From fabb0e6520ca7560ab3a4f09d8b9f268b1f80b21 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 22 Jun 2026 16:44:31 +0200 Subject: [PATCH 01/33] feat: multiple instructions per crank --- README.md | 130 +- crates/hydra-api/src/consts.rs | 8 +- crates/hydra-api/src/instruction.rs | 163 +- crates/hydra-cranker/src/fire.rs | 11 +- .../programs/hydra-example-anchor/src/lib.rs | 13 +- examples/native/Cargo.toml | 9 + examples/native/src/lib.rs | 13 +- examples/pinocchio/Cargo.toml | 9 + examples/pinocchio/src/lib.rs | 11 +- programs/hydra/Cargo.toml | 5 +- programs/hydra/src/processor/create.rs | 197 +- tests/lib.rs | 2508 +++++++++++------ tests/programs/noop/Cargo.toml | 9 + 13 files changed, 1990 insertions(+), 1096 deletions(-) diff --git a/README.md b/README.md index 6bef3a0..20c1319 100644 --- a/README.md +++ b/README.md @@ -6,30 +6,38 @@ ## Packages -| Package | Description | Version | Docs | -|:--------|:------------|:--------|:-----| -| `hydra` | Pinocchio `no_std` on-chain program | `0.1.0` | [Overview](#overview) | +| Package | Description | Version | Docs | +| :---------- | :------------------------------------------- | :------ | :-------------------------------------- | +| `hydra` | Pinocchio `no_std` on-chain program | `0.1.0` | [Overview](#overview) | | `hydra-api` | Shared Rust types, builders, and CPI helpers | `0.1.0` | [Integrating Hydra](#integrating-hydra) | ## Overview -Hydra stores a scheduled instruction in a crank PDA and lets anyone trigger it -when the schedule is due. +Hydra stores one or more scheduled instructions in a crank PDA and lets anyone +trigger them when the schedule is due. -Each trigger transaction has two instructions: +Each trigger transaction places the scheduled instructions immediately after +`Trigger`: ```text -ix[k] = Hydra.Trigger -ix[k+1] = scheduled instruction +ix[k] = Hydra.Trigger +ix[k+1] = scheduled instruction 1 +ix[k+2] = scheduled instruction 2 +… +ix[k+n] = scheduled instruction n ``` -`Trigger` verifies `ix[k+1]` against the bytes stored in the crank account. If -the scheduled instruction fails, the whole transaction rolls back. +`Trigger` verifies `ix[k+1..=k+n]` against the bytes stored in the crank +account. Because the instructions sysvar lays instruction blobs out +contiguously, this verification is a single `memcmp` regardless of `n`. If any +scheduled instruction fails, the whole transaction rolls back. Key constraints: - scheduled instructions run top-level, not via CPI - scheduled instructions cannot require signer metas +- the scheduled instructions must be contiguous and in order, right after `Trigger` +- a crank holds at most `MAX_INSTRUCTIONS` (16) scheduled instructions - `Trigger` is top-level only ## Motivation @@ -42,26 +50,33 @@ their own program; Hydra instead verifies the scheduled instruction against an on-chain template at the top level and lets the runtime execute it as a sibling ix. No CPI frame, no dispatch overhead. -The cranker submits a plain two-instruction transaction; `Trigger` -`memcmp`s `ix[k+1]` against the bytes stored on the crank PDA at -`Create` time (~60 CU), collects the reward, and advances state. -Solana transaction atomicity handles failure — if the scheduled -instruction reverts, the whole tx reverts and Hydra's payout / state -advance revert with it. The scheduled instruction itself runs top-level -and gets the full CU budget and stack depth. +The cranker submits a plain transaction (`Trigger` followed by the scheduled +instructions); `Trigger` `memcmp`s `ix[k+1..]` against the bytes stored on the +crank PDA at `Create` time (~60 CU), collects the reward, and advances state. +The reward and the schedule advance are flat per `Trigger`, independent of how +many instructions the crank holds. Solana transaction atomicity handles failure +— if any scheduled instruction reverts, the whole tx reverts and Hydra's payout +/ state advance revert with it. The scheduled instructions themselves run +top-level and get the full CU budget and stack depth. ## Compute Units Measured with `logging` disabled: -| Instruction | Hydra CU | -|---|---:| -| `Create` | 3292 | -| `Trigger` | 464 | -| `Trigger` (reject: no follow-up) | 378 | -| `Cancel` | 128 | -| `Close` (reject: healthy) | 139 | -| `Close` (underfunded) | 150 | +| Instruction | Hydra CU | +| -------------------------------- | -------: | +| `Create` | 5634 | +| `Trigger` (happy, 1 sibling) | 466 | +| `Trigger` (happy, 3 siblings) | 466 | +| `Trigger` (reject: no follow-up) | 379 | +| `Cancel` | 141 | +| `Close` (reject: healthy) | 270 | +| `Close` (underfunded) | 300 | + +`Trigger` costs the same whether the crank schedules one instruction or many — +the single concatenated `memcmp` is the entire verification, so adding +instructions adds no Hydra-side CU. `Create` scales with the total scheduled +payload size (it is a one-time cost dominated by the account-creation syscall). Reproduce: @@ -88,11 +103,11 @@ cargo test -p hydra-tests Use `hydra-api` from clients or from your own on-chain program. -| Use case | Feature | API | -|---|---|---| -| Host-side client | `client` | `Instruction` builders | -| `solana-program` / Anchor CPI | `cpi-native` | `hydra_api::cpi::native::*` | -| Pinocchio CPI | `cpi-pinocchio` | `hydra_api::cpi::pinocchio::*` | +| Use case | Feature | API | +| ----------------------------- | --------------- | ------------------------------ | +| Host-side client | `client` | `Instruction` builders | +| `solana-program` / Anchor CPI | `cpi-native` | `hydra_api::cpi::native::*` | +| Pinocchio CPI | `cpi-pinocchio` | `hydra_api::cpi::pinocchio::*` | `Trigger` is not exposed as a CPI helper. It must be sent as a top-level instruction. @@ -106,7 +121,7 @@ Examples: ## Creating a Crank ```rust -use hydra_api::instruction::{self as ix, CreateArgs}; +use hydra_api::instruction::{self as ix, CreateArgs, ScheduledIx}; let seed = [0x42u8; 32]; let (crank, _bump) = ix::find_crank_pda(&seed); @@ -122,9 +137,12 @@ let create = ix::create( remaining: 0, priority_tip: 2_500, cu_limit: 0, // 0 = cranker omits SetComputeUnitLimit; cap 1_400_000 - scheduled_program_id: memo::ID, - scheduled_metas: &[], - scheduled_data: b"tick", + // One or more scheduled ixs, run top-level in order after `Trigger`. + scheduled: &[ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"tick", + }], }, ); ``` @@ -167,11 +185,11 @@ not proof that the authority signed the schedule creation. A crank has two upfront costs and a small per-trigger fee: -| | Amount | What happens to it | -|---|---|---| -| **Rent deposit** | ~0.002 SOL | Locked while the crank lives, refunded on close | -| **Create tx fee** | 5,000 lamports | Standard Solana base fee | -| **Per trigger** | 10,000 lamports + `priority_tip` | Drawn from the crank's balance, paid to the cranker | +| | Amount | What happens to it | +| ----------------- | -------------------------------- | --------------------------------------------------- | +| **Rent deposit** | ~0.002 SOL | Locked while the crank lives, refunded on close | +| **Create tx fee** | 5,000 lamports | Standard Solana base fee | +| **Per trigger** | 10,000 lamports + `priority_tip` | Drawn from the crank's balance, paid to the cranker | The rent deposit scales with the scheduled instruction's size — ~0.002 SOL for a minimal ix, up to ~0.003 SOL with a handful of accounts and a bit of @@ -221,17 +239,17 @@ When `--prometheus-port ` is set the cranker serves `/metrics` in Prometheus text format on `0.0.0.0:`. All series are namespaced `hydra_cranker_*` and pre-initialised so `rate()` works from scrape 1. -| Metric | Type | Labels | Meaning | -|---|---|---|---| -| `cranks_cached` | gauge | — | Cranks currently in the in-memory cache. | -| `current_slot` | gauge | — | Last slot observed from `slotSubscribe`. | -| `eligible_now` | gauge | — | Cranks eligible to trigger on the last slot tick. | -| `triggers_submitted_total` | counter | `result={ok,err}` | Triggers submitted. | -| `ws_reconnects_total` | counter | `source={program,slot}` | WS (re)connect attempts. | -| `grpc_reconnects_total` | counter | `source={program,slot}` | Yellowstone gRPC (re)connect attempts (only when `--grpc-url` is set). | -| `cache_events_total` | counter | `kind={insert,update,remove}` | Cache mutations driven by `programSubscribe`. | -| `sweep_duration_seconds` | histogram | — | Wall time per slot-tick sweep (scan + fire). Buckets target sub-10 ms. | -| `rpc_errors_total` | counter | `op={get_program_accounts,get_latest_blockhash,send_transaction}` | RPC call errors, by failing operation. | +| Metric | Type | Labels | Meaning | +| -------------------------- | --------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `cranks_cached` | gauge | — | Cranks currently in the in-memory cache. | +| `current_slot` | gauge | — | Last slot observed from `slotSubscribe`. | +| `eligible_now` | gauge | — | Cranks eligible to trigger on the last slot tick. | +| `triggers_submitted_total` | counter | `result={ok,err}` | Triggers submitted. | +| `ws_reconnects_total` | counter | `source={program,slot}` | WS (re)connect attempts. | +| `grpc_reconnects_total` | counter | `source={program,slot}` | Yellowstone gRPC (re)connect attempts (only when `--grpc-url` is set). | +| `cache_events_total` | counter | `kind={insert,update,remove}` | Cache mutations driven by `programSubscribe`. | +| `sweep_duration_seconds` | histogram | — | Wall time per slot-tick sweep (scan + fire). Buckets target sub-10 ms. | +| `rpc_errors_total` | counter | `op={get_program_accounts,get_latest_blockhash,send_transaction}` | RPC call errors, by failing operation. | Useful alerts: @@ -244,12 +262,12 @@ Useful alerts: ## Instruction Reference -| Disc | Name | Accounts | Data | -|---:|---|---|---| -| 0 | `Create` | `payer(w,s), crank(w), system_program` | schedule payload | -| 1 | `Trigger` | `crank(w), cranker(w,s), instructions_sysvar` | none | -| 2 | `Cancel` | `authority(s), crank(w), recipient(w)` | none | -| 3 | `Close` | `reporter(s,w), crank(w), recipient(w)` | none | +| Disc | Name | Accounts | Data | +| ---: | --------- | --------------------------------------------- | ---------------- | +| 0 | `Create` | `payer(w,s), crank(w), system_program` | schedule payload | +| 1 | `Trigger` | `crank(w), cranker(w,s), instructions_sysvar` | none | +| 2 | `Cancel` | `authority(s), crank(w), recipient(w)` | none | +| 3 | `Close` | `reporter(s,w), crank(w), recipient(w)` | none | To add lamports to a live crank, send a plain `system_program::transfer` to the crank PDA — no dedicated instruction exists. diff --git a/crates/hydra-api/src/consts.rs b/crates/hydra-api/src/consts.rs index d81fbe5..e7811bc 100644 --- a/crates/hydra-api/src/consts.rs +++ b/crates/hydra-api/src/consts.rs @@ -10,9 +10,15 @@ pub const BASE_FEE_LAMPORTS: u64 = 5_000; /// Flat per-trigger reward paid to the cranker. Equals `2 × base_fee`. pub const CRANKER_REWARD: u64 = 2 * BASE_FEE_LAMPORTS; -/// Max metas the scheduled ix may declare. +/// Max metas a single scheduled ix may declare. pub const MAX_ACCOUNTS: usize = 32; +/// Max number of scheduled instructions a single crank may hold. Bounds the +/// `Create` validation cost and the crank account's rent footprint. The +/// concatenated tail region must also fit `Crank.region_len` (a `u16`), which +/// `Create` enforces independently. +pub const MAX_INSTRUCTIONS: usize = 16; + /// Max bytes of the scheduled ix's `data` field. pub const MAX_DATA_LEN: usize = 1024; diff --git a/crates/hydra-api/src/instruction.rs b/crates/hydra-api/src/instruction.rs index 45e63cb..8b88413 100644 --- a/crates/hydra-api/src/instruction.rs +++ b/crates/hydra-api/src/instruction.rs @@ -3,18 +3,19 @@ //! # `Create` (disc 0) — wire layout //! //! ```text -//! seed: [u8; 32] -//! authority: [u8; 32] // all-zeros = none -//! start_slot: u64 LE -//! interval_slots: u64 LE -//! remaining: u64 LE // 0 on the wire = infinite -//! priority_tip: u64 LE -//! cu_limit: u32 LE // 0 = cranker omits SetComputeUnitLimit -//! num_accounts: u8 -//! data_len: u16 LE -//! program_id: [u8; 32] -//! metas: [[flag:u8][pubkey:[u8;32]]; num_accounts] -//! data: [u8; data_len] +//! seed: [u8; 32] +//! authority: [u8; 32] // all-zeros = none +//! start_slot: u64 LE +//! interval_slots: u64 LE +//! remaining: u64 LE // 0 on the wire = infinite +//! priority_tip: u64 LE +//! cu_limit: u32 LE // 0 = cranker omits SetComputeUnitLimit +//! ── one or more scheduled ixs, parsed until the data is exhausted: ── +//! num_accounts: u8 +//! data_len: u16 LE +//! program_id: [u8; 32] +//! metas: [[flag:u8][pubkey:[u8;32]]; num_accounts] +//! data: [u8; data_len] //! ``` //! //! # `Trigger` (disc 1) Accounts: `[crank(w), cranker(w,s), instructions_sysvar]` @@ -24,18 +25,19 @@ //! To fund a crank after creation, send a direct `system_program::transfer` //! to the crank PDA — no dedicated instruction is needed. -/// Fixed-size prefix of `Create` data before the variable metas + data section. +/// Fixed-size prefix of `Create` data, before variable data. pub const CREATE_FIXED_PREFIX_LEN: usize = 32 + // seed 32 + // authority 8 + // start_slot 8 + // interval_slots 8 + // remaining 8 + // priority_tip - 4 + // cu_limit - 1 + // num_accounts - 2 + // data_len - 32; // program_id - // = 135 + 4; // cu_limit + // = 100 + +/// Per-scheduled-ix fixed header in `Create` data, before its metas + data: +/// `num_accounts: u8`, `data_len: u16 LE`, `program_id: [u8; 32]`. +pub const CREATE_IX_HEADER_LEN: usize = 1 + 2 + 32; // = 35 // --------------------------------------------------------------------------- // Client builders @@ -95,7 +97,14 @@ mod client { } } - /// All the scheduling knobs for `Create`. + /// One scheduled instruction template. + pub struct ScheduledIx<'a> { + pub program_id: Pubkey, + pub metas: &'a [SchedMeta], + pub data: &'a [u8], + } + + /// All the scheduling knobs for `Create` pub struct CreateArgs<'a> { pub seed: [u8; 32], /// All-zeros = unkillable (no cancel authority). @@ -109,18 +118,18 @@ mod client { /// right before `Trigger`. `0` = no ix (inherits the 200 k/ix /// default). Capped at `MAX_COMPUTE_UNIT_LIMIT` (1.4 M) at `Create`. pub cu_limit: u32, - pub scheduled_program_id: Pubkey, - pub scheduled_metas: &'a [SchedMeta], - pub scheduled_data: &'a [u8], + /// The scheduled instructions, in execution order. Must be non-empty + pub scheduled: &'a [ScheduledIx<'a>], } /// Build a `Create` instruction. pub fn create(payer: Pubkey, crank: Pubkey, args: &CreateArgs<'_>) -> Instruction { - let mut data = Vec::with_capacity( - 1 + super::CREATE_FIXED_PREFIX_LEN - + 33 * args.scheduled_metas.len() - + args.scheduled_data.len(), - ); + let body_len: usize = args + .scheduled + .iter() + .map(|s| super::CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) + .sum(); + let mut data = Vec::with_capacity(1 + super::CREATE_FIXED_PREFIX_LEN + body_len); data.push(ix::CREATE); data.extend_from_slice(&args.seed); data.extend_from_slice(&args.authority); @@ -129,15 +138,17 @@ mod client { data.extend_from_slice(&args.remaining.to_le_bytes()); data.extend_from_slice(&args.priority_tip.to_le_bytes()); data.extend_from_slice(&args.cu_limit.to_le_bytes()); - data.push(args.scheduled_metas.len() as u8); - data.extend_from_slice(&(args.scheduled_data.len() as u16).to_le_bytes()); - data.extend_from_slice(&args.scheduled_program_id.to_bytes()); - for m in args.scheduled_metas { - let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; - data.push(flag); - data.extend_from_slice(&m.pubkey.to_bytes()); + for s in args.scheduled { + data.push(s.metas.len() as u8); + data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); + data.extend_from_slice(&s.program_id.to_bytes()); + for m in s.metas { + let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; + data.push(flag); + data.extend_from_slice(&m.pubkey.to_bytes()); + } + data.extend_from_slice(s.data); } - data.extend_from_slice(args.scheduled_data); Instruction { program_id: program_id(), @@ -190,48 +201,64 @@ mod client { } } - /// Reconstruct the scheduled instruction from a crank's raw account bytes. - /// This is what an off-chain cranker does to build `ix[k+1]` for the tx. - pub fn scheduled_ix_from_crank(data: &[u8]) -> Option { + /// Reconstruct all scheduled instructions from a crank's raw account bytes. + /// This is what an off-chain cranker does to build the sibling ixs that + /// must follow `Trigger`. + pub fn scheduled_ixs_from_crank(data: &[u8]) -> Option> { use crate::consts::{CRANK_HEADER_SIZE, SERIALIZED_META_SIZE}; - if data.len() < CRANK_HEADER_SIZE + 2 { + if data.len() < CRANK_HEADER_SIZE { return None; } - // Tail region starts right after the 120-byte header and is laid out - // in the instructions-sysvar wire format. let tail = &data[CRANK_HEADER_SIZE..]; - let num_accounts = u16::from_le_bytes(tail[0..2].try_into().ok()?) as usize; - let metas_end = 2 + num_accounts * SERIALIZED_META_SIZE; - if tail.len() < metas_end + 32 + 2 { - return None; - } - let program_id = Pubkey::new_from_array(tail[metas_end..metas_end + 32].try_into().ok()?); - let data_len = - u16::from_le_bytes(tail[metas_end + 32..metas_end + 34].try_into().ok()?) as usize; - let data_start = metas_end + 34; - if tail.len() < data_start + data_len { - return None; - } + let mut out = Vec::new(); + let mut off = 0usize; + while off < tail.len() { + // [num_accounts: u16][metas: 33*N][program_id: 32][data_len: u16][data] + if off + 2 > tail.len() { + return None; + } + let num_accounts = u16::from_le_bytes(tail[off..off + 2].try_into().ok()?) as usize; + let metas_start = off + 2; + let metas_end = metas_start + num_accounts * SERIALIZED_META_SIZE; + if metas_end + 32 + 2 > tail.len() { + return None; + } + let program_id = + Pubkey::new_from_array(tail[metas_end..metas_end + 32].try_into().ok()?); + let data_len = + u16::from_le_bytes(tail[metas_end + 32..metas_end + 34].try_into().ok()?) as usize; + let data_start = metas_end + 34; + let data_end = data_start + data_len; + if data_end > tail.len() { + return None; + } - let mut accounts = Vec::with_capacity(num_accounts); - for i in 0..num_accounts { - let base = 2 + i * SERIALIZED_META_SIZE; - let flag = tail[base]; - let pk = Pubkey::new_from_array(tail[base + 1..base + 33].try_into().ok()?); - let is_writable = flag & META_FLAG_WRITABLE != 0; - accounts.push(if is_writable { - AccountMeta::new(pk, false) - } else { - AccountMeta::new_readonly(pk, false) + let mut accounts = Vec::with_capacity(num_accounts); + for i in 0..num_accounts { + let base = metas_start + i * SERIALIZED_META_SIZE; + let flag = tail[base]; + let pk = Pubkey::new_from_array(tail[base + 1..base + 33].try_into().ok()?); + let is_writable = flag & META_FLAG_WRITABLE != 0; + accounts.push(if is_writable { + AccountMeta::new(pk, false) + } else { + AccountMeta::new_readonly(pk, false) + }); + } + + out.push(Instruction { + program_id, + accounts, + data: tail[data_start..data_end].to_vec(), }); + off = data_end; } - Some(Instruction { - program_id, - accounts, - data: tail[data_start..data_start + data_len].to_vec(), - }) + if out.is_empty() { + return None; + } + Some(out) } } diff --git a/crates/hydra-cranker/src/fire.rs b/crates/hydra-cranker/src/fire.rs index ec0f898..6a6bd34 100644 --- a/crates/hydra-cranker/src/fire.rs +++ b/crates/hydra-cranker/src/fire.rs @@ -60,7 +60,7 @@ pub fn fire_trigger( priority_fee_micro_lamports: u64, skip_preflight: bool, ) -> Result<()> { - let scheduled = ix::scheduled_ix_from_crank(&entry.data) + let scheduled = ix::scheduled_ixs_from_crank(&entry.data) .ok_or_else(|| anyhow!("malformed crank tail for {}", entry.pubkey))?; let trigger = ix::trigger(entry.pubkey, cranker.pubkey()); let blockhash = rpc.get_latest_blockhash().map_err(|e| { @@ -70,9 +70,10 @@ pub fn fire_trigger( .inc(); anyhow::Error::new(e).context("latest_blockhash") })?; - // `verify_followup` requires `scheduled` at `current_ix_index + 1`, so - // it must sit immediately after `Trigger`; ComputeBudget ixs go before. - let mut ixs: Vec = Vec::with_capacity(4); + // `verify_followup` requires the scheduled ixs at `current_ix_index + 1 ..`, + // contiguous and in order, so they must sit immediately after `Trigger`; + // ComputeBudget ixs go before. + let mut ixs: Vec = Vec::with_capacity(3 + scheduled.len()); if entry.cu_limit > 0 { ixs.push(set_compute_unit_limit(entry.cu_limit)); } @@ -80,7 +81,7 @@ pub fn fire_trigger( ixs.push(set_compute_unit_price(priority_fee_micro_lamports)); } ixs.push(trigger); - ixs.push(scheduled); + ixs.extend(scheduled); let msg = Message::new_with_blockhash(&ixs, Some(&cranker.pubkey()), &blockhash); let tx = Transaction::new(&[cranker], msg, blockhash); // Preflight catches reverts before the leader charges fees, but also diff --git a/examples/anchor/programs/hydra-example-anchor/src/lib.rs b/examples/anchor/programs/hydra-example-anchor/src/lib.rs index 4bee6e4..5f130c5 100644 --- a/examples/anchor/programs/hydra-example-anchor/src/lib.rs +++ b/examples/anchor/programs/hydra-example-anchor/src/lib.rs @@ -8,7 +8,10 @@ use anchor_lang::prelude::*; -use hydra_api::{cpi::native as hydra_cpi, instruction::CreateArgs}; +use hydra_api::{ + cpi::native as hydra_cpi, + instruction::{CreateArgs, ScheduledIx}, +}; declare_id!("Xyj597GykzwSu44muqNHtYs2aKUgm9ydNoHNySTDFs5"); @@ -33,9 +36,11 @@ pub mod hydra_example_anchor { remaining: 10, priority_tip: 1_000, cu_limit: 0, // no on-chain CU override - scheduled_program_id: target_program_id, - scheduled_metas: &[], - scheduled_data: b"tick", + scheduled: &[ScheduledIx { + program_id: target_program_id, + metas: &[], + data: b"tick", + }], }, ) .map_err(Into::into) diff --git a/examples/native/Cargo.toml b/examples/native/Cargo.toml index c5ca1bd..285000e 100644 --- a/examples/native/Cargo.toml +++ b/examples/native/Cargo.toml @@ -9,6 +9,10 @@ publish = false [lib] crate-type = ["cdylib"] +[features] +custom-panic = [] +custom-heap = [] + [dependencies] hydra-api = { workspace = true, features = ["cpi-native"] } @@ -22,3 +26,8 @@ hydra-api = { workspace = true, features = ["client"] } mollusk-svm = { workspace = true } solana-account = { workspace = true } solana-instruction = { workspace = true } + +[lints.rust.unexpected_cfgs] +level = "warn" +priority = 0 +check-cfg = ['cfg(target_os, values("solana"))'] diff --git a/examples/native/src/lib.rs b/examples/native/src/lib.rs index 69b31eb..0391859 100644 --- a/examples/native/src/lib.rs +++ b/examples/native/src/lib.rs @@ -21,7 +21,10 @@ use solana_program_entrypoint::entrypoint; use solana_program_error::{ProgramError, ProgramResult}; use solana_pubkey::Pubkey; -use hydra_api::{cpi::native as hydra_cpi, instruction::CreateArgs}; +use hydra_api::{ + cpi::native as hydra_cpi, + instruction::{CreateArgs, ScheduledIx}, +}; entrypoint!(process_instruction); @@ -51,9 +54,11 @@ pub fn process_instruction( remaining: 10, priority_tip: 1_000, cu_limit: 0, // no on-chain CU override - scheduled_program_id: target_program_id, - scheduled_metas: &[], - scheduled_data: b"tick", + scheduled: &[ScheduledIx { + program_id: target_program_id, + metas: &[], + data: b"tick", + }], }, ) } diff --git a/examples/pinocchio/Cargo.toml b/examples/pinocchio/Cargo.toml index e03f8e3..99af9b2 100644 --- a/examples/pinocchio/Cargo.toml +++ b/examples/pinocchio/Cargo.toml @@ -9,6 +9,10 @@ publish = false [lib] crate-type = ["cdylib"] +[features] +custom-panic = [] +custom-heap = [] + [dependencies] hydra-api = { workspace = true, features = ["cpi-pinocchio"] } pinocchio = { workspace = true } @@ -20,3 +24,8 @@ mollusk-svm = { workspace = true } solana-account = { workspace = true } solana-instruction = { workspace = true } solana-pubkey = { workspace = true } + +[lints.rust.unexpected_cfgs] +level = "warn" +priority = 0 +check-cfg = ['cfg(target_os, values("solana"))'] diff --git a/examples/pinocchio/src/lib.rs b/examples/pinocchio/src/lib.rs index 9258fa1..536f0a9 100644 --- a/examples/pinocchio/src/lib.rs +++ b/examples/pinocchio/src/lib.rs @@ -13,7 +13,7 @@ use pinocchio::{ use hydra_api::{ consts::{ix as disc, MAX_ACCOUNTS, MAX_DATA_LEN}, - instruction::CREATE_FIXED_PREFIX_LEN, + instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, }; program_entrypoint!(process); @@ -22,9 +22,10 @@ nostd_panic_handler!(); const DISC_SCHEDULE: u8 = 0; -/// Stack-allocated buffer big enough for any Hydra `Create` payload: -/// `1 byte disc + CREATE_FIXED_PREFIX_LEN + 33*MAX_ACCOUNTS + MAX_DATA_LEN`. -const CREATE_BUF_MAX: usize = 1 + CREATE_FIXED_PREFIX_LEN + 33 * MAX_ACCOUNTS + MAX_DATA_LEN; +/// Stack-allocated buffer big enough for a single-scheduled-ix Hydra `Create` +/// payload: `disc + sched prefix + one ix blob`. +const CREATE_BUF_MAX: usize = + 1 + CREATE_FIXED_PREFIX_LEN + CREATE_IX_HEADER_LEN + 33 * MAX_ACCOUNTS + MAX_DATA_LEN; pub fn process(_program_id: &Address, accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { let [disc_byte, rest @ ..] = data else { @@ -73,7 +74,7 @@ fn schedule(accounts: &[AccountView], data: &[u8]) -> ProgramResult { cursor += 8; buf[cursor..cursor + 4].copy_from_slice(&0u32.to_le_bytes()); // cu_limit (omit) cursor += 4; - buf[cursor] = 0; // num_accounts + buf[cursor] = 0; // num_accounts (single scheduled ix; parsed until data ends) cursor += 1; buf[cursor..cursor + 2].copy_from_slice(&(tick_len as u16).to_le_bytes()); cursor += 2; diff --git a/programs/hydra/Cargo.toml b/programs/hydra/Cargo.toml index 4c824bf..d1c5193 100644 --- a/programs/hydra/Cargo.toml +++ b/programs/hydra/Cargo.toml @@ -25,7 +25,10 @@ cu-trace = [] create-account-allow-prefund = [] [dependencies] -pinocchio = { workspace = true } +# `unsafe-account-resize` lets `Create` shrink the crank account from its O(1) +# over-provisioned size down to the exact tail length (a length-only update, +# no syscall), so the scheduled ixs are parsed in a single pass. +pinocchio = { workspace = true, features = ["unsafe-account-resize"] } pinocchio-system = { workspace = true } pinocchio-log = { workspace = true } solana-define-syscall = { workspace = true } diff --git a/programs/hydra/src/processor/create.rs b/programs/hydra/src/processor/create.rs index 6f763ef..0b9b053 100644 --- a/programs/hydra/src/processor/create.rs +++ b/programs/hydra/src/processor/create.rs @@ -3,25 +3,26 @@ //! Wire layout for ix data (no alignment padding): //! //! ```text -//! seed: [u8; 32] -//! authority: [u8; 32] -//! start_slot: u64 LE -//! interval_slots: u64 LE -//! remaining: u64 LE // 0 = infinite (stored internally as u64::MAX) -//! priority_tip: u64 LE -//! cu_limit: u32 LE // 0 = cranker omits SetComputeUnitLimit -//! num_accounts: u8 -//! data_len: u16 LE -//! program_id: [u8; 32] -//! metas: [[flag:u8][pubkey:[u8;32]]; num_accounts] -//! data: [u8; data_len] +//! seed: [u8; 32] +//! authority: [u8; 32] +//! start_slot: u64 LE +//! interval_slots: u64 LE +//! remaining: u64 LE // 0 = infinite (stored internally as u64::MAX) +//! priority_tip: u64 LE +//! cu_limit: u32 LE // 0 = cranker omits SetComputeUnitLimit +//! ── one or more scheduled ixs, parsed until the data is exhausted: ── +//! num_accounts: u8 +//! data_len: u16 LE +//! program_id: [u8; 32] +//! metas: [[flag:u8][pubkey:[u8;32]]; num_accounts] +//! data: [u8; data_len] //! ``` use pinocchio::{ cpi::{Seed, Signer}, error::ProgramError, sysvars::{rent::Rent, Sysvar}, - AccountView, Address, ProgramResult, + AccountView, Address, ProgramResult, UnsafeResize, }; #[cfg(not(feature = "create-account-allow-prefund"))] use pinocchio_system::instructions::{Allocate, Assign, Transfer}; @@ -31,10 +32,10 @@ use pinocchio_system::instructions::{CreateAccountAllowPrefund, Funding}; use hydra_api::{ consts::{ ix as _ix, CRANK_HEADER_SIZE, CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, - MAX_DATA_LEN, META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, + MAX_DATA_LEN, MAX_INSTRUCTIONS, META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, }, - instruction::CREATE_FIXED_PREFIX_LEN, - state::{load_crank_mut, region_len_for}, + instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, + state::load_crank_mut, HydraError, }; @@ -43,7 +44,8 @@ pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; - if data.len() < CREATE_FIXED_PREFIX_LEN { + // Need at least the scheduling prefix plus one ix blob header. + if data.len() < CREATE_FIXED_PREFIX_LEN + CREATE_IX_HEADER_LEN { return Err(ProgramError::InvalidInstructionData); } @@ -55,13 +57,7 @@ pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { let remaining_wire = read_u64_le(data, 80); let priority_tip = read_u64_le(data, 88); let cu_limit = read_u32_le(data, 96); - let num_accounts = data[100] as usize; - let data_len = u16::from_le_bytes([data[101], data[102]]) as usize; - let program_id: &[u8; 32] = unsafe { &*(data.as_ptr().add(103) as *const [u8; 32]) }; - if num_accounts > MAX_ACCOUNTS || data_len > MAX_DATA_LEN { - return Err(HydraError::InvalidSchedule.into()); - } // `0` is the documented opt-out. Any non-zero value must be within the // Solana per-tx ceiling or the runtime would reject the cranker's tx. if cu_limit > MAX_COMPUTE_UNIT_LIMIT { @@ -74,25 +70,17 @@ pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { let authority_signer: u8 = (payer.address().as_array() == authority) as u8; - let metas_offset = CREATE_FIXED_PREFIX_LEN; - let metas_len = num_accounts * SERIALIZED_META_SIZE; - let data_offset = metas_offset + metas_len; - let total_ix_data = data_offset + data_len; - if data.len() != total_ix_data { - return Err(ProgramError::InvalidInstructionData); - } - - let metas = &data[metas_offset..metas_offset + metas_len]; - let inner_data = &data[data_offset..data_offset + data_len]; - - // Reject any signer flag — scheduled ixs run top-level, they can only be - // signed by real tx keys, and this program can't produce a signature for a - // declared pubkey anyway. - for i in 0..num_accounts { - let flag = metas[i * SERIALIZED_META_SIZE]; - if flag & META_FLAG_SIGNER != 0 { - return Err(HydraError::SignerInScheduledIx.into()); - } + // Re-serializing each scheduled ix into the instructions-sysvar tail layout + // widens its `num_accounts` from u8 to u16 — exactly one extra byte per ix — + // so the tail length is `body_len + num_instructions`, which is at most + // `body_len + MAX_INSTRUCTIONS`. Create the account at that O(1) upper bound, + // then validate + serialize the tail in a single pass and shrink to the + // exact length. This avoids a separate pass just to pre-compute the size. + let body_len = data.len() - CREATE_FIXED_PREFIX_LEN; + let upper_region = body_len + MAX_INSTRUCTIONS; + // The exact tail length (`<= upper_region`) is stored in a `u16` header field. + if upper_region > u16::MAX as usize { + return Err(HydraError::InvalidSchedule.into()); } // Derive expected PDA and verify match. @@ -102,8 +90,7 @@ pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { return Err(ProgramError::InvalidSeeds); } - let region_len = region_len_for(num_accounts, data_len); - let total_size = CRANK_HEADER_SIZE + region_len; + let total_size = CRANK_HEADER_SIZE + upper_region; // One sysvar read serves both CreateAccount funding and the cached floor. let rent = Rent::get()?; @@ -162,41 +149,93 @@ pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { .invoke_signed(&signers)?; } - // Populate header + tail region verbatim in sysvar format. - let mut account_data = crank_ai.try_borrow_mut()?; - let buf: &mut [u8] = &mut account_data; - let (header_bytes, tail_bytes) = buf.split_at_mut(CRANK_HEADER_SIZE); - - // SAFETY: split yields CRANK_HEADER_SIZE bytes; Crank is align-1 (compile-time checked). - let state = unsafe { load_crank_mut(header_bytes)? }; - state.authority = *authority; - state.seed = *seed; - state.set_next_exec_slot(start_slot); - state.set_interval_slots(interval_slots); - state.set_remaining(if remaining_wire == 0 { - REMAINING_INFINITE - } else { - remaining_wire - }); - state.set_priority_tip(priority_tip); - state.set_executed(0); - state.set_rent_min(rent_min); - state.set_region_len(region_len as u16); - state.bump = bump; - state.set_cu_limit(cu_limit); - state.authority_signer = authority_signer; - - // Tail region bytes, matching the instructions-sysvar wire layout. - let mut off = 0; - tail_bytes[off..off + 2].copy_from_slice(&(num_accounts as u16).to_le_bytes()); - off += 2; - tail_bytes[off..off + metas_len].copy_from_slice(metas); - off += metas_len; - tail_bytes[off..off + 32].copy_from_slice(program_id); - off += 32; - tail_bytes[off..off + 2].copy_from_slice(&(data_len as u16).to_le_bytes()); - off += 2; - tail_bytes[off..off + data_len].copy_from_slice(inner_data); + // Validate each scheduled ix and re-serialize it into the tail in the + // instructions-sysvar wire layout, counting and accumulating the exact + // length as we go. The account is over-provisioned to `upper_region`, so + // every write stays in bounds (the tail is at most one byte per ix longer + // than the wire body, and there are at most `MAX_INSTRUCTIONS` of them). + let region_len = { + let mut account_data = crank_ai.try_borrow_mut()?; + let buf: &mut [u8] = &mut account_data; + let (header_bytes, tail_bytes) = buf.split_at_mut(CRANK_HEADER_SIZE); + + let mut cursor = CREATE_FIXED_PREFIX_LEN; + let mut off = 0usize; + let mut num_instructions = 0usize; + while cursor < data.len() { + if cursor + CREATE_IX_HEADER_LEN > data.len() { + return Err(ProgramError::InvalidInstructionData); + } + num_instructions += 1; + if num_instructions > MAX_INSTRUCTIONS { + return Err(HydraError::InvalidSchedule.into()); + } + let num_accounts = data[cursor] as usize; + let data_len = u16::from_le_bytes([data[cursor + 1], data[cursor + 2]]) as usize; + if num_accounts > MAX_ACCOUNTS || data_len > MAX_DATA_LEN { + return Err(HydraError::InvalidSchedule.into()); + } + let metas_offset = cursor + CREATE_IX_HEADER_LEN; + let metas_len = num_accounts * SERIALIZED_META_SIZE; + let data_offset = metas_offset + metas_len; + let next = data_offset + data_len; + if next > data.len() { + return Err(ProgramError::InvalidInstructionData); + } + // Reject any signer flag — scheduled ixs run top-level, they can + // only be signed by real keys, and this program can't produce a + // signature for a declared pubkey anyway. + for i in 0..num_accounts { + if data[metas_offset + i * SERIALIZED_META_SIZE] & META_FLAG_SIGNER != 0 { + return Err(HydraError::SignerInScheduledIx.into()); + } + } + // Tail blob, instructions-sysvar layout: + // [num_accounts u16][metas][program_id 32][data_len u16][data] + tail_bytes[off..off + 2].copy_from_slice(&(num_accounts as u16).to_le_bytes()); + off += 2; + tail_bytes[off..off + metas_len].copy_from_slice(&data[metas_offset..data_offset]); + off += metas_len; + tail_bytes[off..off + 32] + .copy_from_slice(&data[cursor + 3..cursor + CREATE_IX_HEADER_LEN]); + off += 32; + tail_bytes[off..off + 2].copy_from_slice(&(data_len as u16).to_le_bytes()); + off += 2; + tail_bytes[off..off + data_len].copy_from_slice(&data[data_offset..next]); + off += data_len; + + cursor = next; + } + + // SAFETY: split yields CRANK_HEADER_SIZE bytes; Crank is align-1 (compile-time checked). + let state = unsafe { load_crank_mut(header_bytes)? }; + state.authority = *authority; + state.seed = *seed; + state.set_next_exec_slot(start_slot); + state.set_interval_slots(interval_slots); + state.set_remaining(if remaining_wire == 0 { + REMAINING_INFINITE + } else { + remaining_wire + }); + state.set_priority_tip(priority_tip); + state.set_executed(0); + state.set_rent_min(rent_min); + state.set_region_len(off as u16); + state.bump = bump; + state.set_cu_limit(cu_limit); + state.authority_signer = authority_signer; + + off + }; + + // Trim the over-provisioned account down to its exact size. Shrinking only + // lowers the data-length field — no syscall, never out of bounds — so the + // unchecked variant is safe: `region_len <= upper_region`, the borrow above + // is dropped, and the crank is program-owned after `CreateAccount`. + unsafe { + crank_ai.resize(CRANK_HEADER_SIZE + region_len); + } // Suppress unused-import warnings when `logging` feature is off. let _ = _ix::CREATE; diff --git a/tests/lib.rs b/tests/lib.rs index 2bdf1b6..beebe11 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -17,16 +17,11 @@ use solana_instruction::{AccountMeta, Instruction}; use solana_pubkey::{pubkey, Pubkey}; use solana_svm_log_collector::LogCollector; +use hydra_api::instruction::{SchedMeta, ScheduledIx}; use hydra_api::{ consts::{ix, CRANK_HEADER_SIZE, META_FLAG_WRITABLE}, state::Crank, }; -#[cfg(test)] -use hydra_api::{ - consts::{CRANKER_REWARD, STALENESS_THRESHOLD_SLOTS}, - instruction::{CreateArgs, SchedMeta}, - state::region_len_for, -}; /// Absolute path to the built `.so` (without extension) — mollusk appends `.so`. pub const HYDRA_SO: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../target/deploy/hydra"); @@ -66,7 +61,9 @@ pub fn find_crank(seed: &[u8; 32]) -> (Pubkey, u8) { (Pubkey::new_from_array(addr.to_bytes()), bump) } -/// Build a `Create` instruction. +/// Build a single-instruction `Create` (the common case). Thin wrapper over +/// [`create_ix_multi`] so existing single-ix tests exercise the same wire path. +#[allow(clippy::too_many_arguments)] pub fn create_ix( payer: Pubkey, crank: Pubkey, @@ -78,8 +75,44 @@ pub fn create_ix( priority_tip: u64, cu_limit: u32, sched_program: Pubkey, - sched_metas: &[(Pubkey, bool)], // (pubkey, is_writable) + sched_metas: &[SchedMeta], sched_data: &[u8], +) -> Instruction { + create_ix_multi( + payer, + crank, + seed, + authority, + start_slot, + interval_slots, + remaining, + priority_tip, + cu_limit, + &[ScheduledIx { + program_id: sched_program, + metas: sched_metas, + data: sched_data, + }], + ) +} + +/// Build a `Create` instruction scheduling one or more sibling instructions. +/// +/// Wire layout: scheduling prefix, then a sequence of self-delimiting ix blobs +/// `[num_accounts: u8][data_len: u16][program_id: 32][metas][data]`, parsed +/// until the data is exhausted (no instruction count on the wire). +#[allow(clippy::too_many_arguments)] +pub fn create_ix_multi( + payer: Pubkey, + crank: Pubkey, + seed: [u8; 32], + authority: [u8; 32], + start_slot: u64, + interval_slots: u64, + remaining: u64, + priority_tip: u64, + cu_limit: u32, + sched: &[ScheduledIx], ) -> Instruction { let (system_program, _) = keyed_account_for_system_program(); @@ -91,15 +124,21 @@ pub fn create_ix( data.extend_from_slice(&remaining.to_le_bytes()); data.extend_from_slice(&priority_tip.to_le_bytes()); data.extend_from_slice(&cu_limit.to_le_bytes()); - data.push(sched_metas.len() as u8); - data.extend_from_slice(&(sched_data.len() as u16).to_le_bytes()); - data.extend_from_slice(&sched_program.to_bytes()); - for (pk, w) in sched_metas { - let flag: u8 = if *w { META_FLAG_WRITABLE } else { 0 }; - data.push(flag); - data.extend_from_slice(&pk.to_bytes()); + for s in sched { + data.push(s.metas.len() as u8); + data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); + data.extend_from_slice(&s.program_id.to_bytes()); + for meta in s.metas { + let flag: u8 = if meta.is_writable { + META_FLAG_WRITABLE + } else { + 0 + }; + data.push(flag); + data.extend_from_slice(&meta.pubkey.to_bytes()); + } + data.extend_from_slice(s.data); } - data.extend_from_slice(sched_data); Instruction { program_id: hydra_id(), @@ -270,6 +309,68 @@ pub fn print_cu_table() { let cu_trig_fail_tx = r_trig_fail.compute_units_consumed; let cu_trig_fail = take_hydra_cu(&logger).expect("hydra log: trigger reject"); + // Trigger (happy, 3 noop siblings) — shows the per-extra-ix Hydra cost, + // which is just the larger single memcmp over the concatenated region. + const MULTI_N: usize = 3; + const SEED_MULTI: [u8; 32] = [0x44; 32]; + let (crank_m, _) = find_crank(&SEED_MULTI); + let payer_m = Pubkey::new_unique(); + let multi_specs: Vec = (0..MULTI_N) + .map(|_| ScheduledIx { + program_id: NOOP_ID, + metas: &[], + data: tick, + }) + .collect(); + let create_m = create_ix_multi( + payer_m, + crank_m, + SEED_MULTI, + authority.to_bytes(), + 0, + 400, + 10, + 1_000, + 0, + &multi_specs, + ); + let initial_m = vec![ + (payer_m, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_m, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (system_program, sys_acct.clone()), + ]; + let r_create_m = mollusk.process_transaction_instructions(&[create_m], &initial_m); + assert!( + r_create_m.raw_result.is_ok(), + "create multi: {:?}", + r_create_m.raw_result + ); + let _ = take_hydra_cu(&logger); + let mut funded_m = r_create_m.resulting_accounts.clone(); + for (k, a) in funded_m.iter_mut() { + if *k == crank_m { + a.lamports += 1_000_000; + } + } + let trigger_m = trigger_ix(crank_m, cranker); + let mut multi_tx = vec![trigger_m]; + for _ in 0..MULTI_N { + multi_tx.push(Instruction { + program_id: NOOP_ID, + accounts: vec![], + data: tick.to_vec(), + }); + } + let r_trig_multi = mollusk.process_transaction_instructions(&multi_tx, &funded_m); + assert!( + r_trig_multi.raw_result.is_ok(), + "trigger multi: {:?}", + r_trig_multi.raw_result + ); + let cu_trig_multi_tx = r_trig_multi.compute_units_consumed; + let cu_trig_multi = take_hydra_cu(&logger).expect("hydra log: trigger multi"); + // Cancel let cancel = cancel_ix(authority, crank, authority); let r_cancel = mollusk.process_transaction_instructions(&[cancel], &funded); @@ -344,6 +445,10 @@ pub fn print_cu_table() { " │ Trigger (reject: no follow-up) │ {:>10} │ {:>8} │", cu_trig_fail, cu_trig_fail_tx ); + println!( + " │ Trigger (happy, {} noop siblings) │ {:>10} │ {:>8} │", + MULTI_N, cu_trig_multi, cu_trig_multi_tx + ); println!( " │ Cancel │ {:>10} │ {:>8} │", cu_cancel, cu_cancel_tx @@ -371,912 +476,1569 @@ pub fn print_cu_table() { // Tests // --------------------------------------------------------------------------- -/// Human-readable per-instruction CU table. Run with: -/// `cargo test -p hydra-tests cu_table -- --ignored --nocapture` -/// (equivalent output to `cargo bench -p hydra-tests`). -#[test] -#[ignore] -fn cu_table() { - print_cu_table(); -} - -#[test] -fn public_create_builder_serializes_cu_limit_and_executes() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let scheduled_meta = Pubkey::new_unique(); - let scheduled_data: &[u8] = b"tick"; - let cu_limit: u32 = 321_000; - - let ix = hydra_api::instruction::create( - payer, - crank_pda, - &CreateArgs { - seed: SEED, - authority: [0u8; 32], - start_slot: 7, - interval_slots: 100, - remaining: 10, - priority_tip: 1_000, - cu_limit, - scheduled_program_id: memo::ID, - scheduled_metas: &[SchedMeta::writable(scheduled_meta)], - scheduled_data, - }, - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (system_program, system_program_acct), - ]; - - let result = mollusk.process_transaction_instructions(&[ix], &accounts); - assert!( - result.raw_result.is_ok(), - "create via public builder failed: {:?}", - result.raw_result - ); - - let crank_acct = result - .resulting_accounts - .iter() - .find(|(k, _)| k == &crank_pda) - .map(|(_, a)| a) - .expect("crank account"); - - let header = decode_header(&crank_acct.data); - assert_eq!(header.next_exec_slot(), 7); - assert_eq!(header.interval_slots(), 100); - assert_eq!(header.priority_tip(), 1_000); - assert_eq!(header.cu_limit(), cu_limit); - assert_eq!( - header.region_len() as usize, - region_len_for(1, scheduled_data.len()) - ); -} - -#[test] -fn create_happy_path_writes_header_and_region() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let recipient = Pubkey::new_unique(); - let memo_data: &[u8] = b"tick"; - - let ix = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], // no cancel authority - 0, // start_slot: immediately executable - 100, // interval_slots - 10, // remaining (not infinite) - 1_000, // priority_tip - 0, // cu_limit (0 = omit the ix) - memo::ID, - &[(recipient, false)], // one read-only account just for content - memo_data, - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (system_program, system_program_acct), - ]; - - let result = mollusk.process_transaction_instructions(&[ix], &accounts); - assert!( - result.raw_result.is_ok(), - "create failed: {:?}", - result.raw_result - ); - - // Find the crank account in the result. - let crank_acct = result - .resulting_accounts - .iter() - .find(|(k, _)| k == &crank_pda) - .map(|(_, a)| a) - .expect("crank account"); - - assert_eq!(crank_acct.owner, hydra_id(), "owner mismatch"); - let region_len = region_len_for(1, memo_data.len()); - assert_eq!( - crank_acct.data.len(), - CRANK_HEADER_SIZE + region_len, - "total account size" - ); - - let header = decode_header(&crank_acct.data); - assert_eq!(header.seed, SEED); - assert_eq!(header.authority, [0u8; 32]); - assert_eq!(header.next_exec_slot(), 0); - assert_eq!(header.interval_slots(), 100); - assert_eq!(header.remaining(), 10); - assert_eq!(header.priority_tip(), 1_000); - assert_eq!(header.executed(), 0); - assert_eq!(header.region_len() as usize, region_len); - assert!(header.rent_min() > 0, "rent_min should be cached"); -} - -#[test] -fn trigger_happy_path_pays_reward_and_advances() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let cranker = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let recipient = Pubkey::new_unique(); - let memo_data: &[u8] = b"tick"; - let priority_tip: u64 = 2_500; - - // 1. Create the crank. SPL memo with no metas = log-only, no signers. - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - priority_tip, - 0, // cu_limit - memo::ID, - &[], // scheduled memo takes zero accounts - memo_data, - ); - - // 2. Trigger + sibling memo ix (must be ix[k+1] in the tx). - let trigger = trigger_ix(crank_pda, cranker); - let scheduled = Instruction { - program_id: memo::ID, - accounts: vec![], - data: memo_data.to_vec(), +#[cfg(test)] +mod tests { + use hydra_api::{ + instruction::CreateArgs, state::region_len_for, CRANKER_REWARD, STALENESS_THRESHOLD_SLOTS, }; - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let (memo_id, memo_acct) = memo::keyed_account(); - - let cranker_starting: u64 = 0; - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (cranker, Account::new(cranker_starting, 0, &system_program)), - (recipient, Account::new(1_000_000, 0, &system_program)), - (memo_id, memo_acct), - (system_program, system_program_acct), - ]; - - // Run create first (separate tx — can't sign the trigger in the same tx - // since create needs payer-signed and trigger needs cranker-signed, and - // the cranker didn't fund the PDA). - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!( - after_create.raw_result.is_ok(), - "create failed: {:?}", - after_create.raw_result - ); + use super::*; - // Top up the crank PDA so it can afford reward + tip above rent_min. - // In production a user would do this via a direct system transfer to the - // crank PDA; here we just mutate the in-memory account. - let mut funded = after_create.resulting_accounts.clone(); - for (k, a) in funded.iter_mut() { - if *k == crank_pda { - a.lamports += 1_000_000; // 0.001 SOL headroom - } + /// Human-readable per-instruction CU table. Run with: + /// `cargo test -p hydra-tests cu_table -- --ignored --nocapture` + /// (equivalent output to `cargo bench -p hydra-tests`). + #[test] + #[ignore] + fn cu_table() { + print_cu_table(); } - // Now run [trigger, scheduled] as a single tx so the instructions sysvar - // contains both and verify_followup sees the sibling at index 1. - let after_trigger = mollusk.process_transaction_instructions(&[trigger, scheduled], &funded); - assert!( - after_trigger.raw_result.is_ok(), - "trigger failed: {:?}; cu={}", - after_trigger.raw_result, - after_trigger.compute_units_consumed - ); - - let total_cu = after_trigger.compute_units_consumed; - eprintln!("trigger + memo CU: {}", total_cu); - - let crank_acct = after_trigger - .resulting_accounts - .iter() - .find(|(k, _)| k == &crank_pda) - .map(|(_, a)| a) - .expect("crank after trigger"); - let cranker_acct = after_trigger - .resulting_accounts - .iter() - .find(|(k, _)| k == &cranker) - .map(|(_, a)| a) - .expect("cranker after trigger"); - - assert_eq!( - cranker_acct.lamports, - cranker_starting + CRANKER_REWARD + priority_tip, - "cranker reward" - ); - - let header = decode_header(&crank_acct.data); - assert_eq!(header.executed(), 1, "executed++"); - assert_eq!(header.remaining(), 9, "remaining--"); - assert_eq!(header.next_exec_slot(), 100, "slot advanced by interval"); -} - -#[test] -fn cancel_with_matching_authority_refunds_recipient() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let authority = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let recipient = Pubkey::new_unique(); - - let create = create_ix( - payer, - crank_pda, - SEED, - authority.to_bytes(), - 0, - 100, - 10, - 0, - 0, // cu_limit - memo::ID, - &[], - b"tick", - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (authority, Account::new(0, 0, &system_program)), - (recipient, Account::new(0, 0, &system_program)), - (system_program, system_program_acct), - ]; - - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); - - let cancel = cancel_ix(authority, crank_pda, recipient); - let after_cancel = - mollusk.process_transaction_instructions(&[cancel], &after_create.resulting_accounts); - assert!( - after_cancel.raw_result.is_ok(), - "cancel failed: {:?}", - after_cancel.raw_result - ); - - let recipient_acct = after_cancel - .resulting_accounts - .iter() - .find(|(k, _)| k == &recipient) - .map(|(_, a)| a) - .expect("recipient"); - assert!( - recipient_acct.lamports > 0, - "recipient should receive crank rent" - ); - let crank_acct = after_cancel - .resulting_accounts - .iter() - .find(|(k, _)| k == &crank_pda) - .map(|(_, a)| a) - .expect("crank post-cancel"); - assert_eq!(crank_acct.lamports, 0, "crank drained"); -} - -#[test] -fn cancel_rejects_unauthorized_signer() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let authority = Pubkey::new_unique(); - let imposter = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let recipient = Pubkey::new_unique(); - - let create = create_ix( - payer, - crank_pda, - SEED, - authority.to_bytes(), - 0, - 100, - 10, - 0, - 0, // cu_limit - memo::ID, - &[], - b"tick", - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (authority, Account::new(0, 0, &system_program)), - (imposter, Account::new(0, 0, &system_program)), - (recipient, Account::new(0, 0, &system_program)), - (system_program, system_program_acct), - ]; - - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); - - let cancel = cancel_ix(imposter, crank_pda, recipient); - let after_cancel = - mollusk.process_transaction_instructions(&[cancel], &after_create.resulting_accounts); - assert!( - after_cancel.raw_result.is_err(), - "imposter should be rejected" - ); -} - -#[test] -fn create_records_authority_signer_flag() { - // Provenance witness: header records whether `authority` was actually - // signed for at Create (i.e. `payer == authority`). Scheduled programs - // can require this flag to treat `authority` as a real witness. - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - - let create_signed = create_ix( - payer, - crank_pda, - SEED, - payer.to_bytes(), - 0, - 100, - 10, - 0, - 0, - memo::ID, - &[], - b"tick", - ); - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (system_program, system_program_acct.clone()), - ]; - let r = mollusk.process_transaction_instructions(&[create_signed], &accounts); - assert!(r.raw_result.is_ok()); - let header = decode_header( - &r.resulting_accounts + #[test] + fn public_create_builder_serializes_cu_limit_and_executes() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let scheduled_meta = Pubkey::new_unique(); + let scheduled_data: &[u8] = b"tick"; + let cu_limit: u32 = 321_000; + + let ix = hydra_api::instruction::create( + payer, + crank_pda, + &CreateArgs { + seed: SEED, + authority: [0u8; 32], + start_slot: 7, + interval_slots: 100, + remaining: 10, + priority_tip: 1_000, + cu_limit, + scheduled: &[ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::writable(scheduled_meta)], + data: scheduled_data, + }], + }, + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + + let result = mollusk.process_transaction_instructions(&[ix], &accounts); + assert!( + result.raw_result.is_ok(), + "create via public builder failed: {:?}", + result.raw_result + ); + + let crank_acct = result + .resulting_accounts .iter() .find(|(k, _)| k == &crank_pda) - .unwrap() - .1 - .data, - ); - assert_eq!(header.authority_signer, 1, "payer == authority -> flag = 1"); + .map(|(_, a)| a) + .expect("crank account"); + + let header = decode_header(&crank_acct.data); + assert_eq!(header.next_exec_slot(), 7); + assert_eq!(header.interval_slots(), 100); + assert_eq!(header.priority_tip(), 1_000); + assert_eq!(header.cu_limit(), cu_limit); + assert_eq!( + header.region_len() as usize, + region_len_for(1, scheduled_data.len()) + ); + } - let payer2 = Pubkey::new_unique(); - let other = Pubkey::new_unique(); - const SEED2: [u8; 32] = [0x33; 32]; - let (crank_pda2, _bump) = find_crank(&SEED2); - let create_unsigned = create_ix( - payer2, - crank_pda2, - SEED2, - other.to_bytes(), - 0, - 100, - 10, - 0, - 0, - memo::ID, - &[], - b"tick", - ); - let accounts2 = vec![ - (payer2, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda2, Account::default()), - (system_program, system_program_acct), - ]; - let r2 = mollusk.process_transaction_instructions(&[create_unsigned], &accounts2); - assert!(r2.raw_result.is_ok()); - let header2 = decode_header( - &r2.resulting_accounts + #[test] + fn create_happy_path_writes_header_and_region() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let recipient = Pubkey::new_unique(); + let memo_data: &[u8] = b"tick"; + + let ix = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], // no cancel authority + 0, // start_slot: immediately executable + 100, // interval_slots + 10, // remaining (not infinite) + 1_000, // priority_tip + 0, // cu_limit (0 = omit the ix) + memo::ID, + &[SchedMeta::readonly(recipient)], // one read-only account just for content + memo_data, + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + + let result = mollusk.process_transaction_instructions(&[ix], &accounts); + assert!( + result.raw_result.is_ok(), + "create failed: {:?}", + result.raw_result + ); + + // Find the crank account in the result. + let crank_acct = result + .resulting_accounts .iter() - .find(|(k, _)| k == &crank_pda2) - .unwrap() - .1 - .data, - ); - assert_eq!( - header2.authority_signer, 0, - "payer != authority -> flag = 0" - ); -} - -#[test] -fn cancel_rejects_unkillable_crank() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let anyone = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let recipient = Pubkey::new_unique(); - - // authority == [0; 32] makes the crank unkillable via Cancel. - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, // cu_limit - memo::ID, - &[], - b"tick", - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (anyone, Account::new(0, 0, &system_program)), - (recipient, Account::new(0, 0, &system_program)), - (system_program, system_program_acct), - ]; - - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); - - let cancel = cancel_ix(anyone, crank_pda, recipient); - let after_cancel = - mollusk.process_transaction_instructions(&[cancel], &after_create.resulting_accounts); - assert!( - after_cancel.raw_result.is_err(), - "unkillable crank should refuse Cancel" - ); -} - -#[test] -fn close_permissionless_when_underfunded() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let reporter = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], // no authority -> reporter is free to name themselves recipient - 0, - 100, - 10, - 0, - 0, // cu_limit - memo::ID, - &[], - b"tick", - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (reporter, Account::new(0, 0, &system_program)), - (system_program, system_program_acct), - ]; - - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); - - // Crank is freshly created with exactly rent_min lamports -> 0 headroom -> underfunded. - let close = close_ix(reporter, crank_pda, reporter); - let after = - mollusk.process_transaction_instructions(&[close], &after_create.resulting_accounts); - assert!( - after.raw_result.is_ok(), - "close failed: {:?}", - after.raw_result - ); - - let reporter_acct = after - .resulting_accounts - .iter() - .find(|(k, _)| k == &reporter) - .map(|(_, a)| a) - .expect("reporter"); - assert!(reporter_acct.lamports > 0, "reporter claims bounty"); -} - -#[test] -fn close_refuses_healthy_crank() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let reporter = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, // cu_limit - memo::ID, - &[], - b"tick", - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (reporter, Account::new(0, 0, &system_program)), - (system_program, system_program_acct), - ]; - - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); - - // Fund the crank generously so it's NOT underfunded. - let mut funded = after_create.resulting_accounts.clone(); - for (k, a) in funded.iter_mut() { - if *k == crank_pda { - a.lamports += 10_000_000; - } + .find(|(k, _)| k == &crank_pda) + .map(|(_, a)| a) + .expect("crank account"); + + assert_eq!(crank_acct.owner, hydra_id(), "owner mismatch"); + let region_len = region_len_for(1, memo_data.len()); + assert_eq!( + crank_acct.data.len(), + CRANK_HEADER_SIZE + region_len, + "total account size" + ); + + let header = decode_header(&crank_acct.data); + assert_eq!(header.seed, SEED); + assert_eq!(header.authority, [0u8; 32]); + assert_eq!(header.next_exec_slot(), 0); + assert_eq!(header.interval_slots(), 100); + assert_eq!(header.remaining(), 10); + assert_eq!(header.priority_tip(), 1_000); + assert_eq!(header.executed(), 0); + assert_eq!(header.region_len() as usize, region_len); + assert!(header.rent_min() > 0, "rent_min should be cached"); } - let close = close_ix(reporter, crank_pda, reporter); - let after = mollusk.process_transaction_instructions(&[close], &funded); - assert!(after.raw_result.is_err(), "healthy crank must refuse Close"); -} - -#[test] -fn close_permissionless_when_stuck() { - let mut mollusk = mollusk_with_hydra(); - mollusk.sysvars.clock.slot = STALENESS_THRESHOLD_SLOTS + 1; + #[test] + fn trigger_happy_path_pays_reward_and_advances() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let recipient = Pubkey::new_unique(); + let memo_data: &[u8] = b"tick"; + let priority_tip: u64 = 2_500; + + // 1. Create the crank. SPL memo with no metas = log-only, no signers. + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + priority_tip, + 0, // cu_limit + memo::ID, + &[], // scheduled memo takes zero accounts + memo_data, + ); + + // 2. Trigger + sibling memo ix (must be ix[k+1] in the tx). + let trigger = trigger_ix(crank_pda, cranker); + let scheduled = Instruction { + program_id: memo::ID, + accounts: vec![], + data: memo_data.to_vec(), + }; + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + + let cranker_starting: u64 = 0; + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(cranker_starting, 0, &system_program)), + (recipient, Account::new(1_000_000, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + + // Run create first (separate tx — can't sign the trigger in the same tx + // since create needs payer-signed and trigger needs cranker-signed, and + // the cranker didn't fund the PDA). + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!( + after_create.raw_result.is_ok(), + "create failed: {:?}", + after_create.raw_result + ); + + // Top up the crank PDA so it can afford reward + tip above rent_min. + // In production a user would do this via a direct system transfer to the + // crank PDA; here we just mutate the in-memory account. + let mut funded = after_create.resulting_accounts.clone(); + for (k, a) in funded.iter_mut() { + if *k == crank_pda { + a.lamports += 1_000_000; // 0.001 SOL headroom + } + } - let payer = Pubkey::new_unique(); - let reporter = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); + // Now run [trigger, scheduled] as a single tx so the instructions sysvar + // contains both and verify_followup sees the sibling at index 1. + let after_trigger = + mollusk.process_transaction_instructions(&[trigger, scheduled], &funded); + assert!( + after_trigger.raw_result.is_ok(), + "trigger failed: {:?}; cu={}", + after_trigger.raw_result, + after_trigger.compute_units_consumed + ); + + let total_cu = after_trigger.compute_units_consumed; + eprintln!("trigger + memo CU: {}", total_cu); + + let crank_acct = after_trigger + .resulting_accounts + .iter() + .find(|(k, _)| k == &crank_pda) + .map(|(_, a)| a) + .expect("crank after trigger"); + let cranker_acct = after_trigger + .resulting_accounts + .iter() + .find(|(k, _)| k == &cranker) + .map(|(_, a)| a) + .expect("cranker after trigger"); + + assert_eq!( + cranker_acct.lamports, + cranker_starting + CRANKER_REWARD + priority_tip, + "cranker reward" + ); + + let header = decode_header(&crank_acct.data); + assert_eq!(header.executed(), 1, "executed++"); + assert_eq!(header.remaining(), 9, "remaining--"); + assert_eq!(header.next_exec_slot(), 100, "slot advanced by interval"); + } - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, // cu_limit - memo::ID, - &[], - b"tick", - ); + #[test] + fn cancel_with_matching_authority_refunds_recipient() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let authority = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let recipient = Pubkey::new_unique(); + + let create = create_ix( + payer, + crank_pda, + SEED, + authority.to_bytes(), + 0, + 100, + 10, + 0, + 0, // cu_limit + memo::ID, + &[], + b"tick", + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (authority, Account::new(0, 0, &system_program)), + (recipient, Account::new(0, 0, &system_program)), + (system_program, system_program_acct), + ]; + + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + let cancel = cancel_ix(authority, crank_pda, recipient); + let after_cancel = + mollusk.process_transaction_instructions(&[cancel], &after_create.resulting_accounts); + assert!( + after_cancel.raw_result.is_ok(), + "cancel failed: {:?}", + after_cancel.raw_result + ); + + let recipient_acct = after_cancel + .resulting_accounts + .iter() + .find(|(k, _)| k == &recipient) + .map(|(_, a)| a) + .expect("recipient"); + assert!( + recipient_acct.lamports > 0, + "recipient should receive crank rent" + ); + let crank_acct = after_cancel + .resulting_accounts + .iter() + .find(|(k, _)| k == &crank_pda) + .map(|(_, a)| a) + .expect("crank post-cancel"); + assert_eq!(crank_acct.lamports, 0, "crank drained"); + } - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (reporter, Account::new(0, 0, &system_program)), - (system_program, system_program_acct), - ]; + #[test] + fn cancel_rejects_unauthorized_signer() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let authority = Pubkey::new_unique(); + let imposter = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let recipient = Pubkey::new_unique(); + + let create = create_ix( + payer, + crank_pda, + SEED, + authority.to_bytes(), + 0, + 100, + 10, + 0, + 0, // cu_limit + memo::ID, + &[], + b"tick", + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (authority, Account::new(0, 0, &system_program)), + (imposter, Account::new(0, 0, &system_program)), + (recipient, Account::new(0, 0, &system_program)), + (system_program, system_program_acct), + ]; + + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + let cancel = cancel_ix(imposter, crank_pda, recipient); + let after_cancel = + mollusk.process_transaction_instructions(&[cancel], &after_create.resulting_accounts); + assert!( + after_cancel.raw_result.is_err(), + "imposter should be rejected" + ); + } - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); + #[test] + fn create_records_authority_signer_flag() { + // Provenance witness: header records whether `authority` was actually + // signed for at Create (i.e. `payer == authority`). Scheduled programs + // can require this flag to treat `authority` as a real witness. + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + let create_signed = create_ix( + payer, + crank_pda, + SEED, + payer.to_bytes(), + 0, + 100, + 10, + 0, + 0, + memo::ID, + &[], + b"tick", + ); + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct.clone()), + ]; + let r = mollusk.process_transaction_instructions(&[create_signed], &accounts); + assert!(r.raw_result.is_ok()); + let header = decode_header( + &r.resulting_accounts + .iter() + .find(|(k, _)| k == &crank_pda) + .unwrap() + .1 + .data, + ); + assert_eq!(header.authority_signer, 1, "payer == authority -> flag = 1"); + + let payer2 = Pubkey::new_unique(); + let other = Pubkey::new_unique(); + const SEED2: [u8; 32] = [0x33; 32]; + let (crank_pda2, _bump) = find_crank(&SEED2); + let create_unsigned = create_ix( + payer2, + crank_pda2, + SEED2, + other.to_bytes(), + 0, + 100, + 10, + 0, + 0, + memo::ID, + &[], + b"tick", + ); + let accounts2 = vec![ + (payer2, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda2, Account::default()), + (system_program, system_program_acct), + ]; + let r2 = mollusk.process_transaction_instructions(&[create_unsigned], &accounts2); + assert!(r2.raw_result.is_ok()); + let header2 = decode_header( + &r2.resulting_accounts + .iter() + .find(|(k, _)| k == &crank_pda2) + .unwrap() + .1 + .data, + ); + assert_eq!( + header2.authority_signer, 0, + "payer != authority -> flag = 0" + ); + } - let mut funded = after_create.resulting_accounts.clone(); - for (k, a) in funded.iter_mut() { - if *k == crank_pda { - a.lamports += 10_000_000; - } + #[test] + fn cancel_rejects_unkillable_crank() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let anyone = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let recipient = Pubkey::new_unique(); + + // authority == [0; 32] makes the crank unkillable via Cancel. + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, // cu_limit + memo::ID, + &[], + b"tick", + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (anyone, Account::new(0, 0, &system_program)), + (recipient, Account::new(0, 0, &system_program)), + (system_program, system_program_acct), + ]; + + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + let cancel = cancel_ix(anyone, crank_pda, recipient); + let after_cancel = + mollusk.process_transaction_instructions(&[cancel], &after_create.resulting_accounts); + assert!( + after_cancel.raw_result.is_err(), + "unkillable crank should refuse Cancel" + ); } - let close = close_ix(reporter, crank_pda, reporter); - let after = mollusk.process_transaction_instructions(&[close], &funded); - assert!( - after.raw_result.is_ok(), - "stuck crank should permit Close: {:?}", - after.raw_result - ); -} + #[test] + fn close_permissionless_when_underfunded() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let reporter = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], // no authority -> reporter is free to name themselves recipient + 0, + 100, + 10, + 0, + 0, // cu_limit + memo::ID, + &[], + b"tick", + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (reporter, Account::new(0, 0, &system_program)), + (system_program, system_program_acct), + ]; + + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + // Crank is freshly created with exactly rent_min lamports -> 0 headroom -> underfunded. + let close = close_ix(reporter, crank_pda, reporter); + let after = + mollusk.process_transaction_instructions(&[close], &after_create.resulting_accounts); + assert!( + after.raw_result.is_ok(), + "close failed: {:?}", + after.raw_result + ); + + let reporter_acct = after + .resulting_accounts + .iter() + .find(|(k, _)| k == &reporter) + .map(|(_, a)| a) + .expect("reporter"); + assert!(reporter_acct.lamports > 0, "reporter claims bounty"); + } -#[test] -fn create_rejects_signer_flag_in_metas() { - // Manually build data with META_FLAG_SIGNER set on a meta, bypassing - // the `create_ix` helper which only accepts (pubkey, is_writable). - use hydra_api::consts::META_FLAG_SIGNER; + #[test] + fn close_refuses_healthy_crank() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let reporter = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, // cu_limit + memo::ID, + &[], + b"tick", + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (reporter, Account::new(0, 0, &system_program)), + (system_program, system_program_acct), + ]; + + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + // Fund the crank generously so it's NOT underfunded. + let mut funded = after_create.resulting_accounts.clone(); + for (k, a) in funded.iter_mut() { + if *k == crank_pda { + a.lamports += 10_000_000; + } + } - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let fake = Pubkey::new_unique(); + let close = close_ix(reporter, crank_pda, reporter); + let after = mollusk.process_transaction_instructions(&[close], &funded); + assert!(after.raw_result.is_err(), "healthy crank must refuse Close"); + } - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let mut data = vec![ix::CREATE]; - data.extend_from_slice(&SEED); - data.extend_from_slice(&[0u8; 32]); // authority - data.extend_from_slice(&0u64.to_le_bytes()); // start_slot - data.extend_from_slice(&100u64.to_le_bytes()); // interval_slots - data.extend_from_slice(&10u64.to_le_bytes()); // remaining - data.extend_from_slice(&0u64.to_le_bytes()); // tip - data.extend_from_slice(&0u32.to_le_bytes()); // cu_limit - data.push(1u8); // num_accounts - data.extend_from_slice(&1u16.to_le_bytes()); // data_len - data.extend_from_slice(&memo::ID.to_bytes()); - data.push(META_FLAG_SIGNER); // <-- the poisoned flag - data.extend_from_slice(&fake.to_bytes()); - data.push(0x42); - - let bad_ix = Instruction { - program_id: hydra_id(), - accounts: vec![ - AccountMeta::new(payer, true), - AccountMeta::new(crank_pda, false), - AccountMeta::new_readonly(system_program, false), - ], - data, - }; + #[test] + fn close_permissionless_when_stuck() { + let mut mollusk = mollusk_with_hydra(); + mollusk.sysvars.clock.slot = STALENESS_THRESHOLD_SLOTS + 1; + + let payer = Pubkey::new_unique(); + let reporter = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, // cu_limit + memo::ID, + &[], + b"tick", + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (reporter, Account::new(0, 0, &system_program)), + (system_program, system_program_acct), + ]; + + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + let mut funded = after_create.resulting_accounts.clone(); + for (k, a) in funded.iter_mut() { + if *k == crank_pda { + a.lamports += 10_000_000; + } + } - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (system_program, system_program_acct), - ]; - let result = mollusk.process_transaction_instructions(&[bad_ix], &accounts); - assert!( - result.raw_result.is_err(), - "create must reject signer flag in scheduled metas" - ); -} + let close = close_ix(reporter, crank_pda, reporter); + let after = mollusk.process_transaction_instructions(&[close], &funded); + assert!( + after.raw_result.is_ok(), + "stuck crank should permit Close: {:?}", + after.raw_result + ); + } -#[test] -fn trigger_rejects_before_slot() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let cranker = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let memo_data: &[u8] = b"tick"; + #[test] + fn create_rejects_signer_flag_in_metas() { + // Manually build data with META_FLAG_SIGNER set on a meta, bypassing + // the `create_ix` helper which only accepts (pubkey, is_writable). + use hydra_api::consts::META_FLAG_SIGNER; + + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let fake = Pubkey::new_unique(); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let mut data = vec![ix::CREATE]; + data.extend_from_slice(&SEED); + data.extend_from_slice(&[0u8; 32]); // authority + data.extend_from_slice(&0u64.to_le_bytes()); // start_slot + data.extend_from_slice(&100u64.to_le_bytes()); // interval_slots + data.extend_from_slice(&10u64.to_le_bytes()); // remaining + data.extend_from_slice(&0u64.to_le_bytes()); // tip + data.extend_from_slice(&0u32.to_le_bytes()); // cu_limit + data.push(1u8); // num_accounts + data.extend_from_slice(&1u16.to_le_bytes()); // data_len + data.extend_from_slice(&memo::ID.to_bytes()); + data.push(META_FLAG_SIGNER); // <-- the poisoned flag + data.extend_from_slice(&fake.to_bytes()); + data.push(0x42); + + let bad_ix = Instruction { + program_id: hydra_id(), + accounts: vec![ + AccountMeta::new(payer, true), + AccountMeta::new(crank_pda, false), + AccountMeta::new_readonly(system_program, false), + ], + data, + }; + + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + let result = mollusk.process_transaction_instructions(&[bad_ix], &accounts); + assert!( + result.raw_result.is_err(), + "create must reject signer flag in scheduled metas" + ); + } - // Start at slot u64::MAX - 1 so current_slot (small) never reaches it. - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], - u64::MAX - 1, - 100, - 10, - 0, - 0, /* cu_limit */ - memo::ID, - &[], - memo_data, - ); + #[test] + fn trigger_rejects_before_slot() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let memo_data: &[u8] = b"tick"; + + // Start at slot u64::MAX - 1 so current_slot (small) never reaches it. + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + u64::MAX - 1, + 100, + 10, + 0, + 0, /* cu_limit */ + memo::ID, + &[], + memo_data, + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + let mut funded = after_create.resulting_accounts.clone(); + for (k, a) in funded.iter_mut() { + if *k == crank_pda { + a.lamports += 1_000_000; + } + } - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let (memo_id, memo_acct) = memo::keyed_account(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (cranker, Account::new(0, 0, &system_program)), - (memo_id, memo_acct), - (system_program, system_program_acct), - ]; - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); + let trigger = trigger_ix(crank_pda, cranker); + let scheduled = Instruction { + program_id: memo::ID, + accounts: vec![], + data: memo_data.to_vec(), + }; + let after = mollusk.process_transaction_instructions(&[trigger, scheduled], &funded); + assert!( + after.raw_result.is_err(), + "trigger must refuse before next_exec_slot" + ); + } - let mut funded = after_create.resulting_accounts.clone(); - for (k, a) in funded.iter_mut() { - if *k == crank_pda { - a.lamports += 1_000_000; + #[test] + fn trigger_rejects_when_followup_mismatches() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, /* cu_limit */ + memo::ID, + &[], + b"expected", + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + let mut funded = after_create.resulting_accounts.clone(); + for (k, a) in funded.iter_mut() { + if *k == crank_pda { + a.lamports += 1_000_000; + } } + + // Scheduled template says data = b"expected"; submit b"different" instead. + let trigger = trigger_ix(crank_pda, cranker); + let wrong = Instruction { + program_id: memo::ID, + accounts: vec![], + data: b"different".to_vec(), + }; + let after = mollusk.process_transaction_instructions(&[trigger, wrong], &funded); + assert!( + after.raw_result.is_err(), + "trigger must reject mismatched followup" + ); } - let trigger = trigger_ix(crank_pda, cranker); - let scheduled = Instruction { - program_id: memo::ID, - accounts: vec![], - data: memo_data.to_vec(), - }; - let after = mollusk.process_transaction_instructions(&[trigger, scheduled], &funded); - assert!( - after.raw_result.is_err(), - "trigger must refuse before next_exec_slot" - ); -} + #[test] + fn trigger_decrements_until_exhausted() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let memo_data: &[u8] = b"x"; + + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 0, + 2, + 0, + 0, /* cu_limit */ + memo::ID, + &[], + memo_data, + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + let mut state = after_create.resulting_accounts.clone(); + // Seed enough lamports for 2 triggers + safety buffer. + for (k, a) in state.iter_mut() { + if *k == crank_pda { + a.lamports += 1_000_000; + } + } -#[test] -fn trigger_rejects_when_followup_mismatches() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let cranker = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); + let trigger = trigger_ix(crank_pda, cranker); + let scheduled = Instruction { + program_id: memo::ID, + accounts: vec![], + data: memo_data.to_vec(), + }; + + // First trigger: remaining 2 -> 1. + let r1 = + mollusk.process_transaction_instructions(&[trigger.clone(), scheduled.clone()], &state); + assert!(r1.raw_result.is_ok(), "1st trigger: {:?}", r1.raw_result); + state = r1.resulting_accounts; + + // Second trigger: remaining 1 -> 0 (now exhausted). + let r2 = + mollusk.process_transaction_instructions(&[trigger.clone(), scheduled.clone()], &state); + assert!(r2.raw_result.is_ok(), "2nd trigger: {:?}", r2.raw_result); + state = r2.resulting_accounts; + + let header = { + let crank = state + .iter() + .find(|(k, _)| k == &crank_pda) + .map(|(_, a)| a) + .unwrap(); + *decode_header(&crank.data) + }; + assert_eq!(header.executed(), 2); + assert_eq!(header.remaining(), 0, "should be exhausted"); + + // Third trigger must fail: exhausted. + let r3 = mollusk.process_transaction_instructions(&[trigger, scheduled], &state); + assert!( + r3.raw_result.is_err(), + "3rd trigger must fail on exhausted crank" + ); + } - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, /* cu_limit */ - memo::ID, - &[], - b"expected", - ); + #[test] + fn trigger_rejects_without_followup() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let recipient = Pubkey::new_unique(); + + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, // cu_limit + memo::ID, + &[], + b"tick", + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (recipient, Account::new(0, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + // Trigger alone — no follow-up. + let trigger = trigger_ix(crank_pda, cranker); + let result = + mollusk.process_transaction_instructions(&[trigger], &after_create.resulting_accounts); + assert!( + result.raw_result.is_err(), + "trigger should fail without follow-up, got: {:?}", + result.raw_result + ); + } - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let (memo_id, memo_acct) = memo::keyed_account(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (cranker, Account::new(0, 0, &system_program)), - (memo_id, memo_acct), - (system_program, system_program_acct), - ]; - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); + // --------------------------------------------------------------------------- + // Multiple scheduled instructions + // --------------------------------------------------------------------------- - let mut funded = after_create.resulting_accounts.clone(); - for (k, a) in funded.iter_mut() { - if *k == crank_pda { - a.lamports += 1_000_000; + /// Build the sibling `Instruction` for a memo with the given data + metas. + #[cfg(test)] + fn memo_sibling(metas: &[(Pubkey, bool)], data: &[u8]) -> Instruction { + Instruction { + program_id: memo::ID, + accounts: metas + .iter() + .map(|(pk, w)| { + if *w { + AccountMeta::new(*pk, false) + } else { + AccountMeta::new_readonly(*pk, false) + } + }) + .collect(), + data: data.to_vec(), } } - // Scheduled template says data = b"expected"; submit b"different" instead. - let trigger = trigger_ix(crank_pda, cranker); - let wrong = Instruction { - program_id: memo::ID, - accounts: vec![], - data: b"different".to_vec(), - }; - let after = mollusk.process_transaction_instructions(&[trigger, wrong], &funded); - assert!( - after.raw_result.is_err(), - "trigger must reject mismatched followup" - ); -} - -#[test] -fn trigger_decrements_until_exhausted() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let cranker = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let memo_data: &[u8] = b"x"; - - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 0, - 2, - 0, - 0, /* cu_limit */ - memo::ID, - &[], - memo_data, - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let (memo_id, memo_acct) = memo::keyed_account(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (cranker, Account::new(0, 0, &system_program)), - (memo_id, memo_acct), - (system_program, system_program_acct), - ]; - - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); - - let mut state = after_create.resulting_accounts.clone(); - // Seed enough lamports for 2 triggers + safety buffer. - for (k, a) in state.iter_mut() { - if *k == crank_pda { - a.lamports += 1_000_000; + /// Fund a crank PDA in a resulting-accounts vector by `delta` lamports. + #[cfg(test)] + fn top_up(accounts: &mut [(Pubkey, Account)], crank: Pubkey, delta: u64) { + for (k, a) in accounts.iter_mut() { + if *k == crank { + a.lamports += delta; + } } } - let trigger = trigger_ix(crank_pda, cranker); - let scheduled = Instruction { - program_id: memo::ID, - accounts: vec![], - data: memo_data.to_vec(), - }; - - // First trigger: remaining 2 -> 1. - let r1 = - mollusk.process_transaction_instructions(&[trigger.clone(), scheduled.clone()], &state); - assert!(r1.raw_result.is_ok(), "1st trigger: {:?}", r1.raw_result); - state = r1.resulting_accounts; + #[test] + fn create_legacy_single_ix_wire_still_works() { + // A client built before multi-instruction support emits the Create payload + // WITHOUT any instruction count: scheduling prefix, then exactly one ix + // blob. This must keep working byte-for-byte (the new parser reads blobs + // until the data is exhausted, so one blob == the legacy layout). + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let tick: &[u8] = b"tick"; + + let mut data = vec![ix::CREATE]; + data.extend_from_slice(&SEED); + data.extend_from_slice(&[0u8; 32]); // authority + data.extend_from_slice(&0u64.to_le_bytes()); // start_slot + data.extend_from_slice(&100u64.to_le_bytes()); // interval + data.extend_from_slice(&10u64.to_le_bytes()); // remaining + data.extend_from_slice(&0u64.to_le_bytes()); // tip + data.extend_from_slice(&0u32.to_le_bytes()); // cu_limit + // single ix blob — NO count byte. + data.push(0u8); // num_accounts + data.extend_from_slice(&(tick.len() as u16).to_le_bytes()); + data.extend_from_slice(&memo::ID.to_bytes()); + data.extend_from_slice(tick); + + let legacy_ix = Instruction { + program_id: hydra_id(), + accounts: vec![ + AccountMeta::new(payer, true), + AccountMeta::new(crank_pda, false), + AccountMeta::new_readonly(keyed_account_for_system_program().0, false), + ], + data, + }; + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + let r = mollusk.process_transaction_instructions(&[legacy_ix], &accounts); + assert!( + r.raw_result.is_ok(), + "legacy single-ix Create wire must still work: {:?}", + r.raw_result + ); + let crank_acct = r + .resulting_accounts + .iter() + .find(|(k, _)| k == &crank_pda) + .map(|(_, a)| a) + .unwrap(); + assert_eq!( + decode_header(&crank_acct.data).region_len() as usize, + region_len_for(0, tick.len()), + "one scheduled ix region" + ); + } - // Second trigger: remaining 1 -> 0 (now exhausted). - let r2 = - mollusk.process_transaction_instructions(&[trigger.clone(), scheduled.clone()], &state); - assert!(r2.raw_result.is_ok(), "2nd trigger: {:?}", r2.raw_result); - state = r2.resulting_accounts; + #[test] + fn create_multi_writes_concatenated_region() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let acct_a = Pubkey::new_unique(); + + let ix = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[ + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::writable(acct_a)], + data: b"first", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"second", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + + let result = mollusk.process_transaction_instructions(&[ix], &accounts); + assert!( + result.raw_result.is_ok(), + "create multi failed: {:?}", + result.raw_result + ); + + let crank_acct = result + .resulting_accounts + .iter() + .find(|(k, _)| k == &crank_pda) + .map(|(_, a)| a) + .expect("crank account"); + + let expected_region = + region_len_for(1, b"first".len()) + region_len_for(0, b"second".len()); + let header = decode_header(&crank_acct.data); + assert_eq!( + header.region_len() as usize, + expected_region, + "region_len = sum of per-ix regions" + ); + assert_eq!( + crank_acct.data.len(), + CRANK_HEADER_SIZE + expected_region, + "account size matches header + concatenated region" + ); + } - let header = { - let crank = state + #[test] + fn trigger_runs_two_scheduled_ixs() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let priority_tip: u64 = 2_500; + + let create = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + priority_tip, + 0, + &[ + ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"alpha", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"beta", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + let cranker_starting: u64 = 0; + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(cranker_starting, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!( + after_create.raw_result.is_ok(), + "create failed: {:?}", + after_create.raw_result + ); + + let mut funded = after_create.resulting_accounts.clone(); + top_up(&mut funded, crank_pda, 1_000_000); + + let trigger = trigger_ix(crank_pda, cranker); + let r = mollusk.process_transaction_instructions( + &[ + trigger, + memo_sibling(&[], b"alpha"), + memo_sibling(&[], b"beta"), + ], + &funded, + ); + assert!( + r.raw_result.is_ok(), + "trigger with 2 siblings failed: {:?}", + r.raw_result + ); + + let crank_acct = r + .resulting_accounts .iter() .find(|(k, _)| k == &crank_pda) .map(|(_, a)| a) .unwrap(); - *decode_header(&crank.data) - }; - assert_eq!(header.executed(), 2); - assert_eq!(header.remaining(), 0, "should be exhausted"); + let cranker_acct = r + .resulting_accounts + .iter() + .find(|(k, _)| k == &cranker) + .map(|(_, a)| a) + .unwrap(); - // Third trigger must fail: exhausted. - let r3 = mollusk.process_transaction_instructions(&[trigger, scheduled], &state); - assert!( - r3.raw_result.is_err(), - "3rd trigger must fail on exhausted crank" - ); -} + // One Trigger = one reward + one schedule advance, regardless of ix count. + assert_eq!( + cranker_acct.lamports, + cranker_starting + CRANKER_REWARD + priority_tip, + "single reward per trigger" + ); + let header = decode_header(&crank_acct.data); + assert_eq!(header.executed(), 1); + assert_eq!(header.remaining(), 9); + assert_eq!(header.next_exec_slot(), 100); + } -#[test] -fn trigger_rejects_without_followup() { - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let cranker = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let recipient = Pubkey::new_unique(); + #[test] + fn trigger_rejects_second_followup_mismatch() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + let create = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[ + ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"alpha", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"beta", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + let mut funded = after_create.resulting_accounts.clone(); + top_up(&mut funded, crank_pda, 1_000_000); + + let trigger = trigger_ix(crank_pda, cranker); + // Second sibling carries the wrong data. + let r = mollusk.process_transaction_instructions( + &[ + trigger, + memo_sibling(&[], b"alpha"), + memo_sibling(&[], b"WRONG"), + ], + &funded, + ); + assert!( + r.raw_result.is_err(), + "trigger must reject when the 2nd scheduled ix mismatches" + ); + } - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, // cu_limit - memo::ID, - &[], - b"tick", - ); + #[test] + fn trigger_rejects_missing_second_followup() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + let create = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[ + ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"alpha", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"beta", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + let mut funded = after_create.resulting_accounts.clone(); + top_up(&mut funded, crank_pda, 1_000_000); + + // Only the first scheduled ix is present; the second is missing. + let trigger = trigger_ix(crank_pda, cranker); + let r = mollusk + .process_transaction_instructions(&[trigger, memo_sibling(&[], b"alpha")], &funded); + assert!( + r.raw_result.is_err(), + "trigger must reject when a scheduled ix is missing" + ); + } - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let (memo_id, memo_acct) = memo::keyed_account(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (cranker, Account::new(0, 0, &system_program)), - (recipient, Account::new(0, 0, &system_program)), - (memo_id, memo_acct), - (system_program, system_program_acct), - ]; + #[test] + fn trigger_rejects_reordered_followups() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + let create = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[ + ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"alpha", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"beta", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + let mut funded = after_create.resulting_accounts.clone(); + top_up(&mut funded, crank_pda, 1_000_000); + + // Siblings present but swapped. + let trigger = trigger_ix(crank_pda, cranker); + let r = mollusk.process_transaction_instructions( + &[ + trigger, + memo_sibling(&[], b"beta"), + memo_sibling(&[], b"alpha"), + ], + &funded, + ); + assert!( + r.raw_result.is_err(), + "trigger must reject reordered scheduled ixs" + ); + } - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!(after_create.raw_result.is_ok()); + #[test] + fn create_rejects_zero_instructions() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + let ix = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[], // zero instructions + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + let r = mollusk.process_transaction_instructions(&[ix], &accounts); + assert!( + r.raw_result.is_err(), + "create must reject zero scheduled instructions" + ); + } - // Trigger alone — no follow-up. - let trigger = trigger_ix(crank_pda, cranker); - let result = - mollusk.process_transaction_instructions(&[trigger], &after_create.resulting_accounts); - assert!( - result.raw_result.is_err(), - "trigger should fail without follow-up, got: {:?}", - result.raw_result - ); + #[test] + fn create_rejects_signer_flag_in_second_ix() { + use hydra_api::consts::META_FLAG_SIGNER; + + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let fake = Pubkey::new_unique(); + + // Build wire by hand so we can set the signer flag on the 2nd ix's meta. + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let mut data = vec![ix::CREATE]; + data.extend_from_slice(&SEED); + data.extend_from_slice(&[0u8; 32]); + data.extend_from_slice(&0u64.to_le_bytes()); // start_slot + data.extend_from_slice(&100u64.to_le_bytes()); // interval + data.extend_from_slice(&10u64.to_le_bytes()); // remaining + data.extend_from_slice(&0u64.to_le_bytes()); // tip + data.extend_from_slice(&0u32.to_le_bytes()); // cu_limit + // ix 0: clean, no accounts. + data.push(0u8); + data.extend_from_slice(&1u16.to_le_bytes()); + data.extend_from_slice(&memo::ID.to_bytes()); + data.push(0x41); + // ix 1: poisoned signer meta. + data.push(1u8); + data.extend_from_slice(&1u16.to_le_bytes()); + data.extend_from_slice(&memo::ID.to_bytes()); + data.push(META_FLAG_SIGNER); + data.extend_from_slice(&fake.to_bytes()); + data.push(0x42); + + let bad_ix = Instruction { + program_id: hydra_id(), + accounts: vec![ + AccountMeta::new(payer, true), + AccountMeta::new(crank_pda, false), + AccountMeta::new_readonly(system_program, false), + ], + data, + }; + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + let r = mollusk.process_transaction_instructions(&[bad_ix], &accounts); + assert!( + r.raw_result.is_err(), + "create must reject a signer flag in any scheduled ix" + ); + } + + #[test] + fn create_allows_max_instructions_and_rejects_one_more() { + use hydra_api::consts::MAX_INSTRUCTIONS; + + let payer = Pubkey::new_unique(); + + // Exactly MAX_INSTRUCTIONS tiny memos -> ok. + let at_max: Vec = (0..MAX_INSTRUCTIONS) + .map(|_| ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"m", + }) + .collect(); + { + let mollusk = mollusk_with_hydra(); + let (crank_pda, _) = find_crank(&SEED); + let ix = create_ix_multi(payer, crank_pda, SEED, [0u8; 32], 0, 100, 10, 0, 0, &at_max); + let (system_program, sys_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, sys_acct), + ]; + let r = mollusk.process_transaction_instructions(&[ix], &accounts); + assert!( + r.raw_result.is_ok(), + "create must accept exactly MAX_INSTRUCTIONS: {:?}", + r.raw_result + ); + } + + // One past the cap -> rejected. + let over: Vec = (0..MAX_INSTRUCTIONS + 1) + .map(|_| ScheduledIx { + program_id: memo::ID, + metas: &[], + data: b"m", + }) + .collect(); + { + let mollusk = mollusk_with_hydra(); + const SEED_OVER: [u8; 32] = [0x55; 32]; + let (crank_pda, _) = find_crank(&SEED_OVER); + let ix = create_ix_multi( + payer, crank_pda, SEED_OVER, [0u8; 32], 0, 100, 10, 0, 0, &over, + ); + let (system_program, sys_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, sys_acct), + ]; + let r = mollusk.process_transaction_instructions(&[ix], &accounts); + assert!( + r.raw_result.is_err(), + "create must reject more than MAX_INSTRUCTIONS scheduled ixs" + ); + } + } + + #[test] + fn scheduled_ixs_from_crank_roundtrip_triggers() { + // The cranker reconstructs siblings purely from on-chain crank bytes via + // `scheduled_ixs_from_crank`. Feeding those reconstructed ixs back as the + // followups must satisfy `Trigger` — proving the parse is byte-exact. + // + // Uses the noop target (not memo) so an account meta can be exercised: noop + // ignores its accounts, whereas SPL memo would reject a non-signer one. + let mut mollusk = mollusk_with_hydra(); + load_noop(&mut mollusk); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let writable_acct = Pubkey::new_unique(); + + let create = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[ + ScheduledIx { + program_id: NOOP_ID, + metas: &[SchedMeta::writable(writable_acct)], + data: b"one", + }, + ScheduledIx { + program_id: NOOP_ID, + metas: &[], + data: b"two", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (writable_acct, Account::new(0, 0, &system_program)), + (system_program, system_program_acct), + ]; + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!(after_create.raw_result.is_ok()); + + let mut funded = after_create.resulting_accounts.clone(); + top_up(&mut funded, crank_pda, 1_000_000); + + // Reconstruct the siblings the same way the off-chain cranker does. + let crank_data = &funded.iter().find(|(k, _)| k == &crank_pda).unwrap().1.data; + let siblings = hydra_api::instruction::scheduled_ixs_from_crank(crank_data) + .expect("parse scheduled ixs"); + assert_eq!(siblings.len(), 2, "two scheduled ixs reconstructed"); + + let mut tx_ixs = vec![trigger_ix(crank_pda, cranker)]; + tx_ixs.extend(siblings); + let r = mollusk.process_transaction_instructions(&tx_ixs, &funded); + assert!( + r.raw_result.is_ok(), + "reconstructed siblings must satisfy Trigger: {:?}", + r.raw_result + ); + } } diff --git a/tests/programs/noop/Cargo.toml b/tests/programs/noop/Cargo.toml index a0a1800..4e7a1ce 100644 --- a/tests/programs/noop/Cargo.toml +++ b/tests/programs/noop/Cargo.toml @@ -9,8 +9,17 @@ publish = false [lib] crate-type = ["cdylib"] +[features] +custom-panic = [] +custom-heap = [] + [dependencies] pinocchio = { workspace = true } [package.metadata.solana] program-id = "4sdZFwGE7TkQCJVpfggvfy2ZwGNCfF6hAMJYjZU5HpZG" + +[lints.rust.unexpected_cfgs] +level = "warn" +priority = 0 +check-cfg = ['cfg(target_os, values("solana"))'] From 924fab47f051a2282511fc9d8bb0ba70ae8e4102 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 24 Jun 2026 16:08:02 +0200 Subject: [PATCH 02/33] feat: ephemeral cranks --- .gitignore | 3 +- Cargo.lock | 9274 +++++++++++++++++ Cargo.toml | 21 +- README.md | 74 + crates/hydra-api/Cargo.toml | 3 + crates/hydra-api/src/consts.rs | 16 +- crates/hydra-api/src/instruction.rs | 282 +- crates/hydra-api/src/lib.rs | 3 + examples/anchor/Cargo.lock | 3800 +++++++ examples/pinocchio/src/lib.rs | 2 +- programs/hydra/Cargo.toml | 12 +- programs/hydra/src/entrypoint.rs | 7 +- programs/hydra/src/processor/base/cancel.rs | 15 + .../hydra/src/processor/{ => base}/close.rs | 16 +- programs/hydra/src/processor/base/common.rs | 28 + programs/hydra/src/processor/base/create.rs | 119 + programs/hydra/src/processor/base/mod.rs | 8 + .../hydra/src/processor/{ => base}/trigger.rs | 82 +- programs/hydra/src/processor/cancel.rs | 50 - programs/hydra/src/processor/common.rs | 356 + programs/hydra/src/processor/create.rs | 256 - .../hydra/src/processor/ephemeral/cancel.rs | 25 + .../hydra/src/processor/ephemeral/close.rs | 46 + .../hydra/src/processor/ephemeral/common.rs | 17 + .../hydra/src/processor/ephemeral/create.rs | 67 + programs/hydra/src/processor/ephemeral/mod.rs | 8 + .../hydra/src/processor/ephemeral/trigger.rs | 79 + programs/hydra/src/processor/mod.rs | 15 +- tests/ephemeral/Cargo.lock | 5864 +++++++++++ tests/ephemeral/Cargo.toml | 35 + tests/ephemeral/src/lib.rs | 1 + tests/ephemeral/tests/lifecycle.rs | 452 + tests/programs/noop/src/lib.rs | 6 +- 33 files changed, 20539 insertions(+), 503 deletions(-) create mode 100644 Cargo.lock create mode 100644 examples/anchor/Cargo.lock create mode 100644 programs/hydra/src/processor/base/cancel.rs rename programs/hydra/src/processor/{ => base}/close.rs (82%) create mode 100644 programs/hydra/src/processor/base/common.rs create mode 100644 programs/hydra/src/processor/base/create.rs create mode 100644 programs/hydra/src/processor/base/mod.rs rename programs/hydra/src/processor/{ => base}/trigger.rs (66%) delete mode 100644 programs/hydra/src/processor/cancel.rs create mode 100644 programs/hydra/src/processor/common.rs delete mode 100644 programs/hydra/src/processor/create.rs create mode 100644 programs/hydra/src/processor/ephemeral/cancel.rs create mode 100644 programs/hydra/src/processor/ephemeral/close.rs create mode 100644 programs/hydra/src/processor/ephemeral/common.rs create mode 100644 programs/hydra/src/processor/ephemeral/create.rs create mode 100644 programs/hydra/src/processor/ephemeral/mod.rs create mode 100644 programs/hydra/src/processor/ephemeral/trigger.rs create mode 100644 tests/ephemeral/Cargo.lock create mode 100644 tests/ephemeral/Cargo.toml create mode 100644 tests/ephemeral/src/lib.rs create mode 100644 tests/ephemeral/tests/lifecycle.rs diff --git a/.gitignore b/.gitignore index 99e44a6..a99f04e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ -/target +target/ # Anchor example is its own workspace with its own target dir. /examples/anchor/target -Cargo.lock hydra-keypair.json noop-keypair.json *.so diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..2911fd4 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,9274 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[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-bls12-381" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816773371021cd9bba7a7b4204a2a241cfb45b842f7cc0982bd946ffdcdc4a07" +dependencies = [ + "blst", + "blstrs", + "bytemuck", + "bytemuck_derive", + "group", + "pairing", +] + +[[package]] +name = "agave-feature-set" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a2c365c0245cbb8959de725fc2b44c754b673fdf34c9a7f9d4a25c35a7bf1" +dependencies = [ + "ahash", + "solana-epoch-schedule 2.2.1", + "solana-hash 2.3.0", + "solana-pubkey 2.4.0", + "solana-sha256-hasher 2.3.0", + "solana-svm-feature-set 2.3.13", +] + +[[package]] +name = "agave-feature-set" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b16372df9ec6577a8e4140c85aa8b743d99945cbeebbc0d7b739136a4e601a4" +dependencies = [ + "ahash", + "solana-epoch-schedule 3.1.1", + "solana-hash 4.4.0", + "solana-keypair 3.1.2", + "solana-pubkey 4.2.0", + "solana-sha256-hasher 3.1.0", + "solana-svm-feature-set 4.0.0-beta.7", +] + +[[package]] +name = "agave-reserved-account-keys" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8289c8a8a2ef5aa10ce49a070f360f4e035ee3410b8d8f3580fb39d8cf042581" +dependencies = [ + "agave-feature-set 2.3.13", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "agave-syscalls" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3407f9617bf6f29b303b78e579f80dcaf9209fb016a20b60ab89dab2732fbb" +dependencies = [ + "agave-bls12-381", + "bincode 1.3.3", + "libsecp256k1", + "num-traits", + "solana-account 3.4.0", + "solana-account-info 3.1.1", + "solana-big-mod-exp 3.0.0", + "solana-blake3-hasher 3.1.0", + "solana-bn254", + "solana-clock 3.1.0", + "solana-cpi 3.1.0", + "solana-curve25519 4.0.1", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-keccak-hasher 3.1.0", + "solana-loader-v3-interface 6.1.1", + "solana-poseidon", + "solana-program-entrypoint 3.1.1", + "solana-program-runtime", + "solana-pubkey 4.2.0", + "solana-sbpf", + "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 4.0.0-beta.7", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-type-overrides", + "solana-sysvar 3.1.1", + "solana-sysvar-id 3.1.0", + "solana-transaction-context 4.0.0-beta.7", + "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 = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arc-swap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +dependencies = [ + "rustversion", +] + +[[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.118", +] + +[[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.118", +] + +[[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.118", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + +[[package]] +name = "asn1-rs" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "async-compression" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "autotools" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef941527c41b0fc0dd48511a8154cd5fc7e29200a0ff8b7203c5d777dbc795cf" +dependencies = [ + "cc", +] + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "bytes", + "futures-util", + "http 1.4.2", + "http-body", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.2", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[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 = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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", + "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]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +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 = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blst" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "blstrs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" +dependencies = [ + "blst", + "byte-slice-cast", + "ff", + "group", + "pairing", + "rand_core 0.6.4", + "serde", + "subtle", +] + +[[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.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" +dependencies = [ + "borsh-derive 1.7.0", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" +dependencies = [ + "once_cell", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[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 = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" +dependencies = [ + "serde", +] + +[[package]] +name = "caps" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" +dependencies = [ + "libc", +] + +[[package]] +name = "cc" +version = "1.2.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[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 = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "chunked_transfer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", +] + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii 0.9.3", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compression-codecs" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +dependencies = [ + "encode_unicode", + "libc", + "unicode-width", + "windows-sys 0.61.2", +] + +[[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-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 = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[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 = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +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 = "ctrlc" +version = "3.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" +dependencies = [ + "dispatch2", + "nix", + "windows-sys 0.61.2", +] + +[[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 = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[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 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.118", +] + +[[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.118", +] + +[[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.118", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "defmt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.6", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + +[[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 0.10.4", + "const-oid", + "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 = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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 2.2.0", + "spki", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature 2.2.0", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.2.0", + "ed25519 1.5.3", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek 4.1.3", + "ed25519 2.2.3", + "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.118", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "enum-iterator" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4549325971814bda7a44061bf3fe7e487d447cba01e4220a4b454d630d7a016" +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.118", +] + +[[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.118", +] + +[[package]] +name = "env_filter" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "ephemeral-rollups-pinocchio" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a09b61c47e5b4eeb7add34e9d43d836784a66d78fa704606bebaa453bef73e21" +dependencies = [ + "bincode 2.0.1", + "pinocchio 0.10.2", + "pinocchio-pubkey", + "pinocchio-system", + "solana-address 2.6.1", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastbloom" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" +dependencies = [ + "getrandom 0.3.4", + "libm", + "rand 0.9.4", + "siphasher", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[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 = [ + "bitvec", + "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" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" +dependencies = [ + "five8_core 1.0.0", +] + +[[package]] +name = "five8_const" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" +dependencies = [ + "five8_core 0.1.2", +] + +[[package]] +name = "five8_const" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" +dependencies = [ + "five8_core 1.0.0", +] + +[[package]] +name = "five8_core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" + +[[package]] +name = "five8_core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[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-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[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 = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix", + "windows-link", +] + +[[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", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand 0.8.6", + "rand_core 0.6.4", + "rand_xorshift", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.4.2", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[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.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "histogram" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.4.2", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.2", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hybrid-array" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +dependencies = [ + "typenum", +] + +[[package]] +name = "hydra" +version = "0.1.1" +dependencies = [ + "ephemeral-rollups-pinocchio", + "hydra-api", + "pinocchio 0.10.2", + "pinocchio-log", + "pinocchio-system", + "solana-define-syscall 5.1.0", +] + +[[package]] +name = "hydra-api" +version = "0.1.1" +dependencies = [ + "ephemeral-rollups-pinocchio", + "pinocchio 0.10.2", + "solana-account-info 3.1.1", + "solana-address 2.6.1", + "solana-cpi 3.1.0", + "solana-instruction 3.4.0", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "hydra-cranker" +version = "0.1.1" +dependencies = [ + "anyhow", + "clap", + "crossbeam-channel", + "ctrlc", + "env_logger", + "futures", + "hydra-api", + "log", + "prometheus", + "solana-account-decoder-client-types 4.0.0-beta.7", + "solana-client", + "solana-commitment-config 3.1.1", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-keypair 3.1.2", + "solana-message 3.1.0", + "solana-pubkey 4.2.0", + "solana-pubsub-client", + "solana-rpc-client-api", + "solana-signature 3.4.1", + "solana-signer 3.0.1", + "solana-transaction 3.1.0", + "tiny_http", + "tokio", + "yellowstone-grpc-client", + "yellowstone-grpc-proto", +] + +[[package]] +name = "hydra-example-native" +version = "0.1.0" +dependencies = [ + "hydra-api", + "mollusk-svm", + "solana-account 3.4.0", + "solana-account-info 3.1.1", + "solana-instruction 3.4.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "hydra-example-pinocchio" +version = "0.1.0" +dependencies = [ + "hydra-api", + "mollusk-svm", + "pinocchio 0.10.2", + "pinocchio-system", + "solana-account 3.4.0", + "solana-instruction 3.4.0", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "hydra-noop" +version = "0.1.0" +dependencies = [ + "pinocchio 0.10.2", +] + +[[package]] +name = "hydra-tests" +version = "0.1.1" +dependencies = [ + "hydra-api", + "mollusk-svm", + "mollusk-svm-programs-memo", + "solana-account 3.4.0", + "solana-instruction 3.4.0", + "solana-logger", + "solana-pubkey 4.2.0", + "solana-svm-log-collector", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "hyper" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http 1.4.2", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http 1.4.2", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.8", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http 1.4.2", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "indicatif" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +dependencies = [ + "console", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[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 = "jiff" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" +dependencies = [ + "defmt", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine 4.6.7", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.118", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.9", + "signature 2.2.0", +] + +[[package]] +name = "kaigan" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ba15de5aeb137f0f65aa3bf82187647f1285abfe5b20c80c2c37f7007ad519a" +dependencies = [ + "borsh 0.10.4", + "serde", +] + +[[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 = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "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 = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[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.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[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 = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "mollusk-svm" +version = "0.12.1-agave-4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2463c0d920535dc1a43a0e0ab8100f0dba5699e687f5593bad543440362574d5" +dependencies = [ + "agave-feature-set 4.0.0-beta.7", + "agave-syscalls", + "bincode 1.3.3", + "mollusk-svm-error", + "mollusk-svm-result", + "solana-account 3.4.0", + "solana-bpf-loader-program", + "solana-clock 3.1.0", + "solana-compute-budget", + "solana-epoch-rewards 3.0.2", + "solana-epoch-schedule 3.1.1", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-instructions-sysvar 3.0.1", + "solana-loader-v3-interface 6.1.1", + "solana-loader-v4-interface 3.1.0", + "solana-logger", + "solana-message 3.1.0", + "solana-precompile-error", + "solana-program-error 3.0.1", + "solana-program-runtime", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.0.2", + "solana-stake-interface 2.0.2", + "solana-svm-callback", + "solana-svm-log-collector", + "solana-svm-timings", + "solana-svm-transaction", + "solana-system-program", + "solana-sysvar 3.1.1", + "solana-sysvar-id 3.1.0", + "solana-transaction-context 4.0.0-beta.7", + "solana-transaction-error 3.2.1", +] + +[[package]] +name = "mollusk-svm-error" +version = "0.12.1-agave-4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51aa68fc50ff8a75fdde2ad966156f553a94e5a2ae680bc4fdd0d682a25e81e0" +dependencies = [ + "solana-pubkey 4.2.0", + "thiserror 2.0.18", +] + +[[package]] +name = "mollusk-svm-programs-memo" +version = "0.12.1-agave-4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbb5e0de9a80a67f93bcae44252e0c70f022459f34f5982cea5626fa0b61db30" +dependencies = [ + "mollusk-svm", + "solana-account 3.4.0", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "mollusk-svm-result" +version = "0.12.1-agave-4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29cb13af9a3aa05994d2bc327210177654c7ce3eb815791687dc24a339a05bd6" +dependencies = [ + "solana-account 3.4.0", + "solana-instruction 3.4.0", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-transaction-error 3.2.1", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[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-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[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.118", +] + +[[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 = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[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 = "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 = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[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 = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pinocchio" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8afe4f39c0e25cc471b35b89963312791a5162d45a86578cbeaad9e5e7d1b3b" + +[[package]] +name = "pinocchio" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06810dac15a4ef83d3dabdb4f2f22fb39c9adff669cd2781da4f716510a647c" +dependencies = [ + "solana-account-view", + "solana-address 2.6.1", + "solana-define-syscall 4.0.1", + "solana-instruction-view", + "solana-program-error 3.0.1", +] + +[[package]] +name = "pinocchio-log" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd11022408f312e6179ece321c1f7dc0d1b2aa7765fddd39b2a7378d65a899e8" +dependencies = [ + "pinocchio-log-macro", +] + +[[package]] +name = "pinocchio-log-macro" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fb52edb3c5736b044cc462b0957b9767d0f574d138f4e2761438c498a4b467" +dependencies = [ + "quote", + "regex", + "syn 1.0.109", +] + +[[package]] +name = "pinocchio-pubkey" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0225638cadcbebae8932cb7f49cb5da7c15c21beb19f048f05a5ca7d93f065" +dependencies = [ + "five8_const 0.1.4", + "pinocchio 0.9.3", + "sha2-const-stable", +] + +[[package]] +name = "pinocchio-system" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24044a0815753862b558e179e78f03f7344cb755de48617a09d7d23b50883b6c" +dependencies = [ + "pinocchio 0.10.2", + "solana-address 2.6.1", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[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 = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.118", +] + +[[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.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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 = "prometheus" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot", + "thiserror 1.0.69", +] + +[[package]] +name = "prost" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" +dependencies = [ + "heck", + "itertools 0.14.0", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "pulldown-cmark", + "pulldown-cmark-to-cmark", + "regex", + "syn 2.0.118", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "prost-types" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" +dependencies = [ + "prost", +] + +[[package]] +name = "protobuf-src" +version = "1.1.0+21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1" +dependencies = [ + "autotools", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" +dependencies = [ + "bitflags 2.13.0", + "memchr", + "unicase", +] + +[[package]] +name = "pulldown-cmark-to-cmark" +version = "22.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" +dependencies = [ + "pulldown-cmark", +] + +[[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.118", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" +dependencies = [ + "bytes", + "fastbloom", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +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 = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.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 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]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "regex" +version = "1.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.8", +] + +[[package]] +name = "reqwest-middleware" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" +dependencies = [ + "anyhow", + "async-trait", + "http 1.4.2", + "reqwest", + "serde", + "thiserror 1.0.69", + "tower-service", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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 = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[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-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" +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.118", +] + +[[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_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[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.118", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "solana-account" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f949fe4edaeaea78c844023bfc1c898e0b1f5a100f8a8d2d0f85d0a7b090258" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_bytes", + "serde_derive", + "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", + "solana-sysvar 2.3.0", +] + +[[package]] +name = "solana-account" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" +dependencies = [ + "bincode 1.3.3", + "qualifier_attr", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info 3.1.1", + "solana-clock 3.1.0", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", + "solana-sysvar 3.1.1", +] + +[[package]] +name = "solana-account-decoder" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba71c97fa4d85ce4a1e0e79044ad0406c419382be598c800202903a7688ce71a" +dependencies = [ + "Inflector", + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "bv", + "serde", + "serde_derive", + "serde_json", + "solana-account 2.2.1", + "solana-account-decoder-client-types 2.3.13", + "solana-address-lookup-table-interface 2.2.2", + "solana-clock 2.2.3", + "solana-config-program-client", + "solana-epoch-schedule 2.2.1", + "solana-fee-calculator 2.2.1", + "solana-instruction 2.3.3", + "solana-loader-v3-interface 5.0.0", + "solana-nonce 2.2.1", + "solana-program-option 2.2.1", + "solana-program-pack 2.2.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-slot-hashes 2.2.1", + "solana-slot-history 2.2.1", + "solana-stake-interface 1.2.1", + "solana-sysvar 2.3.0", + "solana-vote-interface 2.2.6", + "spl-generic-token 1.0.1", + "spl-token", + "spl-token-2022", + "spl-token-group-interface 0.6.0", + "spl-token-metadata-interface 0.7.0", + "thiserror 2.0.18", + "zstd", +] + +[[package]] +name = "solana-account-decoder" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cef67445b00fa0d3ab67ddd1397012d961cf74d1cb47224ba1375d351991181" +dependencies = [ + "Inflector", + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "bv", + "serde", + "serde_json", + "solana-account 3.4.0", + "solana-account-decoder-client-types 4.0.0-beta.7", + "solana-address-lookup-table-interface 3.1.0", + "solana-clock 3.1.0", + "solana-config-interface", + "solana-epoch-schedule 3.1.1", + "solana-fee-calculator 3.2.2", + "solana-instruction 3.4.0", + "solana-loader-v3-interface 6.1.1", + "solana-nonce 3.2.0", + "solana-program-option 3.1.0", + "solana-program-pack 3.1.0", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.0.2", + "solana-slot-history 3.0.1", + "solana-stake-interface 2.0.2", + "solana-sysvar 3.1.1", + "solana-vote-interface 5.1.1", + "spl-generic-token 2.0.1", + "spl-token-2022-interface", + "spl-token-group-interface 0.7.2", + "spl-token-interface", + "spl-token-metadata-interface 0.8.0", + "thiserror 2.0.18", + "zstd", +] + +[[package]] +name = "solana-account-decoder-client-types" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5519e8343325b707f17fbed54fcefb325131b692506d0af9e08a539d15e4f8cf" +dependencies = [ + "base64 0.22.1", + "bs58", + "serde", + "serde_derive", + "serde_json", + "solana-account 2.2.1", + "solana-pubkey 2.4.0", + "zstd", +] + +[[package]] +name = "solana-account-decoder-client-types" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da42c070e1d8a268c9ab746352ad1883c81af2529b3d11cb66d8484a746bd9d8" +dependencies = [ + "base64 0.22.1", + "bs58", + "serde", + "serde_json", + "solana-account 3.4.0", + "solana-pubkey 4.2.0", + "zstd", +] + +[[package]] +name = "solana-account-info" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" +dependencies = [ + "bincode 1.3.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" +dependencies = [ + "solana-address 2.6.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", +] + +[[package]] +name = "solana-account-view" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37ca34c37f92ee341b73d5ce7c8ef5bb38e9a87955b4bd343c63fa18b149215" +dependencies = [ + "solana-address 2.6.1", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-address" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" +dependencies = [ + "solana-address 2.6.1", +] + +[[package]] +name = "solana-address" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39c93e262f671bf402e1040e4a7e40b05d81da5956c7681948c975a0997517bb" +dependencies = [ + "borsh 1.7.0", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "five8 1.0.0", + "five8_const 1.0.0", + "serde", + "serde_derive", + "sha2-const-stable", + "solana-atomic-u64 3.0.1", + "solana-define-syscall 5.1.0", + "solana-nullable", + "solana-program-error 3.0.1", + "solana-sanitize 3.0.1", + "solana-sha256-hasher 3.1.0", + "wincode", +] + +[[package]] +name = "solana-address-lookup-table-interface" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1673f67efe870b64a65cb39e6194be5b26527691ce5922909939961a6e6b395" +dependencies = [ + "bincode 1.3.3", + "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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115b4f773acc4f3f3cb986b0d335e9845c0368c82b0940410935bc11ae065578" +dependencies = [ + "bincode 1.3.3", + "bytemuck", + "serde", + "serde_derive", + "solana-clock 3.1.0", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.0.2", +] + +[[package]] +name = "solana-atomic-u64" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-atomic-u64" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-big-mod-exp" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "solana-define-syscall 2.3.0", +] + +[[package]] +name = "solana-big-mod-exp" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "solana-define-syscall 3.0.0", +] + +[[package]] +name = "solana-bincode" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" +dependencies = [ + "bincode 1.3.3", + "serde", + "solana-instruction 2.3.3", +] + +[[package]] +name = "solana-bincode" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" +dependencies = [ + "bincode 1.3.3", + "serde_core", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" +dependencies = [ + "blake3", + "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", + "solana-define-syscall 5.1.0", + "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.7.0", +] + +[[package]] +name = "solana-borsh" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" +dependencies = [ + "borsh 1.7.0", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edf1bfaec45842de224500eca224d17483c749e8408b79edac0fa55d99d0ef8" +dependencies = [ + "agave-syscalls", + "bincode 1.3.3", + "qualifier_attr", + "solana-account 3.4.0", + "solana-bincode 3.1.0", + "solana-clock 3.1.0", + "solana-instruction 3.4.0", + "solana-loader-v3-interface 6.1.1", + "solana-loader-v4-interface 3.1.0", + "solana-packet", + "solana-program-entrypoint 3.1.1", + "solana-program-runtime", + "solana-pubkey 4.2.0", + "solana-sbpf", + "solana-sdk-ids 3.1.0", + "solana-svm-feature-set 4.0.0-beta.7", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-system-interface 3.2.0", + "solana-transaction-context 4.0.0-beta.7", +] + +[[package]] +name = "solana-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0254ae347d34fbb7d4561c5b4a1de762f177cbbc6d11a257b69564a18bb91eb" +dependencies = [ + "async-trait", + "bincode 1.3.3", + "dashmap", + "futures", + "futures-util", + "indexmap", + "indicatif", + "log", + "quinn", + "rayon", + "solana-account 3.4.0", + "solana-client-traits", + "solana-commitment-config 3.1.1", + "solana-connection-cache", + "solana-epoch-info", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-keypair 3.1.2", + "solana-measure", + "solana-message 3.1.0", + "solana-net-utils", + "solana-pubkey 4.2.0", + "solana-pubsub-client", + "solana-quic-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", + "solana-signature 3.4.1", + "solana-signer 3.0.1", + "solana-streamer", + "solana-time-utils", + "solana-tls-utils", + "solana-tpu-client", + "solana-transaction 3.1.0", + "solana-transaction-error 3.2.1", + "solana-transaction-status-client-types 4.0.0-beta.7", + "solana-udp-client", + "thiserror 2.0.18", + "tokio", + "tokio-util", +] + +[[package]] +name = "solana-client-traits" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08618ed587e128105510c54ae3e456b9a06d674d8640db75afe66dad65cb4e02" +dependencies = [ + "solana-account 3.4.0", + "solana-commitment-config 3.1.1", + "solana-epoch-info", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-keypair 3.1.2", + "solana-message 3.1.0", + "solana-pubkey 3.0.0", + "solana-signature 3.4.1", + "solana-signer 3.0.1", + "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", + "solana-transaction-error 3.2.1", +] + +[[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea35d8f69b67daddb921a9da7f78ca591b533cf5e98833cd9ae62fdc2e4652c" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-cluster-type" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a494cf8eda7d98d9f0144b288bb409c88308d2e86f15cc1045aa77b83304718" +dependencies = [ + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-commitment-config" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac49c4dde3edfa832de1697e9bcdb7c3b3f7cb7a1981b7c62526c8bb6700fb73" + +[[package]] +name = "solana-commitment-config" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1517aa49dcfa9cb793ef90e7aac81346d62ca4a546bb1a754030a033e3972e1c" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-compute-budget" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aea798cdce381dc8ac72ca970a30fab63bf208f3c2879841a997dc335d07cd6" +dependencies = [ + "solana-fee-structure", + "solana-program-runtime", +] + +[[package]] +name = "solana-config-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e401ae56aed512821cc7a0adaa412ff97fecd2dff4602be7b1330d2daec0c4" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-account 3.4.0", + "solana-instruction 3.4.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.2", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-config-program-client" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53aceac36f105fd4922e29b4f0c1f785b69d7b3e7e387e384b8985c8e0c3595e" +dependencies = [ + "bincode 1.3.3", + "borsh 0.10.4", + "kaigan", + "serde", + "solana-program", +] + +[[package]] +name = "solana-connection-cache" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891144968e18addbf553a00db8b15ffe906d1bced65fac35df97d42c40f2db1" +dependencies = [ + "async-trait", + "bincode 1.3.3", + "crossbeam-channel", + "futures-util", + "indexmap", + "log", + "rand 0.9.4", + "rayon", + "solana-keypair 3.1.2", + "solana-measure", + "solana-metrics", + "solana-time-utils", + "solana-transaction-error 3.2.1", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-cpi" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" +dependencies = [ + "solana-account-info 2.3.0", + "solana-define-syscall 2.3.0", + "solana-instruction 2.3.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 3.1.1", + "solana-define-syscall 4.0.1", + "solana-instruction 3.4.0", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", + "solana-stable-layout 3.0.1", +] + +[[package]] +name = "solana-curve25519" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae4261b9a8613d10e77ac831a8fa60b6fa52b9b103df46d641deff9f9812a23" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "solana-define-syscall 2.3.0", + "subtle", + "thiserror 2.0.18", +] + +[[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 4.1.3", + "solana-define-syscall 3.0.0", + "subtle", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-curve25519" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b4d2a4bf0d0b0a86c22111917e86e8bd39a7b31420fb2c7d73eb83761fc7af" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "solana-define-syscall 5.1.0", + "subtle", + "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" +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 = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "939756d798b25c5ec3cca10e06212bdca3b1443cb9bb740a38124f58b258737b" +dependencies = [ + "derivation-path", + "qstring", + "uriparse", +] + +[[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-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" +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.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 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-epoch-schedule" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fce071fbddecc55d727b1d7ed16a629afe4f6e4c217bc8d00af3b785f6f67ed" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-epoch-schedule" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad280b1ed803853f7b453cb3ea9a57e600ca5599a63e69f7be199b486c0ec93" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-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-feature-gate-interface" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f5c5382b449e8e4e3016fb05e418c53d57782d8b5c30aa372fc265654b956d" +dependencies = [ + "bincode 1.3.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" +dependencies = [ + "serde", + "serde_derive", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", +] + +[[package]] +name = "solana-fee-calculator" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89bc408da0fb3812bc3008189d148b4d3e08252c79ad810b245482a3f70cd8d" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-fee-calculator" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef67f01cc6a0c72e99a08d0d484683f995de4c80e9568728fa77d1537f9b7e09" +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 = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" +dependencies = [ + "borsh 1.7.0", + "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" +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 = [ + "bytemuck", + "bytemuck_derive", + "five8 1.0.0", + "serde", + "serde_derive", + "solana-atomic-u64 3.0.1", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-inflation" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf104167e42e747602b88e02b25cacfc5de699c3b7cbba60d3250437e6a22ed" + +[[package]] +name = "solana-instruction" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab5682934bd1f65f8d2c16f21cb532526fcc1a09f796e2cacdb091eee5774ad" +dependencies = [ + "bincode 1.3.3", + "borsh 1.7.0", + "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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" +dependencies = [ + "bincode 1.3.3", + "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 3.0.1", +] + +[[package]] +name = "solana-instruction-view" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60147e4d0a4620013df40bf30a86dd299203ff12fcb8b593cd51014fce0875d8" +dependencies = [ + "solana-account-view", + "solana-address 2.6.1", + "solana-define-syscall 4.0.1", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-instructions-sysvar" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" +dependencies = [ + "bitflags 2.13.0", + "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]] +name = "solana-instructions-sysvar" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0732294560e88ecdb2bbc656e67383e9f88c78ec09469cef172f0d28cd1bcd" +dependencies = [ + "bitflags 2.13.0", + "solana-account-info 3.1.1", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-program-error 3.0.1", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-serialize-utils 3.1.2", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-keccak-hasher" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" +dependencies = [ + "sha3", + "solana-define-syscall 2.3.0", + "solana-hash 2.3.0", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-keccak-hasher" +version = "3.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 = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd3f04aa1a05c535e93e121a95f66e7dcccf57e007282e8255535d24bf1e98bb" +dependencies = [ + "ed25519-dalek 1.0.1", + "five8 0.2.1", + "rand 0.7.3", + "solana-pubkey 2.4.0", + "solana-seed-phrase 2.2.1", + "solana-signature 2.3.0", + "solana-signer 2.2.1", + "wasm-bindgen", +] + +[[package]] +name = "solana-keypair" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" +dependencies = [ + "ed25519-dalek 2.2.0", + "five8 1.0.0", + "five8_core 1.0.0", + "rand 0.9.4", + "solana-address 2.6.1", + "solana-seed-phrase 3.0.0", + "solana-signature 3.4.1", + "solana-signer 3.0.1", +] + +[[package]] +name = "solana-last-restart-slot" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6360ac2fdc72e7463565cd256eedcf10d7ef0c28a1249d261ec168c1b55cdd" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-last-restart-slot" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "426711c6564b790026e45cabec3c64b971864c48b6b2d83c0ebf52a118bb4cda" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-loader-v2-interface" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8ab08006dad78ae7cd30df8eea0539e207d08d91eaefb3e1d49a446e1c49654" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 2.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]] +name = "solana-loader-v3-interface" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e0538d4dbc9022e01616f1c58f2db98ece739c5d5ed4a2ef8737a953e76a2d4" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 3.4.0", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "706a777242f1f39a83e2a96a2a6cb034cb41169c6ecbee2cf09cb873d9659e7e" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 2.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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 3.4.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-logger" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef7421d1092680d72065edbf5c7605856719b021bf5f173656c71febcdd5d003" +dependencies = [ + "env_logger", + "lazy_static", + "libc", + "log", + "signal-hook", +] + +[[package]] +name = "solana-measure" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6bf53782db446797b3cb1116edb00709b5767409724058bba14281673f56025" + +[[package]] +name = "solana-message" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1796aabce376ff74bf89b78d268fa5e683d7d7a96a0a4e4813ec34de49d5314b" +dependencies = [ + "bincode 1.3.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" +dependencies = [ + "bincode 1.3.3", + "lazy_static", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.2", + "solana-transaction-error 3.2.1", +] + +[[package]] +name = "solana-metrics" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b84339a82ea4e2b87dadf13bccf71d3dd6c42db26bbfae9c602663d6a0c892f" +dependencies = [ + "crossbeam-channel", + "gethostname", + "log", + "reqwest", + "solana-cluster-type", + "solana-sha256-hasher 3.1.0", + "solana-time-utils", + "thiserror 2.0.18", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726b7cbbc6be6f1c6f29146ac824343b9415133eee8cce156452ad1db93f8008" +dependencies = [ + "solana-define-syscall 5.1.0", +] + +[[package]] +name = "solana-native-token" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61515b880c36974053dd499c0510066783f0cc6ac17def0c7ef2a244874cf4a9" + +[[package]] +name = "solana-net-utils" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5456d9f922b0b222e305c7dae2ebdeecdb8f1cfa95e879ca81109349fc9b8927" +dependencies = [ + "anyhow", + "bincode 1.3.3", + "bytes", + "cfg-if", + "dashmap", + "itertools 0.14.0", + "log", + "nix", + "rand 0.9.4", + "serde", + "socket2", + "solana-serde", + "solana-svm-type-overrides", + "tokio", + "url", +] + +[[package]] +name = "solana-nonce" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703e22eb185537e06204a5bd9d509b948f0066f2d1d814a6f475dafb3ddf1325" +dependencies = [ + "serde", + "serde_derive", + "solana-fee-calculator 2.2.1", + "solana-hash 2.3.0", + "solana-pubkey 2.4.0", + "solana-sha256-hasher 2.3.0", +] + +[[package]] +name = "solana-nonce" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95dbc9f2e33b6c10e231df15cb2a3bff9ea7eab6347f9e316fe75c97fd67bbb" +dependencies = [ + "serde", + "serde_derive", + "solana-fee-calculator 3.2.2", + "solana-hash 4.4.0", + "solana-pubkey 4.2.0", + "solana-sha256-hasher 3.1.0", +] + +[[package]] +name = "solana-nonce-account" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" +dependencies = [ + "solana-account 3.4.0", + "solana-hash 3.1.0", + "solana-nonce 3.2.0", + "solana-sdk-ids 3.1.0", +] + +[[package]] +name = "solana-nullable" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0f95d3028ef0f682bb174b77379c19d5dae2904a649f4a103fe29be7a139980" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "solana-packet" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad62e1045c2347a0c0e219a6ceb0abfe904be622920996bfcac8d116fabe3c7" +dependencies = [ + "bincode 1.3.3", + "bitflags 2.13.0", + "cfg_eval", + "serde", + "serde_derive", + "serde_with", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-perf" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b28abb6bf9ef6d6bd57003dded119a4d20022a390405bc3f9a49c8b5abbc03be" +dependencies = [ + "ahash", + "bincode 1.3.3", + "bv", + "bytes", + "caps", + "curve25519-dalek 4.1.3", + "dlopen2", + "fnv", + "libc", + "log", + "nix", + "num_cpus", + "rand 0.9.4", + "rayon", + "serde", + "solana-hash 4.4.0", + "solana-message 3.1.0", + "solana-metrics", + "solana-packet", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.2", + "solana-signature 3.4.1", + "solana-time-utils", + "solana-transaction-context 4.0.0-beta.7", +] + +[[package]] +name = "solana-poseidon" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "737b8ab25bf4cc8e618f80f1fe40709b2ace708bc764a36b8a4c81eea8c07034" +dependencies = [ + "ark-bn254 0.4.0", + "ark-bn254 0.5.0", + "light-poseidon 0.2.0", + "light-poseidon 0.4.0", + "solana-define-syscall 4.0.1", + "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 = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" +dependencies = [ + "bincode 1.3.3", + "blake3", + "borsh 0.10.4", + "borsh 1.7.0", + "bs58", + "bytemuck", + "console_error_panic_hook", + "console_log", + "getrandom 0.2.17", + "lazy_static", + "log", + "memoffset", + "num-bigint 0.4.6", + "num-derive", + "num-traits", + "rand 0.8.6", + "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", + "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", + "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-entrypoint" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ce041b1a0ed275290a5008ee1a4a6c48f5054c8a3d78d313c08958a06aedbd" +dependencies = [ + "solana-account-info 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-program-entrypoint" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c9b0a1ff494e05f503a08b3d51150b73aa639544631e510279d6375f290997" +dependencies = [ + "solana-account-info 3.1.1", + "solana-define-syscall 4.0.1", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-program-error" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee2e0217d642e2ea4bee237f37bd61bb02aec60da3647c48ff88f6556ade775" +dependencies = [ + "borsh 1.7.0", + "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 1.7.0", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4068648649653c2c50546e9a7fb761791b5ab0cda054c771bb5808d3a4b9eb52" +dependencies = [ + "solana-define-syscall 4.0.1", +] + +[[package]] +name = "solana-program-option" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc677a2e9bc616eda6dbdab834d463372b92848b2bfe4a1ed4e4b4adba3397d0" + +[[package]] +name = "solana-program-option" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a88006a9b8594088cec9027ab77caaaa258a2aaa2083d3f086c44b42e50aeab" + +[[package]] +name = "solana-program-pack" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "319f0ef15e6e12dc37c597faccb7d62525a509fec5f6975ecb9419efddeb277b" +dependencies = [ + "solana-program-error 2.2.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 3.0.1", +] + +[[package]] +name = "solana-program-runtime" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7d2dca474d6a6af35c670ec82a0f20cdab1fd7978502d61f4797f840e2eb7e" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "cfg-if", + "itertools 0.14.0", + "log", + "percentage", + "rand 0.9.4", + "serde", + "solana-account 3.4.0", + "solana-account-info 3.1.1", + "solana-clock 3.1.0", + "solana-epoch-rewards 3.0.2", + "solana-epoch-schedule 3.1.1", + "solana-fee-structure", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-last-restart-slot 3.0.1", + "solana-loader-v3-interface 6.1.1", + "solana-program-entrypoint 3.1.1", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.0.2", + "solana-stable-layout 3.0.1", + "solana-stake-interface 2.0.2", + "solana-svm-callback", + "solana-svm-feature-set 4.0.0-beta.7", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-transaction", + "solana-svm-type-overrides", + "solana-system-interface 3.2.0", + "solana-sysvar 3.1.1", + "solana-sysvar-id 3.1.0", + "solana-transaction-context 4.0.0-beta.7", + "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.7.0", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" +dependencies = [ + "solana-address 1.1.0", +] + +[[package]] +name = "solana-pubkey" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" +dependencies = [ + "solana-address 2.6.1", +] + +[[package]] +name = "solana-pubsub-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cad54242be1408458425420623c6772e39417aa872deffde531cebea697f032" +dependencies = [ + "crossbeam-channel", + "futures-util", + "http 0.2.12", + "log", + "semver", + "serde", + "serde_json", + "solana-account-decoder-client-types 4.0.0-beta.7", + "solana-clock 3.1.0", + "solana-pubkey 4.2.0", + "solana-rpc-client-types", + "solana-signature 3.4.1", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c86939caa34beff3ac630ea84ce443e5f4eac83d1ef009da51b2e2465821a3e" +dependencies = [ + "async-lock", + "async-trait", + "futures", + "itertools 0.14.0", + "log", + "quinn", + "quinn-proto", + "rustls", + "solana-connection-cache", + "solana-keypair 3.1.2", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-pubkey 4.2.0", + "solana-rpc-client-api", + "solana-signer 3.0.1", + "solana-streamer", + "solana-tls-utils", + "solana-transaction-error 3.2.1", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-rent" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1aea8fdea9de98ca6e8c2da5827707fb3842833521b528a713810ca685d2480" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-rent" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e860d5499a705369778647e97d760f7670adfb6fc8419dd3d568deccd46d5487" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-rent" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40f02fbe2669ebe5d851dbf29a02e91ed6244b051bb64fcc57e6644aba636063" +dependencies = [ + "solana-sdk-macro 3.0.1", +] + +[[package]] +name = "solana-reward-info" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18205b69139b1ae0ab8f6e11cdcb627328c0814422ad2482000fa2ca54ae4a2f" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-reward-info" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f4c5c5b5599e640c15ead65be499d60f6ee62a5ba7aa7e23f5b0537046ed49" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-rpc-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1085efc9679ad7eb357b0bc711a16ff106a2f031bf7501d7279adf360fd6928f" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "futures", + "indicatif", + "log", + "reqwest", + "reqwest-middleware", + "semver", + "serde", + "serde_json", + "solana-account 3.4.0", + "solana-account-decoder 4.0.0-beta.7", + "solana-account-decoder-client-types 4.0.0-beta.7", + "solana-clock 3.1.0", + "solana-commitment-config 3.1.1", + "solana-epoch-info", + "solana-epoch-schedule 3.1.1", + "solana-feature-gate-interface 3.1.0", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-message 3.1.0", + "solana-pubkey 4.2.0", + "solana-rpc-client-api", + "solana-signature 3.4.1", + "solana-transaction 3.1.0", + "solana-transaction-error 3.2.1", + "solana-transaction-status-client-types 4.0.0-beta.7", + "solana-version", + "solana-vote-interface 5.1.1", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7a12b9801d7bca997a8bc0494df224eafee830f6313cc65100c76bb5df4c46d" +dependencies = [ + "anyhow", + "jsonrpc-core", + "reqwest", + "reqwest-middleware", + "serde", + "serde_json", + "solana-account-decoder-client-types 4.0.0-beta.7", + "solana-clock 3.1.0", + "solana-rpc-client-types", + "solana-signer 3.0.1", + "solana-transaction-error 3.2.1", + "solana-transaction-status-client-types 4.0.0-beta.7", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e2be4dff153d2df5b8ad07e0bd655a55fd672c2667fe6b6a48a87fa439ffa5" +dependencies = [ + "solana-account 3.4.0", + "solana-commitment-config 3.1.1", + "solana-hash 4.4.0", + "solana-message 3.1.0", + "solana-nonce 3.2.0", + "solana-pubkey 4.2.0", + "solana-rpc-client", + "solana-sdk-ids 3.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-rpc-client-types" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3196fe76562ac3a68deef16914074c60132321b681dbb33f5ea8d5adb1fe0b4d" +dependencies = [ + "base64 0.22.1", + "bs58", + "semver", + "serde", + "serde_json", + "solana-account 3.4.0", + "solana-account-decoder-client-types 4.0.0-beta.7", + "solana-address 2.6.1", + "solana-clock 3.1.0", + "solana-commitment-config 3.1.1", + "solana-fee-calculator 3.2.2", + "solana-inflation", + "solana-reward-info 5.0.0", + "solana-transaction 3.1.0", + "solana-transaction-error 3.2.1", + "solana-transaction-status-client-types 4.0.0-beta.7", + "solana-version", + "spl-generic-token 2.0.1", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-sanitize" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" + +[[package]] +name = "solana-sanitize" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" + +[[package]] +name = "solana-sbpf" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733b3657a0fab205102b799dbe17f85d3972cf984232c1b0b108fa6ba438e382" +dependencies = [ + "byteorder", + "combine 3.8.1", + "hash32", + "libc", + "log", + "rand 0.8.6", + "rustc-demangle", + "thiserror 2.0.18", + "winapi", +] + +[[package]] +name = "solana-sdk-ids" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5d8b9cc68d5c88b062a33e23a6466722467dde0035152d8fb1afbcdf350a5f" +dependencies = [ + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-sdk-ids" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" +dependencies = [ + "solana-address 2.6.1", +] + +[[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.118", +] + +[[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.118", +] + +[[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" +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-security-txt" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94a02d486b28f219a4f8f5d7dd93cbfbb93c9f466cb7871c22e50cd5ae9a7a2" + +[[package]] +name = "solana-seed-derivable" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beb82b5adb266c6ea90e5cf3967235644848eac476c5a1f2f9283a143b7c97f" +dependencies = [ + "solana-derivation-path 2.2.1", +] + +[[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 3.0.0", +] + +[[package]] +name = "solana-seed-phrase" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36187af2324f079f65a675ec22b31c24919cb4ac22c79472e85d819db9bbbc15" +dependencies = [ + "hmac", + "pbkdf2", + "sha2 0.10.9", +] + +[[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" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a7e155eba458ecfb0107b98236088c3764a09ddf0201ec29e52a0be40857113" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serde-varint" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950e5b83e839dc0f92c66afc124bb8f40e89bc90f0579e8ec5499296d27f54e3" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serialize-utils" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e" +dependencies = [ + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-serialize-utils" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761357b0853c9623bf12c1d2314b3d6160a85b087b84c45224fb85766d22616b" +dependencies = [ + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-sha256-hasher" +version = "2.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]] +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 = "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8250a4495aad49ad20556a607da53bdcb20de78da10b65afbf918b7f1de647" +dependencies = [ + "serde_core", +] + +[[package]] +name = "solana-signature" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c" +dependencies = [ + "ed25519-dalek 1.0.1", + "five8 0.2.1", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-signature" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0364c7577c3c82a693ce28a1febc8d1b5d1b0a175fdc2114ae6186b69effe1e" +dependencies = [ + "ed25519-dalek 2.2.0", + "five8 1.0.0", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize 3.0.1", + "wincode", +] + +[[package]] +name = "solana-signer" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c41991508a4b02f021c1342ba00bcfa098630b213726ceadc7cb032e051975b" +dependencies = [ + "solana-pubkey 2.4.0", + "solana-signature 2.3.0", + "solana-transaction-error 2.2.1", +] + +[[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 3.4.1", + "solana-transaction-error 3.2.1", +] + +[[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]] +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 3.1.0", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-slot-history" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ccc1b2067ca22754d5283afb2b0126d61eae734fc616d23871b0943b0d935e" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-slot-history" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0622d03a823770f7763afd866e012b296d5a3cbbbe51e110b5bd9ab3441efdca" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-stable-layout" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54" +dependencies = [ + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-stable-layout" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" +dependencies = [ + "solana-instruction 3.4.0", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-stake-interface" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c" +dependencies = [ + "borsh 0.10.4", + "borsh 1.7.0", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-clock 3.1.0", + "solana-cpi 3.1.0", + "solana-instruction 3.4.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 3.1.0", +] + +[[package]] +name = "solana-streamer" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9891af44a3cb707db4a393018bfe6b7cc3dd90390801a6f414ec246fabede4b0" +dependencies = [ + "arc-swap", + "bytes", + "crossbeam-channel", + "dashmap", + "futures", + "futures-util", + "histogram", + "indexmap", + "itertools 0.14.0", + "libc", + "log", + "nix", + "num_cpus", + "pem", + "percentage", + "quinn", + "quinn-proto", + "rand 0.9.4", + "rustls", + "smallvec", + "socket2", + "solana-keypair 3.1.2", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-packet", + "solana-perf", + "solana-pubkey 4.2.0", + "solana-signature 3.4.1", + "solana-signer 3.0.1", + "solana-time-utils", + "solana-tls-utils", + "solana-transaction-error 3.2.1", + "solana-transaction-metrics-tracker", + "thiserror 2.0.18", + "tokio", + "tokio-util", + "x509-parser", +] + +[[package]] +name = "solana-svm-callback" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93b1a838ccefa6cf68e21ca189b116d62fbc35863f90f130f8df5e475f4f62b" +dependencies = [ + "solana-account 3.4.0", + "solana-clock 3.1.0", + "solana-precompile-error", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-svm-feature-set" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f24b836eb4d74ec255217bdbe0f24f64a07adeac31aca61f334f91cd4a3b1d5" + +[[package]] +name = "solana-svm-feature-set" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2770de6ab3b2f74b1942128fe6e32f343f4df23b116e9b94bd6860b753d0551b" + +[[package]] +name = "solana-svm-log-collector" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cbf4f01eb9bcb5067f8dba54faff46ce6e2994257a200ee7bb1c33d77cb920e" +dependencies = [ + "log", +] + +[[package]] +name = "solana-svm-measure" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f8d068d88ee2b88c74cfa5bb7bca7834fe018aa8f3df1ed283f1ac38649c7f" + +[[package]] +name = "solana-svm-timings" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95296e38354367ab4a9cf479d249f672725a5ffd8cae53be007d2fb59a95bbda" +dependencies = [ + "eager", + "enum-iterator", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-svm-transaction" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45b79ea0ddc2af9283e86af3bc0480a0a677ba9c3b7575fd57ded6c0ae1cc689" +dependencies = [ + "solana-hash 4.4.0", + "solana-message 3.1.0", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", + "solana-signature 3.4.1", + "solana-transaction 3.1.0", +] + +[[package]] +name = "solana-svm-type-overrides" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d07694a92c868df19651367412658373cb38386fca7d68454e925cd73ad090" +dependencies = [ + "rand 0.9.4", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-instruction 3.4.0", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-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 3.4.0", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-system-program" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07658a2f4fba704cdcd27896e26d4991b3c9648978adccc1fbe2184040f4bcf1" +dependencies = [ + "bincode 1.3.3", + "log", + "serde", + "solana-account 3.4.0", + "solana-bincode 3.1.0", + "solana-fee-calculator 3.2.2", + "solana-instruction 3.4.0", + "solana-nonce 3.2.0", + "solana-nonce-account", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-system-interface 3.2.0", + "solana-sysvar 3.1.1", + "solana-transaction-context 4.0.0-beta.7", +] + +[[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 1.3.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info 3.1.1", + "solana-clock 3.1.0", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards 3.0.2", + "solana-epoch-schedule 3.1.1", + "solana-fee-calculator 3.2.2", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-last-restart-slot 3.0.1", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-slot-hashes 3.0.2", + "solana-slot-history 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-sysvar-id" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1" +dependencies = [ + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-sysvar-id" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +dependencies = [ + "solana-address 2.6.1", + "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-tls-utils" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df6db6c17ff9c5a1240a86185804541ee681024e7fc551821df007d2af220a66" +dependencies = [ + "rustls", + "solana-keypair 3.1.2", + "solana-pubkey 4.2.0", + "solana-signer 3.0.1", + "x509-parser", +] + +[[package]] +name = "solana-tpu-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cde6ca8723785945cf0d6e51285e1b642c0d9ac7140412797d69c51d44d3b6a" +dependencies = [ + "async-trait", + "bincode 1.3.3", + "futures-util", + "indexmap", + "indicatif", + "log", + "rayon", + "solana-client-traits", + "solana-clock 3.1.0", + "solana-commitment-config 3.1.1", + "solana-connection-cache", + "solana-epoch-schedule 3.1.1", + "solana-measure", + "solana-message 3.1.0", + "solana-net-utils", + "solana-pubkey 4.2.0", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-signature 3.4.1", + "solana-signer 3.0.1", + "solana-transaction 3.1.0", + "solana-transaction-error 3.2.1", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-transaction" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80657d6088f721148f5d889c828ca60c7daeedac9a8679f9ec215e0c42bcbf41" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 2.3.0", + "solana-instruction 2.3.3", + "solana-keypair 2.2.3", + "solana-message 2.4.0", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-short-vec 2.2.1", + "solana-signature 2.3.0", + "solana-transaction-error 2.2.1", + "wasm-bindgen", +] + +[[package]] +name = "solana-transaction" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-message 3.1.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.2", + "solana-signature 3.4.1", + "solana-signer 3.0.1", + "solana-transaction-error 3.2.1", +] + +[[package]] +name = "solana-transaction-context" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a312304361987a85b2ef2293920558e6612876a639dd1309daf6d0d59ef2fe" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-account 2.2.1", + "solana-instruction 2.3.3", + "solana-instructions-sysvar 2.2.2", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-transaction-context" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e081c70560c26b67c1e8451c71c08dd70a44f288aa1d006cd1554e9a834b1a72" +dependencies = [ + "bincode 1.3.3", + "qualifier_attr", + "serde", + "solana-account 3.4.0", + "solana-instruction 3.4.0", + "solana-instructions-sysvar 3.0.1", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sbpf", + "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 = [ + "serde", + "serde_derive", + "solana-instruction 2.3.3", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-transaction-error" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441d6dcd51100e7d97c3fb3b723e08aa701066ff7afc00026fd8d8e222cb95b" +dependencies = [ + "serde", + "serde_derive", + "solana-instruction-error", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-transaction-metrics-tracker" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb1d14966612be1eefb10c325a6335a64f8fb5446c9b70dfcccdda21af9cab9" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "log", + "rand 0.9.4", + "solana-packet", + "solana-perf", + "solana-short-vec 3.2.2", + "solana-signature 3.4.1", +] + +[[package]] +name = "solana-transaction-status" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135f92f4192cc68900c665becf97fc0a6500ae5a67ff347bf2cbc20ecfefa821" +dependencies = [ + "Inflector", + "agave-reserved-account-keys", + "base64 0.22.1", + "bincode 1.3.3", + "borsh 1.7.0", + "bs58", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder 2.3.13", + "solana-address-lookup-table-interface 2.2.2", + "solana-clock 2.2.3", + "solana-hash 2.3.0", + "solana-instruction 2.3.3", + "solana-loader-v2-interface", + "solana-loader-v3-interface 5.0.0", + "solana-message 2.4.0", + "solana-program-option 2.2.1", + "solana-pubkey 2.4.0", + "solana-reward-info 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-signature 2.3.0", + "solana-stake-interface 1.2.1", + "solana-system-interface 1.0.0", + "solana-transaction 2.2.3", + "solana-transaction-error 2.2.1", + "solana-transaction-status-client-types 2.3.13", + "solana-vote-interface 2.2.6", + "spl-associated-token-account", + "spl-memo", + "spl-token", + "spl-token-2022", + "spl-token-group-interface 0.6.0", + "spl-token-metadata-interface 0.7.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-transaction-status-client-types" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f1d7c2387c35850848212244d2b225847666cb52d3bd59a5c409d2c300303d" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types 2.3.13", + "solana-commitment-config 2.2.1", + "solana-message 2.4.0", + "solana-reward-info 2.2.1", + "solana-signature 2.3.0", + "solana-transaction 2.2.3", + "solana-transaction-context 2.3.13", + "solana-transaction-error 2.2.1", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-transaction-status-client-types" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb387b44eec1887694ac2264e35951f0c0763014b6593ae17f13cb3088fa2cc" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "serde", + "serde_json", + "solana-account-decoder-client-types 4.0.0-beta.7", + "solana-commitment-config 3.1.1", + "solana-instruction 3.4.0", + "solana-message 3.1.0", + "solana-pubkey 4.2.0", + "solana-reward-info 5.0.0", + "solana-signature 3.4.1", + "solana-transaction 3.1.0", + "solana-transaction-context 4.0.0-beta.7", + "solana-transaction-error 3.2.1", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-udp-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6bc4cca754805d6b90b97c675de71c1e1492315127c2fda0798178a42ad63f" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-keypair 3.1.2", + "solana-net-utils", + "solana-streamer", + "solana-transaction-error 3.2.1", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-version" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5316d63c5a8dfce421d49f5c2234e568f8fe34e1a372d6f55e397f11c623b475" +dependencies = [ + "agave-feature-set 4.0.0-beta.7", + "rand 0.9.4", + "semver", + "serde", + "solana-sanitize 3.0.1", + "solana-serde-varint 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 1.3.3", + "num-derive", + "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]] +name = "solana-vote-interface" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d444ce30b6b4f9c281ba06061ea96638d063b53c2171b1e41ba02ebff79ed28f" +dependencies = [ + "bincode 1.3.3", + "cfg_eval", + "num-derive", + "num-traits", + "serde", + "serde_derive", + "serde_with", + "solana-clock 3.1.0", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-rent 4.2.1", + "solana-sdk-ids 3.1.0", + "solana-serde-varint 3.0.1", + "solana-serialize-utils 3.1.2", + "solana-short-vec 3.2.2", + "solana-system-interface 3.2.0", +] + +[[package]] +name = "solana-zero-copy" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea15126ebdc7e270c50d43884369af9f51d2308156d46a18e351522a164844d" +dependencies = [ + "borsh 1.7.0", + "bytemuck", + "bytemuck_derive", +] + +[[package]] +name = "solana-zk-sdk" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b9fc6ec37d16d0dccff708ed1dd6ea9ba61796700c3bb7c3b401973f10f63b" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode 1.3.3", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "itertools 0.12.1", + "js-sys", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.6", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-derivation-path 2.2.1", + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-seed-derivable 2.2.1", + "solana-seed-phrase 2.2.1", + "solana-signature 2.3.0", + "solana-signer 2.2.1", + "subtle", + "thiserror 2.0.18", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-zk-sdk" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode 1.3.3", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "getrandom 0.2.17", + "itertools 0.12.1", + "js-sys", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.6", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-derivation-path 3.0.0", + "solana-instruction 3.4.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-seed-derivable 3.0.0", + "solana-seed-phrase 3.0.0", + "solana-signature 3.4.1", + "solana-signer 3.0.1", + "subtle", + "thiserror 2.0.18", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "spl-associated-token-account" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae179d4a26b3c7a20c839898e6aed84cb4477adf108a366c95532f058aea041b" +dependencies = [ + "borsh 1.7.0", + "num-derive", + "num-traits", + "solana-program", + "spl-associated-token-account-client", + "spl-token", + "spl-token-2022", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-associated-token-account-client" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f8349dbcbe575f354f9a533a21f272f3eb3808a49e2fdc1c34393b88ba76cb" +dependencies = [ + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "spl-discriminator" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3" +dependencies = [ + "bytemuck", + "solana-program-error 2.2.2", + "solana-sha256-hasher 2.3.0", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e597c5ff9ed7c74a54dbc47bae2f06e4db8c98f4356ad280200dc11878266db1" +dependencies = [ + "bytemuck", + "solana-program-error 3.0.1", + "solana-sha256-hasher 3.1.0", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.118", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.9", + "syn 2.0.118", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-elgamal-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65edfeed09cd4231e595616aa96022214f9c9d2be02dea62c2b30d5695a6833a" +dependencies = [ + "bytemuck", + "solana-account-info 2.3.0", + "solana-cpi 2.2.1", + "solana-instruction 2.3.3", + "solana-msg 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", + "solana-sysvar 2.3.0", + "solana-zk-sdk 2.3.13", + "spl-pod 0.5.1", + "spl-token-confidential-transfer-proof-extraction 0.3.0", +] + +[[package]] +name = "spl-generic-token" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741a62a566d97c58d33f9ed32337ceedd4e35109a686e31b1866c5dfa56abddc" +dependencies = [ + "bytemuck", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "spl-generic-token" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233df81b75ab99b42f002b5cdd6e65a7505ffa930624f7096a7580a56765e9cf" +dependencies = [ + "bytemuck", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "spl-memo" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb" +dependencies = [ + "solana-account-info 2.3.0", + "solana-instruction 2.3.3", + "solana-msg 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "spl-pod" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d994afaf86b779104b4a95ba9ca75b8ced3fdb17ee934e38cb69e72afbe17799" +dependencies = [ + "borsh 1.7.0", + "bytemuck", + "bytemuck_derive", + "num-derive", + "num-traits", + "solana-decode-error", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-program-option 2.2.1", + "solana-pubkey 2.4.0", + "solana-zk-sdk 2.3.13", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-pod" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9c6e142cdf1e7e77f480053ec9f0ce989890768ddf91f619b50f39d1b456f5" +dependencies = [ + "borsh 1.7.0", + "bytemuck", + "bytemuck_derive", + "num-derive", + "num-traits", + "num_enum", + "solana-program-error 3.0.1", + "solana-program-option 3.1.0", + "solana-pubkey 3.0.0", + "solana-zero-copy", + "solana-zk-sdk 4.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-program-error" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdebc8b42553070b75aa5106f071fef2eb798c64a7ec63375da4b1f058688c6" +dependencies = [ + "num-derive", + "num-traits", + "solana-decode-error", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "spl-program-error-derive", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2539e259c66910d78593475540e8072f0b10f0f61d7607bbf7593899ed52d0" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.9", + "syn 2.0.118", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1408e961215688715d5a1063cbdcf982de225c45f99c82b4f7d7e1dd22b998d7" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "solana-account-info 2.3.0", + "solana-decode-error", + "solana-instruction 2.3.3", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator 0.4.1", + "spl-pod 0.5.1", + "spl-program-error", + "spl-type-length-value 0.8.0", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053067c6a82c705004f91dae058b11b4780407e9ccd6799dc9e7d0fab5f242da" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info 2.3.0", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.3", + "solana-msg 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-program-option 2.2.1", + "solana-program-pack 2.2.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sysvar 2.3.0", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-2022" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f0dfbb079eebaee55e793e92ca5f433744f4b71ee04880bfd6beefba5973e5" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info 2.3.0", + "solana-clock 2.2.3", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.3", + "solana-msg 2.2.1", + "solana-native-token", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-program-option 2.2.1", + "solana-program-pack 2.2.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-security-txt", + "solana-system-interface 1.0.0", + "solana-sysvar 2.3.0", + "solana-zk-sdk 2.3.13", + "spl-elgamal-registry", + "spl-memo", + "spl-pod 0.5.1", + "spl-token", + "spl-token-confidential-transfer-ciphertext-arithmetic", + "spl-token-confidential-transfer-proof-extraction 0.3.0", + "spl-token-confidential-transfer-proof-generation 0.4.1", + "spl-token-group-interface 0.6.0", + "spl-token-metadata-interface 0.7.0", + "spl-transfer-hook-interface", + "spl-type-length-value 0.8.0", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-2022-interface" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fcd81188211f4b3c8a5eba7fd534c7142f9dd026123b3472492782cc72f4dc6" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info 3.1.1", + "solana-instruction 3.4.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 3.1.0", + "solana-zk-sdk 4.0.0", + "spl-pod 0.7.3", + "spl-token-confidential-transfer-proof-extraction 0.5.1", + "spl-token-confidential-transfer-proof-generation 0.5.1", + "spl-token-group-interface 0.7.2", + "spl-token-metadata-interface 0.8.0", + "spl-type-length-value 0.9.1", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-ciphertext-arithmetic" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cddd52bfc0f1c677b41493dafa3f2dbbb4b47cf0990f08905429e19dc8289b35" +dependencies = [ + "base64 0.22.1", + "bytemuck", + "solana-curve25519 2.3.13", + "solana-zk-sdk 2.3.13", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-extraction" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe2629860ff04c17bafa9ba4bed8850a404ecac81074113e1f840dbd0ebb7bd6" +dependencies = [ + "bytemuck", + "solana-account-info 2.3.0", + "solana-curve25519 2.3.13", + "solana-instruction 2.3.3", + "solana-instructions-sysvar 2.2.2", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-zk-sdk 2.3.13", + "spl-pod 0.5.1", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-extraction" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879a9ebad0d77383d3ea71e7de50503554961ff0f4ef6cbca39ad126e6f6da3a" +dependencies = [ + "bytemuck", + "solana-account-info 3.1.1", + "solana-curve25519 3.1.14", + "solana-instruction 3.4.0", + "solana-instructions-sysvar 3.0.1", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-zk-sdk 4.0.0", + "spl-pod 0.7.3", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-generation" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa27b9174bea869a7ebf31e0be6890bce90b1a4288bc2bbf24bd413f80ae3fde" +dependencies = [ + "curve25519-dalek 4.1.3", + "solana-zk-sdk 2.3.13", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-generation" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0cd59fce3dc00f563c6fa364d67c3f200d278eae681f4dc250240afcfe044b1" +dependencies = [ + "curve25519-dalek 4.1.3", + "solana-zk-sdk 4.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5597b4cd76f85ce7cd206045b7dc22da8c25516573d42d267c8d1fd128db5129" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "solana-decode-error", + "solana-instruction 2.3.3", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator 0.4.1", + "spl-pod 0.5.1", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841cbd6f2322d02719be4da1affedbe6495b1048b7b985ec9796032564026e22" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-address 2.6.1", + "solana-instruction 3.4.0", + "solana-nullable", + "solana-program-error 3.0.1", + "solana-zero-copy", + "spl-discriminator 0.5.2", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c564ac05a7c8d8b12e988a37d82695b5ba4db376d07ea98bc4882c81f96c7f3" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-instruction 3.4.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 3.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304d6e06f0de0c13a621464b1fd5d4b1bebf60d15ca71a44d3839958e0da16ee" +dependencies = [ + "borsh 1.7.0", + "num-derive", + "num-traits", + "solana-borsh 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.3", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator 0.4.1", + "spl-pod 0.5.1", + "spl-type-length-value 0.8.0", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c467c7c3bd056f8fe60119e7ec34ddd6f23052c2fa8f1f51999098063b72676" +dependencies = [ + "borsh 1.7.0", + "num-derive", + "num-traits", + "solana-borsh 3.0.2", + "solana-instruction 3.4.0", + "solana-program-error 3.0.1", + "solana-pubkey 3.0.0", + "spl-discriminator 0.5.2", + "spl-pod 0.7.3", + "spl-type-length-value 0.9.1", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e905b849b6aba63bde8c4badac944ebb6c8e6e14817029cbe1bc16829133bd" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "solana-account-info 2.3.0", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.3", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "spl-discriminator 0.4.1", + "spl-pod 0.5.1", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value 0.8.0", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-type-length-value" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d417eb548214fa822d93f84444024b4e57c13ed6719d4dcc68eec24fb481e9f5" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "solana-account-info 2.3.0", + "solana-decode-error", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "spl-discriminator 0.4.1", + "spl-pod 0.5.1", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-type-length-value" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2504631748c48d2a937414d64a12dcac4588d34bd07d355d648619c189d29435" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info 3.1.1", + "solana-program-error 3.0.1", + "solana-zero-copy", + "spl-discriminator 0.5.2", + "thiserror 2.0.18", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[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.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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.118", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny_http" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" +dependencies = [ + "ascii 1.1.0", + "chunked_transfer", + "httpdate", + "log", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[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 = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "futures-util", + "pin-project-lite", + "tokio", +] + +[[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 = "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 = "tonic" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" +dependencies = [ + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "flate2", + "h2", + "http 1.4.2", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "rustls-native-certs", + "socket2", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", + "zstd", +] + +[[package]] +name = "tonic-build" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f61875ac5293cf72e6c8cf0158086428c82c37229e98c840878f1706b0322" +dependencies = [ + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "tonic-health" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcfab99db777fba2802f0dfa861d1628d1ae916fb199d29819941f139ae85082" +dependencies = [ + "prost", + "tokio", + "tokio-stream", + "tonic", + "tonic-prost", +] + +[[package]] +name = "tonic-prost" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" +dependencies = [ + "bytes", + "prost", + "tonic", +] + +[[package]] +name = "tonic-prost-build" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "654e5643eff75d7f8c99197ce1440ed19a3474eada74c12bbac488b2cafdae27" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.118", + "tempfile", + "tonic-build", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "indexmap", + "pin-project-lite", + "slab", + "sync_wrapper", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "async-compression", + "bitflags 2.13.0", + "bytes", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body", + "http-body-util", + "pin-project-lite", + "tokio", + "tokio-util", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http 1.4.2", + "httparse", + "log", + "rand 0.9.4", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", + "webpki-roots 0.26.11", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[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 = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[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 = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[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.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.118", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.8", +] + +[[package]] +name = "webpki-roots" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +dependencies = [ + "rustls-pki-types", +] + +[[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-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" +dependencies = [ + "pastey", + "proc-macro2", + "quote", + "thiserror 2.0.18", + "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.118", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x509-parser" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "yellowstone-grpc-client" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38a9ba079420757406d603cd5f27b8c6f6e94c415c30a43b19ef4a0c4a5ff0d1" +dependencies = [ + "bytes", + "futures", + "thiserror 1.0.69", + "tonic", + "tonic-health", + "yellowstone-grpc-proto", +] + +[[package]] +name = "yellowstone-grpc-proto" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbba21b6046eff1c9be2366a70d7264763b10004306e874b54409503a39e5f1e" +dependencies = [ + "anyhow", + "bincode 1.3.3", + "prost", + "prost-types", + "protobuf-src", + "solana-account 2.2.1", + "solana-account-decoder 2.3.13", + "solana-clock 2.2.3", + "solana-hash 2.3.0", + "solana-message 2.4.0", + "solana-pubkey 2.4.0", + "solana-signature 2.3.0", + "solana-transaction 2.2.3", + "solana-transaction-context 2.3.13", + "solana-transaction-error 2.2.1", + "solana-transaction-status", + "tonic", + "tonic-build", + "tonic-prost", + "tonic-prost-build", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure", +] + +[[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.118", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index f3c843a..9bf9ce5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,9 +22,13 @@ license = "MIT" repository = "https://github.com/magicblock-labs/hydra" [workspace.dependencies] -pinocchio = { version = "0.11", features = ["cpi"] } -pinocchio-system = "0.6" +pinocchio = { version = "0.10", features = ["cpi"] } +pinocchio-system = "0.5" pinocchio-log = "0.5" +# CPI helpers for MagicBlock ephemeral accounts (used by the ephemeral-crank +# instructions). Tracks pinocchio 0.10, which is why the program is pinned to +# 0.10 rather than 0.11. +ephemeral-rollups-pinocchio = "0.15" solana-address = { version = "2.6", features = ["decode", "curve25519"] } solana-define-syscall = "5.0" hydra-api = { path = "crates/hydra-api" } @@ -32,11 +36,18 @@ hydra-api = { path = "crates/hydra-api" } # tests only: mollusk-svm = "=0.12.1-agave-4.0" mollusk-svm-programs-memo = "=0.12.1-agave-4.0" -solana-svm-log-collector = { version = "4.0.0-beta", features = ["agave-unstable-api"] } +solana-svm-log-collector = { version = "4.0.0-beta", features = [ + "agave-unstable-api", +] } solana-logger = "3" -solana-account = "3.0" solana-instruction = "3.0" solana-pubkey = "4.0" +solana-account = "3.0" +solana-keypair = "3.1" +solana-message = "3.0.1" +solana-signer = "3.0" +solana-transaction = "3.0" +solana-hash = "3.1.0" solana-system-interface = { version = "2.0", features = ["bincode"] } [profile.release] @@ -47,5 +58,5 @@ overflow-checks = true [workspace.lints.rust] unexpected_cfgs = { level = "warn", check-cfg = [ 'cfg(target_os, values("solana"))', - 'cfg(feature, values("create-account-allow-prefund", "custom-alloc", "custom-panic", "no-entrypoint", "logging"))', + 'cfg(feature, values("create-account-allow-prefund", "custom-alloc", "custom-panic", "no-entrypoint", "logging", "ephemeral"))', ] } diff --git a/README.md b/README.md index 20c1319..29514b5 100644 --- a/README.md +++ b/README.md @@ -262,6 +262,10 @@ Useful alerts: ## Instruction Reference +Discriminators `0–3` are the base-layer crank. Discriminators `4–7` are the +[ephemeral-rollup crank](#ephemeral-rollup-crank-feature-ephemeral), compiled +only under the `ephemeral` feature. + | Disc | Name | Accounts | Data | | ---: | --------- | --------------------------------------------- | ---------------- | | 0 | `Create` | `payer(w,s), crank(w), system_program` | schedule payload | @@ -280,6 +284,76 @@ the crank PDA — no dedicated instruction exists. - `MAX_DATA_LEN = 1024` - reward is fixed at `10_000` lamports plus the stored priority tip +## Ephemeral Rollup Crank (feature `ephemeral`) + +Behind the optional `ephemeral` cargo feature, Hydra exposes a parallel set of +instructions that run a crank on a [MagicBlock](https://magicblock.gg) **ephemeral +rollup (ER)**, where the crank lives as a MagicBlock **ephemeral account** instead +of a base-layer PDA. The default (mainnet) build neither compiles this code nor +pulls its dependency (`ephemeral-rollups-pinocchio`). + +The model is the same as the base crank — a crank stores scheduled instructions, +anyone triggers them when due, and `Trigger` verifies the follow-up siblings with +the same single `memcmp` — with two differences the ER forces: + +- **Ephemeral accounts hold zero lamports.** Rent (a flat per-byte fee) is paid by + a sponsor into a shared vault, not held in the account. So there is no cranker + reward, no priority-tip payout, and no rent floor: `TriggerEphemeral` only + verifies the follow-up ix and advances the schedule (slot check, decrement + `remaining`, bump `executed`). +- **Creation is a single instruction.** The Magic program materializes the + ephemeral account synchronously, so `CreateEphemeral` allocates the crank (via a + Magic CPI signed by the crank PDA) and writes its header + scheduled-ix tail in + one instruction — no separate init step. + +Lifecycle: `CreateEphemeral` → `TriggerEphemeral` (+ scheduled siblings, run +top-level on the ER) → `CancelEphemeral` (authority-gated) / `CloseEphemeral` +(permissionless, when the crank is exhausted or stuck). `Cancel`/`Close` CPI the +Magic program to close the ephemeral account and refund the vault rent to the +sponsor; if a non-zero `authority` is set, only that authority may close it. The +crank PDA derivation (`[b"crank", seed]`) and the on-chain `Crank` layout are +unchanged, so the template / verification model is identical. + +### Instruction Reference (ephemeral) + +| Disc | Name | Accounts | Data | +| ---: | ------------------ | --------------------------------------------------- | ---------------- | +| 4 | `CreateEphemeral` | `sponsor(w,s), crank(w), vault(w), magic_program` | schedule payload | +| 5 | `TriggerEphemeral` | `crank(w), cranker(w,s), instructions_sysvar` | none | +| 6 | `CancelEphemeral` | `authority(w,s), crank(w), vault(w), magic_program` | none | +| 7 | `CloseEphemeral` | `reporter(w,s), crank(w), vault(w), magic_program` | none | + +`vault` is the ephemeral rent vault and `magic_program` is MagicBlock's Magic +program; `hydra-api` exposes both as `consts::magic::EPHEMERAL_VAULT_ID` / +`MAGIC_PROGRAM_ID`, and the `client`-feature builder fills them in. `sponsor` must +be an account delegated to the ER (it pays the rent and sets `authority_signer`). + +Build a `CreateEphemeral` with the same `CreateArgs` as base `create`: + +```rust +use hydra_api::instruction::{self as ix, CreateArgs, ScheduledIx}; + +let (crank, _bump) = ix::find_crank_pda(&seed); +let create = ix::create_ephemeral( + sponsor_pubkey, + crank, + &CreateArgs { seed, authority, start_slot: 0, interval_slots: 50, + remaining: 0, priority_tip: 0, cu_limit: 0, scheduled }, +); +``` + +### Build & test + +```sh +# Build the program with the ephemeral instructions. +cargo build-sbf --manifest-path programs/hydra/Cargo.toml -- --features ephemeral + +# End-to-end lifecycle tests run against a local MagicSVM simulator. `tests/ephemeral` +# is an isolated crate (its own lockfile); see its module docs for the exact steps. +cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml +cargo test --manifest-path tests/ephemeral/Cargo.toml +``` + ## Releasing `hydra-api` is the only crate published to crates.io (`hydra` is a program, diff --git a/crates/hydra-api/Cargo.toml b/crates/hydra-api/Cargo.toml index d091b3a..1477ef7 100644 --- a/crates/hydra-api/Cargo.toml +++ b/crates/hydra-api/Cargo.toml @@ -24,8 +24,11 @@ cpi-native = [ # `pinocchio::cpi::invoke_signed` with `InstructionView`s built on the # stack (no allocations, usable from `no_std` programs). cpi-pinocchio = ["pinocchio/cpi"] +# Ephemeral-rollup crank instructions use a different program ID. +ephemeral = [] [dependencies] +ephemeral-rollups-pinocchio = { workspace = true } pinocchio = { workspace = true } solana-address = { workspace = true } solana-instruction = { workspace = true, optional = true } diff --git a/crates/hydra-api/src/consts.rs b/crates/hydra-api/src/consts.rs index e7811bc..a878c80 100644 --- a/crates/hydra-api/src/consts.rs +++ b/crates/hydra-api/src/consts.rs @@ -5,7 +5,11 @@ pub const CRANK_SEED_PREFIX: &[u8] = b"crank"; /// Solana base transaction fee (lamports per signature). +#[cfg(not(feature = "ephemeral"))] pub const BASE_FEE_LAMPORTS: u64 = 5_000; +/// 100x cheaper on the ephemeral rollup. +#[cfg(feature = "ephemeral")] +pub const BASE_FEE_LAMPORTS: u64 = 50; /// Flat per-trigger reward paid to the cranker. Equals `2 × base_fee`. pub const CRANKER_REWARD: u64 = 2 * BASE_FEE_LAMPORTS; @@ -34,12 +38,18 @@ pub const CRANK_HEADER_SIZE: usize = 120; /// "don't emit `SetComputeUnitLimit`" (inherits the 200 k/ix default). pub const MAX_COMPUTE_UNIT_LIMIT: u32 = 1_400_000; +/// Expected number of slots per day. +#[cfg(not(feature = "ephemeral"))] +pub const SLOT_FREQUENCY_MS: u64 = 400; +#[cfg(feature = "ephemeral")] +pub const SLOT_FREQUENCY_MS: u64 = 50; + /// Slots of overdue past `next_exec_slot` after which a crank is considered /// stuck and `Close` becomes permissionlessly callable. `next_exec_slot` only -/// advances on successful `Trigger`, so a crank whose inner ix deterministically +/// advances on successful `Trigger`, so a crank whose inner ixs deterministically /// fails (or whose target is paused) would otherwise pin its rent forever. -/// ~10 days at 400 ms/slot: 10 × 86_400 / 0.4 = 2_160_000. -pub const STALENESS_THRESHOLD_SLOTS: u64 = 2_160_000; +/// ~10 days +pub const STALENESS_THRESHOLD_SLOTS: u64 = 10 * 86_400_000 / SLOT_FREQUENCY_MS; /// Per-meta size in both the on-chain template bytes and the instructions /// sysvar wire format: `[1 flag byte][32-byte pubkey]`. diff --git a/crates/hydra-api/src/instruction.rs b/crates/hydra-api/src/instruction.rs index 8b88413..770ebc3 100644 --- a/crates/hydra-api/src/instruction.rs +++ b/crates/hydra-api/src/instruction.rs @@ -52,6 +52,7 @@ mod client { use solana_pubkey::{pubkey, Pubkey}; use crate::consts::{ix, META_FLAG_WRITABLE}; + use crate::instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}; /// Solana's built-in instructions sysvar pubkey. pub const INSTRUCTIONS_SYSVAR_ID: Pubkey = @@ -104,103 +105,218 @@ mod client { pub data: &'a [u8], } - /// All the scheduling knobs for `Create` - pub struct CreateArgs<'a> { - pub seed: [u8; 32], - /// All-zeros = unkillable (no cancel authority). - pub authority: [u8; 32], - pub start_slot: u64, - pub interval_slots: u64, - /// `0` on the wire means "infinite"; Hydra stores `u64::MAX` internally. - pub remaining: u64, - pub priority_tip: u64, - /// Compute-unit limit the cranker emits as `SetComputeUnitLimit` - /// right before `Trigger`. `0` = no ix (inherits the 200 k/ix - /// default). Capped at `MAX_COMPUTE_UNIT_LIMIT` (1.4 M) at `Create`. - pub cu_limit: u32, - /// The scheduled instructions, in execution order. Must be non-empty - pub scheduled: &'a [ScheduledIx<'a>], - } + #[cfg(not(feature = "ephemeral"))] + mod base { + use super::*; + + /// All the scheduling knobs for `Create` + pub struct CreateArgs<'a> { + pub seed: [u8; 32], + /// All-zeros = unkillable (no cancel authority). + pub authority: [u8; 32], + pub start_slot: u64, + pub interval_slots: u64, + /// `0` on the wire means "infinite"; Hydra stores `u64::MAX` internally. + pub remaining: u64, + pub priority_tip: u64, + /// Compute-unit limit the cranker emits as `SetComputeUnitLimit` + /// right before `Trigger`. `0` = no ix (inherits the 200 k/ix + /// default). Capped at `MAX_COMPUTE_UNIT_LIMIT` (1.4 M) at `Create`. + pub cu_limit: u32, + /// The scheduled instructions, in execution order. Must be non-empty + pub scheduled: &'a [ScheduledIx<'a>], + } - /// Build a `Create` instruction. - pub fn create(payer: Pubkey, crank: Pubkey, args: &CreateArgs<'_>) -> Instruction { - let body_len: usize = args - .scheduled - .iter() - .map(|s| super::CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) - .sum(); - let mut data = Vec::with_capacity(1 + super::CREATE_FIXED_PREFIX_LEN + body_len); - data.push(ix::CREATE); - data.extend_from_slice(&args.seed); - data.extend_from_slice(&args.authority); - data.extend_from_slice(&args.start_slot.to_le_bytes()); - data.extend_from_slice(&args.interval_slots.to_le_bytes()); - data.extend_from_slice(&args.remaining.to_le_bytes()); - data.extend_from_slice(&args.priority_tip.to_le_bytes()); - data.extend_from_slice(&args.cu_limit.to_le_bytes()); - for s in args.scheduled { - data.push(s.metas.len() as u8); - data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); - data.extend_from_slice(&s.program_id.to_bytes()); - for m in s.metas { - let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; - data.push(flag); - data.extend_from_slice(&m.pubkey.to_bytes()); + /// Build a `Create` instruction scheduling a single instruction. + pub fn create(payer: Pubkey, crank: Pubkey, args: &CreateArgs<'_>) -> Instruction { + let body_len: usize = args + .scheduled + .iter() + .map(|s| CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) + .sum(); + let mut data = Vec::with_capacity(1 + CREATE_FIXED_PREFIX_LEN + body_len); + data.push(ix::CREATE); + data.extend_from_slice(&args.seed); + data.extend_from_slice(&args.authority); + data.extend_from_slice(&args.start_slot.to_le_bytes()); + data.extend_from_slice(&args.interval_slots.to_le_bytes()); + data.extend_from_slice(&args.remaining.to_le_bytes()); + data.extend_from_slice(&args.priority_tip.to_le_bytes()); + data.extend_from_slice(&args.cu_limit.to_le_bytes()); + for s in args.scheduled { + data.push(s.metas.len() as u8); + data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); + data.extend_from_slice(&s.program_id.to_bytes()); + for m in s.metas { + let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; + data.push(flag); + data.extend_from_slice(&m.pubkey.to_bytes()); + } + data.extend_from_slice(s.data); + } + + Instruction { + program_id: program_id(), + accounts: alloc::vec![ + AccountMeta::new(payer, true), + AccountMeta::new(crank, false), + AccountMeta::new_readonly(SYSTEM_PROGRAM_ID, false), + ], + data, } - data.extend_from_slice(s.data); } - Instruction { - program_id: program_id(), - accounts: alloc::vec![ - AccountMeta::new(payer, true), - AccountMeta::new(crank, false), - AccountMeta::new_readonly(SYSTEM_PROGRAM_ID, false), - ], - data, + /// Build a `Trigger` instruction. Must be paired in the same tx with the + /// scheduled instruction at `current_ix_index + 1`. + pub fn trigger(crank: Pubkey, cranker: Pubkey) -> Instruction { + Instruction { + program_id: program_id(), + accounts: alloc::vec![ + AccountMeta::new(crank, false), + AccountMeta::new(cranker, true), + AccountMeta::new_readonly(INSTRUCTIONS_SYSVAR_ID, false), + ], + data: alloc::vec![ix::TRIGGER], + } } - } - /// Build a `Trigger` instruction. Must be paired in the same tx with the - /// scheduled instruction at `current_ix_index + 1`. - pub fn trigger(crank: Pubkey, cranker: Pubkey) -> Instruction { - Instruction { - program_id: program_id(), - accounts: alloc::vec![ - AccountMeta::new(crank, false), - AccountMeta::new(cranker, true), - AccountMeta::new_readonly(INSTRUCTIONS_SYSVAR_ID, false), - ], - data: alloc::vec![ix::TRIGGER], + /// Build a `Cancel` instruction. + pub fn cancel(authority: Pubkey, crank: Pubkey, recipient: Pubkey) -> Instruction { + Instruction { + program_id: program_id(), + accounts: alloc::vec![ + AccountMeta::new_readonly(authority, true), + AccountMeta::new(crank, false), + AccountMeta::new(recipient, false), + ], + data: alloc::vec![ix::CANCEL], + } } - } - /// Build a `Cancel` instruction. - pub fn cancel(authority: Pubkey, crank: Pubkey, recipient: Pubkey) -> Instruction { - Instruction { - program_id: program_id(), - accounts: alloc::vec![ - AccountMeta::new_readonly(authority, true), - AccountMeta::new(crank, false), - AccountMeta::new(recipient, false), - ], - data: alloc::vec![ix::CANCEL], + /// Build a `Close` instruction (permissionless cleanup). + pub fn close(reporter: Pubkey, crank: Pubkey, recipient: Pubkey) -> Instruction { + Instruction { + program_id: program_id(), + accounts: alloc::vec![ + AccountMeta::new(reporter, true), + AccountMeta::new(crank, false), + AccountMeta::new(recipient, false), + ], + data: alloc::vec![ix::CLOSE], + } } } - /// Build a `Close` instruction (permissionless cleanup). - pub fn close(reporter: Pubkey, crank: Pubkey, recipient: Pubkey) -> Instruction { - Instruction { - program_id: program_id(), - accounts: alloc::vec![ - AccountMeta::new(reporter, true), - AccountMeta::new(crank, false), - AccountMeta::new(recipient, false), - ], - data: alloc::vec![ix::CLOSE], + #[cfg(feature = "ephemeral")] + mod ephemeral { + use ephemeral_rollups_pinocchio::consts::{EPHEMERAL_VAULT_ID, MAGIC_PROGRAM_ID}; + + use super::*; + + /// All the scheduling knobs for `CreateEphemeral` + pub struct CreateArgs<'a> { + pub seed: [u8; 32], + /// All-zeros = unkillable (no cancel authority). + pub authority: [u8; 32], + pub start_slots: u64, + pub interval_slots: u64, + /// `0` on the wire means "infinite"; Hydra stores `u64::MAX` internally. + pub remaining: u64, + pub priority_tip: u64, + /// Compute-unit limit the cranker emits as `SetComputeUnitLimit` + /// right before `Trigger`. `0` = no ix (inherits the 200 k/ix + /// default). Capped at `MAX_COMPUTE_UNIT_LIMIT` (1.4 M) at `Create`. + pub cu_limit: u32, + /// The scheduled instructions, in execution order. Must be non-empty + pub scheduled: &'a [ScheduledIx<'a>], + } + + /// Build a `Create` instruction + pub fn create(sponsor: Pubkey, crank: Pubkey, args: &CreateArgs<'_>) -> Instruction { + let body_len: usize = args + .scheduled + .iter() + .map(|s| super::CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) + .sum(); + let mut data = Vec::with_capacity(1 + super::CREATE_FIXED_PREFIX_LEN + body_len); + data.push(ix::CREATE); + data.extend_from_slice(&args.seed); + data.extend_from_slice(&args.authority); + data.extend_from_slice(&args.start_slots.to_le_bytes()); + data.extend_from_slice(&args.interval_slots.to_le_bytes()); + data.extend_from_slice(&args.remaining.to_le_bytes()); + data.extend_from_slice(&args.priority_tip.to_le_bytes()); + data.extend_from_slice(&args.cu_limit.to_le_bytes()); + for s in args.scheduled { + data.push(s.metas.len() as u8); + data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); + data.extend_from_slice(&s.program_id.to_bytes()); + for m in s.metas { + let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; + data.push(flag); + data.extend_from_slice(&m.pubkey.to_bytes()); + } + data.extend_from_slice(s.data); + } + Instruction { + program_id: program_id(), + accounts: alloc::vec![ + AccountMeta::new(sponsor, true), + AccountMeta::new(crank, false), + AccountMeta::new(EPHEMERAL_VAULT_ID, false), + AccountMeta::new_readonly(MAGIC_PROGRAM_ID, false), + ], + data, + } + } + + /// Build a `Trigger` instruction. + pub fn trigger(crank: Pubkey, cranker: Pubkey) -> Instruction { + Instruction { + program_id: program_id(), + accounts: alloc::vec![ + AccountMeta::new(crank, false), + AccountMeta::new(cranker, true), + AccountMeta::new_readonly(INSTRUCTIONS_SYSVAR_ID, false), + ], + data: alloc::vec![ix::TRIGGER], + } + } + + /// Build a `Cancel` instruction + pub fn cancel(authority: Pubkey, crank: Pubkey) -> Instruction { + Instruction { + program_id: program_id(), + accounts: alloc::vec![ + AccountMeta::new(authority, true), + AccountMeta::new(crank, false), + AccountMeta::new(EPHEMERAL_VAULT_ID, false), + AccountMeta::new_readonly(MAGIC_PROGRAM_ID, false), + ], + data: alloc::vec![ix::CANCEL], + } + } + + /// Build a `Close` instruction + pub fn close(reporter: Pubkey, crank: Pubkey) -> Instruction { + Instruction { + program_id: program_id(), + accounts: alloc::vec![ + AccountMeta::new(reporter, true), + AccountMeta::new(crank, false), + AccountMeta::new(EPHEMERAL_VAULT_ID, false), + AccountMeta::new_readonly(MAGIC_PROGRAM_ID, false), + ], + data: alloc::vec![ix::CLOSE], + } } } + #[cfg(not(feature = "ephemeral"))] + pub use base::*; + #[cfg(feature = "ephemeral")] + pub use ephemeral::*; + /// Reconstruct all scheduled instructions from a crank's raw account bytes. /// This is what an off-chain cranker does to build the sibling ixs that /// must follow `Trigger`. diff --git a/crates/hydra-api/src/lib.rs b/crates/hydra-api/src/lib.rs index 3cd23ba..ecba58a 100644 --- a/crates/hydra-api/src/lib.rs +++ b/crates/hydra-api/src/lib.rs @@ -18,4 +18,7 @@ pub use state::Crank; use solana_address::declare_id; +#[cfg(not(feature = "ephemeral"))] declare_id!("Hydra17i1feui9deaxu6d1TzSQMRNHeBRkDR1Awy7zea"); +#[cfg(feature = "ephemeral")] +declare_id!("eHyd5BU8QffvHi4GnXwxrK4WpS7pM2x9UGKHBWii7mf"); diff --git a/examples/anchor/Cargo.lock b/examples/anchor/Cargo.lock new file mode 100644 index 0000000..a161b39 --- /dev/null +++ b/examples/anchor/Cargo.lock @@ -0,0 +1,3800 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "agave-bls12-381" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d9a1b5f771a2c8da108a1492203478e07838cf2db8743b8c868533d713d41d" +dependencies = [ + "blst", + "blstrs", + "bytemuck", + "bytemuck_derive", + "group", + "pairing", +] + +[[package]] +name = "agave-feature-set" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e41538180f5ded6d08a69c75b4f48c4c6ba8098d7e790b3d694a6bc081fbc7" +dependencies = [ + "ahash", + "solana-epoch-schedule", + "solana-hash 4.4.0", + "solana-keypair", + "solana-pubkey 4.2.0", + "solana-sha256-hasher", + "solana-svm-feature-set", +] + +[[package]] +name = "agave-syscalls" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a7bd728013fd439061aee37da3efff4fddbc07d21aaaf33f508794cfbe42ee" +dependencies = [ + "agave-bls12-381", + "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 4.4.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-loader-v3-interface", + "solana-poseidon", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 4.2.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", + "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 = "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anchor-attribute-access-control" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8cd233e382ea499e3c1e51bf4f0cb367abb37bb64e9e3667a5d618af3fe265" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-account" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e12171382e24c5cda6b0f7236a4f6bb9b657da997780c88a0ef794a419298bf" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-constant" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510f8db71375446405dfabdaf157fb7d3fbf33470c98ed75fad4c467e8ca0080" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-error" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b203169a49ea74da7782281e740ea8e21017c85f8f3b1ab452712c9796d28f" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-event" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50a462651e573ec6cc632e8f607e8b1e11f620f6fc26badaeff04fd49f45cc1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-program" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84704ee25a7e788afd9d846945cba536cfdcd53b463e8a337cf237cd897ca4d9" +dependencies = [ + "anchor-lang-idl", + "anchor-syn", + "anyhow", + "heck", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-accounts" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98bf49664527c7bb0ebca04e9b5bfb618d6ceb849ef44a8149241d244bbfb0f6" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-serde" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8140a40827bdfd74720f1f3084778fa081262f2f43bd4bdbc350f98ce1b341c6" +dependencies = [ + "anchor-syn", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-space" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee5b6fa5dde037399d3e0bb322a1c7360ad8adc6b6afdd797d19566c039dcfb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-lang" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bac4de7c9a9a69180798af701e22302cc0ebf2ef683b843706a1b7809454735" +dependencies = [ + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-constant", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-program", + "anchor-derive-accounts", + "anchor-derive-serde", + "anchor-derive-space", + "anchor-lang-idl", + "base64 0.21.7", + "bincode", + "borsh", + "bytemuck", + "const-crypto", + "solana-account-info", + "solana-clock", + "solana-cpi", + "solana-define-syscall 3.0.0", + "solana-feature-gate-interface", + "solana-instruction", + "solana-instructions-sysvar", + "solana-invoke", + "solana-loader-v3-interface", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-stake-interface", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-sysvar-id", + "thiserror 1.0.69", +] + +[[package]] +name = "anchor-lang-idl" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308910c7570f3598e631648dd33ce1a6016cfcb019542667f696b0ffb37e7001" +dependencies = [ + "anchor-lang-idl-spec", + "anyhow", + "heck", + "regex", + "serde", + "serde_json", + "sha2 0.10.9", +] + +[[package]] +name = "anchor-lang-idl-spec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" +dependencies = [ + "anyhow", + "serde", +] + +[[package]] +name = "anchor-syn" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6940253e80acf0f8e83b1ebd9c4772c496aedcce6ad19aa85ce75d0b6b188298" +dependencies = [ + "anyhow", + "bs58", + "cargo_toml", + "heck", + "proc-macro2", + "quote", + "serde", + "sha2 0.10.9", + "syn 1.0.109", + "thiserror 1.0.69", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + +[[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.118", +] + +[[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.118", +] + +[[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.118", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" + +[[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" +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.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.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 = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blst" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "blstrs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" +dependencies = [ + "blst", + "byte-slice-cast", + "ff", + "group", + "pairing", + "rand_core 0.6.4", + "serde", + "subtle", +] + +[[package]] +name = "borsh" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" +dependencies = [ + "borsh-derive", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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 = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" + +[[package]] +name = "cargo_toml" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" +dependencies = [ + "serde", + "toml", +] + +[[package]] +name = "cc" +version = "1.2.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +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 = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[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-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c06f1eb05f06cf2e380fdded278fbf056a38974299d77960555a311dcf91a52" +dependencies = [ + "keccak-const", + "sha2-const-stable", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.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 = "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.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 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.118", +] + +[[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.118", +] + +[[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.118", +] + +[[package]] +name = "defmt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.18", +] + +[[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 = "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 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 = "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.118", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-iterator" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4549325971814bda7a44061bf3fe7e487d447cba01e4220a4b454d630d7a016" +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.118", +] + +[[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.118", +] + +[[package]] +name = "env_filter" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[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 = [ + "bitvec", + "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" +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 = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand 0.8.6", + "rand_core 0.6.4", + "rand_xorshift", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hydra-api" +version = "0.1.1" +dependencies = [ + "pinocchio", + "solana-account-info", + "solana-address 2.6.1", + "solana-cpi", + "solana-instruction", + "solana-program-error", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "hydra-example-anchor" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "hydra-api", + "mollusk-svm", + "solana-account", + "solana-instruction", + "solana-pubkey 4.2.0", +] + +[[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 0.17.1", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[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.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 = "jiff" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" +dependencies = [ + "defmt", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.9", + "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 = "keccak-const" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d8d8ce877200136358e0bbff3a77965875db3af755a11e1fa6b1b3e2df13ea" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "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 = "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.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "mollusk-svm" +version = "0.12.1-agave-4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2463c0d920535dc1a43a0e0ab8100f0dba5699e687f5593bad543440362574d5" +dependencies = [ + "agave-feature-set", + "agave-syscalls", + "bincode", + "mollusk-svm-error", + "mollusk-svm-result", + "solana-account", + "solana-bpf-loader-program", + "solana-clock", + "solana-compute-budget", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-hash 4.4.0", + "solana-instruction", + "solana-instruction-error", + "solana-instructions-sysvar", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-logger", + "solana-message", + "solana-precompile-error", + "solana-program-error", + "solana-program-runtime", + "solana-pubkey 4.2.0", + "solana-rent", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-log-collector", + "solana-svm-timings", + "solana-svm-transaction", + "solana-system-program", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction-context", + "solana-transaction-error", +] + +[[package]] +name = "mollusk-svm-error" +version = "0.12.1-agave-4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51aa68fc50ff8a75fdde2ad966156f553a94e5a2ae680bc4fdd0d682a25e81e0" +dependencies = [ + "solana-pubkey 4.2.0", + "thiserror 2.0.18", +] + +[[package]] +name = "mollusk-svm-result" +version = "0.12.1-agave-4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29cb13af9a3aa05994d2bc327210177654c7ce3eb815791687dc24a339a05bd6" +dependencies = [ + "solana-account", + "solana-instruction", + "solana-program-error", + "solana-pubkey 4.2.0", + "solana-rent", + "solana-transaction-error", +] + +[[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-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 = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + +[[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 = "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 = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pinocchio" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cababcb62a2e739c7078ae16eda02789a6e3edd21bbdded864e85c38a7914d" +dependencies = [ + "solana-account-view", + "solana-address 2.6.1", + "solana-define-syscall 5.1.0", + "solana-instruction-view", + "solana-program-error", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.12+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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 = "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.118", +] + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +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 = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.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 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]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "regex" +version = "1.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[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-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" +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_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" +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.118", +] + +[[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_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.9.0", + "opaque-debug", +] + +[[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 0.10.7", +] + +[[package]] +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "solana-account" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" +dependencies = [ + "bincode", + "qualifier_attr", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-sysvar", +] + +[[package]] +name = "solana-account-info" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" +dependencies = [ + "solana-address 2.6.1", + "solana-program-error", + "solana-program-memory", +] + +[[package]] +name = "solana-account-view" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc141b940560430425ebaadb7645496c45f6a10fad9911d719bd03eab7f4d422" +dependencies = [ + "solana-address 2.6.1", + "solana-program-error", +] + +[[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" +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 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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" +dependencies = [ + "blake3", + "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", + "solana-define-syscall 5.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33714bbd14ee6030920b72a26c773964655a92f869175617feb8e6a33e5c9fc4" +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 4.2.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-system-interface 3.2.0", + "solana-transaction-context", +] + +[[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 = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14437d8820ba2084951f7990b03cc53b86fc55a5b5716ee12f4511e4cacec18b" +dependencies = [ + "solana-fee-structure", + "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 = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b4d2a4bf0d0b0a86c22111917e86e8bd39a7b31420fb2c7d73eb83761fc7af" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "solana-define-syscall 5.1.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-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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad280b1ed803853f7b453cb3ea9a57e600ca5599a63e69f7be199b486c0ec93" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-feature-gate-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" +dependencies = [ + "solana-program-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", +] + +[[package]] +name = "solana-fee-calculator" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef67f01cc6a0c72e99a08d0d484683f995de4c80e9568728fa77d1537f9b7e09" +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 = [ + "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", + "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-instruction-view" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab7a27d0c4214b9f7389c3dd00b68c93093a67f1dcc5b7893aebe299bbcbb47" +dependencies = [ + "solana-account-view", + "solana-address 2.6.1", + "solana-define-syscall 5.1.0", + "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 2.13.0", + "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-invoke" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4065031f5c7dd29ef5f5003c1a353011eeabbafa6c5a5033da0cedbfca824b94" +dependencies = [ + "solana-account-info", + "solana-define-syscall 3.0.0", + "solana-instruction", + "solana-program-entrypoint", + "solana-stable-layout", +] + +[[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.6.1", + "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", + "solana-instruction", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-system-interface 3.2.0", +] + +[[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-logger" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef7421d1092680d72065edbf5c7605856719b021bf5f173656c71febcdd5d003" +dependencies = [ + "env_logger", + "lazy_static", + "libc", + "log", + "signal-hook", +] + +[[package]] +name = "solana-message" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" +dependencies = [ + "lazy_static", + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction", + "solana-sanitize", + "solana-sdk-ids", + "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-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 = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad62e1045c2347a0c0e219a6ceb0abfe904be622920996bfcac8d116fabe3c7" +dependencies = [ + "bitflags 2.13.0", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-poseidon" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "737b8ab25bf4cc8e618f80f1fe40709b2ace708bc764a36b8a4c81eea8c07034" +dependencies = [ + "ark-bn254 0.4.0", + "ark-bn254 0.5.0", + "light-poseidon 0.2.0", + "light-poseidon 0.4.0", + "solana-define-syscall 4.0.1", + "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-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", +] + +[[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 = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b4f1d58aac20d62ad133f7cfe018281d22fce89d2f78c063f2ebf96f005d8d" +dependencies = [ + "base64 0.22.1", + "bincode", + "cfg-if", + "itertools 0.14.0", + "log", + "percentage", + "rand 0.9.4", + "serde", + "solana-account", + "solana-account-info", + "solana-clock", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-structure", + "solana-hash 4.4.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-loader-v3-interface", + "solana-program-entrypoint", + "solana-pubkey 4.2.0", + "solana-rent", + "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 3.2.0", + "solana-sysvar", + "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.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]] +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.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733b3657a0fab205102b799dbe17f85d3972cf984232c1b0b108fa6ba438e382" +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 2.6.1", +] + +[[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.118", +] + +[[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-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-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-signature" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0364c7577c3c82a693ce28a1febc8d1b5d1b0a175fdc2114ae6186b69effe1e" +dependencies = [ + "ed25519-dalek", + "five8", + "serde", + "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", + "solana-sysvar-id", +] + +[[package]] +name = "solana-svm-callback" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3001438e7765fdfcbbe2d556439e358984a3b3b880bcda1c7f1f3091ce817b0c" +dependencies = [ + "solana-account", + "solana-clock", + "solana-precompile-error", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-svm-feature-set" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ada78631678a5a5139d6491bb8729143192c6afd30945dd8cddd974b174d7f7" + +[[package]] +name = "solana-svm-log-collector" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d30ddddd9d907772d34ecc8efacfb4ad65469f1f02e4d21da422d03594f52df" +dependencies = [ + "log", +] + +[[package]] +name = "solana-svm-measure" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c944cc0aa7eb1b8f754546d3f851d30ff6602667dc61377c28bcd186b1beaf" + +[[package]] +name = "solana-svm-timings" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4540c51ccc83931a33323eb1b7a1e9cae9eb8f4a45c2abc5d235c6c9b775252" +dependencies = [ + "eager", + "enum-iterator", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-svm-transaction" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08508c2781c618d70f0524c673d347fa568963d9b0169efb6ef812d8203246c2" +dependencies = [ + "solana-hash 4.4.0", + "solana-message", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-signature", + "solana-transaction", +] + +[[package]] +name = "solana-svm-type-overrides" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da24176c92931464ac3dae45b8be137bf747f838d022f41728405f958c63e32d" +dependencies = [ + "rand 0.9.4", +] + +[[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 = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd11fb16042bd0ff41f6679aae98d79b25f85f797edfebf5c0c73e497e1bf826" +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 4.2.0", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-system-interface 3.2.0", + "solana-sysvar", + "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", + "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 2.6.1", + "solana-sdk-ids", +] + +[[package]] +name = "solana-transaction" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" +dependencies = [ + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction", + "solana-instruction-error", + "solana-message", + "solana-sanitize", + "solana-sdk-ids", + "solana-signature", + "solana-transaction-error", +] + +[[package]] +name = "solana-transaction-context" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee065d9e0a7d374c012d541083b1e72832a7f016ac2ab493f535d07fa89c26d" +dependencies = [ + "bincode", + "qualifier_attr", + "serde", + "solana-account", + "solana-instruction", + "solana-instructions-sysvar", + "solana-pubkey 4.2.0", + "solana-rent", + "solana-sbpf", + "solana-sdk-ids", +] + +[[package]] +name = "solana-transaction-error" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441d6dcd51100e7d97c3fb3b723e08aa701066ff7afc00026fd8d8e222cb95b" +dependencies = [ + "solana-instruction-error", + "solana-sanitize", +] + +[[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.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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.118", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[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" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[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.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[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 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.3", +] + +[[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 1.0.3", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[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 = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[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.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" +dependencies = [ + "pastey", + "proc-macro2", + "quote", + "thiserror 2.0.18", + "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.118", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.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.118", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/examples/pinocchio/src/lib.rs b/examples/pinocchio/src/lib.rs index 536f0a9..9dce048 100644 --- a/examples/pinocchio/src/lib.rs +++ b/examples/pinocchio/src/lib.rs @@ -27,7 +27,7 @@ const DISC_SCHEDULE: u8 = 0; const CREATE_BUF_MAX: usize = 1 + CREATE_FIXED_PREFIX_LEN + CREATE_IX_HEADER_LEN + 33 * MAX_ACCOUNTS + MAX_DATA_LEN; -pub fn process(_program_id: &Address, accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { +pub fn process(_program_id: &Address, accounts: &[AccountView], data: &[u8]) -> ProgramResult { let [disc_byte, rest @ ..] = data else { return Err(ProgramError::InvalidInstructionData); }; diff --git a/programs/hydra/Cargo.toml b/programs/hydra/Cargo.toml index d1c5193..9d9cb36 100644 --- a/programs/hydra/Cargo.toml +++ b/programs/hydra/Cargo.toml @@ -22,15 +22,19 @@ no-entrypoint = [] cu-trace = [] # Uses the SIMD-0312 System Program instruction for prefunded crank PDAs. # Keep this disabled on mainnet until `create_account_allow_prefund` is active. +# NOTE: requires pinocchio-system >= 0.6 (`CreateAccountAllowPrefund`), which is +# incompatible with the pinocchio 0.10 pin needed for ephemeral support. create-account-allow-prefund = [] +# Ephemeral-rollup crank instructions: schedule/run cranks that live as +# MagicBlock ephemeral accounts on the ephemeral rollup. Pulls in the +# `ephemeral-rollups-pinocchio` CPI helpers. +ephemeral = ["dep:ephemeral-rollups-pinocchio", "hydra-api/ephemeral"] [dependencies] -# `unsafe-account-resize` lets `Create` shrink the crank account from its O(1) -# over-provisioned size down to the exact tail length (a length-only update, -# no syscall), so the scheduled ixs are parsed in a single pass. -pinocchio = { workspace = true, features = ["unsafe-account-resize"] } +pinocchio = { workspace = true } pinocchio-system = { workspace = true } pinocchio-log = { workspace = true } +ephemeral-rollups-pinocchio = { workspace = true, optional = true } solana-define-syscall = { workspace = true } hydra-api = { workspace = true } diff --git a/programs/hydra/src/entrypoint.rs b/programs/hydra/src/entrypoint.rs index eb7b85c..49ccf37 100644 --- a/programs/hydra/src/entrypoint.rs +++ b/programs/hydra/src/entrypoint.rs @@ -15,17 +15,14 @@ nostd_panic_handler!(); pub fn process_instruction( _program_id: &Address, - accounts: &mut [AccountView], + accounts: &[AccountView], instruction_data: &[u8], ) -> ProgramResult { inner_process_instruction(accounts, instruction_data).inspect_err(log_error) } #[inline(never)] -fn inner_process_instruction( - accounts: &mut [AccountView], - instruction_data: &[u8], -) -> ProgramResult { +fn inner_process_instruction(accounts: &[AccountView], instruction_data: &[u8]) -> ProgramResult { let [discriminator, rest @ ..] = instruction_data else { return Err(HydraError::InvalidInstruction.into()); }; diff --git a/programs/hydra/src/processor/base/cancel.rs b/programs/hydra/src/processor/base/cancel.rs new file mode 100644 index 0000000..bee96ac --- /dev/null +++ b/programs/hydra/src/processor/base/cancel.rs @@ -0,0 +1,15 @@ +//! `Cancel` (disc 2) — authority-gated close + rent refund. + +use pinocchio::{error::ProgramError, AccountView, ProgramResult}; + +use crate::processor::base::common::drain_lamports; +use crate::processor::common::require_cancel_authority; + +pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { + let [authority, crank_ai, recipient] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + require_cancel_authority(authority, crank_ai)?; + drain_lamports(crank_ai, recipient) +} diff --git a/programs/hydra/src/processor/close.rs b/programs/hydra/src/processor/base/close.rs similarity index 82% rename from programs/hydra/src/processor/close.rs rename to programs/hydra/src/processor/base/close.rs index 2b16f75..2d2c71c 100644 --- a/programs/hydra/src/processor/close.rs +++ b/programs/hydra/src/processor/base/close.rs @@ -13,18 +13,14 @@ use hydra_api::{ }; use crate::helpers::get_clock_slot; +use crate::processor::common::{require_refund_recipient, require_signed_crank}; -pub fn process(accounts: &mut [AccountView], _data: &[u8]) -> ProgramResult { +pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { let [reporter, crank_ai, recipient] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - if !reporter.is_signer() { - return Err(ProgramError::MissingRequiredSignature); - } - if !crank_ai.owned_by(&hydra_api::ID) { - return Err(ProgramError::InvalidAccountOwner); - } + require_signed_crank(reporter, crank_ai)?; // Snapshot fields we need from the crank header. let (stored_authority, remaining, rent_min, priority_tip, next_exec_slot, lamports_now) = { @@ -59,11 +55,7 @@ pub fn process(accounts: &mut [AccountView], _data: &[u8]) -> ProgramResult { return Err(HydraError::NotClosable.into()); } - // Anti-grief: if an authority is set, only they can receive the refund. - // Anyone can still invoke Close, but they can't redirect the rent refund. - if stored_authority != [0u8; 32] && recipient.address().as_array() != &stored_authority { - return Err(HydraError::UnauthorizedAuthority.into()); - } + require_refund_recipient(stored_authority, recipient)?; // Flat bounty (2 × base fee) to whoever cranked the cleanup; the balance // refunds to `recipient`. `min` handles a crank holding less than the diff --git a/programs/hydra/src/processor/base/common.rs b/programs/hydra/src/processor/base/common.rs new file mode 100644 index 0000000..ea68d10 --- /dev/null +++ b/programs/hydra/src/processor/base/common.rs @@ -0,0 +1,28 @@ +//! Shared helpers for the base-layer crank processors. + +use pinocchio::{error::ProgramError, AccountView, ProgramResult}; + +/// Move all lamports out of `src` into `dst`. The runtime zeroes `src.data` +/// and reassigns ownership to the system program at the instruction boundary +/// because `src.lamports == 0` post-write. +#[inline(always)] +pub(super) fn drain_lamports(src: &AccountView, dst: &AccountView) -> ProgramResult { + let amount = src.lamports(); + let new_dst = dst + .lamports() + .checked_add(amount) + .ok_or(ProgramError::ArithmeticOverflow)?; + src.set_lamports(0); + dst.set_lamports(new_dst); + Ok(()) +} + +#[inline(always)] +pub(super) unsafe fn read_u64(p: *const u8) -> u64 { + core::ptr::read_unaligned(p as *const u64) +} + +#[inline(always)] +pub(super) unsafe fn write_u64(p: *mut u8, v: u64) { + core::ptr::write_unaligned(p as *mut u64, v); +} diff --git a/programs/hydra/src/processor/base/create.rs b/programs/hydra/src/processor/base/create.rs new file mode 100644 index 0000000..40291c1 --- /dev/null +++ b/programs/hydra/src/processor/base/create.rs @@ -0,0 +1,119 @@ +//! `Create` (disc 0). +//! +//! Wire layout for ix data (no alignment padding): +//! +//! ```text +//! seed: [u8; 32] +//! authority: [u8; 32] +//! start_slot: u64 LE +//! interval_slots: u64 LE +//! remaining: u64 LE // 0 = infinite (stored internally as u64::MAX) +//! priority_tip: u64 LE +//! cu_limit: u32 LE // 0 = cranker omits SetComputeUnitLimit +//! ── one or more scheduled ixs, parsed until the data is exhausted: ── +//! num_accounts: u8 +//! data_len: u16 LE +//! program_id: [u8; 32] +//! metas: [[flag:u8][pubkey:[u8;32]]; num_accounts] +//! data: [u8; data_len] +//! ``` + +use pinocchio::{ + cpi::{Seed, Signer}, + error::ProgramError, + sysvars::{rent::Rent, Sysvar}, + AccountView, ProgramResult, +}; +#[cfg(not(feature = "create-account-allow-prefund"))] +use pinocchio_system::instructions::{Allocate, Assign, Transfer}; +#[cfg(feature = "create-account-allow-prefund")] +use pinocchio_system::instructions::{CreateAccountAllowPrefund, Funding}; + +use hydra_api::consts::{CRANK_HEADER_SIZE, CRANK_SEED_PREFIX}; + +use crate::processor::common::{ + derive_crank_pda, measure_region, parse_create_header, write_crank, +}; + +pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { + let [payer, crank_ai, _system_program] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let header = parse_create_header(data)?; + let authority_signer: u8 = (payer.address().as_array() == &header.authority) as u8; + + // Size the account from the scheduled ixs (validates the schedule), verify + // the PDA, then allocate at exactly that size. The tail is written below. + let region_len = measure_region(data)?; + let bump = derive_crank_pda(crank_ai, &header.seed)?; + let total_size = CRANK_HEADER_SIZE + region_len; + + // One sysvar read serves both CreateAccount funding and the cached floor. + let rent = Rent::get()?; + let rent_min = rent.try_minimum_balance(total_size)?; + + // Sign the CreateAccount with the PDA's seeds so it owns itself on creation. + let bump_arr = [bump]; + let seeds_arr = [ + Seed::from(CRANK_SEED_PREFIX), + Seed::from(header.seed.as_ref()), + Seed::from(&bump_arr), + ]; + let signers = [Signer::from(&seeds_arr)]; + + #[cfg(feature = "create-account-allow-prefund")] + { + let funding_lamports = rent_min.saturating_sub(crank_ai.lamports()); + if funding_lamports == 0 && !payer.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + CreateAccountAllowPrefund { + to: crank_ai, + space: total_size as u64, + owner: &hydra_api::ID, + funding: (funding_lamports > 0).then_some(Funding { + from: payer, + lamports: funding_lamports, + }), + } + .invoke_signed(&signers)?; + } + + #[cfg(not(feature = "create-account-allow-prefund"))] + { + let funding_lamports = rent_min.saturating_sub(crank_ai.lamports()); + if funding_lamports == 0 && !payer.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + if funding_lamports > 0 { + Transfer { + from: payer, + to: crank_ai, + lamports: funding_lamports, + } + .invoke()?; + } + Allocate { + account: crank_ai, + space: total_size as u64, + } + .invoke_signed(&signers)?; + Assign { + account: crank_ai, + owner: &hydra_api::ID, + } + .invoke_signed(&signers)?; + } + + // The account is sized to `region_len`, so `write_crank` fills it exactly. + write_crank( + crank_ai, + data, + &header, + bump, + authority_signer, + rent_min, + region_len, + ) +} diff --git a/programs/hydra/src/processor/base/mod.rs b/programs/hydra/src/processor/base/mod.rs new file mode 100644 index 0000000..0c26488 --- /dev/null +++ b/programs/hydra/src/processor/base/mod.rs @@ -0,0 +1,8 @@ +//! Base-layer crank lifecycle (feature `base`). + +pub mod cancel; +pub mod close; +pub mod create; +pub mod trigger; + +mod common; diff --git a/programs/hydra/src/processor/trigger.rs b/programs/hydra/src/processor/base/trigger.rs similarity index 66% rename from programs/hydra/src/processor/trigger.rs rename to programs/hydra/src/processor/base/trigger.rs index ef0dbc7..9e7e752 100644 --- a/programs/hydra/src/processor/trigger.rs +++ b/programs/hydra/src/processor/base/trigger.rs @@ -15,7 +15,13 @@ use hydra_api::{ HydraError, }; -use crate::helpers::{get_clock_slot, get_stack_height, TRANSACTION_LEVEL_STACK_HEIGHT}; +use crate::{ + helpers::{get_clock_slot, get_stack_height, TRANSACTION_LEVEL_STACK_HEIGHT}, + processor::{ + base::common::{read_u64, write_u64}, + common::{read_u16, verify_followup}, + }, +}; // Field offsets inside the 120-byte `Crank` header, kept local to this file // so the raw reads below stay easy to verify against the account layout. @@ -27,7 +33,7 @@ const OFF_EXECUTED: usize = 96; const OFF_RENT_MIN: usize = 104; const OFF_REGION_LEN: usize = 112; -pub fn process(accounts: &mut [AccountView], _data: &[u8]) -> ProgramResult { +pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { cu_mark(); // 0 — before any work let [crank_ai, cranker_ai, ix_sysvar_ai] = accounts else { @@ -105,7 +111,7 @@ pub fn process(accounts: &mut [AccountView], _data: &[u8]) -> ProgramResult { // SAFETY: `crank_ai` is owned by this program and has at least // `CRANK_HEADER_SIZE` bytes (checked above). No other borrow is live. unsafe { - let p = crank_ai.data_mut_ptr(); + let p = crank_ai.data_ptr(); write_u64(p.add(OFF_NEXT_EXEC_SLOT), next_slot); write_u64(p.add(OFF_EXECUTED), hdr.executed + 1); if hdr.remaining != REMAINING_INFINITE { @@ -156,73 +162,3 @@ unsafe fn read_header(p: *const u8) -> Snapshot { region_len: read_u16(p.add(OFF_REGION_LEN)), } } - -/// Parse the instructions sysvar, locate the region for -/// `current_ix_index + 1`, and byte-compare it against the crank's stored tail. -#[inline(always)] -fn verify_followup(sysvar: &AccountView, crank: &AccountView, region_len: usize) -> ProgramResult { - // SAFETY: we're in a linear entrypoint flow with no outstanding borrows - // on either account. pinocchio's `borrow_unchecked` skips the refcell - // bookkeeping, which saves a handful of CUs per call. - let sv: &[u8] = unsafe { sysvar.borrow_unchecked() }; - let cr: &[u8] = unsafe { crank.borrow_unchecked() }; - - let sv_len = sv.len(); - if sv_len < 4 { - return Err(ProgramError::InvalidAccountData); - } - - // [len-2..len] = current_ix_index (u16 LE) - let current = unsafe { read_u16(sv.as_ptr().add(sv_len - 2)) } as usize; - let target = current - .checked_add(1) - .ok_or(HydraError::MissingFollowupInstruction)?; - - // [0..2] = num_instructions (u16 LE) - let num_ix = unsafe { read_u16(sv.as_ptr()) } as usize; - if target >= num_ix { - return Err(HydraError::MissingFollowupInstruction.into()); - } - - // [2 + 2*target..+2] = offset of instruction `target`'s region. - let off_pos = 2 + 2 * target; - if off_pos + 2 > sv_len { - return Err(ProgramError::InvalidAccountData); - } - let region_start = unsafe { read_u16(sv.as_ptr().add(off_pos)) } as usize; - let region_end = region_start - .checked_add(region_len) - .ok_or(HydraError::MismatchedFollowupIx)?; - if region_end > sv_len.saturating_sub(2) { - return Err(HydraError::MismatchedFollowupIx.into()); - } - - let tail_end = CRANK_HEADER_SIZE - .checked_add(region_len) - .ok_or(ProgramError::InvalidAccountData)?; - if tail_end > cr.len() { - return Err(ProgramError::InvalidAccountData); - } - let tail = &cr[CRANK_HEADER_SIZE..tail_end]; - let sv_region = &sv[region_start..region_end]; - - if sv_region != tail { - return Err(HydraError::MismatchedFollowupIx.into()); - } - Ok(()) -} - -#[inline(always)] -unsafe fn read_u64(p: *const u8) -> u64 { - core::ptr::read_unaligned(p as *const u64) -} - -#[inline(always)] -unsafe fn read_u16(p: *const u8) -> u16 { - core::ptr::read_unaligned(p as *const u16) -} - -#[inline(always)] -unsafe fn write_u64(p: *mut u8, v: u64) { - core::ptr::write_unaligned(p as *mut u64, v); -} diff --git a/programs/hydra/src/processor/cancel.rs b/programs/hydra/src/processor/cancel.rs deleted file mode 100644 index 14144bc..0000000 --- a/programs/hydra/src/processor/cancel.rs +++ /dev/null @@ -1,50 +0,0 @@ -//! `Cancel` (disc 2) — authority-gated close + rent refund. - -use pinocchio::{error::ProgramError, AccountView, ProgramResult}; - -use hydra_api::{state::load_crank, HydraError}; - -pub fn process(accounts: &mut [AccountView], _data: &[u8]) -> ProgramResult { - let [authority, crank_ai, recipient] = accounts else { - return Err(ProgramError::NotEnoughAccountKeys); - }; - - if !authority.is_signer() { - return Err(ProgramError::MissingRequiredSignature); - } - if !crank_ai.owned_by(&hydra_api::ID) { - return Err(ProgramError::InvalidAccountOwner); - } - - // Read the stored authority and bail if unkillable (all-zeros) or - // doesn't match the signer. - let stored_authority = { - let data = crank_ai.try_borrow()?; - let state = unsafe { load_crank(&data)? }; - state.authority - }; - - if stored_authority == [0u8; 32] { - return Err(HydraError::UnauthorizedAuthority.into()); - } - if authority.address().as_array() != &stored_authority { - return Err(HydraError::UnauthorizedAuthority.into()); - } - - drain_lamports(crank_ai, recipient) -} - -/// Move all lamports out of `src` into `dst`. The runtime zeroes `src.data` -/// and reassigns ownership to the system program at the instruction boundary -/// because `src.lamports == 0` post-write. -#[inline(always)] -pub(super) fn drain_lamports(src: &mut AccountView, dst: &mut AccountView) -> ProgramResult { - let amount = src.lamports(); - let new_dst = dst - .lamports() - .checked_add(amount) - .ok_or(ProgramError::ArithmeticOverflow)?; - src.set_lamports(0); - dst.set_lamports(new_dst); - Ok(()) -} diff --git a/programs/hydra/src/processor/common.rs b/programs/hydra/src/processor/common.rs new file mode 100644 index 0000000..11c8aa6 --- /dev/null +++ b/programs/hydra/src/processor/common.rs @@ -0,0 +1,356 @@ +//! Shared helpers for the ephemeral-rollup crank processors. + +use pinocchio::{error::ProgramError, Address, AccountView, ProgramResult}; + +use hydra_api::{ + consts::{ + CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, MAX_DATA_LEN, MAX_INSTRUCTIONS, + META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, + }, + instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, + state::{load_crank, load_crank_mut, Crank}, + HydraError, CRANK_HEADER_SIZE, +}; + +/// `signer` must sign and `crank` must be Hydra-owned — the preamble of every +/// `Cancel` / `Close` path. +pub(super) fn require_signed_crank(signer: &AccountView, crank_ai: &AccountView) -> ProgramResult { + if !signer.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + if !crank_ai.owned_by(&hydra_api::ID) { + return Err(ProgramError::InvalidAccountOwner); + } + Ok(()) +} + +/// Anti-grief: when a crank has a non-zero authority, only that authority may +/// receive the rent refund. Shared by base and ephemeral `Close`. +pub(super) fn require_refund_recipient( + stored_authority: [u8; 32], + recipient: &AccountView, +) -> ProgramResult { + if stored_authority != [0u8; 32] && recipient.address().as_array() != &stored_authority { + return Err(HydraError::UnauthorizedAuthority.into()); + } + Ok(()) +} + +/// Authority-gated close preamble shared by base `Cancel` and `CancelEphemeral`: +/// `authority` signs a Hydra-owned crank and matches its stored (non-zero) +/// authority. +pub(super) fn require_cancel_authority( + authority: &AccountView, + crank_ai: &AccountView, +) -> ProgramResult { + require_signed_crank(authority, crank_ai)?; + let stored = { + let data = crank_ai.try_borrow()?; + unsafe { load_crank(&data)? }.authority + }; + if stored == [0u8; 32] || authority.address().as_array() != &stored { + return Err(HydraError::UnauthorizedAuthority.into()); + } + Ok(()) +} + +/// The fixed-size scheduling prefix of a `Create` / `CreateEphemeral` payload. +/// `next_exec` / `interval` are slots for base-layer cranks and milliseconds for +/// ephemeral-rollup cranks; the bytes are identical either way. +pub(super) struct CreateHeader { + pub seed: [u8; 32], + pub authority: [u8; 32], + pub next_exec: u64, + pub interval: u64, + pub remaining_wire: u64, + pub priority_tip: u64, + pub cu_limit: u32, +} + +/// Parse + validate the fixed prefix of a `Create` payload. Requires at least +/// the prefix plus one scheduled-ix blob header. +pub(super) fn parse_create_header(data: &[u8]) -> Result { + if data.len() < CREATE_FIXED_PREFIX_LEN + CREATE_IX_HEADER_LEN { + return Err(ProgramError::InvalidInstructionData); + } + // SAFETY: bounds checked above; the reads only require byte alignment. + let header = CreateHeader { + seed: unsafe { *(data.as_ptr() as *const [u8; 32]) }, + authority: unsafe { *(data.as_ptr().add(32) as *const [u8; 32]) }, + next_exec: read_u64_le(data, 64), + interval: read_u64_le(data, 72), + remaining_wire: read_u64_le(data, 80), + priority_tip: read_u64_le(data, 88), + cu_limit: read_u32_le(data, 96), + }; + // `0` opts out of `SetComputeUnitLimit`; non-zero must fit the per-tx ceiling. + if header.cu_limit > MAX_COMPUTE_UNIT_LIMIT { + return Err(HydraError::InvalidSchedule.into()); + } + // A never-advancing infinite crank makes no sense. + if header.remaining_wire == 0 && header.interval == 0 { + return Err(HydraError::InvalidSchedule.into()); + } + Ok(header) +} + +/// Write the parsed prefix + computed fields into a freshly-allocated crank +/// header. `rent_min` is the cached rent floor for base cranks and `0` for +/// ephemeral cranks (which hold no lamports). +#[inline(always)] +pub(super) fn write_header( + state: &mut Crank, + h: &CreateHeader, + bump: u8, + authority_signer: u8, + rent_min: u64, + region_len: u16, +) { + state.authority = h.authority; + state.seed = h.seed; + state.set_next_exec_slot(h.next_exec); + state.set_interval_slots(h.interval); + state.set_remaining(if h.remaining_wire == 0 { + REMAINING_INFINITE + } else { + h.remaining_wire + }); + state.set_priority_tip(h.priority_tip); + state.set_executed(0); + state.set_rent_min(rent_min); + state.set_region_len(region_len); + state.bump = bump; + state.set_cu_limit(h.cu_limit); + state.authority_signer = authority_signer; +} + +/// The scheduled-ix tail must fit `Crank.region_len` (a `u16`). +const MAX_REGION_LEN: usize = u16::MAX as usize; + +/// Measure the exact tail length the scheduled ixs serialize to, validating the +/// per-ix structure, the instruction-count limit, and the `region_len` ceiling +/// in a single pass. Mirrors the byte accounting in [`write_tail`] so the caller +/// can allocate the precise account size up front; `write_tail` then re-validates +/// (incl. signer flags) and writes, yielding the same length. +pub(super) fn measure_region(data: &[u8]) -> Result { + let mut cursor = CREATE_FIXED_PREFIX_LEN; + let mut region_len = 0usize; + let mut num_instructions = 0usize; + + while cursor < data.len() { + let (num_accounts, data_len, next) = parse_ix_header(data, cursor)?; + num_instructions += 1; + if num_instructions > MAX_INSTRUCTIONS { + return Err(HydraError::InvalidSchedule.into()); + } + let metas_len = num_accounts * SERIALIZED_META_SIZE; + // [num_accounts u16][metas][program_id 32][data_len u16][data] + region_len += 2 + metas_len + 32 + 2 + data_len; + cursor = next; + } + + if region_len > MAX_REGION_LEN { + return Err(HydraError::InvalidSchedule.into()); + } + Ok(region_len) +} + +/// Derive the crank PDA from `[CRANK_SEED_PREFIX, seed]` and verify it matches +/// the supplied account, returning the bump for the create CPI's signer seeds. +/// Shared by both `Create` paths. +pub(super) fn derive_crank_pda( + crank_ai: &AccountView, + seed: &[u8; 32], +) -> Result { + let (expected_pda, bump) = + Address::find_program_address(&[CRANK_SEED_PREFIX, seed], &hydra_api::ID); + if crank_ai.address() != &expected_pda { + return Err(ProgramError::InvalidSeeds); + } + Ok(bump) +} + +/// Finalize a freshly-allocated crank account: serialize the scheduled-ix tail +/// and write the header. The account must already be sized to +/// `CRANK_HEADER_SIZE + region_len`; `rent_min` is the cached rent floor for base +/// cranks and `0` for ephemeral cranks (which hold no lamports). Shared by both +/// `Create` paths. +pub(super) fn write_crank( + crank_ai: &AccountView, + data: &[u8], + header: &CreateHeader, + bump: u8, + authority_signer: u8, + rent_min: u64, + region_len: usize, +) -> ProgramResult { + let mut account_data = crank_ai.try_borrow_mut()?; + let buf: &mut [u8] = &mut account_data; + if buf.len() < CRANK_HEADER_SIZE { + return Err(ProgramError::AccountDataTooSmall); + } + let (header_bytes, tail_bytes) = buf.split_at_mut(CRANK_HEADER_SIZE); + + let written = write_tail(tail_bytes, data)?; + if written != region_len { + return Err(HydraError::InvalidSchedule.into()); + } + + // SAFETY: split yields CRANK_HEADER_SIZE bytes; Crank is align-1 (compile-time checked). + let state = unsafe { load_crank_mut(header_bytes)? }; + write_header(state, header, bump, authority_signer, rent_min, region_len as u16); + Ok(()) +} + +/// Validate + serialize the scheduled ixs of a `Create` payload into `tail`, +/// returning the bytes written. Every write is bounds-checked against +/// `tail.len()` so a wrongly-sized account fails cleanly instead of writing out +/// of bounds. +/// +/// Mirrors the tail layout produced by `processor::create` — see that file for +/// the wire format. Kept separate so the audited base path stays untouched. +pub(super) fn write_tail(tail: &mut [u8], data: &[u8]) -> Result { + let cap = tail.len(); + let mut cursor = CREATE_FIXED_PREFIX_LEN; + let mut off = 0usize; + let mut num_instructions = 0usize; + + while cursor < data.len() { + let (num_accounts, data_len, next) = parse_ix_header(data, cursor)?; + num_instructions += 1; + if num_instructions > MAX_INSTRUCTIONS { + return Err(HydraError::InvalidSchedule.into()); + } + let metas_offset = cursor + CREATE_IX_HEADER_LEN; + let metas_len = num_accounts * SERIALIZED_META_SIZE; + let data_offset = metas_offset + metas_len; + // Scheduled ixs run top-level; reject any signer flag. + for i in 0..num_accounts { + if data[metas_offset + i * SERIALIZED_META_SIZE] & META_FLAG_SIGNER != 0 { + return Err(HydraError::SignerInScheduledIx.into()); + } + } + + // [num_accounts u16][metas][program_id 32][data_len u16][data] + let blob_len = 2 + metas_len + 32 + 2 + data_len; + if off + blob_len > cap { + return Err(ProgramError::AccountDataTooSmall); + } + tail[off..off + 2].copy_from_slice(&(num_accounts as u16).to_le_bytes()); + off += 2; + tail[off..off + metas_len].copy_from_slice(&data[metas_offset..data_offset]); + off += metas_len; + tail[off..off + 32].copy_from_slice(&data[cursor + 3..cursor + CREATE_IX_HEADER_LEN]); + off += 32; + tail[off..off + 2].copy_from_slice(&(data_len as u16).to_le_bytes()); + off += 2; + tail[off..off + data_len].copy_from_slice(&data[data_offset..next]); + off += data_len; + + cursor = next; + } + + Ok(off) +} + +/// Parse one scheduled-ix blob header at `cursor`, validating limits and bounds. +/// Returns `(num_accounts, data_len, next_cursor)`. +#[inline(always)] +pub(super) fn parse_ix_header( + data: &[u8], + cursor: usize, +) -> Result<(usize, usize, usize), ProgramError> { + if cursor + CREATE_IX_HEADER_LEN > data.len() { + return Err(ProgramError::InvalidInstructionData); + } + let num_accounts = data[cursor] as usize; + let data_len = u16::from_le_bytes([data[cursor + 1], data[cursor + 2]]) as usize; + if num_accounts > MAX_ACCOUNTS || data_len > MAX_DATA_LEN { + return Err(HydraError::InvalidSchedule.into()); + } + let metas_len = num_accounts * SERIALIZED_META_SIZE; + let next = cursor + CREATE_IX_HEADER_LEN + metas_len + data_len; + if next > data.len() { + return Err(ProgramError::InvalidInstructionData); + } + Ok((num_accounts, data_len, next)) +} + +/// Parse the instructions sysvar, locate the region for +/// `current_ix_index + 1`, and byte-compare it against the crank's stored tail. +/// +/// Shared with the ephemeral-rollup `TriggerEphemeral` handler — the +/// follow-up binding is identical on both ledgers. +#[inline(always)] +pub(crate) fn verify_followup( + sysvar: &AccountView, + crank: &AccountView, + region_len: usize, +) -> ProgramResult { + // SAFETY: we're in a linear entrypoint flow with no outstanding borrows + // on either account. pinocchio's `borrow_unchecked` skips the refcell + // bookkeeping, which saves a handful of CUs per call. + let sv: &[u8] = unsafe { sysvar.borrow_unchecked() }; + let cr: &[u8] = unsafe { crank.borrow_unchecked() }; + + let sv_len = sv.len(); + if sv_len < 4 { + return Err(ProgramError::InvalidAccountData); + } + + // [len-2..len] = current_ix_index (u16 LE) + let current = unsafe { read_u16(sv.as_ptr().add(sv_len - 2)) } as usize; + let target = current + .checked_add(1) + .ok_or(HydraError::MissingFollowupInstruction)?; + + // [0..2] = num_instructions (u16 LE) + let num_ix = unsafe { read_u16(sv.as_ptr()) } as usize; + if target >= num_ix { + return Err(HydraError::MissingFollowupInstruction.into()); + } + + // [2 + 2*target..+2] = offset of instruction `target`'s region. + let off_pos = 2 + 2 * target; + if off_pos + 2 > sv_len { + return Err(ProgramError::InvalidAccountData); + } + let region_start = unsafe { read_u16(sv.as_ptr().add(off_pos)) } as usize; + let region_end = region_start + .checked_add(region_len) + .ok_or(HydraError::MismatchedFollowupIx)?; + if region_end > sv_len.saturating_sub(2) { + return Err(HydraError::MismatchedFollowupIx.into()); + } + + let tail_end = CRANK_HEADER_SIZE + .checked_add(region_len) + .ok_or(ProgramError::InvalidAccountData)?; + if tail_end > cr.len() { + return Err(ProgramError::InvalidAccountData); + } + let tail = &cr[CRANK_HEADER_SIZE..tail_end]; + let sv_region = &sv[region_start..region_end]; + + if sv_region != tail { + return Err(HydraError::MismatchedFollowupIx.into()); + } + Ok(()) +} + +#[inline(always)] +pub(super) fn read_u64_le(data: &[u8], offset: usize) -> u64 { + // SAFETY: the caller ensures `offset + 8 <= data.len()`. + unsafe { u64::from_le_bytes(*(data.as_ptr().add(offset) as *const [u8; 8])) } +} + +#[inline(always)] +pub(super) fn read_u32_le(data: &[u8], offset: usize) -> u32 { + // SAFETY: the caller ensures `offset + 4 <= data.len()`. + unsafe { u32::from_le_bytes(*(data.as_ptr().add(offset) as *const [u8; 4])) } +} + +#[inline(always)] +pub(super) unsafe fn read_u16(p: *const u8) -> u16 { + core::ptr::read_unaligned(p as *const u16) +} diff --git a/programs/hydra/src/processor/create.rs b/programs/hydra/src/processor/create.rs deleted file mode 100644 index 0b9b053..0000000 --- a/programs/hydra/src/processor/create.rs +++ /dev/null @@ -1,256 +0,0 @@ -//! `Create` (disc 0). -//! -//! Wire layout for ix data (no alignment padding): -//! -//! ```text -//! seed: [u8; 32] -//! authority: [u8; 32] -//! start_slot: u64 LE -//! interval_slots: u64 LE -//! remaining: u64 LE // 0 = infinite (stored internally as u64::MAX) -//! priority_tip: u64 LE -//! cu_limit: u32 LE // 0 = cranker omits SetComputeUnitLimit -//! ── one or more scheduled ixs, parsed until the data is exhausted: ── -//! num_accounts: u8 -//! data_len: u16 LE -//! program_id: [u8; 32] -//! metas: [[flag:u8][pubkey:[u8;32]]; num_accounts] -//! data: [u8; data_len] -//! ``` - -use pinocchio::{ - cpi::{Seed, Signer}, - error::ProgramError, - sysvars::{rent::Rent, Sysvar}, - AccountView, Address, ProgramResult, UnsafeResize, -}; -#[cfg(not(feature = "create-account-allow-prefund"))] -use pinocchio_system::instructions::{Allocate, Assign, Transfer}; -#[cfg(feature = "create-account-allow-prefund")] -use pinocchio_system::instructions::{CreateAccountAllowPrefund, Funding}; - -use hydra_api::{ - consts::{ - ix as _ix, CRANK_HEADER_SIZE, CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, - MAX_DATA_LEN, MAX_INSTRUCTIONS, META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, - }, - instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, - state::load_crank_mut, - HydraError, -}; - -pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { - let [payer, crank_ai, _system_program] = accounts else { - return Err(ProgramError::NotEnoughAccountKeys); - }; - - // Need at least the scheduling prefix plus one ix blob header. - if data.len() < CREATE_FIXED_PREFIX_LEN + CREATE_IX_HEADER_LEN { - return Err(ProgramError::InvalidInstructionData); - } - - // SAFETY: bounds checked above; Address/u64/u16 only require byte alignment. - let seed: &[u8; 32] = unsafe { &*(data.as_ptr() as *const [u8; 32]) }; - let authority: &[u8; 32] = unsafe { &*(data.as_ptr().add(32) as *const [u8; 32]) }; - let start_slot = read_u64_le(data, 64); - let interval_slots = read_u64_le(data, 72); - let remaining_wire = read_u64_le(data, 80); - let priority_tip = read_u64_le(data, 88); - let cu_limit = read_u32_le(data, 96); - - // `0` is the documented opt-out. Any non-zero value must be within the - // Solana per-tx ceiling or the runtime would reject the cranker's tx. - if cu_limit > MAX_COMPUTE_UNIT_LIMIT { - return Err(HydraError::InvalidSchedule.into()); - } - // A never-advancing infinite crank makes no sense. - if remaining_wire == 0 && interval_slots == 0 { - return Err(HydraError::InvalidSchedule.into()); - } - - let authority_signer: u8 = (payer.address().as_array() == authority) as u8; - - // Re-serializing each scheduled ix into the instructions-sysvar tail layout - // widens its `num_accounts` from u8 to u16 — exactly one extra byte per ix — - // so the tail length is `body_len + num_instructions`, which is at most - // `body_len + MAX_INSTRUCTIONS`. Create the account at that O(1) upper bound, - // then validate + serialize the tail in a single pass and shrink to the - // exact length. This avoids a separate pass just to pre-compute the size. - let body_len = data.len() - CREATE_FIXED_PREFIX_LEN; - let upper_region = body_len + MAX_INSTRUCTIONS; - // The exact tail length (`<= upper_region`) is stored in a `u16` header field. - if upper_region > u16::MAX as usize { - return Err(HydraError::InvalidSchedule.into()); - } - - // Derive expected PDA and verify match. - let (expected_pda, bump) = - Address::find_program_address(&[CRANK_SEED_PREFIX, seed.as_ref()], &hydra_api::ID); - if crank_ai.address() != &expected_pda { - return Err(ProgramError::InvalidSeeds); - } - - let total_size = CRANK_HEADER_SIZE + upper_region; - - // One sysvar read serves both CreateAccount funding and the cached floor. - let rent = Rent::get()?; - let rent_min = rent.try_minimum_balance(total_size)?; - - // Sign the CreateAccount with the PDA's seeds so it owns itself on creation. - let bump_arr = [bump]; - let seeds_arr = [ - Seed::from(CRANK_SEED_PREFIX), - Seed::from(seed.as_ref()), - Seed::from(&bump_arr), - ]; - let signers = [Signer::from(&seeds_arr)]; - - #[cfg(feature = "create-account-allow-prefund")] - { - let funding_lamports = rent_min.saturating_sub(crank_ai.lamports()); - if funding_lamports == 0 && !payer.is_signer() { - return Err(ProgramError::MissingRequiredSignature); - } - CreateAccountAllowPrefund { - to: crank_ai, - space: total_size as u64, - owner: &hydra_api::ID, - funding: (funding_lamports > 0).then_some(Funding { - from: payer, - lamports: funding_lamports, - }), - } - .invoke_signed(&signers)?; - } - - #[cfg(not(feature = "create-account-allow-prefund"))] - { - let funding_lamports = rent_min.saturating_sub(crank_ai.lamports()); - if funding_lamports == 0 && !payer.is_signer() { - return Err(ProgramError::MissingRequiredSignature); - } - if funding_lamports > 0 { - Transfer { - from: payer, - to: crank_ai, - lamports: funding_lamports, - } - .invoke()?; - } - Allocate { - account: crank_ai, - space: total_size as u64, - } - .invoke_signed(&signers)?; - Assign { - account: crank_ai, - owner: &hydra_api::ID, - } - .invoke_signed(&signers)?; - } - - // Validate each scheduled ix and re-serialize it into the tail in the - // instructions-sysvar wire layout, counting and accumulating the exact - // length as we go. The account is over-provisioned to `upper_region`, so - // every write stays in bounds (the tail is at most one byte per ix longer - // than the wire body, and there are at most `MAX_INSTRUCTIONS` of them). - let region_len = { - let mut account_data = crank_ai.try_borrow_mut()?; - let buf: &mut [u8] = &mut account_data; - let (header_bytes, tail_bytes) = buf.split_at_mut(CRANK_HEADER_SIZE); - - let mut cursor = CREATE_FIXED_PREFIX_LEN; - let mut off = 0usize; - let mut num_instructions = 0usize; - while cursor < data.len() { - if cursor + CREATE_IX_HEADER_LEN > data.len() { - return Err(ProgramError::InvalidInstructionData); - } - num_instructions += 1; - if num_instructions > MAX_INSTRUCTIONS { - return Err(HydraError::InvalidSchedule.into()); - } - let num_accounts = data[cursor] as usize; - let data_len = u16::from_le_bytes([data[cursor + 1], data[cursor + 2]]) as usize; - if num_accounts > MAX_ACCOUNTS || data_len > MAX_DATA_LEN { - return Err(HydraError::InvalidSchedule.into()); - } - let metas_offset = cursor + CREATE_IX_HEADER_LEN; - let metas_len = num_accounts * SERIALIZED_META_SIZE; - let data_offset = metas_offset + metas_len; - let next = data_offset + data_len; - if next > data.len() { - return Err(ProgramError::InvalidInstructionData); - } - // Reject any signer flag — scheduled ixs run top-level, they can - // only be signed by real keys, and this program can't produce a - // signature for a declared pubkey anyway. - for i in 0..num_accounts { - if data[metas_offset + i * SERIALIZED_META_SIZE] & META_FLAG_SIGNER != 0 { - return Err(HydraError::SignerInScheduledIx.into()); - } - } - // Tail blob, instructions-sysvar layout: - // [num_accounts u16][metas][program_id 32][data_len u16][data] - tail_bytes[off..off + 2].copy_from_slice(&(num_accounts as u16).to_le_bytes()); - off += 2; - tail_bytes[off..off + metas_len].copy_from_slice(&data[metas_offset..data_offset]); - off += metas_len; - tail_bytes[off..off + 32] - .copy_from_slice(&data[cursor + 3..cursor + CREATE_IX_HEADER_LEN]); - off += 32; - tail_bytes[off..off + 2].copy_from_slice(&(data_len as u16).to_le_bytes()); - off += 2; - tail_bytes[off..off + data_len].copy_from_slice(&data[data_offset..next]); - off += data_len; - - cursor = next; - } - - // SAFETY: split yields CRANK_HEADER_SIZE bytes; Crank is align-1 (compile-time checked). - let state = unsafe { load_crank_mut(header_bytes)? }; - state.authority = *authority; - state.seed = *seed; - state.set_next_exec_slot(start_slot); - state.set_interval_slots(interval_slots); - state.set_remaining(if remaining_wire == 0 { - REMAINING_INFINITE - } else { - remaining_wire - }); - state.set_priority_tip(priority_tip); - state.set_executed(0); - state.set_rent_min(rent_min); - state.set_region_len(off as u16); - state.bump = bump; - state.set_cu_limit(cu_limit); - state.authority_signer = authority_signer; - - off - }; - - // Trim the over-provisioned account down to its exact size. Shrinking only - // lowers the data-length field — no syscall, never out of bounds — so the - // unchecked variant is safe: `region_len <= upper_region`, the borrow above - // is dropped, and the crank is program-owned after `CreateAccount`. - unsafe { - crank_ai.resize(CRANK_HEADER_SIZE + region_len); - } - - // Suppress unused-import warnings when `logging` feature is off. - let _ = _ix::CREATE; - - Ok(()) -} - -#[inline(always)] -fn read_u64_le(data: &[u8], offset: usize) -> u64 { - // SAFETY: the caller ensures `offset + 8 <= data.len()`. - unsafe { u64::from_le_bytes(*(data.as_ptr().add(offset) as *const [u8; 8])) } -} - -#[inline(always)] -fn read_u32_le(data: &[u8], offset: usize) -> u32 { - // SAFETY: the caller ensures `offset + 4 <= data.len()`. - unsafe { u32::from_le_bytes(*(data.as_ptr().add(offset) as *const [u8; 4])) } -} diff --git a/programs/hydra/src/processor/ephemeral/cancel.rs b/programs/hydra/src/processor/ephemeral/cancel.rs new file mode 100644 index 0000000..292a233 --- /dev/null +++ b/programs/hydra/src/processor/ephemeral/cancel.rs @@ -0,0 +1,25 @@ +//! `Cancel` (disc 2). +//! +//! Authority-gated close of an ephemeral crank. CPIs Magic `CloseEphemeralAccount`, +//! refunding the rent to `authority`. +//! +//! Accounts: `[authority(w,s), crank(w), vault(w), magic_program(ro)]`. + +use ephemeral_rollups_pinocchio::ephemeral_accounts::EphemeralAccount; +use pinocchio::{error::ProgramError, AccountView, ProgramResult}; + +use crate::processor::common::require_cancel_authority; +use crate::processor::ephemeral::common::check_magic_accounts; + +pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { + let [authority, crank_ai, vault, magic_program] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + require_cancel_authority(authority, crank_ai)?; + check_magic_accounts(vault, magic_program)?; + + // The ephemeral account need not sign on close; `authority` is the sponsor + // (a real signer) and receives the rent refund. + EphemeralAccount::new(authority, crank_ai, vault, magic_program).close() +} diff --git a/programs/hydra/src/processor/ephemeral/close.rs b/programs/hydra/src/processor/ephemeral/close.rs new file mode 100644 index 0000000..37a2b61 --- /dev/null +++ b/programs/hydra/src/processor/ephemeral/close.rs @@ -0,0 +1,46 @@ +//! `Close` (disc 3). +//! +//! Permissionless cleanup of an exhausted or stuck ephemeral crank. CPIs Magic +//! `CloseEphemeralAccount`, refunding the rent to `reporter`. If the crank has a +//! non-zero authority, only that authority may close it (so the refund can't be +//! redirected away from them). +//! +//! Accounts: `[reporter(w,s), crank(w), vault(w), magic_program(ro)]`. + +use ephemeral_rollups_pinocchio::ephemeral_accounts::EphemeralAccount; +use pinocchio::{error::ProgramError, AccountView, ProgramResult}; + +use hydra_api::{state::load_crank, HydraError, STALENESS_THRESHOLD_SLOTS}; + +use crate::helpers::get_clock_slot; +use crate::processor::common::{require_refund_recipient, require_signed_crank}; +use crate::processor::ephemeral::common::check_magic_accounts; + +pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { + let [reporter, crank_ai, vault, magic_program] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + require_signed_crank(reporter, crank_ai)?; + check_magic_accounts(vault, magic_program)?; + + let (stored_authority, remaining, next_exec_slot) = { + let data = crank_ai.try_borrow()?; + let s = unsafe { load_crank(&data)? }; + (s.authority, s.remaining(), s.next_exec_slot()) + }; + + // Exhausted OR stuck. There is no "underfunded" case: an ephemeral crank + // never holds lamports. + let exhausted = remaining == 0; + let current_slot = get_clock_slot()?; + let stuck = current_slot.saturating_sub(next_exec_slot) > STALENESS_THRESHOLD_SLOTS; + if !(exhausted || stuck) { + return Err(HydraError::NotClosable.into()); + } + + // The refund goes to `reporter`, so anti-grief binds the closer to the authority. + require_refund_recipient(stored_authority, reporter)?; + + EphemeralAccount::new(reporter, crank_ai, vault, magic_program).close() +} diff --git a/programs/hydra/src/processor/ephemeral/common.rs b/programs/hydra/src/processor/ephemeral/common.rs new file mode 100644 index 0000000..13461c2 --- /dev/null +++ b/programs/hydra/src/processor/ephemeral/common.rs @@ -0,0 +1,17 @@ +//! Shared helpers for the ephemeral-rollup crank processors. + +use ephemeral_rollups_pinocchio::consts::{EPHEMERAL_VAULT_ID, MAGIC_PROGRAM_ID}; +use pinocchio::{error::ProgramError, AccountView, ProgramResult}; + +/// Reject calls that don't reference the real Magic program + ephemeral vault, +/// so the CPI can't be pointed at an impostor program/vault. +#[inline(always)] +pub(super) fn check_magic_accounts( + vault: &AccountView, + magic_program: &AccountView, +) -> ProgramResult { + if vault.address() != &EPHEMERAL_VAULT_ID || magic_program.address() != &MAGIC_PROGRAM_ID { + return Err(ProgramError::InvalidAccountData); + } + Ok(()) +} diff --git a/programs/hydra/src/processor/ephemeral/create.rs b/programs/hydra/src/processor/ephemeral/create.rs new file mode 100644 index 0000000..3720a31 --- /dev/null +++ b/programs/hydra/src/processor/ephemeral/create.rs @@ -0,0 +1,67 @@ +//! `Create` (disc 0). +//! +//! Allocates the crank as a MagicBlock ephemeral account (owned by Hydra) via a +//! Magic-program CPI — which materializes it synchronously — then writes the +//! `Crank` header + scheduled-ix tail, all in one instruction. +//! +//! Accounts: `[sponsor(w,s), crank(w), vault(w), magic_program(ro)]`. +//! Data: identical to base `Create`'s body (seed, authority, schedule, scheduled +//! ixs). `sponsor` sets `authority_signer` and pays the per-byte ephemeral rent. + +use ephemeral_rollups_pinocchio::ephemeral_accounts::EphemeralAccount; +use pinocchio::{ + cpi::{Seed, Signer}, + error::ProgramError, + AccountView, ProgramResult, +}; + +use hydra_api::consts::{CRANK_HEADER_SIZE, CRANK_SEED_PREFIX}; + +use crate::processor::common::{ + derive_crank_pda, measure_region, parse_create_header, write_crank, +}; +use crate::processor::ephemeral::common::check_magic_accounts; + +pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { + let [sponsor, crank_ai, vault, magic_program] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let header = parse_create_header(data)?; + let authority_signer: u8 = + (sponsor.address().as_array() == &header.authority && sponsor.is_signer()) as u8; + + check_magic_accounts(vault, magic_program)?; + + // Size the account from the scheduled ixs (validates the schedule), then + // allocate it. The exact tail is written below. + let region_len = measure_region(data)?; + let bump = derive_crank_pda(crank_ai, &header.seed)?; + let data_len = CRANK_HEADER_SIZE + region_len; + + // The crank PDA must sign the create CPI (the ephemeral account is a signer + // on create, to prevent pubkey squatting); Hydra signs it with the seeds. + let bump_arr = [bump]; + let seeds = [ + Seed::from(CRANK_SEED_PREFIX), + Seed::from(header.seed.as_ref()), + Seed::from(&bump_arr), + ]; + let signer = Signer::from(&seeds); + + EphemeralAccount::new(sponsor, crank_ai, vault, magic_program) + .with_signers(&[signer]) + .create(data_len as u32)?; + + // The account is sized to `region_len`, so `write_crank` fills it exactly. + // Ephemeral cranks hold no lamports, so the rent floor is `0`. + write_crank( + crank_ai, + data, + &header, + bump, + authority_signer, + 0, + region_len, + ) +} diff --git a/programs/hydra/src/processor/ephemeral/mod.rs b/programs/hydra/src/processor/ephemeral/mod.rs new file mode 100644 index 0000000..319001a --- /dev/null +++ b/programs/hydra/src/processor/ephemeral/mod.rs @@ -0,0 +1,8 @@ +//! Ephemeral-rollup crank lifecycle (feature `ephemeral`). + +pub mod cancel; +pub mod close; +pub mod create; +pub mod trigger; + +mod common; diff --git a/programs/hydra/src/processor/ephemeral/trigger.rs b/programs/hydra/src/processor/ephemeral/trigger.rs new file mode 100644 index 0000000..4eea576 --- /dev/null +++ b/programs/hydra/src/processor/ephemeral/trigger.rs @@ -0,0 +1,79 @@ +//! `Trigger` (disc 1). +//! +//! Runs a crank's scheduled ixs once, on the ephemeral rollup. Same top-level + +//! instructions-sysvar + memcmp follow-up verification and schedule advance as +//! base `Trigger`, but moves no lamports (the ephemeral crank holds none). +//! +//! Accounts: `[crank(w), cranker(w,s), instructions_sysvar]`. + +use pinocchio::{ + error::ProgramError, sysvars::instructions::INSTRUCTIONS_ID, AccountView, ProgramResult, +}; + +use hydra_api::{ + consts::REMAINING_INFINITE, + state::{load_crank, load_crank_mut}, + HydraError, +}; + +use crate::{ + helpers::{get_clock_slot, get_stack_height, TRANSACTION_LEVEL_STACK_HEIGHT}, + processor::common::verify_followup, +}; + +pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { + let [crank_ai, cranker_ai, ix_sysvar_ai] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + if !cranker_ai.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + if !crank_ai.owned_by(&hydra_api::ID) { + return Err(ProgramError::InvalidAccountOwner); + } + if ix_sysvar_ai.address() != &INSTRUCTIONS_ID { + return Err(ProgramError::UnsupportedSysvar); + } + if get_stack_height() != TRANSACTION_LEVEL_STACK_HEIGHT { + return Err(HydraError::InvalidInstruction.into()); + } + + let current_slot = get_clock_slot()?; + + let (next_exec_slot, interval_slots, remaining, executed, region_len) = { + let data = crank_ai.try_borrow()?; + let s = unsafe { load_crank(&data)? }; + ( + s.next_exec_slot(), + s.interval_slots(), + s.remaining(), + s.executed(), + s.region_len(), + ) + }; + + if current_slot < next_exec_slot { + return Err(HydraError::NotYetExecutable.into()); + } + if remaining == 0 { + return Err(HydraError::Exhausted.into()); + } + + verify_followup(ix_sysvar_ai, crank_ai, region_len as usize)?; + + let next_slot = next_exec_slot + .checked_add(interval_slots) + .ok_or(ProgramError::ArithmeticOverflow)?; + { + let mut data = crank_ai.try_borrow_mut()?; + let s = unsafe { load_crank_mut(&mut data)? }; + s.set_next_exec_slot(next_slot); + s.set_executed(executed + 1); + if remaining != REMAINING_INFINITE { + s.set_remaining(remaining - 1); + } + } + + Ok(()) +} diff --git a/programs/hydra/src/processor/mod.rs b/programs/hydra/src/processor/mod.rs index d5637c9..d94b91c 100644 --- a/programs/hydra/src/processor/mod.rs +++ b/programs/hydra/src/processor/mod.rs @@ -1,4 +1,11 @@ -pub mod cancel; -pub mod close; -pub mod create; -pub mod trigger; +pub mod common; + +#[cfg(not(feature = "ephemeral"))] +mod base; +#[cfg(not(feature = "ephemeral"))] +pub use base::*; + +#[cfg(feature = "ephemeral")] +mod ephemeral; +#[cfg(feature = "ephemeral")] +pub use ephemeral::*; diff --git a/tests/ephemeral/Cargo.lock b/tests/ephemeral/Cargo.lock new file mode 100644 index 0000000..1829f9e --- /dev/null +++ b/tests/ephemeral/Cargo.lock @@ -0,0 +1,5864 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[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 0.8.12", + "solana-epoch-schedule 3.1.1", + "solana-hash 3.1.0", + "solana-pubkey 3.0.0", + "solana-sha256-hasher 3.1.0", + "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 3.1.0", +] + +[[package]] +name = "agave-syscalls" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98807b80e4367cc38c2b24ea30d6d16466553982aeedb0b0cb2c70bbae8ba5b0" +dependencies = [ + "bincode 1.3.3", + "libsecp256k1", + "num-traits", + "solana-account 3.4.0", + "solana-account-info 3.1.1", + "solana-big-mod-exp 3.0.0", + "solana-blake3-hasher 3.1.0", + "solana-bn254", + "solana-clock 3.1.0", + "solana-cpi 3.1.0", + "solana-curve25519", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-keccak-hasher 3.1.0", + "solana-loader-v3-interface 6.1.1", + "solana-poseidon", + "solana-program-entrypoint 3.1.1", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "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", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-type-overrides", + "solana-sysvar 3.1.1", + "solana-sysvar-id 3.1.0", + "solana-transaction-context", + "thiserror 2.0.18", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[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 = "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" +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 = "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 0.8.12", + "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.118", +] + +[[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.118", +] + +[[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 0.8.12", + "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.118", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" + +[[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" +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.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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", + "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]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +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 = "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.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" +dependencies = [ + "borsh-derive 1.7.0", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" +dependencies = [ + "once_cell", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" + +[[package]] +name = "cc" +version = "1.2.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +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 = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +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 = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c06f1eb05f06cf2e380fdded278fbf056a38974299d77960555a311dcf91a52" +dependencies = [ + "keccak-const", + "sha2-const-stable", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.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 = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +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 = "ct-codecs" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49fb0c6640b4507ebd99ff67677009e381ba5eee1d14df78de4a3d16eb123c39" + +[[package]] +name = "ctor" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1c888a2a4f677017373fb6c01e13e318dd9e78758445ed5eb985e355d3f8281" +dependencies = [ + "ctor-proc-macro", + "dtor", + "link-section", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ab264ea985f1bd27887d7b21ea2bb046728e05d11909ca138d700c494730db" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "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.118", +] + +[[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.118", +] + +[[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.118", +] + +[[package]] +name = "dary_heap" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1e3a325bc115f096c8b77bbf027a7c2592230e70be2d985be950d3d5e60ebe" + +[[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" +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 0.10.4", + "const-oid", + "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 = "dtor" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e4690622ab6700ced40fc370a3f07b7d111f0154bb6fb08f73b4c8834f75b6" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c98b077c7463d01d22dde8a24378ddf1ca7263dc687cffbed38819ea6c21131" + +[[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 = "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 = "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "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.118", +] + +[[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.118", +] + +[[package]] +name = "ephemeral-rollups-pinocchio" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a09b61c47e5b4eeb7add34e9d43d836784a66d78fa704606bebaa453bef73e21" +dependencies = [ + "bincode 2.0.1", + "pinocchio 0.10.2", + "pinocchio-pubkey", + "pinocchio-system", + "solana-address 2.6.1", +] + +[[package]] +name = "ephemeral-rollups-sdk" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "838564736408ada011e9986c819b26cf0195bb2dd238e10be258731979213d75" +dependencies = [ + "base64ct", + "bincode 1.3.3", + "bytemuck", + "ephemeral-rollups-sdk-attribute-action", + "ephemeral-rollups-sdk-attribute-commit", + "ephemeral-rollups-sdk-attribute-delegate", + "ephemeral-rollups-sdk-attribute-ephemeral", + "ephemeral-rollups-sdk-attribute-ephemeral-accounts", + "five8 0.2.1", + "getrandom 0.2.17", + "magicblock-delegation-program-api", + "magicblock-magic-program-api 0.10.1", + "solana-account 3.4.0", + "solana-account-info 2.3.0", + "solana-account-info 3.1.1", + "solana-address 2.6.1", + "solana-cpi 3.1.0", + "solana-instruction 3.4.0", + "solana-program 2.3.0", + "solana-program 3.0.0", + "solana-program-error 2.2.2", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-sysvar 3.1.1", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-action" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a29f33b94edcdfcf1b9b7a61aa0ac00e8efdc66f89c8b4b573f7ea965a42c60a" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-commit" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9ed3ea8b850013f6bf768e5f0f2e1f22f1861b46908764536795bf67bb5c67" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-delegate" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f0d8ab90b4ecc7ac802bbd2115681f9fd42bc5a9018be79ba7aff1fe971aa36" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-ephemeral" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ea166c57ee55b329be4eae730561fe02aad5620a35b4d89439d8d0c9e07c3a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-ephemeral-accounts" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa3efae094f5c288746d479fd605b67bcd56d29ddcf1238046ac07eeec130c45" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + +[[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 = "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" +dependencies = [ + "five8_core 1.0.0", +] + +[[package]] +name = "five8_const" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" +dependencies = [ + "five8_core 0.1.2", +] + +[[package]] +name = "five8_const" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" +dependencies = [ + "five8_core 1.0.0", +] + +[[package]] +name = "five8_core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" + +[[package]] +name = "five8_core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.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", + "r-efi", + "wasip2", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.12", +] + +[[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.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hybrid-array" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +dependencies = [ + "typenum", +] + +[[package]] +name = "hydra-api" +version = "0.1.1" +dependencies = [ + "ephemeral-rollups-pinocchio", + "pinocchio 0.10.2", + "solana-address 2.6.1", + "solana-instruction 3.4.0", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "hydra-ephemeral-tests" +version = "0.0.0" +dependencies = [ + "ephemeral-rollups-pinocchio", + "hydra-api", + "magicsvm", + "solana-account 3.4.0", + "solana-address 2.6.1", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-keypair", + "solana-message 3.1.0", + "solana-signer", + "solana-transaction", +] + +[[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 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.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.9", + "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 = "keccak-const" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d8d8ce877200136358e0bbff3a77965875db3af755a11e1fa6b1b3e2df13ea" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libflate" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd96e993e5f3368b0cb8497dae6c860c22af8ff18388c61c6c0b86c58d86b5df" +dependencies = [ + "adler32", + "crc32fast", + "dary_heap", + "libflate_lz77", + "no_std_io2", +] + +[[package]] +name = "libflate_lz77" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7a10e427698aef6eef269482776debfef63384d30f13aad39a1a95e0e098fd" +dependencies = [ + "hashbrown 0.16.1", + "no_std_io2", + "rle-decode-fast", +] + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsodium-rs" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8cd48c80d6c6fa5a4612d242941067219555baea82b0b49c92ea9d8156b59c" +dependencies = [ + "ct-codecs", + "ctor", + "libc", + "libsodium-sys-stable", + "pkg-config", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "libsodium-sys-stable" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b04bf6da2c98b727af37ab62cb505f4d751b975b034a9b9ad491d333b0564e" +dependencies = [ + "cc", + "libc", + "libflate", + "minisign-verify", + "pkg-config", + "tar", + "ureq", + "vcpkg", + "zip", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "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 = "link-section" +version = "0.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52437d47b0358721ec869cc7374b2a21f7b2237af9b439c0391341a1fbfbf1b" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litesvm" +version = "0.12.0" +source = "git+https://github.com/magicblock-labs/litesvm?branch=dode%2Fmagicsvm#c83fa93773cebf8a521854d68158d08fba3579f4" +dependencies = [ + "agave-feature-set", + "agave-reserved-account-keys", + "agave-syscalls", + "ansi_term", + "bincode 1.3.3", + "indexmap", + "itertools 0.14.0", + "log", + "serde", + "solana-account 3.4.0", + "solana-address 2.6.1", + "solana-address-lookup-table-interface 3.1.0", + "solana-bpf-loader-program", + "solana-builtins", + "solana-clock 3.1.0", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-epoch-rewards 3.0.2", + "solana-epoch-schedule 3.1.1", + "solana-feature-gate-interface 3.1.0", + "solana-fee", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-instructions-sysvar 3.0.1", + "solana-keypair", + "solana-last-restart-slot 3.0.1", + "solana-loader-v3-interface 6.1.1", + "solana-loader-v4-interface 3.1.0", + "solana-message 3.1.0", + "solana-native-token 3.0.0", + "solana-nonce 3.2.0", + "solana-nonce-account", + "solana-precompile-error", + "solana-program-error 3.0.1", + "solana-program-runtime", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-sha256-hasher 3.1.0", + "solana-signature 3.4.1", + "solana-signer", + "solana-slot-hashes 3.0.2", + "solana-slot-history 3.0.1", + "solana-stake-interface 2.0.2", + "solana-svm-callback", + "solana-svm-log-collector", + "solana-svm-timings", + "solana-svm-transaction", + "solana-system-interface 3.2.0", + "solana-system-program", + "solana-sysvar 3.1.1", + "solana-sysvar-id 3.1.0", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error 3.2.1", + "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.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "magicblock-delegation-program-api" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "288904a9950bd20f27f0ef934f320ab1410bd35a6d5c9cf138eca276442b6b2e" +dependencies = [ + "bincode 1.3.3", + "borsh 0.10.4", + "borsh 1.7.0", + "bytemuck", + "const-crypto", + "libsodium-rs", + "num_enum", + "pinocchio 0.10.2", + "pinocchio-log", + "pinocchio-pubkey", + "pinocchio-system", + "rkyv", + "serde", + "solana-address 2.6.1", + "solana-instruction 3.4.0", + "solana-loader-v3-interface 6.1.1", + "solana-program 3.0.0", + "solana-pubkey 2.4.0", + "solana-sdk", + "solana-sdk-ids 3.1.0", + "solana-sha256-hasher 3.1.0", + "solana-system-interface 2.0.0", + "static_assertions", + "strum", + "thiserror 2.0.18", +] + +[[package]] +name = "magicblock-magic-program-api" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291f7a68f6cc622741a3fae513bd71640911abefd1fae2b2602b934515ed4b95" +dependencies = [ + "bincode 1.3.3", + "const-crypto", + "serde", + "solana-program 2.3.0", + "solana-signature 2.3.0", +] + +[[package]] +name = "magicblock-magic-program-api" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dc8fba0307c90b91b70c9ed06d4242d6c4159f331b2f05bf8f875c2a94e0e98" +dependencies = [ + "bincode 1.3.3", + "const-crypto", + "serde", + "solana-program 3.0.0", + "solana-signature 3.4.1", +] + +[[package]] +name = "magicsvm" +version = "0.1.1" +dependencies = [ + "bincode 1.3.3", + "borsh 1.7.0", + "ephemeral-rollups-sdk", + "litesvm", + "magicblock-delegation-program-api", + "magicblock-magic-program-api 0.8.8", + "solana-account 3.4.0", + "solana-address 2.6.1", + "solana-clock 3.1.0", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-keypair", + "solana-message 3.1.0", + "solana-program-runtime", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-signature 3.4.1", + "solana-signer", + "solana-system-interface 2.0.0", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error 3.2.1", +] + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[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 = "minisign-verify" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f9645cb765ea72b8111f36c522475d2daa0d22c957a9826437e97534bc4e9e" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "no_std_io2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +dependencies = [ + "memchr", +] + +[[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.118", +] + +[[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 = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "once_cell" +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" +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 = "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 = "pinocchio" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8afe4f39c0e25cc471b35b89963312791a5162d45a86578cbeaad9e5e7d1b3b" + +[[package]] +name = "pinocchio" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06810dac15a4ef83d3dabdb4f2f22fb39c9adff669cd2781da4f716510a647c" +dependencies = [ + "solana-account-view", + "solana-address 2.6.1", + "solana-define-syscall 4.0.1", + "solana-instruction-view", + "solana-program-error 3.0.1", +] + +[[package]] +name = "pinocchio-log" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd11022408f312e6179ece321c1f7dc0d1b2aa7765fddd39b2a7378d65a899e8" +dependencies = [ + "pinocchio-log-macro", +] + +[[package]] +name = "pinocchio-log-macro" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fb52edb3c5736b044cc462b0957b9767d0f574d138f4e2761438c498a4b467" +dependencies = [ + "quote", + "regex", + "syn 1.0.109", +] + +[[package]] +name = "pinocchio-pubkey" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0225638cadcbebae8932cb7f49cb5da7c15c21beb19f048f05a5ca7d93f065" +dependencies = [ + "five8_const 0.1.4", + "pinocchio 0.9.3", + "sha2-const-stable", +] + +[[package]] +name = "pinocchio-system" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24044a0815753862b558e179e78f03f7344cb755de48617a09d7d23b50883b6c" +dependencies = [ + "pinocchio 0.10.2", + "solana-address 2.6.1", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[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 = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[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 = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "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.118", +] + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +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 = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.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 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]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rle-decode-fast" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.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-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" +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.118", +] + +[[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.118", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[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 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[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" +source = "git+https://github.com/magicblock-labs/magicblock-svm.git?rev=5bd1d56#5bd1d567c53c43fb501d3cb6d28ea1e9dd42f948" +dependencies = [ + "bincode 1.3.3", + "qualifier_attr", + "serde", + "serde_bytes", + "solana-account-info 3.1.1", + "solana-clock 3.1.0", + "solana-instruction 3.4.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-sysvar 3.1.1", +] + +[[package]] +name = "solana-account-info" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" +dependencies = [ + "bincode 1.3.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" +dependencies = [ + "bincode 1.3.3", + "serde_core", + "solana-address 2.6.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", +] + +[[package]] +name = "solana-account-view" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37ca34c37f92ee341b73d5ce7c8ef5bb38e9a87955b4bd343c63fa18b149215" +dependencies = [ + "solana-address 2.6.1", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-address" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" +dependencies = [ + "solana-address 2.6.1", +] + +[[package]] +name = "solana-address" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39c93e262f671bf402e1040e4a7e40b05d81da5956c7681948c975a0997517bb" +dependencies = [ + "borsh 1.7.0", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "five8 1.0.0", + "five8_const 1.0.0", + "rand 0.9.4", + "serde", + "serde_derive", + "sha2-const-stable", + "solana-atomic-u64 3.0.1", + "solana-define-syscall 5.1.0", + "solana-program-error 3.0.1", + "solana-sanitize 3.0.1", + "solana-sha256-hasher 3.1.0", + "wincode", +] + +[[package]] +name = "solana-address-lookup-table-interface" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1673f67efe870b64a65cb39e6194be5b26527691ce5922909939961a6e6b395" +dependencies = [ + "bincode 1.3.3", + "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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115b4f773acc4f3f3cb986b0d335e9845c0368c82b0940410935bc11ae065578" +dependencies = [ + "bincode 1.3.3", + "bytemuck", + "serde", + "serde_derive", + "solana-clock 3.1.0", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.0.2", +] + +[[package]] +name = "solana-atomic-u64" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-atomic-u64" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-big-mod-exp" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "solana-define-syscall 2.3.0", +] + +[[package]] +name = "solana-big-mod-exp" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "solana-define-syscall 3.0.0", +] + +[[package]] +name = "solana-bincode" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" +dependencies = [ + "bincode 1.3.3", + "serde", + "solana-instruction 2.3.3", +] + +[[package]] +name = "solana-bincode" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" +dependencies = [ + "bincode 1.3.3", + "serde_core", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" +dependencies = [ + "blake3", + "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", + "solana-define-syscall 5.1.0", + "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.7.0", +] + +[[package]] +name = "solana-borsh" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" +dependencies = [ + "borsh 1.7.0", +] + +[[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 1.3.3", + "qualifier_attr", + "solana-account 3.4.0", + "solana-bincode 3.1.0", + "solana-clock 3.1.0", + "solana-instruction 3.4.0", + "solana-loader-v3-interface 6.1.1", + "solana-loader-v4-interface 3.1.0", + "solana-packet", + "solana-program-entrypoint 3.1.1", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids 3.1.0", + "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 3.1.0", + "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 0.8.12", + "log", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-loader-v4-program", + "solana-pubkey 3.0.0", + "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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea35d8f69b67daddb921a9da7f78ca591b533cf5e98833cd9ae62fdc2e4652c" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-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 3.0.2", + "solana-builtins-default-costs", + "solana-compute-budget", + "solana-compute-budget-interface", + "solana-instruction 3.4.0", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-svm-transaction", + "solana-transaction-error 3.2.1", + "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 1.7.0", + "solana-instruction 3.4.0", + "solana-sdk-ids 3.1.0", +] + +[[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 = "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 3.1.1", + "solana-define-syscall 4.0.1", + "solana-instruction 3.4.0", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", + "solana-stable-layout 3.0.1", +] + +[[package]] +name = "solana-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-decode-error" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c781686a18db2f942e70913f7ca15dc120ec38dcab42ff7557db2c70c625a35" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-define-syscall" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" + +[[package]] +name = "solana-define-syscall" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9697086a4e102d28a156b8d6b521730335d6951bd39a5e766512bbe09007cee" + +[[package]] +name = "solana-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-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" +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.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 3.1.0", + "solana-sdk-macro 3.0.1", + "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.1", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-epoch-schedule" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fce071fbddecc55d727b1d7ed16a629afe4f6e4c217bc8d00af3b785f6f67ed" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-epoch-schedule" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad280b1ed803853f7b453cb3ea9a57e600ca5599a63e69f7be199b486c0ec93" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-epoch-stake" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "027e6d0b9e7daac5b2ac7c3f9ca1b727861121d9ef05084cf435ff736051e7c2" +dependencies = [ + "solana-define-syscall 5.1.0", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-example-mocks" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84461d56cbb8bb8d539347151e0525b53910102e4bced875d49d5139708e39d3" +dependencies = [ + "serde", + "serde_derive", + "solana-address-lookup-table-interface 2.2.2", + "solana-clock 2.2.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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978855d164845c1b0235d4b4d101cadc55373fffaf0b5b6cfa2194d25b2ed658" +dependencies = [ + "serde", + "serde_derive", + "solana-address-lookup-table-interface 3.1.0", + "solana-clock 3.1.0", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-keccak-hasher 3.1.0", + "solana-message 3.1.0", + "solana-nonce 3.2.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-system-interface 2.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-feature-gate-interface" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f5c5382b449e8e4e3016fb05e418c53d57782d8b5c30aa372fc265654b956d" +dependencies = [ + "bincode 1.3.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-account 3.4.0", + "solana-account-info 3.1.1", + "solana-instruction 3.4.0", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", + "solana-rent 4.2.1", + "solana-sdk-ids 3.1.0", + "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]] +name = "solana-fee-calculator" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89bc408da0fb3812bc3008189d148b4d3e08252c79ad810b245482a3f70cd8d" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-fee-calculator" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef67f01cc6a0c72e99a08d0d484683f995de4c80e9568728fa77d1537f9b7e09" +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" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-hard-forks" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45406eccad36220e52988b024d8daa93e691e38d5d71ad5fec55410cc9cf427d" + +[[package]] +name = "solana-hash" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" +dependencies = [ + "borsh 1.7.0", + "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" +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 1.7.0", + "bytemuck", + "bytemuck_derive", + "five8 1.0.0", + "serde", + "serde_derive", + "solana-atomic-u64 3.0.1", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-inflation" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf104167e42e747602b88e02b25cacfc5de699c3b7cbba60d3250437e6a22ed" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-instruction" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab5682934bd1f65f8d2c16f21cb532526fcc1a09f796e2cacdb091eee5774ad" +dependencies = [ + "bincode 1.3.3", + "borsh 1.7.0", + "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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" +dependencies = [ + "bincode 1.3.3", + "borsh 1.7.0", + "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 3.0.1", +] + +[[package]] +name = "solana-instruction-view" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60147e4d0a4620013df40bf30a86dd299203ff12fcb8b593cd51014fce0875d8" +dependencies = [ + "solana-account-view", + "solana-address 2.6.1", + "solana-define-syscall 4.0.1", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-instructions-sysvar" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" +dependencies = [ + "bitflags", + "solana-account-info 2.3.0", + "solana-instruction 2.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]] +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 3.1.1", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-program-error 3.0.1", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-serialize-utils 3.1.2", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-keccak-hasher" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" +dependencies = [ + "sha3", + "solana-define-syscall 2.3.0", + "solana-hash 2.3.0", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-keccak-hasher" +version = "3.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", + "ed25519-dalek-bip32", + "five8 1.0.0", + "five8_core 1.0.0", + "rand 0.9.4", + "solana-address 2.6.1", + "solana-derivation-path", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature 3.4.1", + "solana-signer", +] + +[[package]] +name = "solana-last-restart-slot" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6360ac2fdc72e7463565cd256eedcf10d7ef0c28a1249d261ec168c1b55cdd" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-last-restart-slot" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "426711c6564b790026e45cabec3c64b971864c48b6b2d83c0ebf52a118bb4cda" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-loader-v2-interface" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8ab08006dad78ae7cd30df8eea0539e207d08d91eaefb3e1d49a446e1c49654" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 2.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]] +name = "solana-loader-v3-interface" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e0538d4dbc9022e01616f1c58f2db98ece739c5d5ed4a2ef8737a953e76a2d4" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 3.4.0", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "706a777242f1f39a83e2a96a2a6cb034cb41169c6ecbee2cf09cb873d9659e7e" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 2.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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 3.4.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "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 3.4.0", + "solana-bincode 3.1.0", + "solana-bpf-loader-program", + "solana-instruction 3.4.0", + "solana-loader-v3-interface 6.1.1", + "solana-loader-v4-interface 3.1.0", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "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 1.3.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" +dependencies = [ + "bincode 1.3.3", + "blake3", + "lazy_static", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.2", + "solana-transaction-error 3.2.1", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726b7cbbc6be6f1c6f29146ac824343b9415133eee8cce156452ad1db93f8008" +dependencies = [ + "solana-define-syscall 5.1.0", +] + +[[package]] +name = "solana-native-token" +version = "2.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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95dbc9f2e33b6c10e231df15cb2a3bff9ea7eab6347f9e316fe75c97fd67bbb" +dependencies = [ + "serde", + "serde_derive", + "solana-fee-calculator 3.2.2", + "solana-hash 4.4.0", + "solana-pubkey 4.2.0", + "solana-sha256-hasher 3.1.0", +] + +[[package]] +name = "solana-nonce-account" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" +dependencies = [ + "solana-account 3.4.0", + "solana-hash 3.1.0", + "solana-nonce 3.2.0", + "solana-sdk-ids 3.1.0", +] + +[[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 3.4.1", + "solana-signer", +] + +[[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-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 3.4.1", + "solana-signer", +] + +[[package]] +name = "solana-program" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" +dependencies = [ + "bincode 1.3.3", + "blake3", + "borsh 0.10.4", + "borsh 1.7.0", + "bs58", + "bytemuck", + "console_error_panic_hook", + "console_log", + "getrandom 0.2.17", + "lazy_static", + "log", + "memoffset", + "num-bigint 0.4.6", + "num-derive", + "num-traits", + "rand 0.8.6", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91b12305dd81045d705f427acd0435a2e46444b65367d7179d7bdcfc3bc5f5eb" +dependencies = [ + "memoffset", + "solana-account-info 3.1.1", + "solana-big-mod-exp 3.0.0", + "solana-blake3-hasher 3.1.0", + "solana-borsh 3.0.2", + "solana-clock 3.1.0", + "solana-cpi 3.1.0", + "solana-define-syscall 3.0.0", + "solana-epoch-rewards 3.0.2", + "solana-epoch-schedule 3.1.1", + "solana-epoch-stake", + "solana-example-mocks 3.0.0", + "solana-fee-calculator 3.2.2", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-instructions-sysvar 3.0.1", + "solana-keccak-hasher 3.1.0", + "solana-last-restart-slot 3.0.1", + "solana-msg 3.1.0", + "solana-native-token 3.0.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", + "solana-program-option 3.1.0", + "solana-program-pack 3.1.0", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-secp256k1-recover 3.1.1", + "solana-serde-varint 3.0.1", + "solana-serialize-utils 3.1.2", + "solana-sha256-hasher 3.1.0", + "solana-short-vec 3.2.2", + "solana-slot-hashes 3.0.2", + "solana-slot-history 3.0.1", + "solana-stable-layout 3.0.1", + "solana-sysvar 3.1.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-program-entrypoint" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ce041b1a0ed275290a5008ee1a4a6c48f5054c8a3d78d313c08958a06aedbd" +dependencies = [ + "solana-account-info 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-program-entrypoint" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c9b0a1ff494e05f503a08b3d51150b73aa639544631e510279d6375f290997" +dependencies = [ + "solana-account-info 3.1.1", + "solana-define-syscall 4.0.1", + "solana-program-error 3.0.1", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-program-error" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee2e0217d642e2ea4bee237f37bd61bb02aec60da3647c48ff88f6556ade775" +dependencies = [ + "borsh 1.7.0", + "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 1.7.0", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4068648649653c2c50546e9a7fb761791b5ab0cda054c771bb5808d3a4b9eb52" +dependencies = [ + "solana-define-syscall 4.0.1", +] + +[[package]] +name = "solana-program-option" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc677a2e9bc616eda6dbdab834d463372b92848b2bfe4a1ed4e4b4adba3397d0" + +[[package]] +name = "solana-program-option" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a88006a9b8594088cec9027ab77caaaa258a2aaa2083d3f086c44b42e50aeab" + +[[package]] +name = "solana-program-pack" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "319f0ef15e6e12dc37c597faccb7d62525a509fec5f6975ecb9419efddeb277b" +dependencies = [ + "solana-program-error 2.2.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 3.0.1", +] + +[[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 1.3.3", + "itertools 0.12.1", + "log", + "percentage", + "rand 0.8.6", + "serde", + "solana-account 3.4.0", + "solana-account-info 3.1.1", + "solana-clock 3.1.0", + "solana-epoch-rewards 3.0.2", + "solana-epoch-schedule 3.1.1", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-last-restart-slot 3.0.1", + "solana-loader-v3-interface 6.1.1", + "solana-program-entrypoint 3.1.1", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.0.2", + "solana-stable-layout 3.0.1", + "solana-stake-interface 2.0.2", + "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 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.7.0", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" +dependencies = [ + "rand 0.8.6", + "solana-address 1.1.0", +] + +[[package]] +name = "solana-pubkey" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" +dependencies = [ + "solana-address 2.6.1", +] + +[[package]] +name = "solana-rent" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1aea8fdea9de98ca6e8c2da5827707fb3842833521b528a713810ca685d2480" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-rent" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e860d5499a705369778647e97d760f7670adfb6fc8419dd3d568deccd46d5487" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-rent" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40f02fbe2669ebe5d851dbf29a02e91ed6244b051bb64fcc57e6644aba636063" +dependencies = [ + "solana-sdk-macro 3.0.1", +] + +[[package]] +name = "solana-sanitize" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" + +[[package]] +name = "solana-sanitize" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" + +[[package]] +name = "solana-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" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f03df7969f5e723ad31b6c9eadccc209037ac4caa34d8dc259316b05c11e82b" +dependencies = [ + "bincode 1.3.3", + "bs58", + "serde", + "solana-account 3.4.0", + "solana-epoch-info", + "solana-epoch-rewards-hasher", + "solana-fee-structure", + "solana-inflation", + "solana-keypair", + "solana-message 3.1.0", + "solana-offchain-message", + "solana-presigner", + "solana-program 3.0.0", + "solana-program-memory 3.1.0", + "solana-pubkey 3.0.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.2", + "solana-shred-version", + "solana-signature 3.4.1", + "solana-signer", + "solana-time-utils", + "solana-transaction", + "solana-transaction-error 3.2.1", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" +dependencies = [ + "solana-address 2.6.1", +] + +[[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.118", +] + +[[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.118", +] + +[[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" +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" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a7e155eba458ecfb0107b98236088c3764a09ddf0201ec29e52a0be40857113" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serde-varint" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950e5b83e839dc0f92c66afc124bb8f40e89bc90f0579e8ec5499296d27f54e3" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serialize-utils" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e" +dependencies = [ + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-serialize-utils" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761357b0853c9623bf12c1d2314b3d6160a85b087b84c45224fb85766d22616b" +dependencies = [ + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-sha256-hasher" +version = "2.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]] +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 = "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8250a4495aad49ad20556a607da53bdcb20de78da10b65afbf918b7f1de647" +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.4.0", + "solana-sha256-hasher 3.1.0", +] + +[[package]] +name = "solana-signature" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c" +dependencies = [ + "five8 0.2.1", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize 2.2.1", +] + +[[package]] +name = "solana-signature" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0364c7577c3c82a693ce28a1febc8d1b5d1b0a175fdc2114ae6186b69effe1e" +dependencies = [ + "ed25519-dalek", + "five8 1.0.0", + "rand 0.9.4", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize 3.0.1", + "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 3.4.1", + "solana-transaction-error 3.2.1", +] + +[[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]] +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 3.1.0", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-slot-history" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ccc1b2067ca22754d5283afb2b0126d61eae734fc616d23871b0943b0d935e" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-slot-history" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0622d03a823770f7763afd866e012b296d5a3cbbbe51e110b5bd9ab3441efdca" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-sdk-ids 3.1.0", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-stable-layout" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54" +dependencies = [ + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-stable-layout" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" +dependencies = [ + "solana-instruction 3.4.0", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-stake-interface" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c" +dependencies = [ + "borsh 0.10.4", + "borsh 1.7.0", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-clock 3.1.0", + "solana-cpi 3.1.0", + "solana-instruction 3.4.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 3.1.0", +] + +[[package]] +name = "solana-svm-callback" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "012617d16d2994673d98792f7f6d93f612dea00b1b747a3c4aec24c12547875b" +dependencies = [ + "solana-account 3.4.0", + "solana-clock 3.1.0", + "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 3.1.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-signature 3.4.1", + "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 = "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-instruction 3.4.0", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-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 3.4.0", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-system-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4b6faeddf5a62c06991a9a077fd1097da6867060f884595a659b3b24dc3a4a" +dependencies = [ + "bincode 1.3.3", + "log", + "serde", + "solana-account 3.4.0", + "solana-bincode 3.1.0", + "solana-fee-calculator 3.2.2", + "solana-instruction 3.4.0", + "solana-nonce 3.2.0", + "solana-nonce-account", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "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 = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c3595f95069f3d90f275bb9bd235a1973c4d059028b0a7f81baca2703815db" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info 3.1.1", + "solana-clock 3.1.0", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards 3.0.2", + "solana-epoch-schedule 3.1.1", + "solana-fee-calculator 3.2.2", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-last-restart-slot 3.0.1", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-slot-hashes 3.0.2", + "solana-slot-history 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-sysvar-id" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1" +dependencies = [ + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-sysvar-id" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +dependencies = [ + "solana-address 2.6.1", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-message 3.1.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.2", + "solana-signature 3.4.1", + "solana-signer", + "solana-transaction-error 3.2.1", +] + +[[package]] +name = "solana-transaction-context" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a3c3a69688293a195b02c60a5384d855b8de19981f404c71ccb9e7f139b98f" +dependencies = [ + "bincode 1.3.3", + "qualifier_attr", + "serde", + "solana-account 3.4.0", + "solana-instruction 3.4.0", + "solana-instructions-sysvar 3.0.1", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "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]] +name = "solana-transaction-error" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441d6dcd51100e7d97c3fb3b723e08aa701066ff7afc00026fd8d8e222cb95b" +dependencies = [ + "serde", + "serde_derive", + "solana-instruction-error", + "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 1.3.3", + "num-derive", + "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]] +name = "solana-vote-interface" +version = "4.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6e123e16bfdd7a81d71b4c4699e0b29580b619f4cd2ef5b6aae1eb85e8979f" +dependencies = [ + "bincode 1.3.3", + "cfg_eval", + "num-derive", + "num-traits", + "serde", + "serde_derive", + "serde_with", + "solana-clock 3.1.0", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-instruction-error", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-serde-varint 3.0.1", + "solana-serialize-utils 3.1.2", + "solana-short-vec 3.2.2", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-vote-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4164d0eb4760cbdb3dd46457999dba735079774381fe4042a70ec7484930a297" +dependencies = [ + "agave-feature-set", + "bincode 1.3.3", + "log", + "num-derive", + "num-traits", + "serde", + "solana-account 3.4.0", + "solana-bincode 3.1.0", + "solana-clock 3.1.0", + "solana-epoch-schedule 3.1.1", + "solana-hash 3.1.0", + "solana-instruction 3.4.0", + "solana-keypair", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-signer", + "solana-slot-hashes 3.0.2", + "solana-transaction", + "solana-transaction-context", + "solana-vote-interface 4.0.4", + "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", + "num-derive", + "num-traits", + "solana-instruction 3.4.0", + "solana-program-runtime", + "solana-sdk-ids 3.1.0", + "solana-svm-log-collector", + "solana-zk-sdk", +] + +[[package]] +name = "solana-zk-sdk" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode 1.3.3", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "getrandom 0.2.17", + "itertools 0.12.1", + "js-sys", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.6", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-derivation-path", + "solana-instruction 3.4.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature 3.4.1", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-zk-token-proof-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "962938a9994cc6d54b46b5f0d6a978024f4847272f560f8f11edd1575a0d8e8f" +dependencies = [ + "agave-feature-set", + "bytemuck", + "num-derive", + "num-traits", + "solana-instruction 3.4.0", + "solana-program-runtime", + "solana-sdk-ids 3.1.0", + "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 = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode 1.3.3", + "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 3.4.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature 3.4.1", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "zeroize", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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.118", +] + +[[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" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[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 = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + +[[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 = "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 = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "ureq" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" +dependencies = [ + "base64 0.22.1", + "log", + "percent-encoding", + "ureq-proto", + "utf8-zero", +] + +[[package]] +name = "ureq-proto" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" +dependencies = [ + "base64 0.22.1", + "http", + "httparse", + "log", +] + +[[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 = "utf8-zero" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" + +[[package]] +name = "uuid" +version = "1.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[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.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.118", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" +dependencies = [ + "pastey", + "proc-macro2", + "quote", + "thiserror 2.0.18", + "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.118", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[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.118", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "zip" +version = "8.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" +dependencies = [ + "crc32fast", + "flate2", + "indexmap", + "memchr", + "typed-path", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "977347db8caa080403f6b6b7c1cda9479a8e869316f7e13a59b19076a40f94e3" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] diff --git a/tests/ephemeral/Cargo.toml b/tests/ephemeral/Cargo.toml new file mode 100644 index 0000000..8ef2c13 --- /dev/null +++ b/tests/ephemeral/Cargo.toml @@ -0,0 +1,35 @@ +# Isolated from the main Hydra workspace: MagicSVM pulls a solana-3.x + git-fork +# stack (litesvm, magicblock-svm) that conflicts with Hydra's mollusk/agave-4.0 +# test deps. Its own `[workspace]` table gives it an independent lockfile. +[workspace] + +[package] +name = "hydra-ephemeral-tests" +version = "0.0.0" +edition = "2021" +publish = false + +[lib] +path = "src/lib.rs" + +[dev-dependencies] +# `Crank`, consts and `find_crank_pda` — all on solana-address, no client/cpi +# features so no extra solana-instruction/pubkey skew. +ephemeral-rollups-pinocchio = "0.15" +hydra-api = { path = "../../crates/hydra-api", features = [ + "client", + "ephemeral", +] } +magicsvm = { path = "../../../magicsvm/crates/magicsvm" } +solana-account = { git = "https://github.com/magicblock-labs/magicblock-svm.git", rev = "5bd1d56" } +solana-address = { version = "2.6", features = ["decode", "curve25519"] } +solana-instruction = "3.0" +solana-keypair = "3.1" +solana-message = "3.0.1" +solana-signer = "3.0" +solana-transaction = "3.0" +solana-hash = "3.1.0" + + +[patch.crates-io] +solana-account = { git = "https://github.com/magicblock-labs/magicblock-svm.git", rev = "5bd1d56" } diff --git a/tests/ephemeral/src/lib.rs b/tests/ephemeral/src/lib.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/ephemeral/src/lib.rs @@ -0,0 +1 @@ + diff --git a/tests/ephemeral/tests/lifecycle.rs b/tests/ephemeral/tests/lifecycle.rs new file mode 100644 index 0000000..7417e8c --- /dev/null +++ b/tests/ephemeral/tests/lifecycle.rs @@ -0,0 +1,452 @@ +//! End-to-end tests for Hydra's ephemeral-rollup crank, run against the MagicSVM. +//! +//! Prerequisites (the tests load these prebuilt `.so`s from `target/deploy`): +//! +//! ```sh +//! # from the hydra workspace root — the ephemeral instructions are feature-gated +//! cargo build-sbf -- --features ephemeral +//! cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml +//! # then, from this crate: +//! cargo test +//! ``` + +use ephemeral_rollups_pinocchio::{ + consts::{EPHEMERAL_VAULT_ID, MAGIC_PROGRAM_ID}, + ephemeral_accounts::rent, +}; +use hydra_api::{ + consts::{ix, CRANK_HEADER_SIZE}, + instruction::ScheduledIx, + state::{load_crank, region_len_for}, +}; +use magicsvm::{MagicSVM, TransactionTarget}; +use solana_account::ReadableAccount; +use solana_address::{address, Address}; +use solana_instruction::{account_meta::AccountMeta, Instruction}; +use solana_keypair::Keypair; +use solana_message::Message; +use solana_signer::Signer; +use solana_transaction::Transaction; + +const INSTRUCTIONS_SYSVAR_ID: Address = address!("Sysvar1nstructions1111111111111111111111111"); +const SYSTEM_PROGRAM_ID: Address = address!("11111111111111111111111111111111"); +const NOOP_ID: Address = address!("4sdZFwGE7TkQCJVpfggvfy2ZwGNCfF6hAMJYjZU5HpZG"); +const LAMPORTS_PER_SOL: u64 = 1_000_000_000; + +/// Lamports the sponsor parks in the crank when creating it. +/// +/// On a real MagicBlock ephemeral rollup the crank holds **zero** lamports — its +/// rent lives in the shared vault. MagicSVM's litesvm fork, however, purges any +/// 0-lamport account from its accounts DB when a *later* transaction mutates it +/// (`AccountsDb::add_account` removes `lamports == 0` accounts, with no +/// `ephemeral` exemption). So to exercise the crank's mutating instructions +/// (Trigger) under MagicSVM we keep a token balance in it. Hydra's on-chain +/// logic is unchanged and never depends on this balance. +const CRANK_KEEPALIVE: u64 = 2_000_000; + +fn find_crank(seed: &[u8; 32]) -> (Address, u8) { + hydra_api::state::find_crank_pda(seed) +} + +fn workspace_target(name: &str) -> std::path::PathBuf { + let mut p = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); + p.push("../../target/deploy"); + p.push(name); + p +} + +/// Total on-chain size of a crank scheduling `scheds`. +fn crank_size(scheds: &[ScheduledIx]) -> u32 { + let region: usize = scheds + .iter() + .map(|s| region_len_for(s.metas.len(), s.data.len())) + .sum(); + (CRANK_HEADER_SIZE + region) as u32 +} + +/// Build a single `CreateEphemeral` instruction: it allocates the crank (Magic +/// CPI, synchronous) and writes the header + scheduled-ix tail in one shot. +#[allow(clippy::too_many_arguments)] +fn create_ephemeral_ix( + sponsor: Address, + crank: Address, + seed: &[u8; 32], + authority: &[u8; 32], + start_slot: u64, + interval_slots: u64, + remaining: u64, + priority_tip: u64, + cu_limit: u32, + scheds: &[ScheduledIx], +) -> Instruction { + let mut data = vec![ix::CREATE]; + data.extend_from_slice(seed); + data.extend_from_slice(authority); + data.extend_from_slice(&start_slot.to_le_bytes()); + data.extend_from_slice(&interval_slots.to_le_bytes()); + data.extend_from_slice(&remaining.to_le_bytes()); + data.extend_from_slice(&priority_tip.to_le_bytes()); + data.extend_from_slice(&cu_limit.to_le_bytes()); + for s in scheds { + data.push(s.metas.len() as u8); + data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); + data.extend_from_slice(s.program_id.as_ref()); + for meta in s.metas { + let flag: u8 = if meta.is_writable { 0b0000_0010 } else { 0 }; + data.push(flag); + data.extend_from_slice(meta.pubkey.as_ref()); + } + data.extend_from_slice(s.data); + } + Instruction { + program_id: hydra_api::ID, + accounts: vec![ + AccountMeta::new(sponsor, true), + AccountMeta::new(crank, false), + AccountMeta::new(EPHEMERAL_VAULT_ID, false), + AccountMeta::new_readonly(MAGIC_PROGRAM_ID, false), + ], + data, + } +} + +fn trigger_ephemeral_ix(crank: Address, cranker: Address) -> Instruction { + Instruction { + program_id: hydra_api::ID, + accounts: vec![ + AccountMeta::new(crank, false), + AccountMeta::new(cranker, true), + AccountMeta::new_readonly(INSTRUCTIONS_SYSVAR_ID, false), + ], + data: vec![ix::TRIGGER], + } +} + +fn cancel_or_close_ix(disc: u8, signer: Address, crank: Address) -> Instruction { + Instruction { + program_id: hydra_api::ID, + accounts: vec![ + AccountMeta::new(signer, true), + AccountMeta::new(crank, false), + AccountMeta::new(EPHEMERAL_VAULT_ID, false), + AccountMeta::new_readonly(MAGIC_PROGRAM_ID, false), + ], + data: vec![disc], + } +} + +/// System-program transfer (`from` must sign). Used only to keep the crank +/// above 0 lamports under MagicSVM — see [`CRANK_KEEPALIVE`]. +fn system_transfer_ix(from: Address, to: Address, lamports: u64) -> Instruction { + let mut data = Vec::with_capacity(12); + data.extend_from_slice(&2u32.to_le_bytes()); // System `Transfer` discriminator. + data.extend_from_slice(&lamports.to_le_bytes()); + Instruction { + program_id: SYSTEM_PROGRAM_ID, + accounts: vec![AccountMeta::new(from, true), AccountMeta::new(to, false)], + data, + } +} + +/// Rebuild the scheduled sibling ix the cranker must place right after Trigger. +fn sched_to_ix(s: &ScheduledIx) -> Instruction { + Instruction { + program_id: s.program_id, + accounts: s + .metas + .iter() + .map(|meta| { + if meta.is_writable { + AccountMeta::new(meta.pubkey, false) + } else { + AccountMeta::new_readonly(meta.pubkey, false) + } + }) + .collect(), + data: s.data.to_vec(), + } +} + +/// Boot a MagicSVM with Hydra + noop loaded and a delegated, funded sponsor. +fn setup() -> (MagicSVM, Keypair) { + let mut svm = MagicSVM::new(); + svm.add_program_from_file(hydra_api::ID, workspace_target("hydra.so")) + .unwrap(); + svm.add_program_from_file(NOOP_ID, workspace_target("hydra_noop.so")) + .unwrap(); + + let sponsor = Keypair::new(); + svm.airdrop(&sponsor.pubkey(), LAMPORTS_PER_SOL).unwrap(); + // Delegate the sponsor so it is writable on the ephemeral rollup and can pay + // ephemeral rent to the vault. + svm.delegate_account(sponsor.pubkey()).unwrap(); + (svm, sponsor) +} + +/// A fresh cranker funded on the base layer. It is synced onto the ephemeral +/// ledger as the (writable, index-0) fee payer when it triggers, so it needs a +/// balance but not delegation. Distinct from the sponsor to show that triggering +/// is permissionless. +fn funded_cranker(svm: &mut MagicSVM) -> Keypair { + let cranker = Keypair::new(); + svm.airdrop(&cranker.pubkey(), LAMPORTS_PER_SOL).unwrap(); + cranker +} + +fn send_ephemeral(svm: &mut MagicSVM, ixs: &[Instruction], signers: &[&Keypair], payer: &Address) { + let bh = svm.latest_blockhash_for(TransactionTarget::Ephemeral); + let tx = Transaction::new(signers, Message::new(ixs, Some(payer)), bh); + svm.send_transaction_to(TransactionTarget::Ephemeral, tx) + .expect("ephemeral tx should succeed"); + svm.expire_blockhash_for(TransactionTarget::Ephemeral); +} + +/// Create a crank scheduling one noop, in a single `CreateEphemeral` +/// instruction. A keepalive transfer rides along in the same tx so the crank +/// survives later mutations (MagicSVM purges 0-lamport accounts on mutation). +fn create_crank( + svm: &mut MagicSVM, + sponsor: &Keypair, + seed: [u8; 32], + authority: [u8; 32], + interval: u64, + remaining: u64, + sched: &ScheduledIx, +) -> Address { + let (crank, _bump) = find_crank(&seed); + send_ephemeral( + svm, + &[ + create_ephemeral_ix( + sponsor.pubkey(), + crank, + &seed, + &authority, + 0, + interval, + remaining, + 0, + 0, + std::slice::from_ref(sched), + ), + system_transfer_ix(sponsor.pubkey(), crank, CRANK_KEEPALIVE), + ], + &[sponsor], + &sponsor.pubkey(), + ); + crank +} + +fn noop_sched<'a>() -> ScheduledIx<'a> { + ScheduledIx { + program_id: NOOP_ID, + metas: &[], + data: &[0u8], + } +} + +#[test] +fn create_materializes_hydra_owned_ephemeral_account() { + let (mut svm, sponsor) = setup(); + let seed = [1u8; 32]; + let (crank, _) = find_crank(&seed); + let sched = noop_sched(); + let data_len = crank_size(std::slice::from_ref(&sched)); + + let vault_before = svm + .get_shared_account_for(TransactionTarget::Ephemeral, &EPHEMERAL_VAULT_ID) + .unwrap() + .lamports(); + + // Create with no keepalive: the crank ends the tx at 0 lamports, exercising + // the pure ephemeral-account materialization. + send_ephemeral( + &mut svm, + &[create_ephemeral_ix( + sponsor.pubkey(), + crank, + &seed, + &[0u8; 32], + 0, + 1, + 3, + 0, + 0, + std::slice::from_ref(&sched), + )], + &[&sponsor], + &sponsor.pubkey(), + ); + + let acct = svm + .get_shared_account_for(TransactionTarget::Ephemeral, &crank) + .expect("crank should exist on the ephemeral ledger"); + assert!(acct.ephemeral(), "crank must carry the ephemeral flag"); + assert_eq!(acct.owner(), &hydra_api::ID, "crank must be owned by Hydra"); + assert_eq!(acct.data().len(), data_len as usize); + assert_eq!(acct.lamports(), 0, "ephemeral accounts hold no lamports"); + + let vault_after = svm + .get_shared_account_for(TransactionTarget::Ephemeral, &EPHEMERAL_VAULT_ID) + .unwrap() + .lamports(); + assert_eq!( + vault_after - vault_before, + rent(data_len), + "sponsor must pay the per-byte rent into the vault" + ); +} + +#[test] +fn create_writes_header_and_tail() { + let (mut svm, sponsor) = setup(); + let seed = [2u8; 32]; + let authority = sponsor.pubkey().to_bytes(); + let sched = noop_sched(); + let crank = create_crank(&mut svm, &sponsor, seed, authority, 5, 3, &sched); + + let acct = svm + .get_shared_account_for(TransactionTarget::Ephemeral, &crank) + .unwrap(); + let data = acct.data(); + let state = unsafe { load_crank(data).unwrap() }; + assert_eq!(state.seed, seed); + assert_eq!(state.authority, authority); + assert_eq!(state.next_exec_slot(), 0); + assert_eq!(state.interval_slots(), 5); + assert_eq!(state.remaining(), 3); + assert_eq!(state.executed(), 0); + assert_eq!(state.authority_signer, 1); + let region = region_len_for(sched.metas.len(), sched.data.len()); + assert_eq!(state.region_len() as usize, region); + assert_eq!(data.len(), CRANK_HEADER_SIZE + region); +} + +#[test] +fn trigger_runs_scheduled_ix_and_advances() { + let (mut svm, sponsor) = setup(); + let seed = [3u8; 32]; + let sched = noop_sched(); + let crank = create_crank(&mut svm, &sponsor, seed, [0u8; 32], 1, 3, &sched); + + let cranker = funded_cranker(&mut svm); + send_ephemeral( + &mut svm, + &[ + trigger_ephemeral_ix(crank, cranker.pubkey()), + sched_to_ix(&sched), + ], + &[&cranker], + &cranker.pubkey(), + ); + + let acct = svm + .get_shared_account_for(TransactionTarget::Ephemeral, &crank) + .unwrap(); + let state = unsafe { load_crank(acct.data()).unwrap() }; + assert_eq!(state.executed(), 1); + assert_eq!(state.remaining(), 2); + assert_eq!(state.next_exec_slot(), 1); + // Trigger moves no lamports — the keepalive balance is untouched. + assert_eq!(acct.lamports(), CRANK_KEEPALIVE); +} + +#[test] +fn trigger_rejects_mismatched_followup() { + let (mut svm, sponsor) = setup(); + let seed = [4u8; 32]; + let sched = noop_sched(); + let crank = create_crank(&mut svm, &sponsor, seed, [0u8; 32], 1, 3, &sched); + + // Sibling noop with different data than the stored template. + let wrong = ScheduledIx { + program_id: NOOP_ID, + metas: &[], + data: &[9u8], + }; + let cranker = funded_cranker(&mut svm); + let bh = svm.latest_blockhash_for(TransactionTarget::Ephemeral); + let tx = Transaction::new( + &[&cranker], + Message::new( + &[ + trigger_ephemeral_ix(crank, cranker.pubkey()), + sched_to_ix(&wrong), + ], + Some(&cranker.pubkey()), + ), + bh, + ); + assert!( + svm.send_transaction_to(TransactionTarget::Ephemeral, tx) + .is_err(), + "a mismatched follow-up ix must be rejected" + ); +} + +#[test] +fn cancel_by_authority_closes_and_refunds() { + let (mut svm, sponsor) = setup(); + let seed = [5u8; 32]; + let authority = sponsor.pubkey().to_bytes(); + let sched = noop_sched(); + let crank = create_crank(&mut svm, &sponsor, seed, authority, 1, 3, &sched); + + assert!(svm + .get_shared_account_for(TransactionTarget::Ephemeral, &crank) + .is_some()); + + send_ephemeral( + &mut svm, + &[cancel_or_close_ix(ix::CANCEL, sponsor.pubkey(), crank)], + &[&sponsor], + &sponsor.pubkey(), + ); + + let after = svm.get_shared_account_for(TransactionTarget::Ephemeral, &crank); + assert!( + after + .map(|a| a.lamports() == 0 && a.data().is_empty()) + .unwrap_or(true), + "crank should be closed on the ephemeral ledger" + ); +} + +#[test] +fn close_permissionless_when_exhausted() { + let (mut svm, sponsor) = setup(); + let seed = [6u8; 32]; + let sched = noop_sched(); + // authority = none, remaining = 1 → one trigger exhausts it. + let crank = create_crank(&mut svm, &sponsor, seed, [0u8; 32], 1, 1, &sched); + + let cranker = funded_cranker(&mut svm); + send_ephemeral( + &mut svm, + &[ + trigger_ephemeral_ix(crank, cranker.pubkey()), + sched_to_ix(&sched), + ], + &[&cranker], + &cranker.pubkey(), + ); + + // A random reporter (not the sponsor) may close an exhausted, authority-less crank. + let reporter = Keypair::new(); + svm.airdrop(&reporter.pubkey(), LAMPORTS_PER_SOL).unwrap(); + svm.delegate_account(reporter.pubkey()).unwrap(); + send_ephemeral( + &mut svm, + &[cancel_or_close_ix(ix::CLOSE, reporter.pubkey(), crank)], + &[&reporter], + &reporter.pubkey(), + ); + + let after = svm.get_shared_account_for(TransactionTarget::Ephemeral, &crank); + assert!( + after + .map(|a| a.lamports() == 0 && a.data().is_empty()) + .unwrap_or(true), + "exhausted crank should be closed" + ); +} diff --git a/tests/programs/noop/src/lib.rs b/tests/programs/noop/src/lib.rs index b3ab9d7..c2c4e3b 100644 --- a/tests/programs/noop/src/lib.rs +++ b/tests/programs/noop/src/lib.rs @@ -14,10 +14,6 @@ program_entrypoint!(process); no_allocator!(); nostd_panic_handler!(); -pub fn process( - _program_id: &Address, - _accounts: &mut [AccountView], - _data: &[u8], -) -> ProgramResult { +pub fn process(_program_id: &Address, _accounts: &[AccountView], _data: &[u8]) -> ProgramResult { Ok(()) } From 47639ad13312eac34c7d1d56967a6ec06814e66c Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Thu, 25 Jun 2026 17:21:52 +0200 Subject: [PATCH 03/33] test: e2e ephemeral --- .github/workflows/ci.yml | 189 + Cargo.lock | 22 + Cargo.toml | 1 + README.md | 31 + crates/hydra-api/src/instruction.rs | 51 +- crates/hydra-cranker/src/cache.rs | 113 +- crates/hydra-cranker/src/fire.rs | 19 +- crates/hydra-cranker/src/main.rs | 30 +- crates/hydra-cranker/src/mode.rs | 36 + programs/hydra/src/processor/common.rs | 11 +- tests/e2e/Cargo.lock | 5455 ++++++++++++++++++++++++ tests/e2e/Cargo.toml | 28 + tests/e2e/tests/ephemeral_cranks.rs | 971 +++++ tests/ephemeral/Cargo.lock | 118 +- tests/programs/noop/Cargo.toml | 1 + tests/programs/noop/src/lib.rs | 14 +- 16 files changed, 7006 insertions(+), 84 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 crates/hydra-cranker/src/mode.rs create mode 100644 tests/e2e/Cargo.lock create mode 100644 tests/e2e/Cargo.toml create mode 100644 tests/e2e/tests/ephemeral_cranks.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..13d2f5f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,189 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +# Cancel superseded runs on the same ref to save runner minutes. +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: -D warnings + # Pinned Solana/Agave toolchain that ships `cargo build-sbf`. + SOLANA_VERSION: stable + +jobs: + # --------------------------------------------------------------------------- + # Formatting — covers both the main workspace and the isolated `tests/ephemeral` + # crate (it has its own `[workspace]`, so `--all` on the root doesn't reach it). + # --------------------------------------------------------------------------- + fmt: + name: rustfmt + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Rust (rustfmt) + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.91.1 + components: rustfmt + + - name: Format — main workspace + run: cargo fmt --all --check + + - name: Format — tests/ephemeral crate + run: cargo fmt --manifest-path tests/ephemeral/Cargo.toml --all --check + + - name: Format — tests/e2e crate + run: cargo fmt --manifest-path tests/e2e/Cargo.toml --all --check + + # --------------------------------------------------------------------------- + # Default feature set: lint + tests with the `ephemeral` feature OFF. + # --------------------------------------------------------------------------- + default: + name: lint + test (default) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Rust (clippy) + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.91.1 + components: clippy + + - name: Install Solana toolchain (build-sbf) + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/${SOLANA_VERSION}/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> "$GITHUB_PATH" + + - name: Install cargo-nextest + uses: taiki-e/install-action@nextest + + - uses: Swatinem/rust-cache@v2 + + - name: Clippy + run: cargo clippy --workspace --all-targets -- -D warnings + + - name: Build on-chain programs + run: | + cargo build-sbf --manifest-path programs/hydra/Cargo.toml + cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml + + - name: Test + run: cargo nextest run -p hydra-tests + + # --------------------------------------------------------------------------- + # `ephemeral` feature set: lint + the end-to-end lifecycle tests that run + # against MagicSVM. The `tests/ephemeral` crate pulls `magicsvm` via a sibling + # path dependency (`../../../magicsvm/crates/magicsvm`), so it's checked out + # next to this repo. + # --------------------------------------------------------------------------- + ephemeral: + name: lint + test (ephemeral) + runs-on: ubuntu-latest + steps: + - name: Checkout hydra + uses: actions/checkout@v4 + with: + path: hydra + + - name: Install Rust (clippy) + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.91.1 + components: clippy + + - name: Install Solana toolchain (build-sbf) + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/${SOLANA_VERSION}/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> "$GITHUB_PATH" + + - name: Install cargo-nextest + uses: taiki-e/install-action@nextest + + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + hydra + hydra/tests/ephemeral + + - name: Clippy — program (ephemeral) + working-directory: hydra + run: cargo clippy -p hydra --features ephemeral --all-targets -- -D warnings + + - name: Clippy — ephemeral test crate + working-directory: hydra + run: cargo clippy --manifest-path tests/ephemeral/Cargo.toml --all-targets -- -D warnings + + - name: Build on-chain programs (ephemeral) + working-directory: hydra + run: | + cargo build-sbf --manifest-path programs/hydra/Cargo.toml -- --features ephemeral + cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml + + - name: Test — ephemeral lifecycle + working-directory: hydra + run: cargo nextest run --manifest-path tests/ephemeral/Cargo.toml + + # --------------------------------------------------------------------------- + # Live end-to-end: boots the real three-process stack (mb-test-validator + + # ephemeral-validator + hydra-cranker) and asserts ephemeral cranks fire on + # schedule. The validators ship as the `@magicblock-labs/ephemeral-validator` + # npm package (mb-test-validator wraps `solana-test-validator`, which the Anza + # toolchain provides). The `tests/e2e` crate is its own `[workspace]`. + # --------------------------------------------------------------------------- + e2e: + name: e2e (ephemeral cranks, live validators) + runs-on: ubuntu-latest + env: + # Pin to the version the test was developed against. + EPHEMERAL_VALIDATOR_VERSION: 0.12.3 + steps: + - uses: actions/checkout@v4 + + - name: Install Rust (clippy) + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.91.1 + components: clippy + + - name: Install Solana toolchain (build-sbf + solana-test-validator) + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/${SOLANA_VERSION}/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> "$GITHUB_PATH" + + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install MagicBlock validators (mb-test-validator + ephemeral-validator) + run: | + npm install -g "@magicblock-labs/ephemeral-validator@${EPHEMERAL_VALIDATOR_VERSION}" + mb-test-validator --version + ephemeral-validator --version + + - uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . + tests/e2e + + - name: Clippy — e2e crate + run: cargo clippy --manifest-path tests/e2e/Cargo.toml --all-targets -- -D warnings + + - name: Build on-chain programs (ephemeral) + run: | + cargo build-sbf --manifest-path programs/hydra/Cargo.toml -- --features ephemeral + cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml + + - name: Test — live ephemeral cranks + # The test is `#[ignore]` (spawns external validators); it builds the + # hydra-cranker itself and runs it with `--ephemeral`. + run: cargo test --manifest-path tests/e2e/Cargo.toml -- --ignored --nocapture --test-threads=1 diff --git a/Cargo.lock b/Cargo.lock index 2911fd4..4b9b5e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2338,6 +2338,27 @@ dependencies = [ "yellowstone-grpc-proto", ] +[[package]] +name = "hydra-e2e-tests" +version = "0.0.0" +dependencies = [ + "anyhow", + "crossbeam-channel", + "hydra-api", + "solana-client", + "solana-commitment-config 3.1.1", + "solana-instruction 3.4.0", + "solana-keypair 3.1.2", + "solana-message 3.1.0", + "solana-pubkey 4.2.0", + "solana-pubsub-client", + "solana-rpc-client-api", + "solana-signature 3.4.1", + "solana-signer 3.0.1", + "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", +] + [[package]] name = "hydra-example-native" version = "0.1.0" @@ -2370,6 +2391,7 @@ name = "hydra-noop" version = "0.1.0" dependencies = [ "pinocchio 0.10.2", + "pinocchio-log", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 9bf9ce5..04b1939 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ members = [ "crates/hydra-api", "crates/hydra-cranker", "tests", + "tests/e2e", "tests/programs/noop", "examples/native", "examples/pinocchio", diff --git a/README.md b/README.md index 29514b5..935cf7d 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,14 @@ hydra-cranker \ --rpc-url https://your.rpc.example \ --ws-url wss://your.rpc.example +# Against a MagicBlock ephemeral rollup. `--ephemeral` switches the target +# program, the `Close` account layout, and the (zero-lamport) funding model at +# runtime — the same binary drives either program, no rebuild needed. +hydra-cranker \ + --keypair ~/.config/solana/cranker.json \ + --rpc-url https://your.rollup.example \ + --ephemeral + # With Prometheus metrics at http://0.0.0.0:9100/metrics hydra-cranker \ --keypair ~/.config/solana/cranker.json \ @@ -354,6 +362,29 @@ cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml cargo test --manifest-path tests/ephemeral/Cargo.toml ``` +#### Live end-to-end test (`tests/e2e`) + +`tests/ephemeral` runs in-process against MagicSVM. `tests/e2e` instead boots the +**real** three-process stack — `mb-test-validator` (base L1), `ephemeral-validator` (the rollup), and `hydra-cranker` — creates a few ephemeral cranks, and +asserts the cranker fires each one on schedule. + +The validators ship as an npm package; `mb-test-validator` wraps +`solana-test-validator`, so the Solana/Anza toolchain must also be installed: + +```sh +npm install -g @magicblock-labs/ephemeral-validator # mb-test-validator + ephemeral-validator + +# Build the on-chain artifacts the rollup clones (the hydra-cranker is built +# automatically by the test and run with `--ephemeral`). +cargo build-sbf -- --features ephemeral +cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml + +# The test is `#[ignore]` (it spawns external validators); run it explicitly. +cargo test --manifest-path tests/e2e/Cargo.toml -- --ignored --nocapture +``` + +CI runs this as the `e2e` job in `.github/workflows/ci.yml`. + ## Releasing `hydra-api` is the only crate published to crates.io (`hydra` is a program, diff --git a/crates/hydra-api/src/instruction.rs b/crates/hydra-api/src/instruction.rs index 770ebc3..92d1350 100644 --- a/crates/hydra-api/src/instruction.rs +++ b/crates/hydra-api/src/instruction.rs @@ -61,17 +61,15 @@ mod client { /// Solana's system program pubkey. pub const SYSTEM_PROGRAM_ID: Pubkey = pubkey!("11111111111111111111111111111111"); + /// The [`base`] / [`ephemeral`] programs. + pub const BASE_PROGRAM_ID: Pubkey = pubkey!("Hydra17i1feui9deaxu6d1TzSQMRNHeBRkDR1Awy7zea"); + pub const EPHEMERAL_PROGRAM_ID: Pubkey = pubkey!("eHyd5BU8QffvHi4GnXwxrK4WpS7pM2x9UGKHBWii7mf"); + /// Hydra program ID as a `solana_pubkey::Pubkey` (convenience for clients). pub fn program_id() -> Pubkey { Pubkey::new_from_array(crate::ID.to_bytes()) } - /// Derive `(crank_pda, bump)` using `solana_pubkey::Pubkey`. - pub fn find_crank_pda(seed: &[u8; 32]) -> (Pubkey, u8) { - let (addr, bump) = crate::state::find_crank_pda(seed); - (Pubkey::new_from_array(addr.to_bytes()), bump) - } - /// A scheduled-ix meta as it will be stored on-chain. /// /// `is_signer` is intentionally absent: scheduled ixs cannot carry @@ -105,10 +103,18 @@ mod client { pub data: &'a [u8], } - #[cfg(not(feature = "ephemeral"))] - mod base { + /// Builders targeting the base-layer Hydra program ([`BASE_PROGRAM_ID`]). + pub mod base { use super::*; + /// This module's program ID. + pub const PROGRAM_ID: Pubkey = super::BASE_PROGRAM_ID; + + /// Derive `(crank_pda, bump)` under the base program. + pub fn find_crank_pda(seed: &[u8; 32]) -> (Pubkey, u8) { + Pubkey::find_program_address(&[crate::consts::CRANK_SEED_PREFIX, seed], &PROGRAM_ID) + } + /// All the scheduling knobs for `Create` pub struct CreateArgs<'a> { pub seed: [u8; 32], @@ -156,7 +162,7 @@ mod client { } Instruction { - program_id: program_id(), + program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new(payer, true), AccountMeta::new(crank, false), @@ -170,7 +176,7 @@ mod client { /// scheduled instruction at `current_ix_index + 1`. pub fn trigger(crank: Pubkey, cranker: Pubkey) -> Instruction { Instruction { - program_id: program_id(), + program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new(crank, false), AccountMeta::new(cranker, true), @@ -183,7 +189,7 @@ mod client { /// Build a `Cancel` instruction. pub fn cancel(authority: Pubkey, crank: Pubkey, recipient: Pubkey) -> Instruction { Instruction { - program_id: program_id(), + program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new_readonly(authority, true), AccountMeta::new(crank, false), @@ -196,7 +202,7 @@ mod client { /// Build a `Close` instruction (permissionless cleanup). pub fn close(reporter: Pubkey, crank: Pubkey, recipient: Pubkey) -> Instruction { Instruction { - program_id: program_id(), + program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new(reporter, true), AccountMeta::new(crank, false), @@ -207,12 +213,21 @@ mod client { } } - #[cfg(feature = "ephemeral")] - mod ephemeral { + /// Builders targeting the ephemeral-rollup Hydra program + /// ([`EPHEMERAL_PROGRAM_ID`]). + pub mod ephemeral { use ephemeral_rollups_pinocchio::consts::{EPHEMERAL_VAULT_ID, MAGIC_PROGRAM_ID}; use super::*; + /// This module's program ID. + pub const PROGRAM_ID: Pubkey = super::EPHEMERAL_PROGRAM_ID; + + /// Derive `(crank_pda, bump)` under the ephemeral program. + pub fn find_crank_pda(seed: &[u8; 32]) -> (Pubkey, u8) { + Pubkey::find_program_address(&[crate::consts::CRANK_SEED_PREFIX, seed], &PROGRAM_ID) + } + /// All the scheduling knobs for `CreateEphemeral` pub struct CreateArgs<'a> { pub seed: [u8; 32], @@ -259,7 +274,7 @@ mod client { data.extend_from_slice(s.data); } Instruction { - program_id: program_id(), + program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new(sponsor, true), AccountMeta::new(crank, false), @@ -273,7 +288,7 @@ mod client { /// Build a `Trigger` instruction. pub fn trigger(crank: Pubkey, cranker: Pubkey) -> Instruction { Instruction { - program_id: program_id(), + program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new(crank, false), AccountMeta::new(cranker, true), @@ -286,7 +301,7 @@ mod client { /// Build a `Cancel` instruction pub fn cancel(authority: Pubkey, crank: Pubkey) -> Instruction { Instruction { - program_id: program_id(), + program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new(authority, true), AccountMeta::new(crank, false), @@ -300,7 +315,7 @@ mod client { /// Build a `Close` instruction pub fn close(reporter: Pubkey, crank: Pubkey) -> Instruction { Instruction { - program_id: program_id(), + program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new(reporter, true), AccountMeta::new(crank, false), diff --git a/crates/hydra-cranker/src/cache.rs b/crates/hydra-cranker/src/cache.rs index 2c7a6da..c15078c 100644 --- a/crates/hydra-cranker/src/cache.rs +++ b/crates/hydra-cranker/src/cache.rs @@ -10,7 +10,9 @@ use std::{ use solana_pubkey::Pubkey; -use hydra_api::consts::{CRANKER_REWARD, CRANK_HEADER_SIZE, STALENESS_THRESHOLD_SLOTS}; +use hydra_api::consts::{ + CRANKER_REWARD, CRANK_HEADER_SIZE, REMAINING_INFINITE, STALENESS_THRESHOLD_SLOTS, +}; /// Minimal decoded projection of a Crank account — just the fields we need /// for eligibility checks. The full raw bytes live in `data` so the trigger @@ -23,6 +25,10 @@ pub struct CrankEntry { /// recipient. Non-zero = `Close` must refund the remainder to this pubkey. pub authority: [u8; 32], pub next_exec_slot: u64, + /// Slots between executions. `Trigger` advances `next_exec_slot` by exactly + /// this much on-chain, so the cranker can replay that advance locally the + /// instant it submits — without waiting for the `programSubscribe` echo. + pub interval_slots: u64, pub remaining: u64, pub priority_tip: u64, pub rent_min: u64, @@ -40,6 +46,7 @@ impl CrankEntry { } let authority: [u8; 32] = data[0..32].try_into().ok()?; let next_exec_slot = u64::from_le_bytes(data[64..72].try_into().ok()?); + let interval_slots = u64::from_le_bytes(data[72..80].try_into().ok()?); let remaining = u64::from_le_bytes(data[80..88].try_into().ok()?); let priority_tip = u64::from_le_bytes(data[88..96].try_into().ok()?); let rent_min = u64::from_le_bytes(data[104..112].try_into().ok()?); @@ -49,6 +56,7 @@ impl CrankEntry { lamports, authority, next_exec_slot, + interval_slots, remaining, priority_tip, rent_min, @@ -100,6 +108,31 @@ pub enum CacheOutcome { Unchanged, } +/// Replay `Trigger`'s on-chain effect on the cached entry the moment we submit, +/// so re-fire timing follows the crank's own `interval_slots` instead of waiting +/// for the `programSubscribe` echo (which lags by an unbounded number of slots). +/// +/// Mirrors `processor/*/trigger.rs`: `next_exec_slot += interval_slots` and +/// `remaining -= 1` (the `u64::MAX` "infinite" sentinel never decrements). Guarded +/// by an equality check on `next_exec_slot`: if a notification already advanced the +/// entry past the snapshot we fired on, that authoritative update wins and we don't +/// double-advance. A late, *pre*-trigger notification can still overwrite this with +/// a stale value — that self-heals, because the next fire then lands as +/// `NotYetExecutable` and the caller's backoff absorbs it. +pub fn advance_after_trigger(cache: &Cache, pubkey: Pubkey, fired_at_next_exec: u64) { + let mut guard = cache.lock().expect("cache poisoned"); + if let Some(e) = guard.get_mut(&pubkey) { + // Only the entry we actually fired on; a newer echo supersedes us. + if e.next_exec_slot != fired_at_next_exec { + return; + } + e.next_exec_slot = e.next_exec_slot.saturating_add(e.interval_slots); + if e.remaining != REMAINING_INFINITE && e.remaining != 0 { + e.remaining -= 1; + } + } +} + /// Apply a single account update to the cache. Removes entries that have /// been closed (zero lamports / empty data) or are no longer well-formed /// Crank accounts; otherwise inserts/updates the decoded entry. @@ -132,3 +165,81 @@ pub fn apply_update(cache: &Cache, pubkey: Pubkey, lamports: u64, data: &[u8]) - } } } + +#[cfg(test)] +mod tests { + use super::*; + + fn entry(next_exec_slot: u64, interval_slots: u64, remaining: u64) -> CrankEntry { + CrankEntry { + pubkey: Pubkey::new_unique(), + lamports: u64::MAX, + authority: [0u8; 32], + next_exec_slot, + interval_slots, + remaining, + priority_tip: 0, + rent_min: 0, + cu_limit: 0, + data: Vec::new(), + } + } + + fn seed(cache: &Cache, e: CrankEntry) -> Pubkey { + let pk = e.pubkey; + cache.lock().unwrap().insert(pk, e); + pk + } + + fn snapshot(cache: &Cache, pk: &Pubkey) -> (u64, u64) { + let g = cache.lock().unwrap(); + let e = g.get(pk).unwrap(); + (e.next_exec_slot, e.remaining) + } + + #[test] + fn advance_replays_trigger_effect() { + let cache = new_cache(); + let pk = seed(&cache, entry(100, 5, 3)); + advance_after_trigger(&cache, pk, 100); + assert_eq!( + snapshot(&cache, &pk), + (105, 2), + "next_exec += interval, remaining -= 1" + ); + } + + #[test] + fn advance_is_skipped_when_a_newer_echo_already_moved_the_entry() { + let cache = new_cache(); + // A `programSubscribe` update landed first, advancing the entry to 105. + let pk = seed(&cache, entry(105, 5, 2)); + // We fired on the older snapshot (100); the guard must not double-advance. + advance_after_trigger(&cache, pk, 100); + assert_eq!( + snapshot(&cache, &pk), + (105, 2), + "stale fire must not advance" + ); + } + + #[test] + fn advance_keeps_the_infinite_remaining_sentinel() { + let cache = new_cache(); + let pk = seed(&cache, entry(100, 1, REMAINING_INFINITE)); + advance_after_trigger(&cache, pk, 100); + assert_eq!( + snapshot(&cache, &pk), + (101, REMAINING_INFINITE), + "infinite cranks advance the schedule but never decrement remaining" + ); + } + + #[test] + fn advance_does_not_underflow_an_exhausted_crank() { + let cache = new_cache(); + let pk = seed(&cache, entry(100, 1, 0)); + advance_after_trigger(&cache, pk, 100); + assert_eq!(snapshot(&cache, &pk).1, 0, "remaining == 0 stays 0"); + } +} diff --git a/crates/hydra-cranker/src/fire.rs b/crates/hydra-cranker/src/fire.rs index 6a6bd34..6f4dcc0 100644 --- a/crates/hydra-cranker/src/fire.rs +++ b/crates/hydra-cranker/src/fire.rs @@ -62,7 +62,12 @@ pub fn fire_trigger( ) -> Result<()> { let scheduled = ix::scheduled_ixs_from_crank(&entry.data) .ok_or_else(|| anyhow!("malformed crank tail for {}", entry.pubkey))?; - let trigger = ix::trigger(entry.pubkey, cranker.pubkey()); + // Same accounts in both programs; only the program ID differs. + let trigger = if crate::mode::is_ephemeral() { + ix::ephemeral::trigger(entry.pubkey, cranker.pubkey()) + } else { + ix::base::trigger(entry.pubkey, cranker.pubkey()) + }; let blockhash = rpc.get_latest_blockhash().map_err(|e| { metrics::metrics() .rpc_errors_total @@ -163,12 +168,16 @@ pub fn fire_close( entry: &CrankEntry, priority_fee_micro_lamports: u64, ) -> Result<()> { - let recipient = if entry.authority == [0u8; 32] { - cranker.pubkey() + let close = if crate::mode::is_ephemeral() { + ix::ephemeral::close(cranker.pubkey(), entry.pubkey) } else { - Pubkey::new_from_array(entry.authority) + let recipient = if entry.authority == [0u8; 32] { + cranker.pubkey() + } else { + Pubkey::new_from_array(entry.authority) + }; + ix::base::close(cranker.pubkey(), entry.pubkey, recipient) }; - let close = ix::close(cranker.pubkey(), entry.pubkey, recipient); let blockhash = rpc.get_latest_blockhash().map_err(|e| { metrics::metrics() .rpc_errors_total diff --git a/crates/hydra-cranker/src/main.rs b/crates/hydra-cranker/src/main.rs index 2ffc3e5..9cdec9d 100644 --- a/crates/hydra-cranker/src/main.rs +++ b/crates/hydra-cranker/src/main.rs @@ -22,10 +22,13 @@ use solana_signer::Signer; /// Consecutive failures at the same `next_exec_slot` before a crank is parked. const MAX_CONSECUTIVE_FAILURES: u32 = 10; -/// Slots to skip a crank after a successful submit. Absorbs the in-flight -/// window where both our cache and the RPC's preflight bank are stale; without -/// it, a second fire within the window lands as `NotYetExecutable` (0x1). -const POST_SUBMIT_COOLDOWN_SLOTS: u64 = 3; +/// Backstop floor between fires of the same crank, on top of the optimistic +/// `next_exec_slot` advance done on every successful submit (see +/// `cache::advance_after_trigger`). That advance is what normally gates re-fire +/// to the crank's own `interval_slots`; this only matters when it can't move the +/// schedule — `interval_slots == 0` ("every slot") cranks — where it caps the +/// blind retry rate at one fire per slot until the `programSubscribe` echo lands. +const POST_SUBMIT_COOLDOWN_SLOTS: u64 = 1; /// Slots between Close attempts on the same crank. Close is one-shot: success /// purges the crank from the cache, so this map only tracks race losers. @@ -51,10 +54,10 @@ mod cache; mod fire; mod grpc; mod metrics; +mod mode; mod watch; use cache::new_cache; -use hydra_api::instruction as ix; #[derive(Parser, Debug)] #[command( @@ -109,6 +112,12 @@ struct Cli { default_value_t = false )] trigger_skip_preflight: bool, + /// Target Hydra's ephemeral-rollup program instead of the base-layer one. + /// Switches the watched program ID, the `Close` account layout, and the + /// funding/eligibility model (ephemeral cranks hold zero lamports). Point + /// `--rpc-url` at a MagicBlock ephemeral validator. + #[arg(long, env = "HYDRA_CRANKER_EPHEMERAL", default_value_t = false)] + ephemeral: bool, } fn default_ws_url(rpc_url: &str) -> String { @@ -147,8 +156,13 @@ fn main() -> Result<()> { .init(); let args = Cli::parse(); + mode::init(args.ephemeral); let cranker = load_keypair(&args.keypair)?; log::info!("cranker pubkey = {}", cranker.pubkey()); + log::info!( + "mode = {}", + if args.ephemeral { "ephemeral" } else { "base" } + ); // Bootstrap must use the same commitment as `programSubscribe` or a // reconnect hands off a stale cache. @@ -160,7 +174,7 @@ fn main() -> Result<()> { log::info!("rpc = {}", args.rpc_url); log::info!("ws = {}", ws_url); - let program_id = ix::program_id(); + let program_id = mode::program_id(); let cache = new_cache(); let shutdown = Arc::new(AtomicBool::new(false)); // `at_slot` anchors each counter to an observed `next_exec_slot`: once @@ -297,6 +311,10 @@ fn main() -> Result<()> { .with_label_values(&["ok"]) .inc(); last_submit.insert(entry.pubkey, slot); + // Replay `Trigger`'s schedule advance in our cache now, so + // the crank's next fire follows its `interval_slots` instead + // of stalling until the `programSubscribe` echo catches up. + cache::advance_after_trigger(&cache, entry.pubkey, entry.next_exec_slot); // Failure record clears only when the cache observes an // advanced `next_exec_slot`; submit-Ok alone isn't proof // the tx landed. diff --git a/crates/hydra-cranker/src/mode.rs b/crates/hydra-cranker/src/mode.rs new file mode 100644 index 0000000..a525fde --- /dev/null +++ b/crates/hydra-cranker/src/mode.rs @@ -0,0 +1,36 @@ +//! Runtime selection of the target Hydra program. +//! +//! The cranker is a single binary that can drive either the base-layer program +//! or the ephemeral-rollup program; the choice is made once at startup from the +//! `--ephemeral` flag (not a compile-time feature). The base and ephemeral +//! cranks differ in their program ID, their `Close` account layout, and their +//! funding model (ephemeral cranks hold zero lamports), so the hot paths consult +//! this module rather than threading a flag through every call. + +use std::sync::OnceLock; + +use solana_pubkey::Pubkey; + +use hydra_api::instruction as ix; + +static EPHEMERAL: OnceLock = OnceLock::new(); + +/// Record the selected mode. Call once, before any watcher or the trigger loop +/// starts. Later calls are ignored. +pub fn init(ephemeral: bool) { + let _ = EPHEMERAL.set(ephemeral); +} + +/// Whether the cranker targets the ephemeral-rollup program. +pub fn is_ephemeral() -> bool { + EPHEMERAL.get().copied().unwrap_or(false) +} + +/// The program ID the cranker watches and submits to. +pub fn program_id() -> Pubkey { + if is_ephemeral() { + ix::EPHEMERAL_PROGRAM_ID + } else { + ix::BASE_PROGRAM_ID + } +} diff --git a/programs/hydra/src/processor/common.rs b/programs/hydra/src/processor/common.rs index 11c8aa6..afac2c3 100644 --- a/programs/hydra/src/processor/common.rs +++ b/programs/hydra/src/processor/common.rs @@ -1,6 +1,6 @@ //! Shared helpers for the ephemeral-rollup crank processors. -use pinocchio::{error::ProgramError, Address, AccountView, ProgramResult}; +use pinocchio::{error::ProgramError, AccountView, Address, ProgramResult}; use hydra_api::{ consts::{ @@ -198,7 +198,14 @@ pub(super) fn write_crank( // SAFETY: split yields CRANK_HEADER_SIZE bytes; Crank is align-1 (compile-time checked). let state = unsafe { load_crank_mut(header_bytes)? }; - write_header(state, header, bump, authority_signer, rent_min, region_len as u16); + write_header( + state, + header, + bump, + authority_signer, + rent_min, + region_len as u16, + ); Ok(()) } diff --git a/tests/e2e/Cargo.lock b/tests/e2e/Cargo.lock new file mode 100644 index 0000000..22afacd --- /dev/null +++ b/tests/e2e/Cargo.lock @@ -0,0 +1,5455 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "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", +] + +[[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 = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b16372df9ec6577a8e4140c85aa8b743d99945cbeebbc0d7b739136a4e601a4" +dependencies = [ + "ahash", + "solana-epoch-schedule", + "solana-hash 4.4.0", + "solana-keypair", + "solana-pubkey 4.2.0", + "solana-sha256-hasher", + "solana-svm-feature-set", +] + +[[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 = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arc-swap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +dependencies = [ + "rustversion", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "asn1-rs" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-compression" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[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 = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +dependencies = [ + "serde_core", +] + +[[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.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" +dependencies = [ + "borsh-derive", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[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" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" +dependencies = [ + "serde", +] + +[[package]] +name = "caps" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" +dependencies = [ + "libc", +] + +[[package]] +name = "cc" +version = "1.2.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[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 = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compression-codecs" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +dependencies = [ + "encode_unicode", + "libc", + "unicode-width", + "windows-sys 0.61.2", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[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 = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "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", +] + +[[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", +] + +[[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", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.6", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "ephemeral-rollups-pinocchio" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a09b61c47e5b4eeb7add34e9d43d836784a66d78fa704606bebaa453bef73e21" +dependencies = [ + "bincode 2.0.1", + "pinocchio 0.10.2", + "pinocchio-pubkey", + "pinocchio-system", + "solana-address 2.6.1", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastbloom" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" +dependencies = [ + "getrandom 0.3.4", + "libm", + "rand 0.9.4", + "siphasher", +] + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[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 1.0.0", +] + +[[package]] +name = "five8_const" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" +dependencies = [ + "five8_core 0.1.2", +] + +[[package]] +name = "five8_const" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" +dependencies = [ + "five8_core 1.0.0", +] + +[[package]] +name = "five8_core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" + +[[package]] +name = "five8_core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[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-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix", + "windows-link", +] + +[[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", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + +[[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.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "histogram" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.4.2", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.2", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hydra-api" +version = "0.1.1" +dependencies = [ + "ephemeral-rollups-pinocchio", + "pinocchio 0.10.2", + "solana-address 2.6.1", + "solana-instruction", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "hydra-e2e-tests" +version = "0.0.0" +dependencies = [ + "anyhow", + "hydra-api", + "solana-client", + "solana-commitment-config", + "solana-instruction", + "solana-keypair", + "solana-message", + "solana-pubkey 4.2.0", + "solana-rpc-client-api", + "solana-signature", + "solana-signer", + "solana-system-interface 2.0.0", + "solana-transaction", +] + +[[package]] +name = "hyper" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http 1.4.2", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http 1.4.2", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.8", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http 1.4.2", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "indicatif" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +dependencies = [ + "console", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[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.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 = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine 4.6.7", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures", +] + +[[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 = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[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.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[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 = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[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-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[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", +] + +[[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 = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +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 = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[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 = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[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 = "pinocchio" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8afe4f39c0e25cc471b35b89963312791a5162d45a86578cbeaad9e5e7d1b3b" + +[[package]] +name = "pinocchio" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06810dac15a4ef83d3dabdb4f2f22fb39c9adff669cd2781da4f716510a647c" +dependencies = [ + "solana-account-view", + "solana-address 2.6.1", + "solana-define-syscall 4.0.1", + "solana-instruction-view", + "solana-program-error", +] + +[[package]] +name = "pinocchio-pubkey" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0225638cadcbebae8932cb7f49cb5da7c15c21beb19f048f05a5ca7d93f065" +dependencies = [ + "five8_const 0.1.4", + "pinocchio 0.9.3", + "sha2-const-stable", +] + +[[package]] +name = "pinocchio-system" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24044a0815753862b558e179e78f03f7344cb755de48617a09d7d23b50883b6c" +dependencies = [ + "pinocchio 0.10.2", + "solana-address 2.6.1", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[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" +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 = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" +dependencies = [ + "bytes", + "fastbloom", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +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.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.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.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "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 = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.8", +] + +[[package]] +name = "reqwest-middleware" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" +dependencies = [ + "anyhow", + "async-trait", + "http 1.4.2", + "reqwest", + "serde", + "thiserror 1.0.69", + "tower-service", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[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-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" +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", +] + +[[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_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[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", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "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 = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "solana-account" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-sysvar", +] + +[[package]] +name = "solana-account-decoder" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cef67445b00fa0d3ab67ddd1397012d961cf74d1cb47224ba1375d351991181" +dependencies = [ + "Inflector", + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "bv", + "serde", + "serde_json", + "solana-account", + "solana-account-decoder-client-types", + "solana-address-lookup-table-interface", + "solana-clock", + "solana-config-interface", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-instruction", + "solana-loader-v3-interface", + "solana-nonce", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-slot-history", + "solana-stake-interface", + "solana-sysvar", + "solana-vote-interface", + "spl-generic-token", + "spl-token-2022-interface", + "spl-token-group-interface", + "spl-token-interface", + "spl-token-metadata-interface", + "thiserror 2.0.18", + "zstd", +] + +[[package]] +name = "solana-account-decoder-client-types" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da42c070e1d8a268c9ab746352ad1883c81af2529b3d11cb66d8484a746bd9d8" +dependencies = [ + "base64 0.22.1", + "bs58", + "serde", + "serde_json", + "solana-account", + "solana-pubkey 4.2.0", + "zstd", +] + +[[package]] +name = "solana-account-info" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" +dependencies = [ + "solana-address 2.6.1", + "solana-program-error", + "solana-program-memory", +] + +[[package]] +name = "solana-account-view" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37ca34c37f92ee341b73d5ce7c8ef5bb38e9a87955b4bd343c63fa18b149215" +dependencies = [ + "solana-address 2.6.1", + "solana-program-error", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39c93e262f671bf402e1040e4a7e40b05d81da5956c7681948c975a0997517bb" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "five8", + "five8_const 1.0.0", + "serde", + "serde_derive", + "sha2-const-stable", + "solana-atomic-u64", + "solana-define-syscall 5.1.0", + "solana-nullable", + "solana-program-error", + "solana-sanitize", + "solana-sha256-hasher", + "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 1.3.3", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" +dependencies = [ + "parking_lot", +] + +[[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-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0254ae347d34fbb7d4561c5b4a1de762f177cbbc6d11a257b69564a18bb91eb" +dependencies = [ + "async-trait", + "bincode 1.3.3", + "dashmap", + "futures", + "futures-util", + "indexmap", + "indicatif", + "log", + "quinn", + "rayon", + "solana-account", + "solana-client-traits", + "solana-commitment-config", + "solana-connection-cache", + "solana-epoch-info", + "solana-hash 4.4.0", + "solana-instruction", + "solana-keypair", + "solana-measure", + "solana-message", + "solana-net-utils", + "solana-pubkey 4.2.0", + "solana-pubsub-client", + "solana-quic-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", + "solana-signature", + "solana-signer", + "solana-streamer", + "solana-time-utils", + "solana-tls-utils", + "solana-tpu-client", + "solana-transaction", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-udp-client", + "thiserror 2.0.18", + "tokio", + "tokio-util", +] + +[[package]] +name = "solana-client-traits" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08618ed587e128105510c54ae3e456b9a06d674d8640db75afe66dad65cb4e02" +dependencies = [ + "solana-account", + "solana-commitment-config", + "solana-epoch-info", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-message", + "solana-pubkey 3.0.0", + "solana-signature", + "solana-signer", + "solana-system-interface 2.0.0", + "solana-transaction", + "solana-transaction-error", +] + +[[package]] +name = "solana-clock" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0acdace90d96e2c9e70d681465b4fe888b6bcf27c354ae9774e9f8a3b72923d" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-cluster-type" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a494cf8eda7d98d9f0144b288bb409c88308d2e86f15cc1045aa77b83304718" +dependencies = [ + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-commitment-config" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1517aa49dcfa9cb793ef90e7aac81346d62ca4a546bb1a754030a033e3972e1c" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-config-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e401ae56aed512821cc7a0adaa412ff97fecd2dff4602be7b1330d2daec0c4" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-account", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-short-vec", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-connection-cache" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891144968e18addbf553a00db8b15ffe906d1bced65fac35df97d42c40f2db1" +dependencies = [ + "async-trait", + "bincode 1.3.3", + "crossbeam-channel", + "futures-util", + "indexmap", + "log", + "rand 0.9.4", + "rayon", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-time-utils", + "solana-transaction-error", + "thiserror 2.0.18", + "tokio", +] + +[[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-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 = "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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad280b1ed803853f7b453cb3ea9a57e600ca5599a63e69f7be199b486c0ec93" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-feature-gate-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" +dependencies = [ + "serde", + "serde_derive", + "solana-program-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", +] + +[[package]] +name = "solana-fee-calculator" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef67f01cc6a0c72e99a08d0d484683f995de4c80e9568728fa77d1537f9b7e09" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-get-sysvar" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef3bc859fc036ed490146793557386cbfae614ebba4adc704c37d94350824ed4" +dependencies = [ + "solana-address 2.6.1", + "solana-define-syscall 5.1.0", + "solana-program-error", +] + +[[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 = [ + "bytemuck", + "bytemuck_derive", + "five8", + "serde", + "serde_derive", + "solana-atomic-u64", + "solana-sanitize", +] + +[[package]] +name = "solana-inflation" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf104167e42e747602b88e02b25cacfc5de699c3b7cbba60d3250437e6a22ed" + +[[package]] +name = "solana-instruction" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" +dependencies = [ + "bincode 1.3.3", + "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-instruction-view" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60147e4d0a4620013df40bf30a86dd299203ff12fcb8b593cd51014fce0875d8" +dependencies = [ + "solana-account-view", + "solana-address 2.6.1", + "solana-define-syscall 4.0.1", + "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-keypair" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" +dependencies = [ + "ed25519-dalek", + "five8", + "five8_core 1.0.0", + "rand 0.9.4", + "solana-address 2.6.1", + "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", + "solana-instruction", + "solana-pubkey 4.2.0", + "solana-sdk-ids", +] + +[[package]] +name = "solana-measure" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6bf53782db446797b3cb1116edb00709b5767409724058bba14281673f56025" + +[[package]] +name = "solana-message" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" +dependencies = [ + "bincode 1.3.3", + "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-metrics" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b84339a82ea4e2b87dadf13bccf71d3dd6c42db26bbfae9c602663d6a0c892f" +dependencies = [ + "crossbeam-channel", + "gethostname", + "log", + "reqwest", + "solana-cluster-type", + "solana-sha256-hasher", + "solana-time-utils", + "thiserror 2.0.18", +] + +[[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-net-utils" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5456d9f922b0b222e305c7dae2ebdeecdb8f1cfa95e879ca81109349fc9b8927" +dependencies = [ + "anyhow", + "bincode 1.3.3", + "bytes", + "cfg-if", + "dashmap", + "itertools 0.14.0", + "log", + "nix", + "rand 0.9.4", + "serde", + "socket2", + "solana-serde", + "solana-svm-type-overrides", + "tokio", + "url", +] + +[[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-nullable" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0f95d3028ef0f682bb174b77379c19d5dae2904a649f4a103fe29be7a139980" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "solana-packet" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad62e1045c2347a0c0e219a6ceb0abfe904be622920996bfcac8d116fabe3c7" +dependencies = [ + "bincode 1.3.3", + "bitflags", + "cfg_eval", + "serde", + "serde_derive", + "serde_with", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-perf" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b28abb6bf9ef6d6bd57003dded119a4d20022a390405bc3f9a49c8b5abbc03be" +dependencies = [ + "ahash", + "bincode 1.3.3", + "bv", + "bytes", + "caps", + "curve25519-dalek", + "dlopen2", + "fnv", + "libc", + "log", + "nix", + "num_cpus", + "rand 0.9.4", + "rayon", + "serde", + "solana-hash 4.4.0", + "solana-message", + "solana-metrics", + "solana-packet", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-time-utils", + "solana-transaction-context", +] + +[[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", +] + +[[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 = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" +dependencies = [ + "solana-address 1.1.0", +] + +[[package]] +name = "solana-pubkey" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" +dependencies = [ + "solana-address 2.6.1", +] + +[[package]] +name = "solana-pubsub-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cad54242be1408458425420623c6772e39417aa872deffde531cebea697f032" +dependencies = [ + "crossbeam-channel", + "futures-util", + "http 0.2.12", + "log", + "semver", + "serde", + "serde_json", + "solana-account-decoder-client-types", + "solana-clock", + "solana-pubkey 4.2.0", + "solana-rpc-client-types", + "solana-signature", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c86939caa34beff3ac630ea84ce443e5f4eac83d1ef009da51b2e2465821a3e" +dependencies = [ + "async-lock", + "async-trait", + "futures", + "itertools 0.14.0", + "log", + "quinn", + "quinn-proto", + "rustls", + "solana-connection-cache", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-pubkey 4.2.0", + "solana-rpc-client-api", + "solana-signer", + "solana-streamer", + "solana-tls-utils", + "solana-transaction-error", + "thiserror 2.0.18", + "tokio", +] + +[[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]] +name = "solana-rent" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40f02fbe2669ebe5d851dbf29a02e91ed6244b051bb64fcc57e6644aba636063" +dependencies = [ + "solana-sdk-macro", +] + +[[package]] +name = "solana-reward-info" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f4c5c5b5599e640c15ead65be499d60f6ee62a5ba7aa7e23f5b0537046ed49" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-rpc-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1085efc9679ad7eb357b0bc711a16ff106a2f031bf7501d7279adf360fd6928f" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "futures", + "indicatif", + "log", + "reqwest", + "reqwest-middleware", + "semver", + "serde", + "serde_json", + "solana-account", + "solana-account-decoder", + "solana-account-decoder-client-types", + "solana-clock", + "solana-commitment-config", + "solana-epoch-info", + "solana-epoch-schedule", + "solana-feature-gate-interface", + "solana-hash 4.4.0", + "solana-instruction", + "solana-message", + "solana-pubkey 4.2.0", + "solana-rpc-client-api", + "solana-signature", + "solana-transaction", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-version", + "solana-vote-interface", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7a12b9801d7bca997a8bc0494df224eafee830f6313cc65100c76bb5df4c46d" +dependencies = [ + "anyhow", + "jsonrpc-core", + "reqwest", + "reqwest-middleware", + "serde", + "serde_json", + "solana-account-decoder-client-types", + "solana-clock", + "solana-rpc-client-types", + "solana-signer", + "solana-transaction-error", + "solana-transaction-status-client-types", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e2be4dff153d2df5b8ad07e0bd655a55fd672c2667fe6b6a48a87fa439ffa5" +dependencies = [ + "solana-account", + "solana-commitment-config", + "solana-hash 4.4.0", + "solana-message", + "solana-nonce", + "solana-pubkey 4.2.0", + "solana-rpc-client", + "solana-sdk-ids", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-rpc-client-types" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3196fe76562ac3a68deef16914074c60132321b681dbb33f5ea8d5adb1fe0b4d" +dependencies = [ + "base64 0.22.1", + "bs58", + "semver", + "serde", + "serde_json", + "solana-account", + "solana-account-decoder-client-types", + "solana-address 2.6.1", + "solana-clock", + "solana-commitment-config", + "solana-fee-calculator", + "solana-inflation", + "solana-reward-info", + "solana-transaction", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-version", + "spl-generic-token", + "thiserror 2.0.18", +] + +[[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.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733b3657a0fab205102b799dbe17f85d3972cf984232c1b0b108fa6ba438e382" +dependencies = [ + "byteorder", + "combine 3.8.1", + "hash32", + "log", + "rustc-demangle", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-sdk-ids" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" +dependencies = [ + "solana-address 2.6.1", +] + +[[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", +] + +[[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", +] + +[[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 = "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", + "solana-define-syscall 4.0.1", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-short-vec" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8250a4495aad49ad20556a607da53bdcb20de78da10b65afbf918b7f1de647" +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", + "solana-sysvar-id", +] + +[[package]] +name = "solana-streamer" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9891af44a3cb707db4a393018bfe6b7cc3dd90390801a6f414ec246fabede4b0" +dependencies = [ + "arc-swap", + "bytes", + "crossbeam-channel", + "dashmap", + "futures", + "futures-util", + "histogram", + "indexmap", + "itertools 0.14.0", + "libc", + "log", + "nix", + "num_cpus", + "pem", + "percentage", + "quinn", + "quinn-proto", + "rand 0.9.4", + "rustls", + "smallvec", + "socket2", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-packet", + "solana-perf", + "solana-pubkey 4.2.0", + "solana-signature", + "solana-signer", + "solana-time-utils", + "solana-tls-utils", + "solana-transaction-error", + "solana-transaction-metrics-tracker", + "thiserror 2.0.18", + "tokio", + "tokio-util", + "x509-parser", +] + +[[package]] +name = "solana-svm-feature-set" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2770de6ab3b2f74b1942128fe6e32f343f4df23b116e9b94bd6860b753d0551b" + +[[package]] +name = "solana-svm-type-overrides" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d07694a92c868df19651367412658373cb38386fca7d68454e925cd73ad090" +dependencies = [ + "rand 0.9.4", +] + +[[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-sysvar" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "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-id" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +dependencies = [ + "solana-address 2.6.1", + "solana-sdk-ids", +] + +[[package]] +name = "solana-time-utils" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced92c60aa76ec4780a9d93f3bd64dfa916e1b998eacc6f1c110f3f444f02c9" + +[[package]] +name = "solana-tls-utils" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df6db6c17ff9c5a1240a86185804541ee681024e7fc551821df007d2af220a66" +dependencies = [ + "rustls", + "solana-keypair", + "solana-pubkey 4.2.0", + "solana-signer", + "x509-parser", +] + +[[package]] +name = "solana-tpu-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cde6ca8723785945cf0d6e51285e1b642c0d9ac7140412797d69c51d44d3b6a" +dependencies = [ + "async-trait", + "bincode 1.3.3", + "futures-util", + "indexmap", + "indicatif", + "log", + "rayon", + "solana-client-traits", + "solana-clock", + "solana-commitment-config", + "solana-connection-cache", + "solana-epoch-schedule", + "solana-measure", + "solana-message", + "solana-net-utils", + "solana-pubkey 4.2.0", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-signature", + "solana-signer", + "solana-transaction", + "solana-transaction-error", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-transaction" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-address 2.6.1", + "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 = "solana-transaction-context" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e081c70560c26b67c1e8451c71c08dd70a44f288aa1d006cd1554e9a834b1a72" +dependencies = [ + "bincode 1.3.3", + "serde", + "solana-account", + "solana-instruction", + "solana-instructions-sysvar", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", +] + +[[package]] +name = "solana-transaction-error" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441d6dcd51100e7d97c3fb3b723e08aa701066ff7afc00026fd8d8e222cb95b" +dependencies = [ + "serde", + "serde_derive", + "solana-instruction-error", + "solana-sanitize", +] + +[[package]] +name = "solana-transaction-metrics-tracker" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb1d14966612be1eefb10c325a6335a64f8fb5446c9b70dfcccdda21af9cab9" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "log", + "rand 0.9.4", + "solana-packet", + "solana-perf", + "solana-short-vec", + "solana-signature", +] + +[[package]] +name = "solana-transaction-status-client-types" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb387b44eec1887694ac2264e35951f0c0763014b6593ae17f13cb3088fa2cc" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "serde", + "serde_json", + "solana-account-decoder-client-types", + "solana-commitment-config", + "solana-instruction", + "solana-message", + "solana-pubkey 4.2.0", + "solana-reward-info", + "solana-signature", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-udp-client" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6bc4cca754805d6b90b97c675de71c1e1492315127c2fda0798178a42ad63f" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-keypair", + "solana-net-utils", + "solana-streamer", + "solana-transaction-error", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-version" +version = "4.0.0-beta.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5316d63c5a8dfce421d49f5c2234e568f8fe34e1a372d6f55e397f11c623b475" +dependencies = [ + "agave-feature-set", + "rand 0.9.4", + "semver", + "serde", + "solana-sanitize", + "solana-serde-varint", +] + +[[package]] +name = "solana-vote-interface" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d444ce30b6b4f9c281ba06061ea96638d063b53c2171b1e41ba02ebff79ed28f" +dependencies = [ + "bincode 1.3.3", + "cfg_eval", + "num-derive", + "num-traits", + "serde", + "serde_derive", + "serde_with", + "solana-clock", + "solana-hash 4.4.0", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-rent 4.2.1", + "solana-sdk-ids", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface 3.2.0", +] + +[[package]] +name = "solana-zero-copy" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea15126ebdc7e270c50d43884369af9f51d2308156d46a18e351522a164844d" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", +] + +[[package]] +name = "solana-zk-sdk" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode 1.3.3", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "getrandom 0.2.17", + "itertools 0.12.1", + "js-sys", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.6", + "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 = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "spl-discriminator" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e597c5ff9ed7c74a54dbc47bae2f06e4db8c98f4356ad280200dc11878266db1" +dependencies = [ + "bytemuck", + "solana-program-error", + "solana-sha256-hasher", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67" +dependencies = [ + "proc-macro2", + "quote", + "sha2", + "syn", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-generic-token" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233df81b75ab99b42f002b5cdd6e65a7505ffa930624f7096a7580a56765e9cf" +dependencies = [ + "bytemuck", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "spl-pod" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9c6e142cdf1e7e77f480053ec9f0ce989890768ddf91f619b50f39d1b456f5" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "num-derive", + "num-traits", + "num_enum", + "solana-program-error", + "solana-program-option", + "solana-pubkey 3.0.0", + "solana-zero-copy", + "solana-zk-sdk", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-2022-interface" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fcd81188211f4b3c8a5eba7fd534c7142f9dd026123b3472492782cc72f4dc6" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-zk-sdk", + "spl-pod", + "spl-token-confidential-transfer-proof-extraction", + "spl-token-confidential-transfer-proof-generation", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-type-length-value", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-extraction" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879a9ebad0d77383d3ea71e7de50503554961ff0f4ef6cbca39ad126e6f6da3a" +dependencies = [ + "bytemuck", + "solana-account-info", + "solana-curve25519", + "solana-instruction", + "solana-instructions-sysvar", + "solana-msg", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-zk-sdk", + "spl-pod", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-generation" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0cd59fce3dc00f563c6fa364d67c3f200d278eae681f4dc250240afcfe044b1" +dependencies = [ + "curve25519-dalek", + "solana-zk-sdk", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841cbd6f2322d02719be4da1affedbe6495b1048b7b985ec9796032564026e22" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-address 2.6.1", + "solana-instruction", + "solana-nullable", + "solana-program-error", + "solana-zero-copy", + "spl-discriminator", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c564ac05a7c8d8b12e988a37d82695b5ba4db376d07ea98bc4882c81f96c7f3" +dependencies = [ + "arrayref", + "bytemuck", + "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]] +name = "spl-token-metadata-interface" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c467c7c3bd056f8fe60119e7ec34ddd6f23052c2fa8f1f51999098063b72676" +dependencies = [ + "borsh", + "num-derive", + "num-traits", + "solana-borsh", + "solana-instruction", + "solana-program-error", + "solana-pubkey 3.0.0", + "spl-discriminator", + "spl-pod", + "spl-type-length-value", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-type-length-value" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2504631748c48d2a937414d64a12dcac4588d34bd07d355d648619c189d29435" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info", + "solana-program-error", + "solana-zero-copy", + "spl-discriminator", + "thiserror 2.0.18", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[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 = "2.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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", +] + +[[package]] +name = "time" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[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 = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "futures-util", + "pin-project-lite", + "tokio", +] + +[[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 = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "async-compression", + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body", + "http-body-util", + "pin-project-lite", + "tokio", + "tokio-util", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http 1.4.2", + "httparse", + "log", + "rand 0.9.4", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", + "webpki-roots 0.26.11", +] + +[[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 = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[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 = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[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.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.8", +] + +[[package]] +name = "webpki-roots" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +dependencies = [ + "rustls-pki-types", +] + +[[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-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" +dependencies = [ + "pastey", + "proc-macro2", + "quote", + "thiserror 2.0.18", + "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", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "x509-parser" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[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", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/tests/e2e/Cargo.toml b/tests/e2e/Cargo.toml new file mode 100644 index 0000000..77c1f60 --- /dev/null +++ b/tests/e2e/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "hydra-e2e-tests" +version = "0.0.0" +edition = "2021" +publish = false + +[dev-dependencies] +# The ephemeral feature gives us the `eHyd…` program ID and the ephemeral +# `Create`/`Trigger` account layouts that match the deployed program. +# `client` only — the ephemeral builders are reached at runtime via +# `instruction::ephemeral::*`, matching how the cranker selects its program. +hydra-api = { path = "../../crates/hydra-api", features = ["client"] } + +anyhow = "1" +crossbeam-channel = "0.5" + +solana-client = "=4.0.0-beta.7" +solana-pubsub-client = "=4.0.0-beta.7" +solana-rpc-client-api = "=4.0.0-beta.7" +solana-signature = "3" +solana-commitment-config = "3.1" +solana-keypair = "3.1" +solana-signer = "3" +solana-pubkey = "4.0" +solana-instruction = "3.0" +solana-message = "3.1" +solana-transaction = "3.1" +solana-system-interface = { version = "2.0", features = ["bincode"] } diff --git a/tests/e2e/tests/ephemeral_cranks.rs b/tests/e2e/tests/ephemeral_cranks.rs new file mode 100644 index 0000000..fbf55d9 --- /dev/null +++ b/tests/e2e/tests/ephemeral_cranks.rs @@ -0,0 +1,971 @@ +//! Live end-to-end test for Hydra's ephemeral-rollup crank. +//! +//! Unlike the in-process `tests/ephemeral` suite (which drives MagicSVM), this +//! boots the *real* three-process stack and asserts the cranker keeps a handful +//! of ephemeral cranks firing on schedule. Two scenarios cover both discovery +//! paths: cranks created **before** the cranker starts (its bootstrap +//! `getProgramAccounts` scan) and **after** (live `programSubscribe` +//! notifications, with the bootstrap proven empty first). +//! +//! ```text +//! mb-test-validator ── base L1 (delegation + magic programs preloaded), +//! hydra(ephemeral) + noop loaded at genesis +//! ▲ clones programs/accounts on demand +//! │ +//! ephemeral-validator ── the rollup; hosts the ephemeral crank accounts +//! ▲ RPC + WS (slotSubscribe / programSubscribe) +//! │ +//! hydra-cranker ── watches the rollup, fires `Trigger` every interval +//! ``` +//! +//! Execution progress is observed via `logsSubscribe` on the noop program: each +//! crank passes a distinct `u64` id in the scheduled noop's instruction data, +//! and the noop logs `noop-fired:` when it runs. That mirrors how the +//! cranker itself learns about cranks (bootstrap / `programSubscribe`) and +//! fires on slot ticks — the test never polls crank account `executed`. +//! +//! ## Prerequisites +//! +//! Binaries on `PATH` (installed via the `@magicblock-labs/ephemeral-validator` +//! npm package): `mb-test-validator`, `ephemeral-validator`. And the two +//! prebuilt on-chain `.so`s (the rollup clones them from the base): +//! +//! ```sh +//! # from the hydra workspace root +//! cargo build-sbf -- --features ephemeral # target/deploy/hydra.so +//! cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml # target/deploy/hydra_noop.so +//! ``` +//! +//! The `hydra-cranker` binary is built automatically by the test (see +//! `build_cranker`); it selects the ephemeral program at runtime via +//! `--ephemeral`. Then, from this crate: +//! +//! ```sh +//! cargo test -- --ignored --nocapture --test-threads=1 +//! ``` +//! +//! The test is `#[ignore]` by default: it spawns external validators, binds +//! local ports, and takes ~10–15s, so it should not run in a plain `cargo test`. + +use std::fs; +use std::io::ErrorKind; +use std::path::{Path, PathBuf}; +use std::process::{Child, Command, Stdio}; +use std::str::FromStr; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, Mutex}; +use std::thread::{self, JoinHandle}; +use std::time::{Duration, Instant}; + +use anyhow::{anyhow, bail, Context, Result}; +use crossbeam_channel::RecvTimeoutError; +use hydra_api::instruction::ephemeral::{self as eph, CreateArgs}; +use hydra_api::instruction::{self as ix, ScheduledIx}; +use solana_client::rpc_client::RpcClient; +use solana_commitment_config::CommitmentConfig; +use solana_instruction::{AccountMeta, Instruction}; +use solana_keypair::Keypair; +use solana_message::Message; +use solana_pubkey::Pubkey; +use solana_pubsub_client::pubsub_client::PubsubClient; +use solana_rpc_client_api::config::{RpcTransactionLogsConfig, RpcTransactionLogsFilter}; +use solana_signer::Signer; +use solana_system_interface::instruction as system_instruction; +use solana_transaction::Transaction; + +// --- Topology --------------------------------------------------------------- + +/// Base L1 JSON-RPC port. solana-test-validator serves PubSub on `PORT + 1`. +const BASE_RPC_PORT: u16 = 7101; +const BASE_WS_PORT: u16 = BASE_RPC_PORT + 1; +/// Ephemeral rollup RPC port. Aperture serves RPC + WS on the same address, +/// which is exactly what the cranker's `http→ws` URL derivation assumes. +const ER_RPC_PORT: u16 = 7799; + +/// The bundled noop program — its on-chain address is its build keypair's +/// pubkey (`target/deploy/hydra_noop-keypair.json`). Scheduled cranks point at +/// it; it ignores its accounts and data. +const NOOP_ID: &str = "CftjNLnvyBFcEqShc2VRcESCpPnUfDaFub1wgnGCqtHv"; + +const LAMPORTS_PER_SOL: u64 = 1_000_000_000; + +// --- Crank parameters ------------------------------------------------------- + +/// How many cranks to create and watch. +const NUM_CRANKS: usize = 10; +/// Slots between executions. Small so the test stays quick; the rollup runs at +/// ~50 ms/slot, so this is a few seconds per fire. +const INTERVAL_SLOTS: u64 = 1; +/// Executions each crank must reach before the test passes. Proving the crank +/// fires *repeatedly* (not just once) is the point. +const TARGET_EXECUTIONS: u64 = 3; + +/// Prefix emitted by [`tests/programs/noop`] when the scheduled ix carries an +/// 8-byte LE crank id in its instruction data. +const NOOP_FIRED_PREFIX: &str = "noop-fired:"; + +/// Rollup slot time (~50 ms). The e2e crate does not enable `hydra-api/ephemeral`, +/// so `SLOT_FREQUENCY_MS` from that crate reflects base-layer timing. +const ROLLUP_SLOT_MS: u64 = 50; + +/// Overall wall-clock budget for all cranks to reach `TARGET_EXECUTIONS`. +/// Derived from rollup slot timing (not base-layer `SLOT_FREQUENCY_MS`). +const EXEC_DEADLINE: Duration = + Duration::from_millis(ROLLUP_SLOT_MS * INTERVAL_SLOTS * TARGET_EXECUTIONS * 100); + +// --- The tests --------------------------------------------------------------- + +/// When the cranks are created relative to the cranker starting. +#[derive(Clone, Copy, PartialEq)] +enum CreateOrder { + /// Cranks exist before the cranker boots — picked up by its bootstrap + /// `getProgramAccounts` scan. + BeforeCranker, + /// Cranks are created after the cranker is already running with an empty + /// cache — picked up via live `programSubscribe` notifications. + AfterCranker, +} + +// Both tests bind the same fixed local ports and spawn validators, so they must +// not run concurrently. cargo runs tests in a binary on multiple threads, so a +// process-wide lock serializes them (recovering from a poisoned lock if one +// test panics). +static STACK_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(()); + +/// Cranks created *before* the cranker starts → discovered by its bootstrap scan. +#[test] +#[ignore = "spawns live validators + cranker; run with --ignored"] +fn ephemeral_cranks_fire_on_schedule() { + run_scenario(CreateOrder::BeforeCranker); +} + +/// Cranks created *after* the cranker starts → discovered via `programSubscribe`. +#[test] +#[ignore = "spawns live validators + cranker; run with --ignored"] +fn cranker_catches_cranks_created_after_start() { + run_scenario(CreateOrder::AfterCranker); +} + +fn run_scenario(order: CreateOrder) { + let _guard = STACK_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + assert_ports_free().expect("e2e ports available"); + let tmp = TempDir::new().expect("temp dir"); + let mut stack = Stack { + children: Vec::new(), + tmp, + }; + let result = body(&mut stack, order); + if let Err(ref e) = result { + eprintln!("\n[stack] FAILED: {e:#}\n[stack] dumping validator/cranker logs:"); + for f in ["base.log", "er.log", "cranker.log"] { + dump_log(stack.tmp.path(), f); + } + } + // Tear the stack down (and delete the temp dir) *before* asserting, so a + // panic never leaks child processes. + drop(stack); + result.expect("e2e ephemeral crank test"); +} + +fn body(stack: &mut Stack, order: CreateOrder) -> Result<()> { + let tmp = stack.tmp.path().to_path_buf(); + + // Resolve build artifacts up front so a missing prerequisite fails fast. + let hydra_so = artifact("target/deploy/hydra.so")?; + let noop_so = artifact("target/deploy/hydra_noop.so")?; + // The cranker MUST be the `ephemeral` build (it targets the `eHyd…` program + // and skips the lamport-funding checks). A plain `cargo build -p + // hydra-cranker` overwrites the same path with the base-program build, so we + // (re)build the ephemeral variant here to guarantee the right binary. + let cranker_bin = build_cranker()?; + let hydra_id = ix::EPHEMERAL_PROGRAM_ID.to_string(); + let noop_id = Pubkey::from_str(NOOP_ID).unwrap(); + + // `sponsor` is delegated (signs CreateEphemeral, pays rent); `fee_payer` is + // a plain system wallet that covers tx fees (the delegated sponsor can't be + // a fee payer); `cranker` pays for the triggers it submits. + let sponsor = Keypair::new(); + let fee_payer = Keypair::new(); + let cranker = Keypair::new(); + let cranker_kp_path = write_keypair(&tmp, "cranker.json", &cranker)?; + + // 1. Base L1: delegation/magic programs come preloaded by mb-test-validator; + // we add hydra(ephemeral) + noop at genesis so the rollup can clone them. + eprintln!("[stack] starting mb-test-validator on :{BASE_RPC_PORT}"); + let base = spawn( + "mb-test-validator", + &[ + "--reset", + "--quiet", + "--ledger", + tmp.join("base-ledger").to_str().unwrap(), + "--rpc-port", + &BASE_RPC_PORT.to_string(), + "--bind-address", + "127.0.0.1", + "--bpf-program", + &hydra_id, + hydra_so.to_str().unwrap(), + "--bpf-program", + NOOP_ID, + noop_so.to_str().unwrap(), + ], + fs::File::create(tmp.join("base.log"))?, + &[], + )?; + stack.push("mb-test-validator", base); + + let base_rpc = RpcClient::new_with_commitment( + format!("http://127.0.0.1:{BASE_RPC_PORT}"), + CommitmentConfig::confirmed(), + ); + wait_for_rpc(&base_rpc, "base", Duration::from_secs(10))?; + + // 2. Fund the three keypairs on the base, then delegate the sponsor so the + // rollup will let it spend its own lamports (the rent paid inside + // CreateEphemeral). The fee_payer and cranker stay plain system wallets. + airdrop(&base_rpc, &sponsor.pubkey(), 100 * LAMPORTS_PER_SOL)?; + airdrop(&base_rpc, &fee_payer.pubkey(), 10 * LAMPORTS_PER_SOL)?; + airdrop(&base_rpc, &cranker.pubkey(), 10 * LAMPORTS_PER_SOL)?; + delegate_sponsor(&base_rpc, &sponsor, &fee_payer)?; + + eprintln!( + "[stack] funded + delegated sponsor {} (fee_payer {}, cranker {})", + sponsor.pubkey(), + fee_payer.pubkey(), + cranker.pubkey() + ); + + // 3. Ephemeral rollup, syncing against the base. It clones the sponsor (as a + // delegated account), the hydra + noop programs, and the magic vault on + // demand from the base. + eprintln!("[stack] starting ephemeral-validator on :{ER_RPC_PORT}"); + let er = spawn( + "ephemeral-validator", + &[ + "--no-tui", + "--reset", + "--lifecycle", + "ephemeral", + "--remotes", + &format!("http://127.0.0.1:{BASE_RPC_PORT}"), + "--remotes", + &format!("ws://127.0.0.1:{BASE_WS_PORT}"), + "--listen", + &format!("127.0.0.1:{ER_RPC_PORT}"), + "--storage", + tmp.join("er-storage").to_str().unwrap(), + ], + fs::File::create(tmp.join("er.log"))?, + &[("RUST_LOG", "warn")], + )?; + stack.push("ephemeral-validator", er); + + let er_rpc = RpcClient::new_with_commitment( + format!("http://127.0.0.1:{ER_RPC_PORT}"), + CommitmentConfig::confirmed(), + ); + wait_for_rpc(&er_rpc, "rollup", Duration::from_secs(10))?; + // Give the rollup's remote-account-provider WS pool a moment to warm up + // before we make it clone accounts from the base. + std::thread::sleep(Duration::from_secs(3)); + + // Subscribe to noop execution logs before any crank can fire so we never + // miss an early trigger while the cranker is still bootstrapping. + let log_watcher = LogFireWatcher::spawn(noop_id)?; + + // 4. Create the cranks and start the cranker, in the order this scenario + // exercises. `BeforeCranker` is the bootstrap path; `AfterCranker` is the + // live `programSubscribe` path (the cranker boots with an empty cache and + // must catch the new cranks from notifications). + let cranks = match order { + CreateOrder::BeforeCranker => { + let cranks = create_cranks(&sponsor, &fee_payer, noop_id)?; + spawn_cranker(stack, &cranker_bin, &cranker_kp_path, &tmp)?; + cranks + } + CreateOrder::AfterCranker => { + spawn_cranker(stack, &cranker_bin, &cranker_kp_path, &tmp)?; + // Let the cranker bootstrap (finding zero cranks) and connect its + // programSubscribe watcher before any crank exists. + std::thread::sleep(Duration::from_millis(500)); + assert_cranker_bootstrapped_empty(&tmp)?; + eprintln!("[stack] cranker is up with an empty cache; creating cranks now"); + create_cranks(&sponsor, &fee_payer, noop_id)? + } + }; + + // 6. Wait until every crank has fired enough times. Each scheduled noop + // carries a distinct id in its ix data; the noop program logs + // `noop-fired:` and the watcher attributes fires from those notifications. + let watch = log_watcher.wait_until(EXEC_DEADLINE)?; + + // 7. Report + assert. + let mut failures = Vec::new(); + for (i, fires) in watch.fires.iter().enumerate() { + eprintln!("[result] crank {i} ({}): fires={fires:?}", cranks[i]); + + let executed = fires.iter().filter(|fire| fire.is_some()).count(); + if executed < TARGET_EXECUTIONS as usize { + failures.push(format!( + "crank {i} only fired {executed}/{TARGET_EXECUTIONS} times within {EXEC_DEADLINE:?}" + )); + } + } + if !failures.is_empty() { + bail!( + "{} crank(s) failed to keep schedule:\n {}", + failures.len(), + failures.join("\n ") + ); + } + + eprintln!("[stack] all {NUM_CRANKS} cranks fired ≥{TARGET_EXECUTIONS}× on schedule"); + Ok(()) +} + +// --- Scenario helpers ------------------------------------------------------- + +/// Fail fast when fixed local ports are still held by a prior run's validators. +fn assert_ports_free() -> Result<()> { + use std::net::TcpListener; + for (port, label) in [ + (BASE_RPC_PORT, "mb-test-validator"), + (ER_RPC_PORT, "ephemeral-validator"), + ] { + if TcpListener::bind(("127.0.0.1", port)).is_err() { + bail!( + "127.0.0.1:{port} is already in use ({label}). \ + A prior e2e run may have left validators running after Ctrl+C. \ + Stop them with: pkill -INT -f 'mb-test-validator|ephemeral-validator|hydra-cranker'" + ); + } + } + Ok(()) +} + +/// Create `NUM_CRANKS` cranks on the rollup in parallel, asserting each materialized. +/// Returns their PDAs in index order. +fn create_cranks(sponsor: &Keypair, fee_payer: &Keypair, noop_id: Pubkey) -> Result> { + let rpc_url = format!("http://127.0.0.1:{ER_RPC_PORT}"); + let commitment = CommitmentConfig::confirmed(); + let mut cranks = vec![Pubkey::default(); NUM_CRANKS]; + + std::thread::scope(|scope| { + let mut handles: Vec< + std::thread::ScopedJoinHandle<'_, Result<(usize, Pubkey), anyhow::Error>>, + > = Vec::with_capacity(NUM_CRANKS); + for i in 0..NUM_CRANKS { + let rpc_url = rpc_url.clone(); + handles.push(scope.spawn(move || { + let rpc = RpcClient::new_with_commitment(rpc_url, commitment); + let crank = create_crank(&rpc, sponsor, fee_payer, crank_seed(i), noop_id, i)?; + assert_crank_exists(&rpc, &crank) + .with_context(|| format!("crank {i} ({crank}) was not created on the rollup"))?; + Ok((i, crank)) + })); + } + for handle in handles { + let (i, crank) = handle + .join() + .map_err(|_| anyhow!("create crank thread panicked"))??; + cranks[i] = crank; + } + Ok::<(), anyhow::Error>(()) + })?; + + eprintln!("[stack] created {NUM_CRANKS} crank(s)"); + Ok(cranks) +} + +/// A distinct 32-byte crank seed for index `i` (LE-encoded, so it stays unique +/// well past 255 cranks). +fn crank_seed(i: usize) -> [u8; 32] { + let mut seed = [0u8; 32]; + seed[..8].copy_from_slice(&(i as u64 + 1).to_le_bytes()); + seed +} + +/// Spawn the cranker against the rollup and register it for teardown. +fn spawn_cranker( + stack: &mut Stack, + cranker_bin: &Path, + cranker_kp_path: &Path, + tmp: &Path, +) -> Result<()> { + eprintln!("[stack] starting hydra-cranker → rollup"); + let cranker = spawn( + cranker_bin.to_str().unwrap(), + &[ + "--rpc-url", + &format!("http://127.0.0.1:{ER_RPC_PORT}"), + // The rollup serves RPC and WebSocket on separate ports (RPC+1), + // unlike the cranker's default same-port `http→ws` derivation. + "--ws-url", + &format!("ws://127.0.0.1:{}", ER_RPC_PORT + 1), + "--keypair", + cranker_kp_path.to_str().unwrap(), + // Target the ephemeral-rollup program (runtime selection, not a + // build feature). + "--ephemeral", + // Triggers must skip preflight: the rollup only clones referenced + // accounts on the real send path, not during preflight simulation. + "--trigger-skip-preflight", + ], + fs::File::create(tmp.join("cranker.log"))?, + &[("RUST_LOG", "info")], + )?; + stack.push("hydra-cranker", cranker); + Ok(()) +} + +/// Assert the cranker's startup bootstrap found zero cranks — proving that any +/// cranks it later fires were discovered via live `programSubscribe` +/// notifications, not the bootstrap scan. The cranker logs +/// `bootstrap: N crank(s) cached` at startup (info level). +fn assert_cranker_bootstrapped_empty(tmp: &Path) -> Result<()> { + let log = tmp.join("cranker.log"); + let deadline = Instant::now() + Duration::from_secs(10); + loop { + let contents = fs::read_to_string(&log).unwrap_or_default(); + if contents.contains("bootstrap: 0 crank(s) cached") { + return Ok(()); + } + // Guard against a cranker that somehow saw cranks at bootstrap. + if let Some(line) = contents.lines().find(|l| l.contains("crank(s) cached")) { + bail!("cranker bootstrap was not empty: {line:?}"); + } + if Instant::now() >= deadline { + bail!("cranker did not log a bootstrap result within 10s"); + } + std::thread::sleep(Duration::from_millis(250)); + } +} + +// --- Sponsor delegation ----------------------------------------------------- + +/// Make the sponsor an **on-curve delegated** account so the rollup will let it +/// spend its own lamports (paying the ephemeral-account rent inside +/// `CreateEphemeral`). On the rollup, a fee payer whose lamports change must be +/// `delegated()` (`magicblock-svm/.../access_permissions.rs`) — and an +/// undelegated escrow does *not* set that flag on the wallet. The supported +/// path is the on-curve delegation flow (see MagicBlock's `oncurve-delegation` +/// example): the wallet `assign`s itself to the delegation program, then is +/// delegated to the validator, in one base-layer transaction. +/// +/// A separate, system-owned `fee_payer` covers the transaction fee — the +/// delegated sponsor can't be the fee payer (it's owned by the delegation +/// program), and a delegated account also can't `system_program::transfer`. +fn delegate_sponsor(base: &RpcClient, sponsor: &Keypair, fee_payer: &Keypair) -> Result<()> { + let dlp = delegation_program_id(); + let system = system_program_id(); + let acct = sponsor.pubkey(); + + // The wallet reassigns its own owner to the delegation program (it signs). + let assign = system_instruction::assign(&acct, &dlp); + + // delegation program `Delegate` (disc 0). PDAs: delegate buffer under the + // *owner* (system) program, record + metadata under the delegation program. + let (buffer, _) = Pubkey::find_program_address(&[b"buffer", acct.as_ref()], &system); + let (record, _) = Pubkey::find_program_address(&[b"delegation", acct.as_ref()], &dlp); + let (metadata, _) = + Pubkey::find_program_address(&[b"delegation-metadata", acct.as_ref()], &dlp); + // Data: disc u64 LE, borsh `{ commit_frequency_ms: u32, seeds: Vec>, + // validator: Option }`. Empty seeds → on-curve account (no PDA + // seed check); validator pinned to the rollup so it adopts the delegation. + let mut data = Vec::new(); + data.extend_from_slice(&0u64.to_le_bytes()); + data.extend_from_slice(&u32::MAX.to_le_bytes()); // commit_frequency_ms + data.extend_from_slice(&0u32.to_le_bytes()); // seeds: empty + data.push(1u8); // validator: Some(..) + data.extend_from_slice(er_validator_identity().as_ref()); + let delegate = Instruction { + program_id: dlp, + accounts: vec![ + AccountMeta::new(fee_payer.pubkey(), true), // payer + AccountMeta::new(acct, true), // delegated account, signs + AccountMeta::new_readonly(system, false), // owner program + AccountMeta::new(buffer, false), // delegate buffer PDA + AccountMeta::new(record, false), // delegation record PDA + AccountMeta::new(metadata, false), // delegation metadata PDA + AccountMeta::new_readonly(system, false), + ], + data, + }; + send( + base, + &[assign, delegate], + &fee_payer.pubkey(), + &[fee_payer, sponsor], + ) + .context("delegate sponsor (on-curve)") +} + +// --- Crank helpers ---------------------------------------------------------- + +/// Build + send one `CreateEphemeral` for the crank derived from `seed`, +/// scheduling a single noop. `sponsor` (delegated) signs and pays the rent; +/// `fee_payer` (system-owned) covers the transaction fee. Returns the crank PDA. +fn create_crank( + rpc: &RpcClient, + sponsor: &Keypair, + fee_payer: &Keypair, + seed: [u8; 32], + noop: Pubkey, + crank_index: usize, +) -> Result { + let (crank, _bump) = eph::find_crank_pda(&seed); + let fire_id = crank_fire_id(crank_index); + let sched = ScheduledIx { + program_id: noop, + metas: &[], + data: &fire_id.to_le_bytes(), + }; + let create = eph::create( + sponsor.pubkey(), + crank, + &CreateArgs { + seed, + authority: [0u8; 32], // no cancel authority → permissionless, runs forever + start_slots: 0, + interval_slots: INTERVAL_SLOTS, + remaining: TARGET_EXECUTIONS, + priority_tip: 0, + cu_limit: 0, + scheduled: std::slice::from_ref(&sched), + }, + ); + let fund_ix = system_instruction::transfer(&sponsor.pubkey(), &crank, LAMPORTS_PER_SOL / 100); + send( + rpc, + &[create, fund_ix], + &fee_payer.pubkey(), + &[fee_payer, sponsor], + ) + .context("create crank on rollup")?; + Ok(crank) +} + +/// Distinct id encoded in each crank's scheduled noop ix data and echoed in +/// `noop-fired:` logs. +fn crank_fire_id(index: usize) -> u64 { + (index as u64) + 1 +} + +fn crank_index_from_fire_id(id: u64) -> Result { + if id == 0 || id > NUM_CRANKS as u64 { + bail!("unexpected noop fire id {id}"); + } + Ok((id - 1) as usize) +} + +fn assert_crank_exists(rpc: &RpcClient, crank: &Pubkey) -> Result<()> { + rpc.get_account(crank) + .with_context(|| format!("get crank account {crank}"))?; + Ok(()) +} + +#[derive(Clone)] +struct FireWatch { + fires: Vec>>, +} + +/// Background `logsSubscribe` on the noop program. Accumulates `noop-fired:` +/// notifications until [`LogFireWatcher::wait_until`] returns. +struct LogFireWatcher { + started: Instant, + state: Arc>, + shutdown: Arc, + _sub: solana_pubsub_client::pubsub_client::PubsubLogsClientSubscription, + thread: JoinHandle<()>, +} + +impl LogFireWatcher { + fn spawn(noop_id: Pubkey) -> Result { + let ws_url = format!("ws://127.0.0.1:{}", ER_RPC_PORT + 1); + let (sub, rx) = PubsubClient::logs_subscribe( + &ws_url, + RpcTransactionLogsFilter::Mentions(vec![noop_id.to_string()]), + RpcTransactionLogsConfig { + commitment: Some(CommitmentConfig::confirmed()), + }, + ) + .context("logsSubscribe connect")?; + eprintln!("[watch] logsSubscribe connected (noop {noop_id})"); + + let started = Instant::now(); + let shutdown = Arc::new(AtomicBool::new(false)); + let state = Arc::new(Mutex::new(FireWatch { + fires: vec![vec![None; TARGET_EXECUTIONS as usize]; NUM_CRANKS], + })); + let state_bg = state.clone(); + let shutdown_bg = shutdown.clone(); + let thread = thread::spawn(move || loop { + if shutdown_bg.load(Ordering::Relaxed) { + break; + } + match rx.recv_timeout(Duration::from_millis(500)) { + Ok(resp) => { + if resp.value.err.is_some() { + continue; + } + let mut guard = match state_bg.lock() { + Ok(g) => g, + Err(_) => break, + }; + for line in &resp.value.logs { + let Some(id) = parse_noop_fired_log(line) else { + continue; + }; + let Ok(idx) = crank_index_from_fire_id(id) else { + continue; + }; + + for fire in guard.fires[idx].iter_mut() { + if fire.is_none() { + eprintln!("[watch] crank {idx} fired at {:?}", started.elapsed()); + *fire = Some(started.elapsed()); + break; + } + } + } + } + Err(RecvTimeoutError::Timeout) => {} + Err(RecvTimeoutError::Disconnected) => break, + } + }); + + Ok(Self { + started, + state, + shutdown, + _sub: sub, + thread, + }) + } + + fn wait_until(self, deadline: Duration) -> Result { + while self.started.elapsed() < deadline { + let done = { + let guard = self.state.lock().expect("fire watch poisoned"); + guard.fires.iter().flatten().all(|fire| fire.is_some()) + }; + if done { + break; + } + thread::sleep(Duration::from_millis(200)); + } + self.shutdown.store(true, Ordering::Relaxed); + let _ = self.thread.join(); + let watch = self.state.lock().expect("fire watch poisoned").clone(); + // PubsubClient::drop can block sending an unsubscribe over a closing socket. + std::mem::forget(self._sub); + Ok(watch) + } +} + +fn parse_noop_fired_log(line: &str) -> Option { + let rest = line.split_once(NOOP_FIRED_PREFIX)?.1; + rest.trim().parse().ok() +} + +// --- RPC helpers ------------------------------------------------------------ + +/// Send + confirm a transaction with an explicit `fee_payer` and signer set. +/// +/// Always `skip_preflight`: on the rollup, account cloning / delegation +/// adoption happens in the real send path (`chainlink::ensure_transaction_accounts`), +/// not in preflight simulation, so a simulation would wrongly reject the fee +/// payer. We poll the signature for the real outcome instead. +fn send( + rpc: &RpcClient, + ixs: &[Instruction], + fee_payer: &Pubkey, + signers: &[&Keypair], +) -> Result<()> { + // The rollup clones referenced accounts from the base on first use; right + // after startup that can transiently fail (`No clients provided for + // Subscribe`) before its WS client pool is warm. These failures happen at + // submission, before execution, so retrying is safe and idempotent. + let mut last_err = None; + for attempt in 0..8 { + if attempt > 0 { + std::thread::sleep(Duration::from_millis(1500)); + } + match try_send(rpc, ixs, fee_payer, signers) { + Ok(()) => return Ok(()), + Err(e) => { + let msg = format!("{e:#}"); + // A genuine on-chain revert won't get better with retries. + if msg.contains("reverted") { + return Err(e); + } + last_err = Some(e); + } + } + } + Err(last_err.unwrap_or_else(|| anyhow!("send failed"))) +} + +fn try_send( + rpc: &RpcClient, + ixs: &[Instruction], + fee_payer: &Pubkey, + signers: &[&Keypair], +) -> Result<()> { + use solana_rpc_client_api::config::RpcSendTransactionConfig; + let bh = rpc.get_latest_blockhash().context("latest_blockhash")?; + let msg = Message::new(ixs, Some(fee_payer)); + let tx = Transaction::new(signers, msg, bh); + let sig = rpc + .send_transaction_with_config( + &tx, + RpcSendTransactionConfig { + skip_preflight: true, + ..Default::default() + }, + ) + .context("send_transaction")?; + let deadline = Instant::now() + Duration::from_secs(30); + loop { + match rpc.get_signature_status(&sig)? { + Some(Ok(())) => return Ok(()), + Some(Err(e)) => bail!("tx {sig} reverted: {e:?}"), + None if Instant::now() < deadline => std::thread::sleep(Duration::from_millis(250)), + None => bail!("tx {sig} not confirmed within 30s"), + } + } +} + +/// Block until `rpc` reports a slot, or `timeout` elapses. +fn wait_for_rpc(rpc: &RpcClient, label: &str, timeout: Duration) -> Result<()> { + let deadline = Instant::now() + timeout; + let mut last_err = String::new(); + while Instant::now() < deadline { + match rpc.get_slot() { + Ok(slot) if slot > 0 => { + eprintln!("[stack] {label} healthy at slot {slot}"); + return Ok(()); + } + Ok(_) => {} + Err(e) => last_err = e.to_string(), + } + std::thread::sleep(Duration::from_millis(300)); + } + bail!("{label} did not become healthy within {timeout:?}: {last_err}"); +} + +fn airdrop(rpc: &RpcClient, who: &Pubkey, lamports: u64) -> Result<()> { + let sig = rpc + .request_airdrop(who, lamports) + .with_context(|| format!("airdrop to {who}"))?; + let deadline = Instant::now() + Duration::from_secs(30); + while Instant::now() < deadline { + if rpc.confirm_transaction(&sig).unwrap_or(false) { + return Ok(()); + } + std::thread::sleep(Duration::from_millis(300)); + } + bail!("airdrop to {who} not confirmed in time"); +} + +/// MagicBlock delegation program (preloaded on the base by mb-test-validator). +fn delegation_program_id() -> Pubkey { + Pubkey::from_str("DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh").unwrap() +} +fn system_program_id() -> Pubkey { + Pubkey::from_str("11111111111111111111111111111111").unwrap() +} +/// The ephemeral-validator's default identity (from its bundled keypair). The +/// fee-payer escrow must be delegated to this validator for the rollup to adopt +/// it. Logged at rollup startup as "Validator identity". +fn er_validator_identity() -> Pubkey { + Pubkey::from_str("mAGicPQYBMvcYveUZA5F5UNNwyHvfYh5xkLS2Fr1mev").unwrap() +} + +// --- Process orchestration -------------------------------------------------- + +/// Owns the spawned child processes and tears them down (SIGTERM, then SIGKILL) +/// on drop — including on panic, so a failing assertion never leaks validators. +struct Stack { + children: Vec<(String, Child)>, + tmp: TempDir, +} + +impl Stack { + fn push(&mut self, name: &str, child: Child) { + self.children.push((name.to_string(), child)); + } +} + +impl Drop for Stack { + fn drop(&mut self) { + // Reverse order: cranker, then rollup, then base. + for (name, child) in self.children.iter_mut().rev() { + terminate(name, child); + } + } +} + +/// Terminate the child's whole process group. The validators are launched via +/// npm wrappers that re-spawn the real binary as a grandchild and forward only +/// SIGINT — so a plain `kill ` orphans the validator. Each child is +/// spawned as its own process-group leader (`process_group(0)`), so a negative +/// PID signals the wrapper *and* the grandchild. SIGINT first (graceful), then +/// SIGKILL. +fn terminate(name: &str, child: &mut Child) { + let pid = child.id(); + let group = format!("-{pid}"); // negative PID = the process group + // `2>/dev/null` equivalent: a group whose members already exited makes + // `kill` print "No such process" — harmless noise we suppress. + let signal = |sig: &str| { + let _ = Command::new("kill") + .arg(sig) + .arg(&group) + .stderr(Stdio::null()) + .status(); + }; + signal("-INT"); + let deadline = Instant::now() + Duration::from_secs(8); + loop { + match child.try_wait() { + Ok(Some(_)) => break, + Ok(None) if Instant::now() < deadline => std::thread::sleep(Duration::from_millis(100)), + _ => break, + } + } + // Force-kill the whole group regardless, to be sure no grandchild lingers. + signal("-KILL"); + let _ = child.kill(); + let _ = child.wait(); + let _ = name; +} + +/// Spawn a child process, sending stdout/stderr to `log`, with `envs` set. The +/// child leads its own process group so [`terminate`] can signal the whole tree +/// (npm wrapper + the real validator binary it re-spawns). +fn spawn(program: &str, args: &[&str], log: fs::File, envs: &[(&str, &str)]) -> Result { + use std::os::unix::process::CommandExt; + let err_log = log.try_clone().context("clone log handle")?; + let mut cmd = Command::new(program); + cmd.args(args) + .stdin(Stdio::null()) + .stdout(Stdio::from(log)) + .stderr(Stdio::from(err_log)) + .process_group(0); + for (k, v) in envs { + cmd.env(k, v); + } + cmd.spawn().map_err(|e| { + if e.kind() == ErrorKind::NotFound { + anyhow!("`{program}` not found on PATH — see this test's prerequisites") + } else { + anyhow!("failed to spawn `{program}`: {e}") + } + }) +} + +/// Print fee/escrow-relevant lines plus the tail of a log file (best effort). +fn dump_log(dir: &Path, name: &str) { + const KEYWORDS: &[&str] = &[ + "fee", "escrow", "balance", "payer", "invalid", "delegat", "error", "warn", "clon", + ]; + match fs::read_to_string(dir.join(name)) { + Ok(s) => { + let lines: Vec<&str> = s.lines().collect(); + let all_matched: Vec<&str> = lines + .iter() + .filter(|l| { + let low = l.to_lowercase(); + KEYWORDS.iter().any(|k| low.contains(k)) + }) + .copied() + .collect(); + let matched = &all_matched[all_matched.len().saturating_sub(40)..]; + let tail = &lines[lines.len().saturating_sub(15)..]; + eprintln!( + "----- {name} (relevant) -----\n{}\n----- {name} (tail) -----\n{}\n-------------------------", + matched.join("\n"), + tail.join("\n") + ); + } + Err(e) => eprintln!("----- {name}: -----"), + } +} + +// --- Paths ------------------------------------------------------------------ + +/// Hydra workspace root (`tests/e2e` → `../..`). +fn workspace_root() -> PathBuf { + let mut p = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + p.pop(); + p.pop(); + p +} + +fn artifact(rel: &str) -> Result { + let p = workspace_root().join(rel); + if !p.exists() { + bail!( + "missing build artifact {} — see the prerequisites in this file's doc comment", + p.display() + ); + } + Ok(p) +} + +/// Build the `hydra-cranker` binary and return its path. The cranker is a +/// single binary that selects the ephemeral program at runtime (`--ephemeral`), +/// so no special feature is needed — we just ensure it's freshly built. +fn build_cranker() -> Result { + let root = workspace_root(); + eprintln!("[stack] building hydra-cranker"); + let status = Command::new(env!("CARGO")) + .current_dir(&root) + .args(["build", "-p", "hydra-cranker"]) + .status() + .context("spawn cargo build for hydra-cranker")?; + if !status.success() { + bail!("cargo build -p hydra-cranker failed"); + } + artifact("target/debug/hydra-cranker") +} + +/// Write a keypair to a JSON byte-array file (the `--keypair` flag format). +fn write_keypair(dir: &Path, name: &str, kp: &Keypair) -> Result { + let path = dir.join(name); + let bytes = kp.to_bytes(); + let json: Vec = bytes.iter().map(|b| b.to_string()).collect(); + fs::write(&path, format!("[{}]", json.join(","))).context("write keypair file")?; + Ok(path) +} + +/// A self-deleting temp directory for validator ledgers/storage and keypairs. +struct TempDir(PathBuf); + +impl TempDir { + fn new() -> Result { + let mut p = std::env::temp_dir(); + let nanos = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos(); + p.push(format!("hydra-e2e-{nanos}")); + fs::create_dir_all(&p).with_context(|| format!("create temp dir {}", p.display()))?; + Ok(TempDir(p)) + } + fn path(&self) -> &Path { + &self.0 + } +} + +impl Drop for TempDir { + fn drop(&mut self) { + // Keep the dir (logs, ledgers) for post-mortem when debugging. + if std::env::var_os("KEEP_E2E_LOGS").is_some() { + eprintln!("[stack] KEEP_E2E_LOGS set — leaving {}", self.0.display()); + return; + } + let _ = fs::remove_dir_all(&self.0); + } +} diff --git a/tests/ephemeral/Cargo.lock b/tests/ephemeral/Cargo.lock index 1829f9e..d1df74e 100644 --- a/tests/ephemeral/Cargo.lock +++ b/tests/ephemeral/Cargo.lock @@ -1870,9 +1870,72 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] -name = "litesvm" +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.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "magicblock-account" +version = "3.4.0" +dependencies = [ + "bincode 1.3.3", + "qualifier_attr", + "serde", + "serde_bytes", + "solana-account-info 3.1.1", + "solana-clock 3.1.0", + "solana-instruction 3.4.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-sysvar 3.1.1", +] + +[[package]] +name = "magicblock-delegation-program-api" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "288904a9950bd20f27f0ef934f320ab1410bd35a6d5c9cf138eca276442b6b2e" +dependencies = [ + "bincode 1.3.3", + "borsh 0.10.4", + "borsh 1.7.0", + "bytemuck", + "const-crypto", + "libsodium-rs", + "num_enum", + "pinocchio 0.10.2", + "pinocchio-log", + "pinocchio-pubkey", + "pinocchio-system", + "rkyv", + "serde", + "solana-address 2.6.1", + "solana-instruction 3.4.0", + "solana-loader-v3-interface 6.1.1", + "solana-program 3.0.0", + "solana-pubkey 2.4.0", + "solana-sdk", + "solana-sdk-ids 3.1.0", + "solana-sha256-hasher 3.1.0", + "solana-system-interface 2.0.0", + "static_assertions", + "strum", + "thiserror 2.0.18", +] + +[[package]] +name = "magicblock-litesvm" version = "0.12.0" -source = "git+https://github.com/magicblock-labs/litesvm?branch=dode%2Fmagicsvm#c83fa93773cebf8a521854d68158d08fba3579f4" dependencies = [ "agave-feature-set", "agave-reserved-account-keys", @@ -1932,54 +1995,6 @@ dependencies = [ "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.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" - -[[package]] -name = "magicblock-delegation-program-api" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "288904a9950bd20f27f0ef934f320ab1410bd35a6d5c9cf138eca276442b6b2e" -dependencies = [ - "bincode 1.3.3", - "borsh 0.10.4", - "borsh 1.7.0", - "bytemuck", - "const-crypto", - "libsodium-rs", - "num_enum", - "pinocchio 0.10.2", - "pinocchio-log", - "pinocchio-pubkey", - "pinocchio-system", - "rkyv", - "serde", - "solana-address 2.6.1", - "solana-instruction 3.4.0", - "solana-loader-v3-interface 6.1.1", - "solana-program 3.0.0", - "solana-pubkey 2.4.0", - "solana-sdk", - "solana-sdk-ids 3.1.0", - "solana-sha256-hasher 3.1.0", - "solana-system-interface 2.0.0", - "static_assertions", - "strum", - "thiserror 2.0.18", -] - [[package]] name = "magicblock-magic-program-api" version = "0.8.8" @@ -2013,8 +2028,9 @@ dependencies = [ "bincode 1.3.3", "borsh 1.7.0", "ephemeral-rollups-sdk", - "litesvm", + "magicblock-account", "magicblock-delegation-program-api", + "magicblock-litesvm", "magicblock-magic-program-api 0.8.8", "solana-account 3.4.0", "solana-address 2.6.1", diff --git a/tests/programs/noop/Cargo.toml b/tests/programs/noop/Cargo.toml index 4e7a1ce..92f7839 100644 --- a/tests/programs/noop/Cargo.toml +++ b/tests/programs/noop/Cargo.toml @@ -15,6 +15,7 @@ custom-heap = [] [dependencies] pinocchio = { workspace = true } +pinocchio-log = { workspace = true } [package.metadata.solana] program-id = "4sdZFwGE7TkQCJVpfggvfy2ZwGNCfF6hAMJYjZU5HpZG" diff --git a/tests/programs/noop/src/lib.rs b/tests/programs/noop/src/lib.rs index c2c4e3b..1101372 100644 --- a/tests/programs/noop/src/lib.rs +++ b/tests/programs/noop/src/lib.rs @@ -3,17 +3,29 @@ //! Consumes only the entrypoint + `Ok(())` overhead (~20 CU), so when the //! `cu_table` test reports `tx CU`, essentially all of it comes from Hydra //! itself instead of being dominated by SPL Memo's ~2.8 k CU. +//! +//! When instruction data is at least 8 bytes, the first 8 (LE `u64`) are logged +//! as `noop-fired:` so live e2e tests can attribute fires via `logsSubscribe` +//! instead of polling crank account state. #![no_std] use pinocchio::{ no_allocator, nostd_panic_handler, program_entrypoint, AccountView, Address, ProgramResult, }; +use pinocchio_log::logger::Logger; program_entrypoint!(process); no_allocator!(); nostd_panic_handler!(); -pub fn process(_program_id: &Address, _accounts: &[AccountView], _data: &[u8]) -> ProgramResult { +pub fn process(_program_id: &Address, _accounts: &[AccountView], data: &[u8]) -> ProgramResult { + if data.len() >= 8 { + let id = u64::from_le_bytes(data[..8].try_into().unwrap()); + let mut logger = Logger::<32>::default(); + logger.append("noop-fired:"); + logger.append(id); + logger.log(); + } Ok(()) } From 6c8a7770c309be1a3d2925e2ea4e6a746a2c4c11 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Fri, 26 Jun 2026 12:04:43 +0200 Subject: [PATCH 04/33] feat: remove magicsvm tests --- README.md | 14 +- tests/ephemeral/Cargo.lock | 5880 ---------------------------- tests/ephemeral/Cargo.toml | 35 - tests/ephemeral/src/lib.rs | 1 - tests/ephemeral/tests/lifecycle.rs | 452 --- 5 files changed, 2 insertions(+), 6380 deletions(-) delete mode 100644 tests/ephemeral/Cargo.lock delete mode 100644 tests/ephemeral/Cargo.toml delete mode 100644 tests/ephemeral/src/lib.rs delete mode 100644 tests/ephemeral/tests/lifecycle.rs diff --git a/README.md b/README.md index 935cf7d..b89a6c5 100644 --- a/README.md +++ b/README.md @@ -352,20 +352,10 @@ let create = ix::create_ephemeral( ### Build & test -```sh -# Build the program with the ephemeral instructions. -cargo build-sbf --manifest-path programs/hydra/Cargo.toml -- --features ephemeral - -# End-to-end lifecycle tests run against a local MagicSVM simulator. `tests/ephemeral` -# is an isolated crate (its own lockfile); see its module docs for the exact steps. -cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml -cargo test --manifest-path tests/ephemeral/Cargo.toml -``` - #### Live end-to-end test (`tests/e2e`) -`tests/ephemeral` runs in-process against MagicSVM. `tests/e2e` instead boots the -**real** three-process stack — `mb-test-validator` (base L1), `ephemeral-validator` (the rollup), and `hydra-cranker` — creates a few ephemeral cranks, and +`tests/e2e` instead boots the **real** three-process stack — `mb-test-validator` (base L1), +`ephemeral-validator` (the rollup), and `hydra-cranker` — creates a few ephemeral cranks, and asserts the cranker fires each one on schedule. The validators ship as an npm package; `mb-test-validator` wraps diff --git a/tests/ephemeral/Cargo.lock b/tests/ephemeral/Cargo.lock deleted file mode 100644 index d1df74e..0000000 --- a/tests/ephemeral/Cargo.lock +++ /dev/null @@ -1,5880 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "adler32" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" - -[[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 0.8.12", - "solana-epoch-schedule 3.1.1", - "solana-hash 3.1.0", - "solana-pubkey 3.0.0", - "solana-sha256-hasher 3.1.0", - "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 3.1.0", -] - -[[package]] -name = "agave-syscalls" -version = "3.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98807b80e4367cc38c2b24ea30d6d16466553982aeedb0b0cb2c70bbae8ba5b0" -dependencies = [ - "bincode 1.3.3", - "libsecp256k1", - "num-traits", - "solana-account 3.4.0", - "solana-account-info 3.1.1", - "solana-big-mod-exp 3.0.0", - "solana-blake3-hasher 3.1.0", - "solana-bn254", - "solana-clock 3.1.0", - "solana-cpi 3.1.0", - "solana-curve25519", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-keccak-hasher 3.1.0", - "solana-loader-v3-interface 6.1.1", - "solana-poseidon", - "solana-program-entrypoint 3.1.1", - "solana-program-runtime", - "solana-pubkey 3.0.0", - "solana-sbpf", - "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", - "solana-svm-measure", - "solana-svm-timings", - "solana-svm-type-overrides", - "solana-sysvar 3.1.1", - "solana-sysvar-id 3.1.0", - "solana-transaction-context", - "thiserror 2.0.18", -] - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "version_check", -] - -[[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 = "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" -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 = "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 0.8.12", - "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.118", -] - -[[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.118", -] - -[[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 0.8.12", - "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.118", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" - -[[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" -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.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bincode" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" -dependencies = [ - "bincode_derive", - "unty", -] - -[[package]] -name = "bincode_derive" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" -dependencies = [ - "virtue", -] - -[[package]] -name = "bitflags" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" - -[[package]] -name = "bitvec" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[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", - "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]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -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 = "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.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" -dependencies = [ - "borsh-derive 1.7.0", - "bytes", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" -dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" -dependencies = [ - "once_cell", - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - -[[package]] -name = "bv" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" -dependencies = [ - "feature-probe", - "serde", -] - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "bytemuck" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" - -[[package]] -name = "cc" -version = "1.2.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" -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 = "cfg_eval" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -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 = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - -[[package]] -name = "console_log" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" -dependencies = [ - "log", - "web-sys", -] - -[[package]] -name = "const-crypto" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c06f1eb05f06cf2e380fdded278fbf056a38974299d77960555a311dcf91a52" -dependencies = [ - "keccak-const", - "sha2-const-stable", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "constant_time_eq" -version = "0.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 = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.7" -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 = "ct-codecs" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fb0c6640b4507ebd99ff67677009e381ba5eee1d14df78de4a3d16eb123c39" - -[[package]] -name = "ctor" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c888a2a4f677017373fb6c01e13e318dd9e78758445ed5eb985e355d3f8281" -dependencies = [ - "ctor-proc-macro", - "dtor", - "link-section", -] - -[[package]] -name = "ctor-proc-macro" -version = "0.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ab264ea985f1bd27887d7b21ea2bb046728e05d11909ca138d700c494730db" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "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.118", -] - -[[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.118", -] - -[[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.118", -] - -[[package]] -name = "dary_heap" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1e3a325bc115f096c8b77bbf027a7c2592230e70be2d985be950d3d5e60ebe" - -[[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" -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 0.10.4", - "const-oid", - "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 = "dtor" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e4690622ab6700ced40fc370a3f07b7d111f0154bb6fb08f73b4c8834f75b6" -dependencies = [ - "dtor-proc-macro", -] - -[[package]] -name = "dtor-proc-macro" -version = "0.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c98b077c7463d01d22dde8a24378ddf1ca7263dc687cffbed38819ea6c21131" - -[[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 = "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 = "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "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.118", -] - -[[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.118", -] - -[[package]] -name = "ephemeral-rollups-pinocchio" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a09b61c47e5b4eeb7add34e9d43d836784a66d78fa704606bebaa453bef73e21" -dependencies = [ - "bincode 2.0.1", - "pinocchio 0.10.2", - "pinocchio-pubkey", - "pinocchio-system", - "solana-address 2.6.1", -] - -[[package]] -name = "ephemeral-rollups-sdk" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "838564736408ada011e9986c819b26cf0195bb2dd238e10be258731979213d75" -dependencies = [ - "base64ct", - "bincode 1.3.3", - "bytemuck", - "ephemeral-rollups-sdk-attribute-action", - "ephemeral-rollups-sdk-attribute-commit", - "ephemeral-rollups-sdk-attribute-delegate", - "ephemeral-rollups-sdk-attribute-ephemeral", - "ephemeral-rollups-sdk-attribute-ephemeral-accounts", - "five8 0.2.1", - "getrandom 0.2.17", - "magicblock-delegation-program-api", - "magicblock-magic-program-api 0.10.1", - "solana-account 3.4.0", - "solana-account-info 2.3.0", - "solana-account-info 3.1.1", - "solana-address 2.6.1", - "solana-cpi 3.1.0", - "solana-instruction 3.4.0", - "solana-program 2.3.0", - "solana-program 3.0.0", - "solana-program-error 2.2.2", - "solana-program-error 3.0.1", - "solana-program-memory 3.1.0", - "solana-pubkey 3.0.0", - "solana-system-interface 2.0.0", - "solana-sysvar 3.1.1", -] - -[[package]] -name = "ephemeral-rollups-sdk-attribute-action" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a29f33b94edcdfcf1b9b7a61aa0ac00e8efdc66f89c8b4b573f7ea965a42c60a" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ephemeral-rollups-sdk-attribute-commit" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9ed3ea8b850013f6bf768e5f0f2e1f22f1861b46908764536795bf67bb5c67" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ephemeral-rollups-sdk-attribute-delegate" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f0d8ab90b4ecc7ac802bbd2115681f9fd42bc5a9018be79ba7aff1fe971aa36" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ephemeral-rollups-sdk-attribute-ephemeral" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea166c57ee55b329be4eae730561fe02aad5620a35b4d89439d8d0c9e07c3a6" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ephemeral-rollups-sdk-attribute-ephemeral-accounts" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa3efae094f5c288746d479fd605b67bcd56d29ddcf1238046ac07eeec130c45" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "feature-probe" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "filetime" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" -dependencies = [ - "cfg-if", - "libc", -] - -[[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 = "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" -dependencies = [ - "five8_core 1.0.0", -] - -[[package]] -name = "five8_const" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" -dependencies = [ - "five8_core 0.1.2", -] - -[[package]] -name = "five8_const" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" -dependencies = [ - "five8_core 1.0.0", -] - -[[package]] -name = "five8_core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" - -[[package]] -name = "five8_core" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "miniz_oxide", - "zlib-rs", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.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", - "r-efi", - "wasip2", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "hash32" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.12", -] - -[[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.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hybrid-array" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" -dependencies = [ - "typenum", -] - -[[package]] -name = "hydra-api" -version = "0.1.1" -dependencies = [ - "ephemeral-rollups-pinocchio", - "pinocchio 0.10.2", - "solana-address 2.6.1", - "solana-instruction 3.4.0", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "hydra-ephemeral-tests" -version = "0.0.0" -dependencies = [ - "ephemeral-rollups-pinocchio", - "hydra-api", - "magicsvm", - "solana-account 3.4.0", - "solana-address 2.6.1", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-keypair", - "solana-message 3.1.0", - "solana-signer", - "solana-transaction", -] - -[[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 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.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2 0.10.9", - "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 = "keccak-const" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d8d8ce877200136358e0bbff3a77965875db3af755a11e1fa6b1b3e2df13ea" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.186" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" - -[[package]] -name = "libflate" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd96e993e5f3368b0cb8497dae6c860c22af8ff18388c61c6c0b86c58d86b5df" -dependencies = [ - "adler32", - "crc32fast", - "dary_heap", - "libflate_lz77", - "no_std_io2", -] - -[[package]] -name = "libflate_lz77" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff7a10e427698aef6eef269482776debfef63384d30f13aad39a1a95e0e098fd" -dependencies = [ - "hashbrown 0.16.1", - "no_std_io2", - "rle-decode-fast", -] - -[[package]] -name = "libsecp256k1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" -dependencies = [ - "arrayref", - "base64 0.12.3", - "digest 0.9.0", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.7.3", - "serde", - "sha2 0.9.9", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsodium-rs" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8cd48c80d6c6fa5a4612d242941067219555baea82b0b49c92ea9d8156b59c" -dependencies = [ - "ct-codecs", - "ctor", - "libc", - "libsodium-sys-stable", - "pkg-config", - "thiserror 1.0.69", - "zeroize", -] - -[[package]] -name = "libsodium-sys-stable" -version = "1.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b04bf6da2c98b727af37ab62cb505f4d751b975b034a9b9ad491d333b0564e" -dependencies = [ - "cc", - "libc", - "libflate", - "minisign-verify", - "pkg-config", - "tar", - "ureq", - "vcpkg", - "zip", -] - -[[package]] -name = "light-poseidon" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" -dependencies = [ - "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 = "link-section" -version = "0.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52437d47b0358721ec869cc7374b2a21f7b2237af9b439c0391341a1fbfbf1b" - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[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.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" - -[[package]] -name = "magicblock-account" -version = "3.4.0" -dependencies = [ - "bincode 1.3.3", - "qualifier_attr", - "serde", - "serde_bytes", - "solana-account-info 3.1.1", - "solana-clock 3.1.0", - "solana-instruction 3.4.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-sysvar 3.1.1", -] - -[[package]] -name = "magicblock-delegation-program-api" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "288904a9950bd20f27f0ef934f320ab1410bd35a6d5c9cf138eca276442b6b2e" -dependencies = [ - "bincode 1.3.3", - "borsh 0.10.4", - "borsh 1.7.0", - "bytemuck", - "const-crypto", - "libsodium-rs", - "num_enum", - "pinocchio 0.10.2", - "pinocchio-log", - "pinocchio-pubkey", - "pinocchio-system", - "rkyv", - "serde", - "solana-address 2.6.1", - "solana-instruction 3.4.0", - "solana-loader-v3-interface 6.1.1", - "solana-program 3.0.0", - "solana-pubkey 2.4.0", - "solana-sdk", - "solana-sdk-ids 3.1.0", - "solana-sha256-hasher 3.1.0", - "solana-system-interface 2.0.0", - "static_assertions", - "strum", - "thiserror 2.0.18", -] - -[[package]] -name = "magicblock-litesvm" -version = "0.12.0" -dependencies = [ - "agave-feature-set", - "agave-reserved-account-keys", - "agave-syscalls", - "ansi_term", - "bincode 1.3.3", - "indexmap", - "itertools 0.14.0", - "log", - "serde", - "solana-account 3.4.0", - "solana-address 2.6.1", - "solana-address-lookup-table-interface 3.1.0", - "solana-bpf-loader-program", - "solana-builtins", - "solana-clock 3.1.0", - "solana-compute-budget", - "solana-compute-budget-instruction", - "solana-epoch-rewards 3.0.2", - "solana-epoch-schedule 3.1.1", - "solana-feature-gate-interface 3.1.0", - "solana-fee", - "solana-fee-structure", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-instructions-sysvar 3.0.1", - "solana-keypair", - "solana-last-restart-slot 3.0.1", - "solana-loader-v3-interface 6.1.1", - "solana-loader-v4-interface 3.1.0", - "solana-message 3.1.0", - "solana-native-token 3.0.0", - "solana-nonce 3.2.0", - "solana-nonce-account", - "solana-precompile-error", - "solana-program-error 3.0.1", - "solana-program-runtime", - "solana-rent 3.1.0", - "solana-sdk-ids 3.1.0", - "solana-sha256-hasher 3.1.0", - "solana-signature 3.4.1", - "solana-signer", - "solana-slot-hashes 3.0.2", - "solana-slot-history 3.0.1", - "solana-stake-interface 2.0.2", - "solana-svm-callback", - "solana-svm-log-collector", - "solana-svm-timings", - "solana-svm-transaction", - "solana-system-interface 3.2.0", - "solana-system-program", - "solana-sysvar 3.1.1", - "solana-sysvar-id 3.1.0", - "solana-transaction", - "solana-transaction-context", - "solana-transaction-error 3.2.1", - "thiserror 2.0.18", -] - -[[package]] -name = "magicblock-magic-program-api" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291f7a68f6cc622741a3fae513bd71640911abefd1fae2b2602b934515ed4b95" -dependencies = [ - "bincode 1.3.3", - "const-crypto", - "serde", - "solana-program 2.3.0", - "solana-signature 2.3.0", -] - -[[package]] -name = "magicblock-magic-program-api" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dc8fba0307c90b91b70c9ed06d4242d6c4159f331b2f05bf8f875c2a94e0e98" -dependencies = [ - "bincode 1.3.3", - "const-crypto", - "serde", - "solana-program 3.0.0", - "solana-signature 3.4.1", -] - -[[package]] -name = "magicsvm" -version = "0.1.1" -dependencies = [ - "bincode 1.3.3", - "borsh 1.7.0", - "ephemeral-rollups-sdk", - "magicblock-account", - "magicblock-delegation-program-api", - "magicblock-litesvm", - "magicblock-magic-program-api 0.8.8", - "solana-account 3.4.0", - "solana-address 2.6.1", - "solana-clock 3.1.0", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-keypair", - "solana-message 3.1.0", - "solana-program-runtime", - "solana-rent 3.1.0", - "solana-sdk-ids 3.1.0", - "solana-signature 3.4.1", - "solana-signer", - "solana-system-interface 2.0.0", - "solana-transaction", - "solana-transaction-context", - "solana-transaction-error 3.2.1", -] - -[[package]] -name = "memchr" -version = "2.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" - -[[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 = "minisign-verify" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f9645cb765ea72b8111f36c522475d2daa0d22c957a9826437e97534bc4e9e" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "no_std_io2" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" -dependencies = [ - "memchr", -] - -[[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.118", -] - -[[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 = [ - "autocfg", -] - -[[package]] -name = "num_enum" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "once_cell" -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" -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 = "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 = "pinocchio" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8afe4f39c0e25cc471b35b89963312791a5162d45a86578cbeaad9e5e7d1b3b" - -[[package]] -name = "pinocchio" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06810dac15a4ef83d3dabdb4f2f22fb39c9adff669cd2781da4f716510a647c" -dependencies = [ - "solana-account-view", - "solana-address 2.6.1", - "solana-define-syscall 4.0.1", - "solana-instruction-view", - "solana-program-error 3.0.1", -] - -[[package]] -name = "pinocchio-log" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd11022408f312e6179ece321c1f7dc0d1b2aa7765fddd39b2a7378d65a899e8" -dependencies = [ - "pinocchio-log-macro", -] - -[[package]] -name = "pinocchio-log-macro" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69fb52edb3c5736b044cc462b0957b9767d0f574d138f4e2761438c498a4b467" -dependencies = [ - "quote", - "regex", - "syn 1.0.109", -] - -[[package]] -name = "pinocchio-pubkey" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0225638cadcbebae8932cb7f49cb5da7c15c21beb19f048f05a5ca7d93f065" -dependencies = [ - "five8_const 0.1.4", - "pinocchio 0.9.3", - "sha2-const-stable", -] - -[[package]] -name = "pinocchio-system" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24044a0815753862b558e179e78f03f7344cb755de48617a09d7d23b50883b6c" -dependencies = [ - "pinocchio 0.10.2", - "solana-address 2.6.1", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[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 = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - -[[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 = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "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.118", -] - -[[package]] -name = "quote" -version = "1.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" -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 = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.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 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]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "rkyv" -version = "0.7.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rle-decode-fast" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.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-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" -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.118", -] - -[[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.118", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - -[[package]] -name = "sha2-const-stable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" - -[[package]] -name = "sha3" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[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 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" - -[[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" -source = "git+https://github.com/magicblock-labs/magicblock-svm.git?rev=5bd1d56#5bd1d567c53c43fb501d3cb6d28ea1e9dd42f948" -dependencies = [ - "bincode 1.3.3", - "qualifier_attr", - "serde", - "serde_bytes", - "solana-account-info 3.1.1", - "solana-clock 3.1.0", - "solana-instruction 3.4.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-sysvar 3.1.1", -] - -[[package]] -name = "solana-account-info" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" -dependencies = [ - "bincode 1.3.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" -dependencies = [ - "bincode 1.3.3", - "serde_core", - "solana-address 2.6.1", - "solana-program-error 3.0.1", - "solana-program-memory 3.1.0", -] - -[[package]] -name = "solana-account-view" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37ca34c37f92ee341b73d5ce7c8ef5bb38e9a87955b4bd343c63fa18b149215" -dependencies = [ - "solana-address 2.6.1", - "solana-program-error 3.0.1", -] - -[[package]] -name = "solana-address" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" -dependencies = [ - "solana-address 2.6.1", -] - -[[package]] -name = "solana-address" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c93e262f671bf402e1040e4a7e40b05d81da5956c7681948c975a0997517bb" -dependencies = [ - "borsh 1.7.0", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek", - "five8 1.0.0", - "five8_const 1.0.0", - "rand 0.9.4", - "serde", - "serde_derive", - "sha2-const-stable", - "solana-atomic-u64 3.0.1", - "solana-define-syscall 5.1.0", - "solana-program-error 3.0.1", - "solana-sanitize 3.0.1", - "solana-sha256-hasher 3.1.0", - "wincode", -] - -[[package]] -name = "solana-address-lookup-table-interface" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1673f67efe870b64a65cb39e6194be5b26527691ce5922909939961a6e6b395" -dependencies = [ - "bincode 1.3.3", - "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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115b4f773acc4f3f3cb986b0d335e9845c0368c82b0940410935bc11ae065578" -dependencies = [ - "bincode 1.3.3", - "bytemuck", - "serde", - "serde_derive", - "solana-clock 3.1.0", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", - "solana-slot-hashes 3.0.2", -] - -[[package]] -name = "solana-atomic-u64" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" -dependencies = [ - "parking_lot", -] - -[[package]] -name = "solana-atomic-u64" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" -dependencies = [ - "parking_lot", -] - -[[package]] -name = "solana-big-mod-exp" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "solana-define-syscall 2.3.0", -] - -[[package]] -name = "solana-big-mod-exp" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "solana-define-syscall 3.0.0", -] - -[[package]] -name = "solana-bincode" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" -dependencies = [ - "bincode 1.3.3", - "serde", - "solana-instruction 2.3.3", -] - -[[package]] -name = "solana-bincode" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" -dependencies = [ - "bincode 1.3.3", - "serde_core", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" -dependencies = [ - "blake3", - "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", - "solana-define-syscall 5.1.0", - "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.7.0", -] - -[[package]] -name = "solana-borsh" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" -dependencies = [ - "borsh 1.7.0", -] - -[[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 1.3.3", - "qualifier_attr", - "solana-account 3.4.0", - "solana-bincode 3.1.0", - "solana-clock 3.1.0", - "solana-instruction 3.4.0", - "solana-loader-v3-interface 6.1.1", - "solana-loader-v4-interface 3.1.0", - "solana-packet", - "solana-program-entrypoint 3.1.1", - "solana-program-runtime", - "solana-pubkey 3.0.0", - "solana-sbpf", - "solana-sdk-ids 3.1.0", - "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 3.1.0", - "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 0.8.12", - "log", - "solana-bpf-loader-program", - "solana-compute-budget-program", - "solana-loader-v4-program", - "solana-pubkey 3.0.0", - "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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea35d8f69b67daddb921a9da7f78ca591b533cf5e98833cd9ae62fdc2e4652c" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-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 3.0.2", - "solana-builtins-default-costs", - "solana-compute-budget", - "solana-compute-budget-interface", - "solana-instruction 3.4.0", - "solana-packet", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-svm-transaction", - "solana-transaction-error 3.2.1", - "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 1.7.0", - "solana-instruction 3.4.0", - "solana-sdk-ids 3.1.0", -] - -[[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 = "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 3.1.1", - "solana-define-syscall 4.0.1", - "solana-instruction 3.4.0", - "solana-program-error 3.0.1", - "solana-pubkey 4.2.0", - "solana-stable-layout 3.0.1", -] - -[[package]] -name = "solana-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-decode-error" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c781686a18db2f942e70913f7ca15dc120ec38dcab42ff7557db2c70c625a35" -dependencies = [ - "num-traits", -] - -[[package]] -name = "solana-define-syscall" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" - -[[package]] -name = "solana-define-syscall" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9697086a4e102d28a156b8d6b521730335d6951bd39a5e766512bbe09007cee" - -[[package]] -name = "solana-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-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" -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.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 3.1.0", - "solana-sdk-macro 3.0.1", - "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.1", - "solana-hash 4.4.0", -] - -[[package]] -name = "solana-epoch-schedule" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fce071fbddecc55d727b1d7ed16a629afe4f6e4c217bc8d00af3b785f6f67ed" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-epoch-schedule" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad280b1ed803853f7b453cb3ea9a57e600ca5599a63e69f7be199b486c0ec93" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-epoch-stake" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027e6d0b9e7daac5b2ac7c3f9ca1b727861121d9ef05084cf435ff736051e7c2" -dependencies = [ - "solana-define-syscall 5.1.0", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-example-mocks" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84461d56cbb8bb8d539347151e0525b53910102e4bced875d49d5139708e39d3" -dependencies = [ - "serde", - "serde_derive", - "solana-address-lookup-table-interface 2.2.2", - "solana-clock 2.2.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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978855d164845c1b0235d4b4d101cadc55373fffaf0b5b6cfa2194d25b2ed658" -dependencies = [ - "serde", - "serde_derive", - "solana-address-lookup-table-interface 3.1.0", - "solana-clock 3.1.0", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-keccak-hasher 3.1.0", - "solana-message 3.1.0", - "solana-nonce 3.2.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-system-interface 2.0.0", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-feature-gate-interface" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f5c5382b449e8e4e3016fb05e418c53d57782d8b5c30aa372fc265654b956d" -dependencies = [ - "bincode 1.3.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" -dependencies = [ - "bincode 1.3.3", - "serde", - "serde_derive", - "solana-account 3.4.0", - "solana-account-info 3.1.1", - "solana-instruction 3.4.0", - "solana-program-error 3.0.1", - "solana-pubkey 4.2.0", - "solana-rent 4.2.1", - "solana-sdk-ids 3.1.0", - "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]] -name = "solana-fee-calculator" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89bc408da0fb3812bc3008189d148b4d3e08252c79ad810b245482a3f70cd8d" -dependencies = [ - "log", - "serde", - "serde_derive", -] - -[[package]] -name = "solana-fee-calculator" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef67f01cc6a0c72e99a08d0d484683f995de4c80e9568728fa77d1537f9b7e09" -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" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-hard-forks" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45406eccad36220e52988b024d8daa93e691e38d5d71ad5fec55410cc9cf427d" - -[[package]] -name = "solana-hash" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" -dependencies = [ - "borsh 1.7.0", - "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" -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 1.7.0", - "bytemuck", - "bytemuck_derive", - "five8 1.0.0", - "serde", - "serde_derive", - "solana-atomic-u64 3.0.1", - "solana-sanitize 3.0.1", -] - -[[package]] -name = "solana-inflation" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf104167e42e747602b88e02b25cacfc5de699c3b7cbba60d3250437e6a22ed" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-instruction" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab5682934bd1f65f8d2c16f21cb532526fcc1a09f796e2cacdb091eee5774ad" -dependencies = [ - "bincode 1.3.3", - "borsh 1.7.0", - "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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" -dependencies = [ - "bincode 1.3.3", - "borsh 1.7.0", - "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 3.0.1", -] - -[[package]] -name = "solana-instruction-view" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60147e4d0a4620013df40bf30a86dd299203ff12fcb8b593cd51014fce0875d8" -dependencies = [ - "solana-account-view", - "solana-address 2.6.1", - "solana-define-syscall 4.0.1", - "solana-program-error 3.0.1", -] - -[[package]] -name = "solana-instructions-sysvar" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" -dependencies = [ - "bitflags", - "solana-account-info 2.3.0", - "solana-instruction 2.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]] -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 3.1.1", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-program-error 3.0.1", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-serialize-utils 3.1.2", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-keccak-hasher" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" -dependencies = [ - "sha3", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-keccak-hasher" -version = "3.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", - "ed25519-dalek-bip32", - "five8 1.0.0", - "five8_core 1.0.0", - "rand 0.9.4", - "solana-address 2.6.1", - "solana-derivation-path", - "solana-seed-derivable", - "solana-seed-phrase", - "solana-signature 3.4.1", - "solana-signer", -] - -[[package]] -name = "solana-last-restart-slot" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6360ac2fdc72e7463565cd256eedcf10d7ef0c28a1249d261ec168c1b55cdd" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-last-restart-slot" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426711c6564b790026e45cabec3c64b971864c48b6b2d83c0ebf52a118bb4cda" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-loader-v2-interface" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8ab08006dad78ae7cd30df8eea0539e207d08d91eaefb3e1d49a446e1c49654" -dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "solana-instruction 2.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]] -name = "solana-loader-v3-interface" -version = "6.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0538d4dbc9022e01616f1c58f2db98ece739c5d5ed4a2ef8737a953e76a2d4" -dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "solana-instruction 3.4.0", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", -] - -[[package]] -name = "solana-loader-v4-interface" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "706a777242f1f39a83e2a96a2a6cb034cb41169c6ecbee2cf09cb873d9659e7e" -dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "solana-instruction 2.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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" -dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "solana-instruction 3.4.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "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 3.4.0", - "solana-bincode 3.1.0", - "solana-bpf-loader-program", - "solana-instruction 3.4.0", - "solana-loader-v3-interface 6.1.1", - "solana-loader-v4-interface 3.1.0", - "solana-packet", - "solana-program-runtime", - "solana-pubkey 3.0.0", - "solana-sbpf", - "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 1.3.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" -dependencies = [ - "bincode 1.3.3", - "blake3", - "lazy_static", - "serde", - "serde_derive", - "solana-address 2.6.1", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-short-vec 3.2.2", - "solana-transaction-error 3.2.1", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726b7cbbc6be6f1c6f29146ac824343b9415133eee8cce156452ad1db93f8008" -dependencies = [ - "solana-define-syscall 5.1.0", -] - -[[package]] -name = "solana-native-token" -version = "2.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.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95dbc9f2e33b6c10e231df15cb2a3bff9ea7eab6347f9e316fe75c97fd67bbb" -dependencies = [ - "serde", - "serde_derive", - "solana-fee-calculator 3.2.2", - "solana-hash 4.4.0", - "solana-pubkey 4.2.0", - "solana-sha256-hasher 3.1.0", -] - -[[package]] -name = "solana-nonce-account" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" -dependencies = [ - "solana-account 3.4.0", - "solana-hash 3.1.0", - "solana-nonce 3.2.0", - "solana-sdk-ids 3.1.0", -] - -[[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 3.4.1", - "solana-signer", -] - -[[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-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 3.4.1", - "solana-signer", -] - -[[package]] -name = "solana-program" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" -dependencies = [ - "bincode 1.3.3", - "blake3", - "borsh 0.10.4", - "borsh 1.7.0", - "bs58", - "bytemuck", - "console_error_panic_hook", - "console_log", - "getrandom 0.2.17", - "lazy_static", - "log", - "memoffset", - "num-bigint 0.4.6", - "num-derive", - "num-traits", - "rand 0.8.6", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91b12305dd81045d705f427acd0435a2e46444b65367d7179d7bdcfc3bc5f5eb" -dependencies = [ - "memoffset", - "solana-account-info 3.1.1", - "solana-big-mod-exp 3.0.0", - "solana-blake3-hasher 3.1.0", - "solana-borsh 3.0.2", - "solana-clock 3.1.0", - "solana-cpi 3.1.0", - "solana-define-syscall 3.0.0", - "solana-epoch-rewards 3.0.2", - "solana-epoch-schedule 3.1.1", - "solana-epoch-stake", - "solana-example-mocks 3.0.0", - "solana-fee-calculator 3.2.2", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-instructions-sysvar 3.0.1", - "solana-keccak-hasher 3.1.0", - "solana-last-restart-slot 3.0.1", - "solana-msg 3.1.0", - "solana-native-token 3.0.0", - "solana-program-entrypoint 3.1.1", - "solana-program-error 3.0.1", - "solana-program-memory 3.1.0", - "solana-program-option 3.1.0", - "solana-program-pack 3.1.0", - "solana-pubkey 3.0.0", - "solana-rent 3.1.0", - "solana-sdk-ids 3.1.0", - "solana-secp256k1-recover 3.1.1", - "solana-serde-varint 3.0.1", - "solana-serialize-utils 3.1.2", - "solana-sha256-hasher 3.1.0", - "solana-short-vec 3.2.2", - "solana-slot-hashes 3.0.2", - "solana-slot-history 3.0.1", - "solana-stable-layout 3.0.1", - "solana-sysvar 3.1.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-program-entrypoint" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ce041b1a0ed275290a5008ee1a4a6c48f5054c8a3d78d313c08958a06aedbd" -dependencies = [ - "solana-account-info 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-program-entrypoint" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c9b0a1ff494e05f503a08b3d51150b73aa639544631e510279d6375f290997" -dependencies = [ - "solana-account-info 3.1.1", - "solana-define-syscall 4.0.1", - "solana-program-error 3.0.1", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-program-error" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee2e0217d642e2ea4bee237f37bd61bb02aec60da3647c48ff88f6556ade775" -dependencies = [ - "borsh 1.7.0", - "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 1.7.0", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4068648649653c2c50546e9a7fb761791b5ab0cda054c771bb5808d3a4b9eb52" -dependencies = [ - "solana-define-syscall 4.0.1", -] - -[[package]] -name = "solana-program-option" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc677a2e9bc616eda6dbdab834d463372b92848b2bfe4a1ed4e4b4adba3397d0" - -[[package]] -name = "solana-program-option" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a88006a9b8594088cec9027ab77caaaa258a2aaa2083d3f086c44b42e50aeab" - -[[package]] -name = "solana-program-pack" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "319f0ef15e6e12dc37c597faccb7d62525a509fec5f6975ecb9419efddeb277b" -dependencies = [ - "solana-program-error 2.2.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 3.0.1", -] - -[[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 1.3.3", - "itertools 0.12.1", - "log", - "percentage", - "rand 0.8.6", - "serde", - "solana-account 3.4.0", - "solana-account-info 3.1.1", - "solana-clock 3.1.0", - "solana-epoch-rewards 3.0.2", - "solana-epoch-schedule 3.1.1", - "solana-fee-structure", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-last-restart-slot 3.0.1", - "solana-loader-v3-interface 6.1.1", - "solana-program-entrypoint 3.1.1", - "solana-pubkey 3.0.0", - "solana-rent 3.1.0", - "solana-sbpf", - "solana-sdk-ids 3.1.0", - "solana-slot-hashes 3.0.2", - "solana-stable-layout 3.0.1", - "solana-stake-interface 2.0.2", - "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 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.7.0", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" -dependencies = [ - "rand 0.8.6", - "solana-address 1.1.0", -] - -[[package]] -name = "solana-pubkey" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" -dependencies = [ - "solana-address 2.6.1", -] - -[[package]] -name = "solana-rent" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1aea8fdea9de98ca6e8c2da5827707fb3842833521b528a713810ca685d2480" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-rent" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e860d5499a705369778647e97d760f7670adfb6fc8419dd3d568deccd46d5487" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-rent" -version = "4.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f02fbe2669ebe5d851dbf29a02e91ed6244b051bb64fcc57e6644aba636063" -dependencies = [ - "solana-sdk-macro 3.0.1", -] - -[[package]] -name = "solana-sanitize" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" - -[[package]] -name = "solana-sanitize" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" - -[[package]] -name = "solana-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" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f03df7969f5e723ad31b6c9eadccc209037ac4caa34d8dc259316b05c11e82b" -dependencies = [ - "bincode 1.3.3", - "bs58", - "serde", - "solana-account 3.4.0", - "solana-epoch-info", - "solana-epoch-rewards-hasher", - "solana-fee-structure", - "solana-inflation", - "solana-keypair", - "solana-message 3.1.0", - "solana-offchain-message", - "solana-presigner", - "solana-program 3.0.0", - "solana-program-memory 3.1.0", - "solana-pubkey 3.0.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.2", - "solana-shred-version", - "solana-signature 3.4.1", - "solana-signer", - "solana-time-utils", - "solana-transaction", - "solana-transaction-error 3.2.1", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" -dependencies = [ - "solana-address 2.6.1", -] - -[[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.118", -] - -[[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.118", -] - -[[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" -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" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a7e155eba458ecfb0107b98236088c3764a09ddf0201ec29e52a0be40857113" -dependencies = [ - "serde", -] - -[[package]] -name = "solana-serde-varint" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "950e5b83e839dc0f92c66afc124bb8f40e89bc90f0579e8ec5499296d27f54e3" -dependencies = [ - "serde", -] - -[[package]] -name = "solana-serialize-utils" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e" -dependencies = [ - "solana-instruction 2.3.3", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-serialize-utils" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761357b0853c9623bf12c1d2314b3d6160a85b087b84c45224fb85766d22616b" -dependencies = [ - "solana-instruction-error", - "solana-pubkey 4.2.0", - "solana-sanitize 3.0.1", -] - -[[package]] -name = "solana-sha256-hasher" -version = "2.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]] -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 = "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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8250a4495aad49ad20556a607da53bdcb20de78da10b65afbf918b7f1de647" -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.4.0", - "solana-sha256-hasher 3.1.0", -] - -[[package]] -name = "solana-signature" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c" -dependencies = [ - "five8 0.2.1", - "serde", - "serde-big-array", - "serde_derive", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-signature" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0364c7577c3c82a693ce28a1febc8d1b5d1b0a175fdc2114ae6186b69effe1e" -dependencies = [ - "ed25519-dalek", - "five8 1.0.0", - "rand 0.9.4", - "serde", - "serde-big-array", - "serde_derive", - "solana-sanitize 3.0.1", - "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 3.4.1", - "solana-transaction-error 3.2.1", -] - -[[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]] -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 3.1.0", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-slot-history" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ccc1b2067ca22754d5283afb2b0126d61eae734fc616d23871b0943b0d935e" -dependencies = [ - "bv", - "serde", - "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-slot-history" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0622d03a823770f7763afd866e012b296d5a3cbbbe51e110b5bd9ab3441efdca" -dependencies = [ - "bv", - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-stable-layout" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54" -dependencies = [ - "solana-instruction 2.3.3", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-stable-layout" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" -dependencies = [ - "solana-instruction 3.4.0", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-stake-interface" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c" -dependencies = [ - "borsh 0.10.4", - "borsh 1.7.0", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" -dependencies = [ - "num-traits", - "serde", - "serde_derive", - "solana-clock 3.1.0", - "solana-cpi 3.1.0", - "solana-instruction 3.4.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 3.1.0", -] - -[[package]] -name = "solana-svm-callback" -version = "3.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "012617d16d2994673d98792f7f6d93f612dea00b1b747a3c4aec24c12547875b" -dependencies = [ - "solana-account 3.4.0", - "solana-clock 3.1.0", - "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 3.1.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-signature 3.4.1", - "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 = "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" -dependencies = [ - "num-traits", - "serde", - "serde_derive", - "solana-instruction 3.4.0", - "solana-msg 3.1.0", - "solana-program-error 3.0.1", - "solana-pubkey 3.0.0", -] - -[[package]] -name = "solana-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 3.4.0", - "solana-msg 3.1.0", - "solana-program-error 3.0.1", -] - -[[package]] -name = "solana-system-program" -version = "3.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b4b6faeddf5a62c06991a9a077fd1097da6867060f884595a659b3b24dc3a4a" -dependencies = [ - "bincode 1.3.3", - "log", - "serde", - "solana-account 3.4.0", - "solana-bincode 3.1.0", - "solana-fee-calculator 3.2.2", - "solana-instruction 3.4.0", - "solana-nonce 3.2.0", - "solana-nonce-account", - "solana-packet", - "solana-program-runtime", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "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 = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8c3595f95069f3d90f275bb9bd235a1973c4d059028b0a7f81baca2703815db" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "bytemuck", - "bytemuck_derive", - "lazy_static", - "serde", - "serde_derive", - "solana-account-info 3.1.1", - "solana-clock 3.1.0", - "solana-define-syscall 4.0.1", - "solana-epoch-rewards 3.0.2", - "solana-epoch-schedule 3.1.1", - "solana-fee-calculator 3.2.2", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-last-restart-slot 3.0.1", - "solana-program-entrypoint 3.1.1", - "solana-program-error 3.0.1", - "solana-program-memory 3.1.0", - "solana-pubkey 4.2.0", - "solana-rent 3.1.0", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-slot-hashes 3.0.2", - "solana-slot-history 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-sysvar-id" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1" -dependencies = [ - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", -] - -[[package]] -name = "solana-sysvar-id" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" -dependencies = [ - "solana-address 2.6.1", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" -dependencies = [ - "bincode 1.3.3", - "serde", - "serde_derive", - "solana-address 2.6.1", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-message 3.1.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-short-vec 3.2.2", - "solana-signature 3.4.1", - "solana-signer", - "solana-transaction-error 3.2.1", -] - -[[package]] -name = "solana-transaction-context" -version = "3.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a3c3a69688293a195b02c60a5384d855b8de19981f404c71ccb9e7f139b98f" -dependencies = [ - "bincode 1.3.3", - "qualifier_attr", - "serde", - "solana-account 3.4.0", - "solana-instruction 3.4.0", - "solana-instructions-sysvar 3.0.1", - "solana-pubkey 3.0.0", - "solana-rent 3.1.0", - "solana-sbpf", - "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]] -name = "solana-transaction-error" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441d6dcd51100e7d97c3fb3b723e08aa701066ff7afc00026fd8d8e222cb95b" -dependencies = [ - "serde", - "serde_derive", - "solana-instruction-error", - "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 1.3.3", - "num-derive", - "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]] -name = "solana-vote-interface" -version = "4.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6e123e16bfdd7a81d71b4c4699e0b29580b619f4cd2ef5b6aae1eb85e8979f" -dependencies = [ - "bincode 1.3.3", - "cfg_eval", - "num-derive", - "num-traits", - "serde", - "serde_derive", - "serde_with", - "solana-clock 3.1.0", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-pubkey 3.0.0", - "solana-rent 3.1.0", - "solana-sdk-ids 3.1.0", - "solana-serde-varint 3.0.1", - "solana-serialize-utils 3.1.2", - "solana-short-vec 3.2.2", - "solana-system-interface 2.0.0", -] - -[[package]] -name = "solana-vote-program" -version = "3.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4164d0eb4760cbdb3dd46457999dba735079774381fe4042a70ec7484930a297" -dependencies = [ - "agave-feature-set", - "bincode 1.3.3", - "log", - "num-derive", - "num-traits", - "serde", - "solana-account 3.4.0", - "solana-bincode 3.1.0", - "solana-clock 3.1.0", - "solana-epoch-schedule 3.1.1", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-keypair", - "solana-packet", - "solana-program-runtime", - "solana-pubkey 3.0.0", - "solana-rent 3.1.0", - "solana-sdk-ids 3.1.0", - "solana-signer", - "solana-slot-hashes 3.0.2", - "solana-transaction", - "solana-transaction-context", - "solana-vote-interface 4.0.4", - "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", - "num-derive", - "num-traits", - "solana-instruction 3.4.0", - "solana-program-runtime", - "solana-sdk-ids 3.1.0", - "solana-svm-log-collector", - "solana-zk-sdk", -] - -[[package]] -name = "solana-zk-sdk" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" -dependencies = [ - "aes-gcm-siv", - "base64 0.22.1", - "bincode 1.3.3", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek", - "getrandom 0.2.17", - "itertools 0.12.1", - "js-sys", - "merlin", - "num-derive", - "num-traits", - "rand 0.8.6", - "serde", - "serde_derive", - "serde_json", - "sha3", - "solana-derivation-path", - "solana-instruction 3.4.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-seed-derivable", - "solana-seed-phrase", - "solana-signature 3.4.1", - "solana-signer", - "subtle", - "thiserror 2.0.18", - "wasm-bindgen", - "zeroize", -] - -[[package]] -name = "solana-zk-token-proof-program" -version = "3.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "962938a9994cc6d54b46b5f0d6a978024f4847272f560f8f11edd1575a0d8e8f" -dependencies = [ - "agave-feature-set", - "bytemuck", - "num-derive", - "num-traits", - "solana-instruction 3.4.0", - "solana-program-runtime", - "solana-sdk-ids 3.1.0", - "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 = [ - "aes-gcm-siv", - "base64 0.22.1", - "bincode 1.3.3", - "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 3.4.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-seed-derivable", - "solana-seed-phrase", - "solana-signature 3.4.1", - "solana-signer", - "subtle", - "thiserror 2.0.18", - "zeroize", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[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.118" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tar" -version = "0.4.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[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.118", -] - -[[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" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[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 = "typed-path" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" - -[[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 = "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 = "unty" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" - -[[package]] -name = "ureq" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" -dependencies = [ - "base64 0.22.1", - "log", - "percent-encoding", - "ureq-proto", - "utf8-zero", -] - -[[package]] -name = "ureq-proto" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" -dependencies = [ - "base64 0.22.1", - "http", - "httparse", - "log", -] - -[[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 = "utf8-zero" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" - -[[package]] -name = "uuid" -version = "1.23.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "virtue" -version = "0.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" - -[[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.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.118", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" -dependencies = [ - "pastey", - "proc-macro2", - "quote", - "thiserror 2.0.18", - "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.118", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "winnow" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "xattr" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" -dependencies = [ - "libc", - "rustix", -] - -[[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.118", -] - -[[package]] -name = "zeroize" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "zip" -version = "8.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" -dependencies = [ - "crc32fast", - "flate2", - "indexmap", - "memchr", - "typed-path", - "zopfli", -] - -[[package]] -name = "zlib-rs" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977347db8caa080403f6b6b7c1cda9479a8e869316f7e13a59b19076a40f94e3" - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[package]] -name = "zopfli" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" -dependencies = [ - "bumpalo", - "crc32fast", - "log", - "simd-adler32", -] diff --git a/tests/ephemeral/Cargo.toml b/tests/ephemeral/Cargo.toml deleted file mode 100644 index 8ef2c13..0000000 --- a/tests/ephemeral/Cargo.toml +++ /dev/null @@ -1,35 +0,0 @@ -# Isolated from the main Hydra workspace: MagicSVM pulls a solana-3.x + git-fork -# stack (litesvm, magicblock-svm) that conflicts with Hydra's mollusk/agave-4.0 -# test deps. Its own `[workspace]` table gives it an independent lockfile. -[workspace] - -[package] -name = "hydra-ephemeral-tests" -version = "0.0.0" -edition = "2021" -publish = false - -[lib] -path = "src/lib.rs" - -[dev-dependencies] -# `Crank`, consts and `find_crank_pda` — all on solana-address, no client/cpi -# features so no extra solana-instruction/pubkey skew. -ephemeral-rollups-pinocchio = "0.15" -hydra-api = { path = "../../crates/hydra-api", features = [ - "client", - "ephemeral", -] } -magicsvm = { path = "../../../magicsvm/crates/magicsvm" } -solana-account = { git = "https://github.com/magicblock-labs/magicblock-svm.git", rev = "5bd1d56" } -solana-address = { version = "2.6", features = ["decode", "curve25519"] } -solana-instruction = "3.0" -solana-keypair = "3.1" -solana-message = "3.0.1" -solana-signer = "3.0" -solana-transaction = "3.0" -solana-hash = "3.1.0" - - -[patch.crates-io] -solana-account = { git = "https://github.com/magicblock-labs/magicblock-svm.git", rev = "5bd1d56" } diff --git a/tests/ephemeral/src/lib.rs b/tests/ephemeral/src/lib.rs deleted file mode 100644 index 8b13789..0000000 --- a/tests/ephemeral/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tests/ephemeral/tests/lifecycle.rs b/tests/ephemeral/tests/lifecycle.rs deleted file mode 100644 index 7417e8c..0000000 --- a/tests/ephemeral/tests/lifecycle.rs +++ /dev/null @@ -1,452 +0,0 @@ -//! End-to-end tests for Hydra's ephemeral-rollup crank, run against the MagicSVM. -//! -//! Prerequisites (the tests load these prebuilt `.so`s from `target/deploy`): -//! -//! ```sh -//! # from the hydra workspace root — the ephemeral instructions are feature-gated -//! cargo build-sbf -- --features ephemeral -//! cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml -//! # then, from this crate: -//! cargo test -//! ``` - -use ephemeral_rollups_pinocchio::{ - consts::{EPHEMERAL_VAULT_ID, MAGIC_PROGRAM_ID}, - ephemeral_accounts::rent, -}; -use hydra_api::{ - consts::{ix, CRANK_HEADER_SIZE}, - instruction::ScheduledIx, - state::{load_crank, region_len_for}, -}; -use magicsvm::{MagicSVM, TransactionTarget}; -use solana_account::ReadableAccount; -use solana_address::{address, Address}; -use solana_instruction::{account_meta::AccountMeta, Instruction}; -use solana_keypair::Keypair; -use solana_message::Message; -use solana_signer::Signer; -use solana_transaction::Transaction; - -const INSTRUCTIONS_SYSVAR_ID: Address = address!("Sysvar1nstructions1111111111111111111111111"); -const SYSTEM_PROGRAM_ID: Address = address!("11111111111111111111111111111111"); -const NOOP_ID: Address = address!("4sdZFwGE7TkQCJVpfggvfy2ZwGNCfF6hAMJYjZU5HpZG"); -const LAMPORTS_PER_SOL: u64 = 1_000_000_000; - -/// Lamports the sponsor parks in the crank when creating it. -/// -/// On a real MagicBlock ephemeral rollup the crank holds **zero** lamports — its -/// rent lives in the shared vault. MagicSVM's litesvm fork, however, purges any -/// 0-lamport account from its accounts DB when a *later* transaction mutates it -/// (`AccountsDb::add_account` removes `lamports == 0` accounts, with no -/// `ephemeral` exemption). So to exercise the crank's mutating instructions -/// (Trigger) under MagicSVM we keep a token balance in it. Hydra's on-chain -/// logic is unchanged and never depends on this balance. -const CRANK_KEEPALIVE: u64 = 2_000_000; - -fn find_crank(seed: &[u8; 32]) -> (Address, u8) { - hydra_api::state::find_crank_pda(seed) -} - -fn workspace_target(name: &str) -> std::path::PathBuf { - let mut p = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); - p.push("../../target/deploy"); - p.push(name); - p -} - -/// Total on-chain size of a crank scheduling `scheds`. -fn crank_size(scheds: &[ScheduledIx]) -> u32 { - let region: usize = scheds - .iter() - .map(|s| region_len_for(s.metas.len(), s.data.len())) - .sum(); - (CRANK_HEADER_SIZE + region) as u32 -} - -/// Build a single `CreateEphemeral` instruction: it allocates the crank (Magic -/// CPI, synchronous) and writes the header + scheduled-ix tail in one shot. -#[allow(clippy::too_many_arguments)] -fn create_ephemeral_ix( - sponsor: Address, - crank: Address, - seed: &[u8; 32], - authority: &[u8; 32], - start_slot: u64, - interval_slots: u64, - remaining: u64, - priority_tip: u64, - cu_limit: u32, - scheds: &[ScheduledIx], -) -> Instruction { - let mut data = vec![ix::CREATE]; - data.extend_from_slice(seed); - data.extend_from_slice(authority); - data.extend_from_slice(&start_slot.to_le_bytes()); - data.extend_from_slice(&interval_slots.to_le_bytes()); - data.extend_from_slice(&remaining.to_le_bytes()); - data.extend_from_slice(&priority_tip.to_le_bytes()); - data.extend_from_slice(&cu_limit.to_le_bytes()); - for s in scheds { - data.push(s.metas.len() as u8); - data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); - data.extend_from_slice(s.program_id.as_ref()); - for meta in s.metas { - let flag: u8 = if meta.is_writable { 0b0000_0010 } else { 0 }; - data.push(flag); - data.extend_from_slice(meta.pubkey.as_ref()); - } - data.extend_from_slice(s.data); - } - Instruction { - program_id: hydra_api::ID, - accounts: vec![ - AccountMeta::new(sponsor, true), - AccountMeta::new(crank, false), - AccountMeta::new(EPHEMERAL_VAULT_ID, false), - AccountMeta::new_readonly(MAGIC_PROGRAM_ID, false), - ], - data, - } -} - -fn trigger_ephemeral_ix(crank: Address, cranker: Address) -> Instruction { - Instruction { - program_id: hydra_api::ID, - accounts: vec![ - AccountMeta::new(crank, false), - AccountMeta::new(cranker, true), - AccountMeta::new_readonly(INSTRUCTIONS_SYSVAR_ID, false), - ], - data: vec![ix::TRIGGER], - } -} - -fn cancel_or_close_ix(disc: u8, signer: Address, crank: Address) -> Instruction { - Instruction { - program_id: hydra_api::ID, - accounts: vec![ - AccountMeta::new(signer, true), - AccountMeta::new(crank, false), - AccountMeta::new(EPHEMERAL_VAULT_ID, false), - AccountMeta::new_readonly(MAGIC_PROGRAM_ID, false), - ], - data: vec![disc], - } -} - -/// System-program transfer (`from` must sign). Used only to keep the crank -/// above 0 lamports under MagicSVM — see [`CRANK_KEEPALIVE`]. -fn system_transfer_ix(from: Address, to: Address, lamports: u64) -> Instruction { - let mut data = Vec::with_capacity(12); - data.extend_from_slice(&2u32.to_le_bytes()); // System `Transfer` discriminator. - data.extend_from_slice(&lamports.to_le_bytes()); - Instruction { - program_id: SYSTEM_PROGRAM_ID, - accounts: vec![AccountMeta::new(from, true), AccountMeta::new(to, false)], - data, - } -} - -/// Rebuild the scheduled sibling ix the cranker must place right after Trigger. -fn sched_to_ix(s: &ScheduledIx) -> Instruction { - Instruction { - program_id: s.program_id, - accounts: s - .metas - .iter() - .map(|meta| { - if meta.is_writable { - AccountMeta::new(meta.pubkey, false) - } else { - AccountMeta::new_readonly(meta.pubkey, false) - } - }) - .collect(), - data: s.data.to_vec(), - } -} - -/// Boot a MagicSVM with Hydra + noop loaded and a delegated, funded sponsor. -fn setup() -> (MagicSVM, Keypair) { - let mut svm = MagicSVM::new(); - svm.add_program_from_file(hydra_api::ID, workspace_target("hydra.so")) - .unwrap(); - svm.add_program_from_file(NOOP_ID, workspace_target("hydra_noop.so")) - .unwrap(); - - let sponsor = Keypair::new(); - svm.airdrop(&sponsor.pubkey(), LAMPORTS_PER_SOL).unwrap(); - // Delegate the sponsor so it is writable on the ephemeral rollup and can pay - // ephemeral rent to the vault. - svm.delegate_account(sponsor.pubkey()).unwrap(); - (svm, sponsor) -} - -/// A fresh cranker funded on the base layer. It is synced onto the ephemeral -/// ledger as the (writable, index-0) fee payer when it triggers, so it needs a -/// balance but not delegation. Distinct from the sponsor to show that triggering -/// is permissionless. -fn funded_cranker(svm: &mut MagicSVM) -> Keypair { - let cranker = Keypair::new(); - svm.airdrop(&cranker.pubkey(), LAMPORTS_PER_SOL).unwrap(); - cranker -} - -fn send_ephemeral(svm: &mut MagicSVM, ixs: &[Instruction], signers: &[&Keypair], payer: &Address) { - let bh = svm.latest_blockhash_for(TransactionTarget::Ephemeral); - let tx = Transaction::new(signers, Message::new(ixs, Some(payer)), bh); - svm.send_transaction_to(TransactionTarget::Ephemeral, tx) - .expect("ephemeral tx should succeed"); - svm.expire_blockhash_for(TransactionTarget::Ephemeral); -} - -/// Create a crank scheduling one noop, in a single `CreateEphemeral` -/// instruction. A keepalive transfer rides along in the same tx so the crank -/// survives later mutations (MagicSVM purges 0-lamport accounts on mutation). -fn create_crank( - svm: &mut MagicSVM, - sponsor: &Keypair, - seed: [u8; 32], - authority: [u8; 32], - interval: u64, - remaining: u64, - sched: &ScheduledIx, -) -> Address { - let (crank, _bump) = find_crank(&seed); - send_ephemeral( - svm, - &[ - create_ephemeral_ix( - sponsor.pubkey(), - crank, - &seed, - &authority, - 0, - interval, - remaining, - 0, - 0, - std::slice::from_ref(sched), - ), - system_transfer_ix(sponsor.pubkey(), crank, CRANK_KEEPALIVE), - ], - &[sponsor], - &sponsor.pubkey(), - ); - crank -} - -fn noop_sched<'a>() -> ScheduledIx<'a> { - ScheduledIx { - program_id: NOOP_ID, - metas: &[], - data: &[0u8], - } -} - -#[test] -fn create_materializes_hydra_owned_ephemeral_account() { - let (mut svm, sponsor) = setup(); - let seed = [1u8; 32]; - let (crank, _) = find_crank(&seed); - let sched = noop_sched(); - let data_len = crank_size(std::slice::from_ref(&sched)); - - let vault_before = svm - .get_shared_account_for(TransactionTarget::Ephemeral, &EPHEMERAL_VAULT_ID) - .unwrap() - .lamports(); - - // Create with no keepalive: the crank ends the tx at 0 lamports, exercising - // the pure ephemeral-account materialization. - send_ephemeral( - &mut svm, - &[create_ephemeral_ix( - sponsor.pubkey(), - crank, - &seed, - &[0u8; 32], - 0, - 1, - 3, - 0, - 0, - std::slice::from_ref(&sched), - )], - &[&sponsor], - &sponsor.pubkey(), - ); - - let acct = svm - .get_shared_account_for(TransactionTarget::Ephemeral, &crank) - .expect("crank should exist on the ephemeral ledger"); - assert!(acct.ephemeral(), "crank must carry the ephemeral flag"); - assert_eq!(acct.owner(), &hydra_api::ID, "crank must be owned by Hydra"); - assert_eq!(acct.data().len(), data_len as usize); - assert_eq!(acct.lamports(), 0, "ephemeral accounts hold no lamports"); - - let vault_after = svm - .get_shared_account_for(TransactionTarget::Ephemeral, &EPHEMERAL_VAULT_ID) - .unwrap() - .lamports(); - assert_eq!( - vault_after - vault_before, - rent(data_len), - "sponsor must pay the per-byte rent into the vault" - ); -} - -#[test] -fn create_writes_header_and_tail() { - let (mut svm, sponsor) = setup(); - let seed = [2u8; 32]; - let authority = sponsor.pubkey().to_bytes(); - let sched = noop_sched(); - let crank = create_crank(&mut svm, &sponsor, seed, authority, 5, 3, &sched); - - let acct = svm - .get_shared_account_for(TransactionTarget::Ephemeral, &crank) - .unwrap(); - let data = acct.data(); - let state = unsafe { load_crank(data).unwrap() }; - assert_eq!(state.seed, seed); - assert_eq!(state.authority, authority); - assert_eq!(state.next_exec_slot(), 0); - assert_eq!(state.interval_slots(), 5); - assert_eq!(state.remaining(), 3); - assert_eq!(state.executed(), 0); - assert_eq!(state.authority_signer, 1); - let region = region_len_for(sched.metas.len(), sched.data.len()); - assert_eq!(state.region_len() as usize, region); - assert_eq!(data.len(), CRANK_HEADER_SIZE + region); -} - -#[test] -fn trigger_runs_scheduled_ix_and_advances() { - let (mut svm, sponsor) = setup(); - let seed = [3u8; 32]; - let sched = noop_sched(); - let crank = create_crank(&mut svm, &sponsor, seed, [0u8; 32], 1, 3, &sched); - - let cranker = funded_cranker(&mut svm); - send_ephemeral( - &mut svm, - &[ - trigger_ephemeral_ix(crank, cranker.pubkey()), - sched_to_ix(&sched), - ], - &[&cranker], - &cranker.pubkey(), - ); - - let acct = svm - .get_shared_account_for(TransactionTarget::Ephemeral, &crank) - .unwrap(); - let state = unsafe { load_crank(acct.data()).unwrap() }; - assert_eq!(state.executed(), 1); - assert_eq!(state.remaining(), 2); - assert_eq!(state.next_exec_slot(), 1); - // Trigger moves no lamports — the keepalive balance is untouched. - assert_eq!(acct.lamports(), CRANK_KEEPALIVE); -} - -#[test] -fn trigger_rejects_mismatched_followup() { - let (mut svm, sponsor) = setup(); - let seed = [4u8; 32]; - let sched = noop_sched(); - let crank = create_crank(&mut svm, &sponsor, seed, [0u8; 32], 1, 3, &sched); - - // Sibling noop with different data than the stored template. - let wrong = ScheduledIx { - program_id: NOOP_ID, - metas: &[], - data: &[9u8], - }; - let cranker = funded_cranker(&mut svm); - let bh = svm.latest_blockhash_for(TransactionTarget::Ephemeral); - let tx = Transaction::new( - &[&cranker], - Message::new( - &[ - trigger_ephemeral_ix(crank, cranker.pubkey()), - sched_to_ix(&wrong), - ], - Some(&cranker.pubkey()), - ), - bh, - ); - assert!( - svm.send_transaction_to(TransactionTarget::Ephemeral, tx) - .is_err(), - "a mismatched follow-up ix must be rejected" - ); -} - -#[test] -fn cancel_by_authority_closes_and_refunds() { - let (mut svm, sponsor) = setup(); - let seed = [5u8; 32]; - let authority = sponsor.pubkey().to_bytes(); - let sched = noop_sched(); - let crank = create_crank(&mut svm, &sponsor, seed, authority, 1, 3, &sched); - - assert!(svm - .get_shared_account_for(TransactionTarget::Ephemeral, &crank) - .is_some()); - - send_ephemeral( - &mut svm, - &[cancel_or_close_ix(ix::CANCEL, sponsor.pubkey(), crank)], - &[&sponsor], - &sponsor.pubkey(), - ); - - let after = svm.get_shared_account_for(TransactionTarget::Ephemeral, &crank); - assert!( - after - .map(|a| a.lamports() == 0 && a.data().is_empty()) - .unwrap_or(true), - "crank should be closed on the ephemeral ledger" - ); -} - -#[test] -fn close_permissionless_when_exhausted() { - let (mut svm, sponsor) = setup(); - let seed = [6u8; 32]; - let sched = noop_sched(); - // authority = none, remaining = 1 → one trigger exhausts it. - let crank = create_crank(&mut svm, &sponsor, seed, [0u8; 32], 1, 1, &sched); - - let cranker = funded_cranker(&mut svm); - send_ephemeral( - &mut svm, - &[ - trigger_ephemeral_ix(crank, cranker.pubkey()), - sched_to_ix(&sched), - ], - &[&cranker], - &cranker.pubkey(), - ); - - // A random reporter (not the sponsor) may close an exhausted, authority-less crank. - let reporter = Keypair::new(); - svm.airdrop(&reporter.pubkey(), LAMPORTS_PER_SOL).unwrap(); - svm.delegate_account(reporter.pubkey()).unwrap(); - send_ephemeral( - &mut svm, - &[cancel_or_close_ix(ix::CLOSE, reporter.pubkey(), crank)], - &[&reporter], - &reporter.pubkey(), - ); - - let after = svm.get_shared_account_for(TransactionTarget::Ephemeral, &crank); - assert!( - after - .map(|a| a.lamports() == 0 && a.data().is_empty()) - .unwrap_or(true), - "exhausted crank should be closed" - ); -} From 13fa05d33c99a31c167b7496142274df380f1727 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Fri, 26 Jun 2026 17:40:19 +0200 Subject: [PATCH 05/33] feat: extend SDK --- crates/hydra-api/src/cpi.rs | 208 +++++++++++++++++- crates/hydra-api/src/instruction.rs | 161 +++++++------- .../programs/hydra-example-anchor/src/lib.rs | 1 + examples/native/src/lib.rs | 1 + examples/pinocchio/src/lib.rs | 77 +++---- tests/e2e/tests/ephemeral_cranks.rs | 12 +- 6 files changed, 328 insertions(+), 132 deletions(-) diff --git a/crates/hydra-api/src/cpi.rs b/crates/hydra-api/src/cpi.rs index 600e5fa..9e32694 100644 --- a/crates/hydra-api/src/cpi.rs +++ b/crates/hydra-api/src/cpi.rs @@ -6,7 +6,7 @@ //! //! `Trigger` is not exposed here. It must be sent as a top-level instruction. -#[cfg(feature = "cpi-native")] +#[cfg(all(feature = "cpi-native", not(feature = "ephemeral")))] pub mod native { //! CPI wrappers for `solana-program` / Anchor callers. //! @@ -24,7 +24,7 @@ pub mod native { //! ``` use solana_account_info::AccountInfo; - use solana_cpi::{invoke, invoke_signed}; + use solana_cpi::invoke_signed; use solana_program_error::ProgramError; use crate::instruction as builder; @@ -35,9 +35,14 @@ pub mod native { crank: &AccountInfo<'a>, system_program: &AccountInfo<'a>, args: &builder::CreateArgs<'_>, + signer_seeds: &[&[&[u8]]], ) -> Result<(), ProgramError> { let ix = builder::create(*payer.key, *crank.key, args); - invoke(&ix, &[payer.clone(), crank.clone(), system_program.clone()]) + invoke_signed( + &ix, + &[payer.clone(), crank.clone(), system_program.clone()], + signer_seeds, + ) } /// `signer_seeds` is typically `&[&[b"authority_seed", &[bump]]]` when @@ -76,7 +81,169 @@ pub mod native { } } -#[cfg(feature = "cpi-pinocchio")] +#[cfg(all(feature = "cpi-pinocchio", not(feature = "ephemeral")))] +pub mod pinocchio { + //! CPI wrappers for Pinocchio callers. + //! + //! Build `Create` manually. See `examples/pinocchio/`. + + use pinocchio::{ + cpi::{invoke_signed, Signer}, + instruction::{InstructionAccount, InstructionView}, + AccountView, ProgramResult, + }; + use solana_program_error::ProgramError; + + use crate::instruction as builder; + use crate::{consts::ix as disc, instruction::CREATE_FIXED_PREFIX_LEN}; + + #[inline] + pub fn create<'a, const N: usize>( + payer: &AccountView, + crank: &AccountView, + system_program: &AccountView, + args: &builder::CreateArgs<'_>, + signers: &[Signer], + ) -> ProgramResult { + if 1 + CREATE_FIXED_PREFIX_LEN + args.body_len() > N { + return Err(ProgramError::InvalidInstructionData); + } + + let mut data = [0_u8; N]; + args.write_to(&mut data); + + let ix = InstructionView { + program_id: &crate::ID, + data: &data, + accounts: &[ + InstructionAccount::writable(payer.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(system_program.address()), + ], + }; + + invoke_signed(&ix, &[payer, crank, system_program], signers) + } + + #[inline(always)] + pub fn cancel( + authority: &AccountView, + crank: &AccountView, + recipient: &AccountView, + signers: &[Signer], + ) -> ProgramResult { + let data = [disc::CANCEL]; + let metas = [ + InstructionAccount::readonly_signer(authority.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(recipient.address()), + ]; + let ix = InstructionView { + program_id: &crate::ID, + accounts: &metas, + data: &data, + }; + invoke_signed(&ix, &[authority, crank, recipient], signers) + } + + #[inline(always)] + pub fn close( + reporter: &AccountView, + crank: &AccountView, + recipient: &AccountView, + signers: &[Signer], + ) -> ProgramResult { + let data = [disc::CLOSE]; + let metas = [ + InstructionAccount::writable_signer(reporter.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(recipient.address()), + ]; + let ix = InstructionView { + program_id: &crate::ID, + accounts: &metas, + data: &data, + }; + invoke_signed(&ix, &[reporter, crank, recipient], signers) + } +} + +#[cfg(all(feature = "cpi-native", feature = "ephemeral"))] +pub mod native { + //! CPI wrappers for `solana-program` / Anchor callers. + //! + //! # Example + //! + //! ```ignore + //! use hydra_api::cpi::native as hydra_cpi; + //! use hydra_api::instruction::{CreateArgs, SchedMeta}; + //! + //! // Inside your user-facing instruction's handler: + //! hydra_cpi::create( + //! payer_ai, crank_ai, system_program_ai, + //! &CreateArgs { seed, authority: [0u8; 32], /* ... */ }, + //! )?; + //! ``` + + use solana_account_info::AccountInfo; + use solana_cpi::invoke_signed; + use solana_program_error::ProgramError; + + use crate::instruction as builder; + + #[inline] + pub fn create<'a>( + payer: &AccountInfo<'a>, + crank: &AccountInfo<'a>, + system_program: &AccountInfo<'a>, + args: &builder::CreateArgs<'_>, + signer_seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let ix = builder::create(*payer.key, *crank.key, args); + invoke_signed( + &ix, + &[payer.clone(), crank.clone(), system_program.clone()], + signer_seeds, + ) + } + + /// `signer_seeds` is typically `&[&[b"authority_seed", &[bump]]]` when + /// `authority` is a PDA controlled by the integrator program, or + /// `&[]` when it's an EOA. + #[inline] + pub fn cancel<'a>( + authority: &AccountInfo<'a>, + crank: &AccountInfo<'a>, + recipient: &AccountInfo<'a>, + signer_seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let ix = builder::cancel(*authority.key, *crank.key); + invoke_signed( + &ix, + &[authority.clone(), crank.clone(), recipient.clone()], + signer_seeds, + ) + } + + /// `signer_seeds` is typically `&[]` unless the reporter is a PDA + /// owned by the integrator program. + #[inline] + pub fn close<'a>( + reporter: &AccountInfo<'a>, + crank: &AccountInfo<'a>, + recipient: &AccountInfo<'a>, + signer_seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let ix = builder::close(*reporter.key, *crank.key); + invoke_signed( + &ix, + &[reporter.clone(), crank.clone(), recipient.clone()], + signer_seeds, + ) + } +} + +#[cfg(all(feature = "cpi-pinocchio", feature = "ephemeral"))] pub mod pinocchio { //! CPI wrappers for Pinocchio callers. //! @@ -87,8 +254,39 @@ pub mod pinocchio { instruction::{InstructionAccount, InstructionView}, AccountView, ProgramResult, }; + use solana_program_error::ProgramError; + + use crate::{ + consts::ix as disc, + instruction::{CreateArgs, CREATE_FIXED_PREFIX_LEN}, + }; + + #[inline] + pub fn create<'a, const N: usize>( + payer: &AccountView, + crank: &AccountView, + system_program: &AccountView, + args: &CreateArgs<'_>, + signers: &[Signer], + ) -> ProgramResult { + if 1 + CREATE_FIXED_PREFIX_LEN + args.body_len() > N { + return Err(ProgramError::InvalidInstructionData); + } + + let mut data = [0_u8; N]; + args.write_to(&mut data); - use crate::consts::ix as disc; + let ix = InstructionView { + program_id: &crate::ID, + data: &data, + accounts: &[ + InstructionAccount::writable(payer.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(system_program.address()), + ], + }; + invoke_signed(&ix, &[payer, crank, system_program], signers) + } #[inline(always)] pub fn cancel( diff --git a/crates/hydra-api/src/instruction.rs b/crates/hydra-api/src/instruction.rs index 92d1350..49cf883 100644 --- a/crates/hydra-api/src/instruction.rs +++ b/crates/hydra-api/src/instruction.rs @@ -103,6 +103,86 @@ mod client { pub data: &'a [u8], } + /// All the scheduling knobs for `CreateEphemeral` + pub struct CreateArgs<'a> { + pub seed: [u8; 32], + /// All-zeros = unkillable (no cancel authority). + pub authority: [u8; 32], + pub start_slot: u64, + pub interval_slots: u64, + /// `0` on the wire means "infinite"; Hydra stores `u64::MAX` internally. + pub remaining: u64, + pub priority_tip: u64, + /// Compute-unit limit the cranker emits as `SetComputeUnitLimit` + /// right before `Trigger`. `0` = no ix (inherits the 200 k/ix + /// default). Capped at `MAX_COMPUTE_UNIT_LIMIT` (1.4 M) at `Create`. + pub cu_limit: u32, + /// The scheduled instructions, in execution order. Must be non-empty + pub scheduled: &'a [ScheduledIx<'a>], + } + + impl CreateArgs<'_> { + pub fn body_len(&self) -> usize { + self.scheduled + .iter() + .map(|s| CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) + .sum() + } + + pub fn write_to(&self, data: &mut [u8]) -> usize { + let mut off = 0; + + data[off] = ix::CREATE; + off += 1; + + data[off..off + 32].copy_from_slice(&self.seed); + off += 32; + + data[off..off + 32].copy_from_slice(&self.authority); + off += 32; + + data[off..off + 8].copy_from_slice(&self.start_slot.to_le_bytes()); + off += 8; + + data[off..off + 8].copy_from_slice(&self.interval_slots.to_le_bytes()); + off += 8; + + data[off..off + 8].copy_from_slice(&self.remaining.to_le_bytes()); + off += 8; + + data[off..off + 8].copy_from_slice(&self.priority_tip.to_le_bytes()); + off += 8; + + data[off..off + 4].copy_from_slice(&self.cu_limit.to_le_bytes()); + off += 4; + + for s in self.scheduled { + data[off] = s.metas.len() as u8; + off += 1; + + data[off..off + 2].copy_from_slice(&(s.data.len() as u16).to_le_bytes()); + off += 2; + + data[off..off + 32].copy_from_slice(&s.program_id.to_bytes()); + off += 32; + + for m in s.metas { + let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; + data[off] = flag; + off += 1; + + data[off..off + 32].copy_from_slice(&m.pubkey.to_bytes()); + off += 32; + } + + data[off..off + s.data.len()].copy_from_slice(s.data); + off += s.data.len(); + } + + off + } + } + /// Builders targeting the base-layer Hydra program ([`BASE_PROGRAM_ID`]). pub mod base { use super::*; @@ -115,24 +195,6 @@ mod client { Pubkey::find_program_address(&[crate::consts::CRANK_SEED_PREFIX, seed], &PROGRAM_ID) } - /// All the scheduling knobs for `Create` - pub struct CreateArgs<'a> { - pub seed: [u8; 32], - /// All-zeros = unkillable (no cancel authority). - pub authority: [u8; 32], - pub start_slot: u64, - pub interval_slots: u64, - /// `0` on the wire means "infinite"; Hydra stores `u64::MAX` internally. - pub remaining: u64, - pub priority_tip: u64, - /// Compute-unit limit the cranker emits as `SetComputeUnitLimit` - /// right before `Trigger`. `0` = no ix (inherits the 200 k/ix - /// default). Capped at `MAX_COMPUTE_UNIT_LIMIT` (1.4 M) at `Create`. - pub cu_limit: u32, - /// The scheduled instructions, in execution order. Must be non-empty - pub scheduled: &'a [ScheduledIx<'a>], - } - /// Build a `Create` instruction scheduling a single instruction. pub fn create(payer: Pubkey, crank: Pubkey, args: &CreateArgs<'_>) -> Instruction { let body_len: usize = args @@ -140,26 +202,8 @@ mod client { .iter() .map(|s| CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) .sum(); - let mut data = Vec::with_capacity(1 + CREATE_FIXED_PREFIX_LEN + body_len); - data.push(ix::CREATE); - data.extend_from_slice(&args.seed); - data.extend_from_slice(&args.authority); - data.extend_from_slice(&args.start_slot.to_le_bytes()); - data.extend_from_slice(&args.interval_slots.to_le_bytes()); - data.extend_from_slice(&args.remaining.to_le_bytes()); - data.extend_from_slice(&args.priority_tip.to_le_bytes()); - data.extend_from_slice(&args.cu_limit.to_le_bytes()); - for s in args.scheduled { - data.push(s.metas.len() as u8); - data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); - data.extend_from_slice(&s.program_id.to_bytes()); - for m in s.metas { - let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; - data.push(flag); - data.extend_from_slice(&m.pubkey.to_bytes()); - } - data.extend_from_slice(s.data); - } + let mut data = vec![0_u8; 1 + CREATE_FIXED_PREFIX_LEN + body_len]; + args.write_to(&mut data); Instruction { program_id: PROGRAM_ID, @@ -228,24 +272,6 @@ mod client { Pubkey::find_program_address(&[crate::consts::CRANK_SEED_PREFIX, seed], &PROGRAM_ID) } - /// All the scheduling knobs for `CreateEphemeral` - pub struct CreateArgs<'a> { - pub seed: [u8; 32], - /// All-zeros = unkillable (no cancel authority). - pub authority: [u8; 32], - pub start_slots: u64, - pub interval_slots: u64, - /// `0` on the wire means "infinite"; Hydra stores `u64::MAX` internally. - pub remaining: u64, - pub priority_tip: u64, - /// Compute-unit limit the cranker emits as `SetComputeUnitLimit` - /// right before `Trigger`. `0` = no ix (inherits the 200 k/ix - /// default). Capped at `MAX_COMPUTE_UNIT_LIMIT` (1.4 M) at `Create`. - pub cu_limit: u32, - /// The scheduled instructions, in execution order. Must be non-empty - pub scheduled: &'a [ScheduledIx<'a>], - } - /// Build a `Create` instruction pub fn create(sponsor: Pubkey, crank: Pubkey, args: &CreateArgs<'_>) -> Instruction { let body_len: usize = args @@ -253,26 +279,9 @@ mod client { .iter() .map(|s| super::CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) .sum(); - let mut data = Vec::with_capacity(1 + super::CREATE_FIXED_PREFIX_LEN + body_len); - data.push(ix::CREATE); - data.extend_from_slice(&args.seed); - data.extend_from_slice(&args.authority); - data.extend_from_slice(&args.start_slots.to_le_bytes()); - data.extend_from_slice(&args.interval_slots.to_le_bytes()); - data.extend_from_slice(&args.remaining.to_le_bytes()); - data.extend_from_slice(&args.priority_tip.to_le_bytes()); - data.extend_from_slice(&args.cu_limit.to_le_bytes()); - for s in args.scheduled { - data.push(s.metas.len() as u8); - data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); - data.extend_from_slice(&s.program_id.to_bytes()); - for m in s.metas { - let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; - data.push(flag); - data.extend_from_slice(&m.pubkey.to_bytes()); - } - data.extend_from_slice(s.data); - } + let mut data = vec![0_u8; 1 + super::CREATE_FIXED_PREFIX_LEN + body_len]; + args.write_to(&mut data); + Instruction { program_id: PROGRAM_ID, accounts: alloc::vec![ diff --git a/examples/anchor/programs/hydra-example-anchor/src/lib.rs b/examples/anchor/programs/hydra-example-anchor/src/lib.rs index 5f130c5..03e41f6 100644 --- a/examples/anchor/programs/hydra-example-anchor/src/lib.rs +++ b/examples/anchor/programs/hydra-example-anchor/src/lib.rs @@ -42,6 +42,7 @@ pub mod hydra_example_anchor { data: b"tick", }], }, + &[], ) .map_err(Into::into) } diff --git a/examples/native/src/lib.rs b/examples/native/src/lib.rs index 0391859..866155b 100644 --- a/examples/native/src/lib.rs +++ b/examples/native/src/lib.rs @@ -60,5 +60,6 @@ pub fn process_instruction( data: b"tick", }], }, + &[], ) } diff --git a/examples/pinocchio/src/lib.rs b/examples/pinocchio/src/lib.rs index 9dce048..69c7114 100644 --- a/examples/pinocchio/src/lib.rs +++ b/examples/pinocchio/src/lib.rs @@ -5,15 +5,13 @@ #![no_std] use pinocchio::{ - cpi::invoke, - error::ProgramError, - instruction::{InstructionAccount, InstructionView}, - no_allocator, nostd_panic_handler, program_entrypoint, AccountView, Address, ProgramResult, + error::ProgramError, no_allocator, nostd_panic_handler, program_entrypoint, AccountView, + Address, ProgramResult, }; use hydra_api::{ - consts::{ix as disc, MAX_ACCOUNTS, MAX_DATA_LEN}, - instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, + consts::{MAX_ACCOUNTS, MAX_DATA_LEN}, + instruction::{CreateArgs, ScheduledIx, CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, }; program_entrypoint!(process); @@ -43,7 +41,9 @@ fn schedule(accounts: &[AccountView], data: &[u8]) -> ProgramResult { if data.len() < 66 { return Err(ProgramError::InvalidInstructionData); } - let seed = &data[0..32]; + let seed: [u8; 32] = data[0..32] + .try_into() + .map_err(|_| ProgramError::InvalidInstructionData)?; let target_program_id = &data[32..64]; let tick_len = u16::from_le_bytes([data[64], data[65]]) as usize; if data.len() < 66 + tick_len || tick_len > MAX_DATA_LEN { @@ -51,48 +51,31 @@ fn schedule(accounts: &[AccountView], data: &[u8]) -> ProgramResult { } let tick_data = &data[66..66 + tick_len]; - let [payer, crank, system_program, hydra_program, ..] = accounts else { + let [payer, crank, system_program, _hydra_program, ..] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; // Build Hydra Create data on the stack. - let mut buf = [0u8; CREATE_BUF_MAX]; - let mut cursor = 0usize; - buf[cursor] = disc::CREATE; - cursor += 1; - buf[cursor..cursor + 32].copy_from_slice(seed); - cursor += 32; - buf[cursor..cursor + 32].copy_from_slice(&[0u8; 32]); // no cancel authority - cursor += 32; - buf[cursor..cursor + 8].copy_from_slice(&0u64.to_le_bytes()); // start_slot - cursor += 8; - buf[cursor..cursor + 8].copy_from_slice(&400u64.to_le_bytes()); // interval_slots - cursor += 8; - buf[cursor..cursor + 8].copy_from_slice(&10u64.to_le_bytes()); // remaining - cursor += 8; - buf[cursor..cursor + 8].copy_from_slice(&1_000u64.to_le_bytes()); // priority_tip - cursor += 8; - buf[cursor..cursor + 4].copy_from_slice(&0u32.to_le_bytes()); // cu_limit (omit) - cursor += 4; - buf[cursor] = 0; // num_accounts (single scheduled ix; parsed until data ends) - cursor += 1; - buf[cursor..cursor + 2].copy_from_slice(&(tick_len as u16).to_le_bytes()); - cursor += 2; - buf[cursor..cursor + 32].copy_from_slice(target_program_id); - cursor += 32; - // No metas. - buf[cursor..cursor + tick_len].copy_from_slice(tick_data); - cursor += tick_len; - - let metas = [ - InstructionAccount::writable_signer(payer.address()), - InstructionAccount::writable(crank.address()), - InstructionAccount::readonly(system_program.address()), - ]; - let ix = InstructionView { - program_id: hydra_program.address(), - accounts: &metas, - data: &buf[..cursor], - }; - invoke(&ix, &[payer, crank, system_program]) + hydra_api::cpi::pinocchio::create::( + payer, + crank, + system_program, + &CreateArgs { + seed, + authority: [0u8; 32], + start_slot: 0, + interval_slots: 400, + remaining: 10, + priority_tip: 1_000, + cu_limit: 0, + scheduled: &[ScheduledIx { + program_id: target_program_id + .try_into() + .map_err(|_| ProgramError::InvalidInstructionData)?, + metas: &[], + data: tick_data, + }], + }, + &[], + ) } diff --git a/tests/e2e/tests/ephemeral_cranks.rs b/tests/e2e/tests/ephemeral_cranks.rs index fbf55d9..0ff2b53 100644 --- a/tests/e2e/tests/ephemeral_cranks.rs +++ b/tests/e2e/tests/ephemeral_cranks.rs @@ -59,8 +59,11 @@ use std::time::{Duration, Instant}; use anyhow::{anyhow, bail, Context, Result}; use crossbeam_channel::RecvTimeoutError; -use hydra_api::instruction::ephemeral::{self as eph, CreateArgs}; use hydra_api::instruction::{self as ix, ScheduledIx}; +use hydra_api::instruction::{ + ephemeral::{self as eph}, + CreateArgs, +}; use solana_client::rpc_client::RpcClient; use solana_commitment_config::CommitmentConfig; use solana_instruction::{AccountMeta, Instruction}; @@ -360,8 +363,9 @@ fn create_cranks(sponsor: &Keypair, fee_payer: &Keypair, noop_id: Pubkey) -> Res handles.push(scope.spawn(move || { let rpc = RpcClient::new_with_commitment(rpc_url, commitment); let crank = create_crank(&rpc, sponsor, fee_payer, crank_seed(i), noop_id, i)?; - assert_crank_exists(&rpc, &crank) - .with_context(|| format!("crank {i} ({crank}) was not created on the rollup"))?; + assert_crank_exists(&rpc, &crank).with_context(|| { + format!("crank {i} ({crank}) was not created on the rollup") + })?; Ok((i, crank)) })); } @@ -527,7 +531,7 @@ fn create_crank( &CreateArgs { seed, authority: [0u8; 32], // no cancel authority → permissionless, runs forever - start_slots: 0, + start_slot: 0, interval_slots: INTERVAL_SLOTS, remaining: TARGET_EXECUTIONS, priority_tip: 0, From db02270c98ae9e6f54a037925a3f3c3b259d67a2 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Fri, 26 Jun 2026 18:18:42 +0200 Subject: [PATCH 06/33] feat: api expose both programs --- crates/hydra-api/Cargo.toml | 2 - crates/hydra-api/src/cpi.rs | 584 +++++++++--------- crates/hydra-api/src/instruction.rs | 13 +- crates/hydra-api/src/lib.rs | 11 +- crates/hydra-api/src/state.rs | 12 +- programs/hydra/Cargo.toml | 2 +- programs/hydra/src/lib.rs | 2 +- programs/hydra/src/processor/base/cancel.rs | 2 +- programs/hydra/src/processor/base/close.rs | 2 +- programs/hydra/src/processor/base/create.rs | 6 +- programs/hydra/src/processor/base/trigger.rs | 2 +- programs/hydra/src/processor/common.rs | 14 +- .../hydra/src/processor/ephemeral/cancel.rs | 2 +- .../hydra/src/processor/ephemeral/close.rs | 2 +- .../hydra/src/processor/ephemeral/create.rs | 2 +- .../hydra/src/processor/ephemeral/trigger.rs | 2 +- tests/lib.rs | 6 +- 17 files changed, 341 insertions(+), 325 deletions(-) diff --git a/crates/hydra-api/Cargo.toml b/crates/hydra-api/Cargo.toml index 1477ef7..cc1c28d 100644 --- a/crates/hydra-api/Cargo.toml +++ b/crates/hydra-api/Cargo.toml @@ -24,8 +24,6 @@ cpi-native = [ # `pinocchio::cpi::invoke_signed` with `InstructionView`s built on the # stack (no allocations, usable from `no_std` programs). cpi-pinocchio = ["pinocchio/cpi"] -# Ephemeral-rollup crank instructions use a different program ID. -ephemeral = [] [dependencies] ephemeral-rollups-pinocchio = { workspace = true } diff --git a/crates/hydra-api/src/cpi.rs b/crates/hydra-api/src/cpi.rs index 9e32694..f8588a1 100644 --- a/crates/hydra-api/src/cpi.rs +++ b/crates/hydra-api/src/cpi.rs @@ -6,327 +6,331 @@ //! //! `Trigger` is not exposed here. It must be sent as a top-level instruction. -#[cfg(all(feature = "cpi-native", not(feature = "ephemeral")))] -pub mod native { - //! CPI wrappers for `solana-program` / Anchor callers. - //! - //! # Example - //! - //! ```ignore - //! use hydra_api::cpi::native as hydra_cpi; - //! use hydra_api::instruction::{CreateArgs, SchedMeta}; - //! - //! // Inside your user-facing instruction's handler: - //! hydra_cpi::create( - //! payer_ai, crank_ai, system_program_ai, - //! &CreateArgs { seed, authority: [0u8; 32], /* ... */ }, - //! )?; - //! ``` +mod base { + #[cfg(feature = "cpi-native")] + pub mod native { + //! CPI wrappers for `solana-program` / Anchor callers. + //! + //! # Example + //! + //! ```ignore + //! use hydra_api::cpi::native as hydra_cpi; + //! use hydra_api::instruction::{CreateArgs, SchedMeta}; + //! + //! // Inside your user-facing instruction's handler: + //! hydra_cpi::create( + //! payer_ai, crank_ai, system_program_ai, + //! &CreateArgs { seed, authority: [0u8; 32], /* ... */ }, + //! )?; + //! ``` - use solana_account_info::AccountInfo; - use solana_cpi::invoke_signed; - use solana_program_error::ProgramError; + use solana_account_info::AccountInfo; + use solana_cpi::invoke_signed; + use solana_program_error::ProgramError; - use crate::instruction as builder; + use crate::instruction::{base as builder, CreateArgs}; - #[inline] - pub fn create<'a>( - payer: &AccountInfo<'a>, - crank: &AccountInfo<'a>, - system_program: &AccountInfo<'a>, - args: &builder::CreateArgs<'_>, - signer_seeds: &[&[&[u8]]], - ) -> Result<(), ProgramError> { - let ix = builder::create(*payer.key, *crank.key, args); - invoke_signed( - &ix, - &[payer.clone(), crank.clone(), system_program.clone()], - signer_seeds, - ) - } + #[inline] + pub fn create<'a>( + payer: &AccountInfo<'a>, + crank: &AccountInfo<'a>, + system_program: &AccountInfo<'a>, + args: &CreateArgs<'_>, + signer_seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let ix = builder::create(*payer.key, *crank.key, args); + invoke_signed( + &ix, + &[payer.clone(), crank.clone(), system_program.clone()], + signer_seeds, + ) + } - /// `signer_seeds` is typically `&[&[b"authority_seed", &[bump]]]` when - /// `authority` is a PDA controlled by the integrator program, or - /// `&[]` when it's an EOA. - #[inline] - pub fn cancel<'a>( - authority: &AccountInfo<'a>, - crank: &AccountInfo<'a>, - recipient: &AccountInfo<'a>, - signer_seeds: &[&[&[u8]]], - ) -> Result<(), ProgramError> { - let ix = builder::cancel(*authority.key, *crank.key, *recipient.key); - invoke_signed( - &ix, - &[authority.clone(), crank.clone(), recipient.clone()], - signer_seeds, - ) - } + /// `signer_seeds` is typically `&[&[b"authority_seed", &[bump]]]` when + /// `authority` is a PDA controlled by the integrator program, or + /// `&[]` when it's an EOA. + #[inline] + pub fn cancel<'a>( + authority: &AccountInfo<'a>, + crank: &AccountInfo<'a>, + recipient: &AccountInfo<'a>, + signer_seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let ix = builder::cancel(*authority.key, *crank.key, *recipient.key); + invoke_signed( + &ix, + &[authority.clone(), crank.clone(), recipient.clone()], + signer_seeds, + ) + } - /// `signer_seeds` is typically `&[]` unless the reporter is a PDA - /// owned by the integrator program. - #[inline] - pub fn close<'a>( - reporter: &AccountInfo<'a>, - crank: &AccountInfo<'a>, - recipient: &AccountInfo<'a>, - signer_seeds: &[&[&[u8]]], - ) -> Result<(), ProgramError> { - let ix = builder::close(*reporter.key, *crank.key, *recipient.key); - invoke_signed( - &ix, - &[reporter.clone(), crank.clone(), recipient.clone()], - signer_seeds, - ) + /// `signer_seeds` is typically `&[]` unless the reporter is a PDA + /// owned by the integrator program. + #[inline] + pub fn close<'a>( + reporter: &AccountInfo<'a>, + crank: &AccountInfo<'a>, + recipient: &AccountInfo<'a>, + signer_seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let ix = builder::close(*reporter.key, *crank.key, *recipient.key); + invoke_signed( + &ix, + &[reporter.clone(), crank.clone(), recipient.clone()], + signer_seeds, + ) + } } -} -#[cfg(all(feature = "cpi-pinocchio", not(feature = "ephemeral")))] -pub mod pinocchio { - //! CPI wrappers for Pinocchio callers. - //! - //! Build `Create` manually. See `examples/pinocchio/`. + #[cfg(feature = "cpi-pinocchio")] + pub mod pinocchio { + //! CPI wrappers for Pinocchio callers. + //! + //! Build `Create` manually. See `examples/pinocchio/`. - use pinocchio::{ - cpi::{invoke_signed, Signer}, - instruction::{InstructionAccount, InstructionView}, - AccountView, ProgramResult, - }; - use solana_program_error::ProgramError; + use pinocchio::{ + cpi::{invoke_signed, Signer}, + instruction::{InstructionAccount, InstructionView}, + AccountView, ProgramResult, + }; + use solana_program_error::ProgramError; - use crate::instruction as builder; - use crate::{consts::ix as disc, instruction::CREATE_FIXED_PREFIX_LEN}; + use crate::instruction as builder; + use crate::{consts::ix as disc, instruction::CREATE_FIXED_PREFIX_LEN}; - #[inline] - pub fn create<'a, const N: usize>( - payer: &AccountView, - crank: &AccountView, - system_program: &AccountView, - args: &builder::CreateArgs<'_>, - signers: &[Signer], - ) -> ProgramResult { - if 1 + CREATE_FIXED_PREFIX_LEN + args.body_len() > N { - return Err(ProgramError::InvalidInstructionData); - } + #[inline] + pub fn create<'a, const N: usize>( + payer: &AccountView, + crank: &AccountView, + system_program: &AccountView, + args: &builder::CreateArgs<'_>, + signers: &[Signer], + ) -> ProgramResult { + if 1 + CREATE_FIXED_PREFIX_LEN + args.body_len() > N { + return Err(ProgramError::InvalidInstructionData); + } - let mut data = [0_u8; N]; - args.write_to(&mut data); + let mut data = [0_u8; N]; + args.write_to(&mut data); - let ix = InstructionView { - program_id: &crate::ID, - data: &data, - accounts: &[ - InstructionAccount::writable(payer.address()), - InstructionAccount::writable(crank.address()), - InstructionAccount::writable(system_program.address()), - ], - }; + let ix = InstructionView { + program_id: &crate::base::ID, + data: &data, + accounts: &[ + InstructionAccount::writable(payer.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(system_program.address()), + ], + }; - invoke_signed(&ix, &[payer, crank, system_program], signers) - } + invoke_signed(&ix, &[payer, crank, system_program], signers) + } - #[inline(always)] - pub fn cancel( - authority: &AccountView, - crank: &AccountView, - recipient: &AccountView, - signers: &[Signer], - ) -> ProgramResult { - let data = [disc::CANCEL]; - let metas = [ - InstructionAccount::readonly_signer(authority.address()), - InstructionAccount::writable(crank.address()), - InstructionAccount::writable(recipient.address()), - ]; - let ix = InstructionView { - program_id: &crate::ID, - accounts: &metas, - data: &data, - }; - invoke_signed(&ix, &[authority, crank, recipient], signers) - } + #[inline(always)] + pub fn cancel( + authority: &AccountView, + crank: &AccountView, + recipient: &AccountView, + signers: &[Signer], + ) -> ProgramResult { + let data = [disc::CANCEL]; + let metas = [ + InstructionAccount::readonly_signer(authority.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(recipient.address()), + ]; + let ix = InstructionView { + program_id: &crate::base::ID, + accounts: &metas, + data: &data, + }; + invoke_signed(&ix, &[authority, crank, recipient], signers) + } - #[inline(always)] - pub fn close( - reporter: &AccountView, - crank: &AccountView, - recipient: &AccountView, - signers: &[Signer], - ) -> ProgramResult { - let data = [disc::CLOSE]; - let metas = [ - InstructionAccount::writable_signer(reporter.address()), - InstructionAccount::writable(crank.address()), - InstructionAccount::writable(recipient.address()), - ]; - let ix = InstructionView { - program_id: &crate::ID, - accounts: &metas, - data: &data, - }; - invoke_signed(&ix, &[reporter, crank, recipient], signers) + #[inline(always)] + pub fn close( + reporter: &AccountView, + crank: &AccountView, + recipient: &AccountView, + signers: &[Signer], + ) -> ProgramResult { + let data = [disc::CLOSE]; + let metas = [ + InstructionAccount::writable_signer(reporter.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(recipient.address()), + ]; + let ix = InstructionView { + program_id: &crate::base::ID, + accounts: &metas, + data: &data, + }; + invoke_signed(&ix, &[reporter, crank, recipient], signers) + } } } -#[cfg(all(feature = "cpi-native", feature = "ephemeral"))] -pub mod native { - //! CPI wrappers for `solana-program` / Anchor callers. - //! - //! # Example - //! - //! ```ignore - //! use hydra_api::cpi::native as hydra_cpi; - //! use hydra_api::instruction::{CreateArgs, SchedMeta}; - //! - //! // Inside your user-facing instruction's handler: - //! hydra_cpi::create( - //! payer_ai, crank_ai, system_program_ai, - //! &CreateArgs { seed, authority: [0u8; 32], /* ... */ }, - //! )?; - //! ``` +mod ephemeral { + #[cfg(feature = "cpi-native")] + pub mod native { + //! CPI wrappers for `solana-program` / Anchor callers. + //! + //! # Example + //! + //! ```ignore + //! use hydra_api::cpi::native as hydra_cpi; + //! use hydra_api::instruction::{CreateArgs, SchedMeta}; + //! + //! // Inside your user-facing instruction's handler: + //! hydra_cpi::create( + //! payer_ai, crank_ai, system_program_ai, + //! &CreateArgs { seed, authority: [0u8; 32], /* ... */ }, + //! )?; + //! ``` - use solana_account_info::AccountInfo; - use solana_cpi::invoke_signed; - use solana_program_error::ProgramError; + use solana_account_info::AccountInfo; + use solana_cpi::invoke_signed; + use solana_program_error::ProgramError; - use crate::instruction as builder; + use crate::instruction::{ephemeral as builder, CreateArgs}; - #[inline] - pub fn create<'a>( - payer: &AccountInfo<'a>, - crank: &AccountInfo<'a>, - system_program: &AccountInfo<'a>, - args: &builder::CreateArgs<'_>, - signer_seeds: &[&[&[u8]]], - ) -> Result<(), ProgramError> { - let ix = builder::create(*payer.key, *crank.key, args); - invoke_signed( - &ix, - &[payer.clone(), crank.clone(), system_program.clone()], - signer_seeds, - ) - } + #[inline] + pub fn create<'a>( + payer: &AccountInfo<'a>, + crank: &AccountInfo<'a>, + system_program: &AccountInfo<'a>, + args: &CreateArgs<'_>, + signer_seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let ix = builder::create(*payer.key, *crank.key, args); + invoke_signed( + &ix, + &[payer.clone(), crank.clone(), system_program.clone()], + signer_seeds, + ) + } - /// `signer_seeds` is typically `&[&[b"authority_seed", &[bump]]]` when - /// `authority` is a PDA controlled by the integrator program, or - /// `&[]` when it's an EOA. - #[inline] - pub fn cancel<'a>( - authority: &AccountInfo<'a>, - crank: &AccountInfo<'a>, - recipient: &AccountInfo<'a>, - signer_seeds: &[&[&[u8]]], - ) -> Result<(), ProgramError> { - let ix = builder::cancel(*authority.key, *crank.key); - invoke_signed( - &ix, - &[authority.clone(), crank.clone(), recipient.clone()], - signer_seeds, - ) - } + /// `signer_seeds` is typically `&[&[b"authority_seed", &[bump]]]` when + /// `authority` is a PDA controlled by the integrator program, or + /// `&[]` when it's an EOA. + #[inline] + pub fn cancel<'a>( + authority: &AccountInfo<'a>, + crank: &AccountInfo<'a>, + recipient: &AccountInfo<'a>, + signer_seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let ix = builder::cancel(*authority.key, *crank.key); + invoke_signed( + &ix, + &[authority.clone(), crank.clone(), recipient.clone()], + signer_seeds, + ) + } - /// `signer_seeds` is typically `&[]` unless the reporter is a PDA - /// owned by the integrator program. - #[inline] - pub fn close<'a>( - reporter: &AccountInfo<'a>, - crank: &AccountInfo<'a>, - recipient: &AccountInfo<'a>, - signer_seeds: &[&[&[u8]]], - ) -> Result<(), ProgramError> { - let ix = builder::close(*reporter.key, *crank.key); - invoke_signed( - &ix, - &[reporter.clone(), crank.clone(), recipient.clone()], - signer_seeds, - ) + /// `signer_seeds` is typically `&[]` unless the reporter is a PDA + /// owned by the integrator program. + #[inline] + pub fn close<'a>( + reporter: &AccountInfo<'a>, + crank: &AccountInfo<'a>, + recipient: &AccountInfo<'a>, + signer_seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let ix = builder::close(*reporter.key, *crank.key); + invoke_signed( + &ix, + &[reporter.clone(), crank.clone(), recipient.clone()], + signer_seeds, + ) + } } -} -#[cfg(all(feature = "cpi-pinocchio", feature = "ephemeral"))] -pub mod pinocchio { - //! CPI wrappers for Pinocchio callers. - //! - //! Build `Create` manually. See `examples/pinocchio/`. + #[cfg(feature = "cpi-pinocchio")] + pub mod pinocchio { + //! CPI wrappers for Pinocchio callers. + //! + //! Build `Create` manually. See `examples/pinocchio/`. - use pinocchio::{ - cpi::{invoke_signed, Signer}, - instruction::{InstructionAccount, InstructionView}, - AccountView, ProgramResult, - }; - use solana_program_error::ProgramError; + use pinocchio::{ + cpi::{invoke_signed, Signer}, + instruction::{InstructionAccount, InstructionView}, + AccountView, ProgramResult, + }; + use solana_program_error::ProgramError; - use crate::{ - consts::ix as disc, - instruction::{CreateArgs, CREATE_FIXED_PREFIX_LEN}, - }; + use crate::{ + consts::ix as disc, + instruction::{CreateArgs, CREATE_FIXED_PREFIX_LEN}, + }; - #[inline] - pub fn create<'a, const N: usize>( - payer: &AccountView, - crank: &AccountView, - system_program: &AccountView, - args: &CreateArgs<'_>, - signers: &[Signer], - ) -> ProgramResult { - if 1 + CREATE_FIXED_PREFIX_LEN + args.body_len() > N { - return Err(ProgramError::InvalidInstructionData); - } + #[inline] + pub fn create<'a, const N: usize>( + payer: &AccountView, + crank: &AccountView, + system_program: &AccountView, + args: &CreateArgs<'_>, + signers: &[Signer], + ) -> ProgramResult { + if 1 + CREATE_FIXED_PREFIX_LEN + args.body_len() > N { + return Err(ProgramError::InvalidInstructionData); + } - let mut data = [0_u8; N]; - args.write_to(&mut data); + let mut data = [0_u8; N]; + args.write_to(&mut data); - let ix = InstructionView { - program_id: &crate::ID, - data: &data, - accounts: &[ - InstructionAccount::writable(payer.address()), - InstructionAccount::writable(crank.address()), - InstructionAccount::writable(system_program.address()), - ], - }; - invoke_signed(&ix, &[payer, crank, system_program], signers) - } + let ix = InstructionView { + program_id: &crate::ephemeral::ID, + data: &data, + accounts: &[ + InstructionAccount::writable(payer.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(system_program.address()), + ], + }; + invoke_signed(&ix, &[payer, crank, system_program], signers) + } - #[inline(always)] - pub fn cancel( - authority: &AccountView, - crank: &AccountView, - recipient: &AccountView, - signers: &[Signer], - ) -> ProgramResult { - let data = [disc::CANCEL]; - let metas = [ - InstructionAccount::readonly_signer(authority.address()), - InstructionAccount::writable(crank.address()), - InstructionAccount::writable(recipient.address()), - ]; - let ix = InstructionView { - program_id: &crate::ID, - accounts: &metas, - data: &data, - }; - invoke_signed(&ix, &[authority, crank, recipient], signers) - } + #[inline(always)] + pub fn cancel( + authority: &AccountView, + crank: &AccountView, + recipient: &AccountView, + signers: &[Signer], + ) -> ProgramResult { + let data = [disc::CANCEL]; + let metas = [ + InstructionAccount::readonly_signer(authority.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(recipient.address()), + ]; + let ix = InstructionView { + program_id: &crate::ephemeral::ID, + accounts: &metas, + data: &data, + }; + invoke_signed(&ix, &[authority, crank, recipient], signers) + } - #[inline(always)] - pub fn close( - reporter: &AccountView, - crank: &AccountView, - recipient: &AccountView, - signers: &[Signer], - ) -> ProgramResult { - let data = [disc::CLOSE]; - let metas = [ - InstructionAccount::writable_signer(reporter.address()), - InstructionAccount::writable(crank.address()), - InstructionAccount::writable(recipient.address()), - ]; - let ix = InstructionView { - program_id: &crate::ID, - accounts: &metas, - data: &data, - }; - invoke_signed(&ix, &[reporter, crank, recipient], signers) + #[inline(always)] + pub fn close( + reporter: &AccountView, + crank: &AccountView, + recipient: &AccountView, + signers: &[Signer], + ) -> ProgramResult { + let data = [disc::CLOSE]; + let metas = [ + InstructionAccount::writable_signer(reporter.address()), + InstructionAccount::writable(crank.address()), + InstructionAccount::writable(recipient.address()), + ]; + let ix = InstructionView { + program_id: &crate::ephemeral::ID, + accounts: &metas, + data: &data, + }; + invoke_signed(&ix, &[reporter, crank, recipient], signers) + } } } diff --git a/crates/hydra-api/src/instruction.rs b/crates/hydra-api/src/instruction.rs index 49cf883..d2fb0b9 100644 --- a/crates/hydra-api/src/instruction.rs +++ b/crates/hydra-api/src/instruction.rs @@ -66,8 +66,12 @@ mod client { pub const EPHEMERAL_PROGRAM_ID: Pubkey = pubkey!("eHyd5BU8QffvHi4GnXwxrK4WpS7pM2x9UGKHBWii7mf"); /// Hydra program ID as a `solana_pubkey::Pubkey` (convenience for clients). - pub fn program_id() -> Pubkey { - Pubkey::new_from_array(crate::ID.to_bytes()) + pub fn base_program_id() -> Pubkey { + Pubkey::new_from_array(crate::base::ID.to_bytes()) + } + + pub fn ephemeral_program_id() -> Pubkey { + Pubkey::new_from_array(crate::ephemeral::ID.to_bytes()) } /// A scheduled-ix meta as it will be stored on-chain. @@ -336,11 +340,6 @@ mod client { } } - #[cfg(not(feature = "ephemeral"))] - pub use base::*; - #[cfg(feature = "ephemeral")] - pub use ephemeral::*; - /// Reconstruct all scheduled instructions from a crank's raw account bytes. /// This is what an off-chain cranker does to build the sibling ixs that /// must follow `Trigger`. diff --git a/crates/hydra-api/src/lib.rs b/crates/hydra-api/src/lib.rs index ecba58a..266476d 100644 --- a/crates/hydra-api/src/lib.rs +++ b/crates/hydra-api/src/lib.rs @@ -16,9 +16,10 @@ pub use consts::*; pub use error::HydraError; pub use state::Crank; -use solana_address::declare_id; +pub mod base { + solana_address::declare_id!("Hydra17i1feui9deaxu6d1TzSQMRNHeBRkDR1Awy7zea"); +} -#[cfg(not(feature = "ephemeral"))] -declare_id!("Hydra17i1feui9deaxu6d1TzSQMRNHeBRkDR1Awy7zea"); -#[cfg(feature = "ephemeral")] -declare_id!("eHyd5BU8QffvHi4GnXwxrK4WpS7pM2x9UGKHBWii7mf"); +pub mod ephemeral { + solana_address::declare_id!("eHyd5BU8QffvHi4GnXwxrK4WpS7pM2x9UGKHBWii7mf"); +} diff --git a/crates/hydra-api/src/state.rs b/crates/hydra-api/src/state.rs index a83f0ae..d73429b 100644 --- a/crates/hydra-api/src/state.rs +++ b/crates/hydra-api/src/state.rs @@ -184,9 +184,17 @@ pub unsafe fn load_crank_mut(bytes: &mut [u8]) -> Result<&mut Crank, ProgramErro /// Derive the crank PDA for the given 32-byte seed. #[inline] -pub fn find_crank_pda(seed: &[u8; 32]) -> (solana_address::Address, u8) { +pub fn find_base_crank_pda(seed: &[u8; 32]) -> (solana_address::Address, u8) { solana_address::Address::find_program_address( &[crate::consts::CRANK_SEED_PREFIX, seed.as_ref()], - &crate::ID, + &crate::base::ID, + ) +} + +#[inline] +pub fn find_ephemeral_crank_pda(seed: &[u8; 32]) -> (solana_address::Address, u8) { + solana_address::Address::find_program_address( + &[crate::consts::CRANK_SEED_PREFIX, seed.as_ref()], + &crate::ephemeral::ID, ) } diff --git a/programs/hydra/Cargo.toml b/programs/hydra/Cargo.toml index 9d9cb36..74f8663 100644 --- a/programs/hydra/Cargo.toml +++ b/programs/hydra/Cargo.toml @@ -28,7 +28,7 @@ create-account-allow-prefund = [] # Ephemeral-rollup crank instructions: schedule/run cranks that live as # MagicBlock ephemeral accounts on the ephemeral rollup. Pulls in the # `ephemeral-rollups-pinocchio` CPI helpers. -ephemeral = ["dep:ephemeral-rollups-pinocchio", "hydra-api/ephemeral"] +ephemeral = ["dep:ephemeral-rollups-pinocchio"] [dependencies] pinocchio = { workspace = true } diff --git a/programs/hydra/src/lib.rs b/programs/hydra/src/lib.rs index c4d6b0b..ec5ee69 100644 --- a/programs/hydra/src/lib.rs +++ b/programs/hydra/src/lib.rs @@ -6,4 +6,4 @@ mod entrypoint; mod helpers; mod processor; -pub use hydra_api::ID; +pub use hydra_api::{base::ID as BASE_ID, ephemeral::ID as EPHEMERAL_ID}; diff --git a/programs/hydra/src/processor/base/cancel.rs b/programs/hydra/src/processor/base/cancel.rs index bee96ac..08a324a 100644 --- a/programs/hydra/src/processor/base/cancel.rs +++ b/programs/hydra/src/processor/base/cancel.rs @@ -10,6 +10,6 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; - require_cancel_authority(authority, crank_ai)?; + require_cancel_authority(authority, crank_ai, &hydra_api::base::ID)?; drain_lamports(crank_ai, recipient) } diff --git a/programs/hydra/src/processor/base/close.rs b/programs/hydra/src/processor/base/close.rs index 2d2c71c..6c93861 100644 --- a/programs/hydra/src/processor/base/close.rs +++ b/programs/hydra/src/processor/base/close.rs @@ -20,7 +20,7 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; - require_signed_crank(reporter, crank_ai)?; + require_signed_crank(reporter, crank_ai, &hydra_api::base::ID)?; // Snapshot fields we need from the crank header. let (stored_authority, remaining, rent_min, priority_tip, next_exec_slot, lamports_now) = { diff --git a/programs/hydra/src/processor/base/create.rs b/programs/hydra/src/processor/base/create.rs index 40291c1..e27bdff 100644 --- a/programs/hydra/src/processor/base/create.rs +++ b/programs/hydra/src/processor/base/create.rs @@ -46,7 +46,7 @@ pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { // Size the account from the scheduled ixs (validates the schedule), verify // the PDA, then allocate at exactly that size. The tail is written below. let region_len = measure_region(data)?; - let bump = derive_crank_pda(crank_ai, &header.seed)?; + let bump = derive_crank_pda(crank_ai, &header.seed, &hydra_api::base::ID)?; let total_size = CRANK_HEADER_SIZE + region_len; // One sysvar read serves both CreateAccount funding and the cached floor. @@ -71,7 +71,7 @@ pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { CreateAccountAllowPrefund { to: crank_ai, space: total_size as u64, - owner: &hydra_api::ID, + owner: &hydra_api::base::ID, funding: (funding_lamports > 0).then_some(Funding { from: payer, lamports: funding_lamports, @@ -101,7 +101,7 @@ pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { .invoke_signed(&signers)?; Assign { account: crank_ai, - owner: &hydra_api::ID, + owner: &hydra_api::base::ID, } .invoke_signed(&signers)?; } diff --git a/programs/hydra/src/processor/base/trigger.rs b/programs/hydra/src/processor/base/trigger.rs index 9e7e752..f471304 100644 --- a/programs/hydra/src/processor/base/trigger.rs +++ b/programs/hydra/src/processor/base/trigger.rs @@ -43,7 +43,7 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { if !cranker_ai.is_signer() { return Err(ProgramError::MissingRequiredSignature); } - if !crank_ai.owned_by(&hydra_api::ID) { + if !crank_ai.owned_by(&hydra_api::base::ID) { return Err(ProgramError::InvalidAccountOwner); } if ix_sysvar_ai.address() != &INSTRUCTIONS_ID { diff --git a/programs/hydra/src/processor/common.rs b/programs/hydra/src/processor/common.rs index afac2c3..e2031bc 100644 --- a/programs/hydra/src/processor/common.rs +++ b/programs/hydra/src/processor/common.rs @@ -14,11 +14,15 @@ use hydra_api::{ /// `signer` must sign and `crank` must be Hydra-owned — the preamble of every /// `Cancel` / `Close` path. -pub(super) fn require_signed_crank(signer: &AccountView, crank_ai: &AccountView) -> ProgramResult { +pub(super) fn require_signed_crank( + signer: &AccountView, + crank_ai: &AccountView, + program_id: &Address, +) -> ProgramResult { if !signer.is_signer() { return Err(ProgramError::MissingRequiredSignature); } - if !crank_ai.owned_by(&hydra_api::ID) { + if !crank_ai.owned_by(program_id) { return Err(ProgramError::InvalidAccountOwner); } Ok(()) @@ -42,8 +46,9 @@ pub(super) fn require_refund_recipient( pub(super) fn require_cancel_authority( authority: &AccountView, crank_ai: &AccountView, + program_id: &Address, ) -> ProgramResult { - require_signed_crank(authority, crank_ai)?; + require_signed_crank(authority, crank_ai, program_id)?; let stored = { let data = crank_ai.try_borrow()?; unsafe { load_crank(&data)? }.authority @@ -161,9 +166,10 @@ pub(super) fn measure_region(data: &[u8]) -> Result { pub(super) fn derive_crank_pda( crank_ai: &AccountView, seed: &[u8; 32], + program_id: &Address, ) -> Result { let (expected_pda, bump) = - Address::find_program_address(&[CRANK_SEED_PREFIX, seed], &hydra_api::ID); + Address::find_program_address(&[CRANK_SEED_PREFIX, seed], program_id); if crank_ai.address() != &expected_pda { return Err(ProgramError::InvalidSeeds); } diff --git a/programs/hydra/src/processor/ephemeral/cancel.rs b/programs/hydra/src/processor/ephemeral/cancel.rs index 292a233..400a926 100644 --- a/programs/hydra/src/processor/ephemeral/cancel.rs +++ b/programs/hydra/src/processor/ephemeral/cancel.rs @@ -16,7 +16,7 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; - require_cancel_authority(authority, crank_ai)?; + require_cancel_authority(authority, crank_ai, &hydra_api::ephemeral::ID)?; check_magic_accounts(vault, magic_program)?; // The ephemeral account need not sign on close; `authority` is the sponsor diff --git a/programs/hydra/src/processor/ephemeral/close.rs b/programs/hydra/src/processor/ephemeral/close.rs index 37a2b61..126b72b 100644 --- a/programs/hydra/src/processor/ephemeral/close.rs +++ b/programs/hydra/src/processor/ephemeral/close.rs @@ -21,7 +21,7 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; - require_signed_crank(reporter, crank_ai)?; + require_signed_crank(reporter, crank_ai, &hydra_api::ephemeral::ID)?; check_magic_accounts(vault, magic_program)?; let (stored_authority, remaining, next_exec_slot) = { diff --git a/programs/hydra/src/processor/ephemeral/create.rs b/programs/hydra/src/processor/ephemeral/create.rs index 3720a31..48e8569 100644 --- a/programs/hydra/src/processor/ephemeral/create.rs +++ b/programs/hydra/src/processor/ephemeral/create.rs @@ -36,7 +36,7 @@ pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { // Size the account from the scheduled ixs (validates the schedule), then // allocate it. The exact tail is written below. let region_len = measure_region(data)?; - let bump = derive_crank_pda(crank_ai, &header.seed)?; + let bump = derive_crank_pda(crank_ai, &header.seed, &hydra_api::ephemeral::ID)?; let data_len = CRANK_HEADER_SIZE + region_len; // The crank PDA must sign the create CPI (the ephemeral account is a signer diff --git a/programs/hydra/src/processor/ephemeral/trigger.rs b/programs/hydra/src/processor/ephemeral/trigger.rs index 4eea576..1d37a87 100644 --- a/programs/hydra/src/processor/ephemeral/trigger.rs +++ b/programs/hydra/src/processor/ephemeral/trigger.rs @@ -29,7 +29,7 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { if !cranker_ai.is_signer() { return Err(ProgramError::MissingRequiredSignature); } - if !crank_ai.owned_by(&hydra_api::ID) { + if !crank_ai.owned_by(&hydra_api::ephemeral::ID) { return Err(ProgramError::InvalidAccountOwner); } if ix_sysvar_ai.address() != &INSTRUCTIONS_ID { diff --git a/tests/lib.rs b/tests/lib.rs index beebe11..b7aaf7e 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -40,7 +40,7 @@ pub const NOOP_ID: Pubkey = pubkey!("4sdZFwGE7TkQCJVpfggvfy2ZwGNCfF6hAMJYjZU5HpZ pub const NOOP_SO: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../target/deploy/hydra_noop"); pub fn hydra_id() -> Pubkey { - Pubkey::new_from_array(hydra_api::ID.to_bytes()) + Pubkey::new_from_array(hydra_api::base::ID.to_bytes()) } pub fn mollusk_with_hydra() -> Mollusk { @@ -57,7 +57,7 @@ pub fn load_noop(mollusk: &mut Mollusk) { } pub fn find_crank(seed: &[u8; 32]) -> (Pubkey, u8) { - let (addr, bump) = hydra_api::state::find_crank_pda(seed); + let (addr, bump) = hydra_api::state::find_base_crank_pda(seed); (Pubkey::new_from_array(addr.to_bytes()), bump) } @@ -502,7 +502,7 @@ mod tests { let scheduled_data: &[u8] = b"tick"; let cu_limit: u32 = 321_000; - let ix = hydra_api::instruction::create( + let ix = hydra_api::instruction::base::create( payer, crank_pda, &CreateArgs { From f3327a5ec8bd5c15b488471746163e80e3f2ed9b Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Fri, 26 Jun 2026 18:27:44 +0200 Subject: [PATCH 07/33] fix: make modules public --- crates/hydra-api/src/cpi.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/hydra-api/src/cpi.rs b/crates/hydra-api/src/cpi.rs index f8588a1..9e1497d 100644 --- a/crates/hydra-api/src/cpi.rs +++ b/crates/hydra-api/src/cpi.rs @@ -6,7 +6,7 @@ //! //! `Trigger` is not exposed here. It must be sent as a top-level instruction. -mod base { +pub mod base { #[cfg(feature = "cpi-native")] pub mod native { //! CPI wrappers for `solana-program` / Anchor callers. @@ -170,7 +170,7 @@ mod base { } } -mod ephemeral { +pub mod ephemeral { #[cfg(feature = "cpi-native")] pub mod native { //! CPI wrappers for `solana-program` / Anchor callers. From 01b6c86f61548545a81f2a22eb17b73c66bcd4cc Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Fri, 26 Jun 2026 18:38:46 +0200 Subject: [PATCH 08/33] feat: move args out of client --- crates/hydra-api/Cargo.toml | 2 +- crates/hydra-api/src/instruction.rs | 231 ++++++++++++++-------------- examples/native/src/lib.rs | 4 +- examples/native/tests/mollusk.rs | 4 +- examples/pinocchio/src/lib.rs | 2 +- examples/pinocchio/tests/mollusk.rs | 4 +- tests/e2e/tests/ephemeral_cranks.rs | 2 +- tests/lib.rs | 46 +++--- 8 files changed, 150 insertions(+), 145 deletions(-) diff --git a/crates/hydra-api/Cargo.toml b/crates/hydra-api/Cargo.toml index cc1c28d..806bc50 100644 --- a/crates/hydra-api/Cargo.toml +++ b/crates/hydra-api/Cargo.toml @@ -23,7 +23,7 @@ cpi-native = [ # On-chain CPI helpers for Pinocchio callers. Wraps # `pinocchio::cpi::invoke_signed` with `InstructionView`s built on the # stack (no allocations, usable from `no_std` programs). -cpi-pinocchio = ["pinocchio/cpi"] +cpi-pinocchio = ["pinocchio/cpi", "dep:solana-program-error"] [dependencies] ephemeral-rollups-pinocchio = { workspace = true } diff --git a/crates/hydra-api/src/instruction.rs b/crates/hydra-api/src/instruction.rs index d2fb0b9..0a4f50d 100644 --- a/crates/hydra-api/src/instruction.rs +++ b/crates/hydra-api/src/instruction.rs @@ -39,6 +39,119 @@ pub const CREATE_FIXED_PREFIX_LEN: usize = 32 + // seed /// `num_accounts: u8`, `data_len: u16 LE`, `program_id: [u8; 32]`. pub const CREATE_IX_HEADER_LEN: usize = 1 + 2 + 32; // = 35 +/// A scheduled-ix meta as it will be stored on-chain. +/// +/// `is_signer` is intentionally absent: scheduled ixs cannot carry +/// signer flags (enforced by `Create`), and the on-chain template +/// stores only the writable bit anyway. +#[derive(Clone, Copy)] +pub struct SchedMeta { + pub pubkey: [u8; 32], + pub is_writable: bool, +} + +impl SchedMeta { + pub fn readonly(pubkey: [u8; 32]) -> Self { + Self { + pubkey, + is_writable: false, + } + } + pub fn writable(pubkey: [u8; 32]) -> Self { + Self { + pubkey, + is_writable: true, + } + } +} + +/// One scheduled instruction template. +pub struct ScheduledIx<'a> { + pub program_id: [u8; 32], + pub metas: &'a [SchedMeta], + pub data: &'a [u8], +} + +/// All the scheduling knobs for `CreateEphemeral` +pub struct CreateArgs<'a> { + pub seed: [u8; 32], + /// All-zeros = unkillable (no cancel authority). + pub authority: [u8; 32], + pub start_slot: u64, + pub interval_slots: u64, + /// `0` on the wire means "infinite"; Hydra stores `u64::MAX` internally. + pub remaining: u64, + pub priority_tip: u64, + /// Compute-unit limit the cranker emits as `SetComputeUnitLimit` + /// right before `Trigger`. `0` = no ix (inherits the 200 k/ix + /// default). Capped at `MAX_COMPUTE_UNIT_LIMIT` (1.4 M) at `Create`. + pub cu_limit: u32, + /// The scheduled instructions, in execution order. Must be non-empty + pub scheduled: &'a [ScheduledIx<'a>], +} + +impl CreateArgs<'_> { + pub fn body_len(&self) -> usize { + self.scheduled + .iter() + .map(|s| CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) + .sum() + } + + pub fn write_to(&self, data: &mut [u8]) -> usize { + let mut off = 0; + + data[off] = ix::CREATE; + off += 1; + + data[off..off + 32].copy_from_slice(&self.seed); + off += 32; + + data[off..off + 32].copy_from_slice(&self.authority); + off += 32; + + data[off..off + 8].copy_from_slice(&self.start_slot.to_le_bytes()); + off += 8; + + data[off..off + 8].copy_from_slice(&self.interval_slots.to_le_bytes()); + off += 8; + + data[off..off + 8].copy_from_slice(&self.remaining.to_le_bytes()); + off += 8; + + data[off..off + 8].copy_from_slice(&self.priority_tip.to_le_bytes()); + off += 8; + + data[off..off + 4].copy_from_slice(&self.cu_limit.to_le_bytes()); + off += 4; + + for s in self.scheduled { + data[off] = s.metas.len() as u8; + off += 1; + + data[off..off + 2].copy_from_slice(&(s.data.len() as u16).to_le_bytes()); + off += 2; + + data[off..off + 32].copy_from_slice(&s.program_id); + off += 32; + + for m in s.metas { + let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; + data[off] = flag; + off += 1; + + data[off..off + 32].copy_from_slice(&m.pubkey); + off += 32; + } + + data[off..off + s.data.len()].copy_from_slice(s.data); + off += s.data.len(); + } + + off + } +} + // --------------------------------------------------------------------------- // Client builders // --------------------------------------------------------------------------- @@ -54,6 +167,8 @@ mod client { use crate::consts::{ix, META_FLAG_WRITABLE}; use crate::instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}; + use super::*; + /// Solana's built-in instructions sysvar pubkey. pub const INSTRUCTIONS_SYSVAR_ID: Pubkey = pubkey!("Sysvar1nstructions1111111111111111111111111"); @@ -74,121 +189,9 @@ mod client { Pubkey::new_from_array(crate::ephemeral::ID.to_bytes()) } - /// A scheduled-ix meta as it will be stored on-chain. - /// - /// `is_signer` is intentionally absent: scheduled ixs cannot carry - /// signer flags (enforced by `Create`), and the on-chain template - /// stores only the writable bit anyway. - #[derive(Clone, Copy)] - pub struct SchedMeta { - pub pubkey: Pubkey, - pub is_writable: bool, - } - - impl SchedMeta { - pub fn readonly(pubkey: Pubkey) -> Self { - Self { - pubkey, - is_writable: false, - } - } - pub fn writable(pubkey: Pubkey) -> Self { - Self { - pubkey, - is_writable: true, - } - } - } - - /// One scheduled instruction template. - pub struct ScheduledIx<'a> { - pub program_id: Pubkey, - pub metas: &'a [SchedMeta], - pub data: &'a [u8], - } - - /// All the scheduling knobs for `CreateEphemeral` - pub struct CreateArgs<'a> { - pub seed: [u8; 32], - /// All-zeros = unkillable (no cancel authority). - pub authority: [u8; 32], - pub start_slot: u64, - pub interval_slots: u64, - /// `0` on the wire means "infinite"; Hydra stores `u64::MAX` internally. - pub remaining: u64, - pub priority_tip: u64, - /// Compute-unit limit the cranker emits as `SetComputeUnitLimit` - /// right before `Trigger`. `0` = no ix (inherits the 200 k/ix - /// default). Capped at `MAX_COMPUTE_UNIT_LIMIT` (1.4 M) at `Create`. - pub cu_limit: u32, - /// The scheduled instructions, in execution order. Must be non-empty - pub scheduled: &'a [ScheduledIx<'a>], - } - - impl CreateArgs<'_> { - pub fn body_len(&self) -> usize { - self.scheduled - .iter() - .map(|s| CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) - .sum() - } - - pub fn write_to(&self, data: &mut [u8]) -> usize { - let mut off = 0; - - data[off] = ix::CREATE; - off += 1; - - data[off..off + 32].copy_from_slice(&self.seed); - off += 32; - - data[off..off + 32].copy_from_slice(&self.authority); - off += 32; - - data[off..off + 8].copy_from_slice(&self.start_slot.to_le_bytes()); - off += 8; - - data[off..off + 8].copy_from_slice(&self.interval_slots.to_le_bytes()); - off += 8; - - data[off..off + 8].copy_from_slice(&self.remaining.to_le_bytes()); - off += 8; - - data[off..off + 8].copy_from_slice(&self.priority_tip.to_le_bytes()); - off += 8; - - data[off..off + 4].copy_from_slice(&self.cu_limit.to_le_bytes()); - off += 4; - - for s in self.scheduled { - data[off] = s.metas.len() as u8; - off += 1; - - data[off..off + 2].copy_from_slice(&(s.data.len() as u16).to_le_bytes()); - off += 2; - - data[off..off + 32].copy_from_slice(&s.program_id.to_bytes()); - off += 32; - - for m in s.metas { - let flag: u8 = if m.is_writable { META_FLAG_WRITABLE } else { 0 }; - data[off] = flag; - off += 1; - - data[off..off + 32].copy_from_slice(&m.pubkey.to_bytes()); - off += 32; - } - - data[off..off + s.data.len()].copy_from_slice(s.data); - off += s.data.len(); - } - - off - } - } - /// Builders targeting the base-layer Hydra program ([`BASE_PROGRAM_ID`]). pub mod base { + use super::*; /// This module's program ID. @@ -403,3 +406,5 @@ mod client { #[cfg(feature = "client")] pub use client::*; + +use crate::{ix, META_FLAG_WRITABLE}; diff --git a/examples/native/src/lib.rs b/examples/native/src/lib.rs index 866155b..fe1bf4d 100644 --- a/examples/native/src/lib.rs +++ b/examples/native/src/lib.rs @@ -22,7 +22,7 @@ use solana_program_error::{ProgramError, ProgramResult}; use solana_pubkey::Pubkey; use hydra_api::{ - cpi::native as hydra_cpi, + cpi::base::native as hydra_cpi, instruction::{CreateArgs, ScheduledIx}, }; @@ -55,7 +55,7 @@ pub fn process_instruction( priority_tip: 1_000, cu_limit: 0, // no on-chain CU override scheduled: &[ScheduledIx { - program_id: target_program_id, + program_id: target_program_id.to_bytes(), metas: &[], data: b"tick", }], diff --git a/examples/native/tests/mollusk.rs b/examples/native/tests/mollusk.rs index 4e3e2e5..4df5f5b 100644 --- a/examples/native/tests/mollusk.rs +++ b/examples/native/tests/mollusk.rs @@ -24,7 +24,7 @@ const EXAMPLE_SO: &str = concat!( const HYDRA_SO: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../../target/deploy/hydra"); fn hydra_id() -> Pubkey { - Pubkey::new_from_array(hydra_api::ID.to_bytes()) + Pubkey::new_from_array(hydra_api::base::ID.to_bytes()) } #[test] @@ -45,7 +45,7 @@ fn schedule_creates_crank_via_cpi_into_hydra() { // Derive the crank PDA. The seed must match what the example hard-codes // into its `CreateArgs` (it just passes through the user-supplied seed). let seed = [0x33u8; 32]; - let (crank_addr, _bump) = hydra_api::state::find_crank_pda(&seed); + let (crank_addr, _bump) = hydra_api::state::find_base_crank_pda(&seed); let crank = Pubkey::new_from_array(crank_addr.to_bytes()); let payer = Pubkey::new_unique(); let target_program_id = Pubkey::new_unique(); diff --git a/examples/pinocchio/src/lib.rs b/examples/pinocchio/src/lib.rs index 69c7114..82ff66b 100644 --- a/examples/pinocchio/src/lib.rs +++ b/examples/pinocchio/src/lib.rs @@ -56,7 +56,7 @@ fn schedule(accounts: &[AccountView], data: &[u8]) -> ProgramResult { }; // Build Hydra Create data on the stack. - hydra_api::cpi::pinocchio::create::( + hydra_api::cpi::base::pinocchio::create::( payer, crank, system_program, diff --git a/examples/pinocchio/tests/mollusk.rs b/examples/pinocchio/tests/mollusk.rs index 88afc9f..88812dd 100644 --- a/examples/pinocchio/tests/mollusk.rs +++ b/examples/pinocchio/tests/mollusk.rs @@ -27,7 +27,7 @@ const HYDRA_SO: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../../target/deploy const DISC_SCHEDULE: u8 = 0; fn hydra_id() -> Pubkey { - Pubkey::new_from_array(hydra_api::ID.to_bytes()) + Pubkey::new_from_array(hydra_api::base::ID.to_bytes()) } #[test] @@ -48,7 +48,7 @@ fn schedule_creates_crank_via_cpi_into_hydra() { // Derive the crank PDA from the seed we'll pass in. let seed = [0x55u8; 32]; - let (crank_addr, _bump) = hydra_api::state::find_crank_pda(&seed); + let (crank_addr, _bump) = hydra_api::state::find_base_crank_pda(&seed); let crank = Pubkey::new_from_array(crank_addr.to_bytes()); let payer = Pubkey::new_unique(); let target_program_id = Pubkey::new_unique(); diff --git a/tests/e2e/tests/ephemeral_cranks.rs b/tests/e2e/tests/ephemeral_cranks.rs index 0ff2b53..44183e2 100644 --- a/tests/e2e/tests/ephemeral_cranks.rs +++ b/tests/e2e/tests/ephemeral_cranks.rs @@ -521,7 +521,7 @@ fn create_crank( let (crank, _bump) = eph::find_crank_pda(&seed); let fire_id = crank_fire_id(crank_index); let sched = ScheduledIx { - program_id: noop, + program_id: noop.to_bytes(), metas: &[], data: &fire_id.to_le_bytes(), }; diff --git a/tests/lib.rs b/tests/lib.rs index b7aaf7e..e8b275d 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -89,7 +89,7 @@ pub fn create_ix( priority_tip, cu_limit, &[ScheduledIx { - program_id: sched_program, + program_id: sched_program.to_bytes(), metas: sched_metas, data: sched_data, }], @@ -127,7 +127,7 @@ pub fn create_ix_multi( for s in sched { data.push(s.metas.len() as u8); data.extend_from_slice(&(s.data.len() as u16).to_le_bytes()); - data.extend_from_slice(&s.program_id.to_bytes()); + data.extend_from_slice(&s.program_id); for meta in s.metas { let flag: u8 = if meta.is_writable { META_FLAG_WRITABLE @@ -135,7 +135,7 @@ pub fn create_ix_multi( 0 }; data.push(flag); - data.extend_from_slice(&meta.pubkey.to_bytes()); + data.extend_from_slice(&meta.pubkey); } data.extend_from_slice(s.data); } @@ -317,7 +317,7 @@ pub fn print_cu_table() { let payer_m = Pubkey::new_unique(); let multi_specs: Vec = (0..MULTI_N) .map(|_| ScheduledIx { - program_id: NOOP_ID, + program_id: NOOP_ID.to_bytes(), metas: &[], data: tick, }) @@ -514,8 +514,8 @@ mod tests { priority_tip: 1_000, cu_limit, scheduled: &[ScheduledIx { - program_id: memo::ID, - metas: &[SchedMeta::writable(scheduled_meta)], + program_id: memo::ID.to_bytes(), + metas: &[SchedMeta::writable(scheduled_meta.to_bytes())], data: scheduled_data, }], }, @@ -572,7 +572,7 @@ mod tests { 1_000, // priority_tip 0, // cu_limit (0 = omit the ix) memo::ID, - &[SchedMeta::readonly(recipient)], // one read-only account just for content + &[SchedMeta::readonly(recipient.to_bytes())], // one read-only account just for content memo_data, ); @@ -1509,12 +1509,12 @@ mod tests { 0, &[ ScheduledIx { - program_id: memo::ID, - metas: &[SchedMeta::writable(acct_a)], + program_id: memo::ID.to_bytes(), + metas: &[SchedMeta::writable(acct_a.to_bytes())], data: b"first", }, ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"second", }, @@ -1577,12 +1577,12 @@ mod tests { 0, &[ ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"alpha", }, ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"beta", }, @@ -1669,12 +1669,12 @@ mod tests { 0, &[ ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"alpha", }, ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"beta", }, @@ -1730,12 +1730,12 @@ mod tests { 0, &[ ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"alpha", }, ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"beta", }, @@ -1785,12 +1785,12 @@ mod tests { 0, &[ ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"alpha", }, ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"beta", }, @@ -1921,7 +1921,7 @@ mod tests { // Exactly MAX_INSTRUCTIONS tiny memos -> ok. let at_max: Vec = (0..MAX_INSTRUCTIONS) .map(|_| ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"m", }) @@ -1947,7 +1947,7 @@ mod tests { // One past the cap -> rejected. let over: Vec = (0..MAX_INSTRUCTIONS + 1) .map(|_| ScheduledIx { - program_id: memo::ID, + program_id: memo::ID.to_bytes(), metas: &[], data: b"m", }) @@ -2000,12 +2000,12 @@ mod tests { 0, &[ ScheduledIx { - program_id: NOOP_ID, - metas: &[SchedMeta::writable(writable_acct)], + program_id: NOOP_ID.to_bytes(), + metas: &[SchedMeta::writable(writable_acct.to_bytes())], data: b"one", }, ScheduledIx { - program_id: NOOP_ID, + program_id: NOOP_ID.to_bytes(), metas: &[], data: b"two", }, From 09b3c8e893de509a85a471602102ffe8844f95ba Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 29 Jun 2026 18:49:39 +0200 Subject: [PATCH 09/33] feat: relax version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 04b1939..44b03e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ pinocchio-log = "0.5" # instructions). Tracks pinocchio 0.10, which is why the program is pinned to # 0.10 rather than 0.11. ephemeral-rollups-pinocchio = "0.15" -solana-address = { version = "2.6", features = ["decode", "curve25519"] } +solana-address = { version = "2", features = ["decode", "curve25519"] } solana-define-syscall = "5.0" hydra-api = { path = "crates/hydra-api" } From e80dba825de58187fc2959919becf978af9850a6 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Tue, 30 Jun 2026 14:59:28 +0200 Subject: [PATCH 10/33] feat: split programs --- .github/workflows/ci.yml | 17 +- Cargo.lock | 13 +- Cargo.toml | 3 +- README.md | 69 ++-- crates/hydra-api/Cargo.toml | 6 + crates/hydra-api/src/cpi.rs | 4 +- crates/hydra-api/src/lib.rs | 2 + .../hydra-api/src/program}/helpers.rs | 2 +- crates/hydra-api/src/program/mod.rs | 11 + crates/hydra-api/src/program/processor.rs | 372 +++++++++++++++++ programs/hydra-ephemeral/Cargo.toml | 33 ++ programs/hydra-ephemeral/src/entrypoint.rs | 74 ++++ programs/hydra-ephemeral/src/lib.rs | 8 + .../src/processor}/cancel.rs | 7 +- .../src/processor}/close.rs | 9 +- .../src/processor}/common.rs | 2 +- .../src/processor}/create.rs | 8 +- programs/hydra-ephemeral/src/processor/mod.rs | 12 + .../src/processor}/trigger.rs | 11 +- programs/hydra/Cargo.toml | 9 +- programs/hydra/src/lib.rs | 3 +- programs/hydra/src/processor/base/common.rs | 28 -- programs/hydra/src/processor/base/mod.rs | 8 - .../hydra/src/processor/{base => }/cancel.rs | 6 +- .../hydra/src/processor/{base => }/close.rs | 6 +- programs/hydra/src/processor/common.rs | 375 +----------------- .../hydra/src/processor/{base => }/create.rs | 8 +- programs/hydra/src/processor/ephemeral/mod.rs | 8 - programs/hydra/src/processor/mod.rs | 19 +- .../hydra/src/processor/{base => }/trigger.rs | 11 +- tests/e2e/tests/ephemeral_cranks.rs | 6 +- 31 files changed, 649 insertions(+), 501 deletions(-) rename {programs/hydra/src => crates/hydra-api/src/program}/helpers.rs (95%) create mode 100644 crates/hydra-api/src/program/mod.rs create mode 100644 crates/hydra-api/src/program/processor.rs create mode 100644 programs/hydra-ephemeral/Cargo.toml create mode 100644 programs/hydra-ephemeral/src/entrypoint.rs create mode 100644 programs/hydra-ephemeral/src/lib.rs rename programs/{hydra/src/processor/ephemeral => hydra-ephemeral/src/processor}/cancel.rs (80%) rename programs/{hydra/src/processor/ephemeral => hydra-ephemeral/src/processor}/close.rs (86%) rename programs/{hydra/src/processor/ephemeral => hydra-ephemeral/src/processor}/common.rs (90%) rename programs/{hydra/src/processor/ephemeral => hydra-ephemeral/src/processor}/create.rs (92%) create mode 100644 programs/hydra-ephemeral/src/processor/mod.rs rename programs/{hydra/src/processor/ephemeral => hydra-ephemeral/src/processor}/trigger.rs (92%) delete mode 100644 programs/hydra/src/processor/base/common.rs delete mode 100644 programs/hydra/src/processor/base/mod.rs rename programs/hydra/src/processor/{base => }/cancel.rs (67%) rename programs/hydra/src/processor/{base => }/close.rs (93%) rename programs/hydra/src/processor/{base => }/create.rs (95%) delete mode 100644 programs/hydra/src/processor/ephemeral/mod.rs rename programs/hydra/src/processor/{base => }/trigger.rs (96%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 13d2f5f..3ff70ac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,6 +73,7 @@ jobs: - name: Build on-chain programs run: | cargo build-sbf --manifest-path programs/hydra/Cargo.toml + cargo build-sbf --manifest-path programs/hydra-ephemeral/Cargo.toml cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml - name: Test @@ -85,7 +86,7 @@ jobs: # next to this repo. # --------------------------------------------------------------------------- ephemeral: - name: lint + test (ephemeral) + name: lint (ephemeral) runs-on: ubuntu-latest steps: - name: Checkout hydra @@ -115,22 +116,12 @@ jobs: - name: Clippy — program (ephemeral) working-directory: hydra - run: cargo clippy -p hydra --features ephemeral --all-targets -- -D warnings + run: cargo clippy -p hydra-ephemeral --all-targets -- -D warnings - name: Clippy — ephemeral test crate working-directory: hydra run: cargo clippy --manifest-path tests/ephemeral/Cargo.toml --all-targets -- -D warnings - - name: Build on-chain programs (ephemeral) - working-directory: hydra - run: | - cargo build-sbf --manifest-path programs/hydra/Cargo.toml -- --features ephemeral - cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml - - - name: Test — ephemeral lifecycle - working-directory: hydra - run: cargo nextest run --manifest-path tests/ephemeral/Cargo.toml - # --------------------------------------------------------------------------- # Live end-to-end: boots the real three-process stack (mb-test-validator + # ephemeral-validator + hydra-cranker) and asserts ephemeral cranks fire on @@ -180,7 +171,7 @@ jobs: - name: Build on-chain programs (ephemeral) run: | - cargo build-sbf --manifest-path programs/hydra/Cargo.toml -- --features ephemeral + cargo build-sbf --manifest-path programs/hydra-ephemeral/Cargo.toml cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml - name: Test — live ephemeral cranks diff --git a/Cargo.lock b/Cargo.lock index 4b9b5e4..4afd48d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2284,7 +2284,6 @@ dependencies = [ name = "hydra" version = "0.1.1" dependencies = [ - "ephemeral-rollups-pinocchio", "hydra-api", "pinocchio 0.10.2", "pinocchio-log", @@ -2301,6 +2300,7 @@ dependencies = [ "solana-account-info 3.1.1", "solana-address 2.6.1", "solana-cpi 3.1.0", + "solana-define-syscall 5.1.0", "solana-instruction 3.4.0", "solana-program-error 3.0.1", "solana-pubkey 4.2.0", @@ -2359,6 +2359,17 @@ dependencies = [ "solana-transaction 3.1.0", ] +[[package]] +name = "hydra-ephemeral" +version = "0.1.1" +dependencies = [ + "ephemeral-rollups-pinocchio", + "hydra-api", + "pinocchio 0.10.2", + "pinocchio-log", + "solana-define-syscall 5.1.0", +] + [[package]] name = "hydra-example-native" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 44b03e5..3b9b455 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ resolver = "2" default-members = ["programs/hydra"] members = [ "programs/hydra", + "programs/hydra-ephemeral", "crates/hydra-api", "crates/hydra-cranker", "tests", @@ -59,5 +60,5 @@ overflow-checks = true [workspace.lints.rust] unexpected_cfgs = { level = "warn", check-cfg = [ 'cfg(target_os, values("solana"))', - 'cfg(feature, values("create-account-allow-prefund", "custom-alloc", "custom-panic", "no-entrypoint", "logging", "ephemeral"))', + 'cfg(feature, values("create-account-allow-prefund", "custom-alloc", "custom-panic", "no-entrypoint", "logging", "ephemeral", "program"))', ] } diff --git a/README.md b/README.md index b89a6c5..0b8f55e 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ Examples: ## Creating a Crank ```rust -use hydra_api::instruction::{self as ix, CreateArgs, ScheduledIx}; +use hydra_api::instruction::{base as ix, CreateArgs, ScheduledIx}; let seed = [0x42u8; 32]; let (crank, _bump) = ix::find_crank_pda(&seed); @@ -270,9 +270,19 @@ Useful alerts: ## Instruction Reference -Discriminators `0–3` are the base-layer crank. Discriminators `4–7` are the -[ephemeral-rollup crank](#ephemeral-rollup-crank-feature-ephemeral), compiled -only under the `ephemeral` feature. +Hydra ships as **two on-chain programs** that share the same discriminators +(`0–3`) and on-chain `Crank` layout, distinguished by program ID: + +- `hydra` (`Hydra17…`) — the base-layer crank, in `programs/hydra`. +- `hydra-ephemeral` (`eHyd5…`) — the + [ephemeral-rollup crank](#ephemeral-rollup-crank-hydra-ephemeral-program), in + `programs/hydra-ephemeral`. + +The instruction-parsing, tail-serialization and follow-up-verification logic is +shared between them via [`hydra_api::program`] (behind the api crate's `program` +feature); each program only carries its own account-funding model. + +The base-layer (`hydra`) instructions: | Disc | Name | Accounts | Data | | ---: | --------- | --------------------------------------------- | ---------------- | @@ -292,13 +302,15 @@ the crank PDA — no dedicated instruction exists. - `MAX_DATA_LEN = 1024` - reward is fixed at `10_000` lamports plus the stored priority tip -## Ephemeral Rollup Crank (feature `ephemeral`) +## Ephemeral Rollup Crank (`hydra-ephemeral` program) -Behind the optional `ephemeral` cargo feature, Hydra exposes a parallel set of -instructions that run a crank on a [MagicBlock](https://magicblock.gg) **ephemeral -rollup (ER)**, where the crank lives as a MagicBlock **ephemeral account** instead -of a base-layer PDA. The default (mainnet) build neither compiles this code nor -pulls its dependency (`ephemeral-rollups-pinocchio`). +The separate `hydra-ephemeral` program (ID `eHyd5…`, crate +`programs/hydra-ephemeral`) runs a crank on a +[MagicBlock](https://magicblock.gg) **ephemeral rollup (ER)**, where the crank +lives as a MagicBlock **ephemeral account** instead of a base-layer PDA. The +base-layer `hydra` program neither contains this code nor depends on +`ephemeral-rollups-pinocchio`; the two programs share their schedule/verify +logic through [`hydra_api::program`]. The model is the same as the base crank — a crank stores scheduled instructions, anyone triggers them when due, and `Trigger` verifies the follow-up siblings with @@ -306,16 +318,16 @@ the same single `memcmp` — with two differences the ER forces: - **Ephemeral accounts hold zero lamports.** Rent (a flat per-byte fee) is paid by a sponsor into a shared vault, not held in the account. So there is no cranker - reward, no priority-tip payout, and no rent floor: `TriggerEphemeral` only + reward, no priority-tip payout, and no rent floor: the ephemeral `Trigger` only verifies the follow-up ix and advances the schedule (slot check, decrement `remaining`, bump `executed`). - **Creation is a single instruction.** The Magic program materializes the - ephemeral account synchronously, so `CreateEphemeral` allocates the crank (via a + ephemeral account synchronously, so `Create` allocates the crank (via a Magic CPI signed by the crank PDA) and writes its header + scheduled-ix tail in one instruction — no separate init step. -Lifecycle: `CreateEphemeral` → `TriggerEphemeral` (+ scheduled siblings, run -top-level on the ER) → `CancelEphemeral` (authority-gated) / `CloseEphemeral` +Lifecycle: `Create` → `Trigger` (+ scheduled siblings, run +top-level on the ER) → `Cancel` (authority-gated) / `Close` (permissionless, when the crank is exhausted or stuck). `Cancel`/`Close` CPI the Magic program to close the ephemeral account and refund the vault rent to the sponsor; if a non-zero `authority` is set, only that authority may close it. The @@ -324,25 +336,29 @@ unchanged, so the template / verification model is identical. ### Instruction Reference (ephemeral) -| Disc | Name | Accounts | Data | -| ---: | ------------------ | --------------------------------------------------- | ---------------- | -| 4 | `CreateEphemeral` | `sponsor(w,s), crank(w), vault(w), magic_program` | schedule payload | -| 5 | `TriggerEphemeral` | `crank(w), cranker(w,s), instructions_sysvar` | none | -| 6 | `CancelEphemeral` | `authority(w,s), crank(w), vault(w), magic_program` | none | -| 7 | `CloseEphemeral` | `reporter(w,s), crank(w), vault(w), magic_program` | none | +Same discriminators as the base program (`0–3`); the account shapes differ +because creation/close go through the Magic program rather than the System +program. + +| Disc | Name | Accounts | Data | +| ---: | --------- | --------------------------------------------------- | ---------------- | +| 0 | `Create` | `sponsor(w,s), crank(w), vault(w), magic_program` | schedule payload | +| 1 | `Trigger` | `crank(w), cranker(w,s), instructions_sysvar` | none | +| 2 | `Cancel` | `authority(w,s), crank(w), vault(w), magic_program` | none | +| 3 | `Close` | `reporter(w,s), crank(w), vault(w), magic_program` | none | `vault` is the ephemeral rent vault and `magic_program` is MagicBlock's Magic program; `hydra-api` exposes both as `consts::magic::EPHEMERAL_VAULT_ID` / `MAGIC_PROGRAM_ID`, and the `client`-feature builder fills them in. `sponsor` must be an account delegated to the ER (it pays the rent and sets `authority_signer`). -Build a `CreateEphemeral` with the same `CreateArgs` as base `create`: +Build an ephemeral `Create` with the same `CreateArgs` as base `create`: ```rust -use hydra_api::instruction::{self as ix, CreateArgs, ScheduledIx}; +use hydra_api::instruction::{ephemeral as ix, CreateArgs, ScheduledIx}; let (crank, _bump) = ix::find_crank_pda(&seed); -let create = ix::create_ephemeral( +let create = ix::create( sponsor_pubkey, crank, &CreateArgs { seed, authority, start_slot: 0, interval_slots: 50, @@ -366,7 +382,7 @@ npm install -g @magicblock-labs/ephemeral-validator # mb-test-validator + ephe # Build the on-chain artifacts the rollup clones (the hydra-cranker is built # automatically by the test and run with `--ephemeral`). -cargo build-sbf -- --features ephemeral +cargo build-sbf --manifest-path programs/hydra-ephemeral/Cargo.toml cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml # The test is `#[ignore]` (it spawns external validators); run it explicitly. @@ -377,8 +393,9 @@ CI runs this as the `e2e` job in `.github/workflows/ci.yml`. ## Releasing -`hydra-api` is the only crate published to crates.io (`hydra` is a program, -not a library; `hydra-cranker` / the examples are workspace-local). +`hydra-api` is the only crate published to crates.io (`hydra` and +`hydra-ephemeral` are programs, not libraries; `hydra-cranker` / the examples +are workspace-local). Release flow: diff --git a/crates/hydra-api/Cargo.toml b/crates/hydra-api/Cargo.toml index 806bc50..17f1663 100644 --- a/crates/hydra-api/Cargo.toml +++ b/crates/hydra-api/Cargo.toml @@ -24,11 +24,17 @@ cpi-native = [ # `pinocchio::cpi::invoke_signed` with `InstructionView`s built on the # stack (no allocations, usable from `no_std` programs). cpi-pinocchio = ["pinocchio/cpi", "dep:solana-program-error"] +# Shared on-chain processor building blocks (schedule parsing, tail +# serialization, follow-up verification, sysvar syscalls) consumed by the +# `programs/hydra` and `programs/hydra-ephemeral` program crates. Pulls in +# `solana-define-syscall` for the raw Clock / stack-height reads. +program = ["pinocchio/cpi", "dep:solana-define-syscall"] [dependencies] ephemeral-rollups-pinocchio = { workspace = true } pinocchio = { workspace = true } solana-address = { workspace = true } +solana-define-syscall = { workspace = true, optional = true } solana-instruction = { workspace = true, optional = true } solana-pubkey = { workspace = true, optional = true } solana-account-info = { version = "3", optional = true } diff --git a/crates/hydra-api/src/cpi.rs b/crates/hydra-api/src/cpi.rs index 9e1497d..5cd12dc 100644 --- a/crates/hydra-api/src/cpi.rs +++ b/crates/hydra-api/src/cpi.rs @@ -99,7 +99,7 @@ pub mod base { use crate::{consts::ix as disc, instruction::CREATE_FIXED_PREFIX_LEN}; #[inline] - pub fn create<'a, const N: usize>( + pub fn create( payer: &AccountView, crank: &AccountView, system_program: &AccountView, @@ -265,7 +265,7 @@ pub mod ephemeral { }; #[inline] - pub fn create<'a, const N: usize>( + pub fn create( payer: &AccountView, crank: &AccountView, system_program: &AccountView, diff --git a/crates/hydra-api/src/lib.rs b/crates/hydra-api/src/lib.rs index 266476d..2ce5c4e 100644 --- a/crates/hydra-api/src/lib.rs +++ b/crates/hydra-api/src/lib.rs @@ -10,6 +10,8 @@ pub mod consts; pub mod cpi; pub mod error; pub mod instruction; +#[cfg(feature = "program")] +pub mod program; pub mod state; pub use consts::*; diff --git a/programs/hydra/src/helpers.rs b/crates/hydra-api/src/program/helpers.rs similarity index 95% rename from programs/hydra/src/helpers.rs rename to crates/hydra-api/src/program/helpers.rs index f623828..6576553 100644 --- a/programs/hydra/src/helpers.rs +++ b/crates/hydra-api/src/program/helpers.rs @@ -1,4 +1,4 @@ -//! Tiny utilities that don't fit into any one processor. +//! Tiny syscall utilities shared by the on-chain processors. use pinocchio::error::ProgramError; #[cfg(target_os = "solana")] diff --git a/crates/hydra-api/src/program/mod.rs b/crates/hydra-api/src/program/mod.rs new file mode 100644 index 0000000..88f7bff --- /dev/null +++ b/crates/hydra-api/src/program/mod.rs @@ -0,0 +1,11 @@ +//! On-chain building blocks shared by the base-layer and ephemeral-rollup Hydra +//! programs. Gated behind the `program` feature so client/CPI consumers don't +//! pull the pinocchio-flavoured processor code (or `solana-define-syscall`). +//! +//! Each program crate (`programs/hydra`, `programs/hydra-ephemeral`) keeps only +//! its CPI-funding-model-specific handlers; everything that is identical across +//! the two ledgers — schedule parsing, tail serialization, follow-up +//! verification, the sysvar syscalls — lives here. + +pub mod helpers; +pub mod processor; diff --git a/crates/hydra-api/src/program/processor.rs b/crates/hydra-api/src/program/processor.rs new file mode 100644 index 0000000..2b11da0 --- /dev/null +++ b/crates/hydra-api/src/program/processor.rs @@ -0,0 +1,372 @@ +//! Shared helpers for the on-chain crank processors (base + ephemeral). +//! +//! These building blocks are program-agnostic: every function that needs the +//! caller's program id takes it as a parameter, so both the base-layer and the +//! ephemeral-rollup programs link the exact same code here. + +use pinocchio::{error::ProgramError, AccountView, Address, ProgramResult}; + +use crate::{ + consts::{ + CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, MAX_DATA_LEN, MAX_INSTRUCTIONS, + META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, + }, + instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, + state::{load_crank, load_crank_mut, Crank}, + HydraError, CRANK_HEADER_SIZE, +}; + +/// `signer` must sign and `crank` must be Hydra-owned — the preamble of every +/// `Cancel` / `Close` path. +pub fn require_signed_crank( + signer: &AccountView, + crank_ai: &AccountView, + program_id: &Address, +) -> ProgramResult { + if !signer.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + if !crank_ai.owned_by(program_id) { + return Err(ProgramError::InvalidAccountOwner); + } + Ok(()) +} + +/// Anti-grief: when a crank has a non-zero authority, only that authority may +/// receive the rent refund. Shared by base and ephemeral `Close`. +pub fn require_refund_recipient( + stored_authority: [u8; 32], + recipient: &AccountView, +) -> ProgramResult { + if stored_authority != [0u8; 32] && recipient.address().as_array() != &stored_authority { + return Err(HydraError::UnauthorizedAuthority.into()); + } + Ok(()) +} + +/// Authority-gated close preamble shared by base `Cancel` and `CancelEphemeral`: +/// `authority` signs a Hydra-owned crank and matches its stored (non-zero) +/// authority. +pub fn require_cancel_authority( + authority: &AccountView, + crank_ai: &AccountView, + program_id: &Address, +) -> ProgramResult { + require_signed_crank(authority, crank_ai, program_id)?; + let stored = { + let data = crank_ai.try_borrow()?; + unsafe { load_crank(&data)? }.authority + }; + if stored == [0u8; 32] || authority.address().as_array() != &stored { + return Err(HydraError::UnauthorizedAuthority.into()); + } + Ok(()) +} + +/// The fixed-size scheduling prefix of a `Create` / `CreateEphemeral` payload. +/// `next_exec` / `interval` are slots for base-layer cranks and milliseconds for +/// ephemeral-rollup cranks; the bytes are identical either way. +pub struct CreateHeader { + pub seed: [u8; 32], + pub authority: [u8; 32], + pub next_exec: u64, + pub interval: u64, + pub remaining_wire: u64, + pub priority_tip: u64, + pub cu_limit: u32, +} + +/// Parse + validate the fixed prefix of a `Create` payload. Requires at least +/// the prefix plus one scheduled-ix blob header. +pub fn parse_create_header(data: &[u8]) -> Result { + if data.len() < CREATE_FIXED_PREFIX_LEN + CREATE_IX_HEADER_LEN { + return Err(ProgramError::InvalidInstructionData); + } + // SAFETY: bounds checked above; the reads only require byte alignment. + let header = CreateHeader { + seed: unsafe { *(data.as_ptr() as *const [u8; 32]) }, + authority: unsafe { *(data.as_ptr().add(32) as *const [u8; 32]) }, + next_exec: read_u64_le(data, 64), + interval: read_u64_le(data, 72), + remaining_wire: read_u64_le(data, 80), + priority_tip: read_u64_le(data, 88), + cu_limit: read_u32_le(data, 96), + }; + // `0` opts out of `SetComputeUnitLimit`; non-zero must fit the per-tx ceiling. + if header.cu_limit > MAX_COMPUTE_UNIT_LIMIT { + return Err(HydraError::InvalidSchedule.into()); + } + // A never-advancing infinite crank makes no sense. + if header.remaining_wire == 0 && header.interval == 0 { + return Err(HydraError::InvalidSchedule.into()); + } + Ok(header) +} + +/// Write the parsed prefix + computed fields into a freshly-allocated crank +/// header. `rent_min` is the cached rent floor for base cranks and `0` for +/// ephemeral cranks (which hold no lamports). +#[inline(always)] +pub fn write_header( + state: &mut Crank, + h: &CreateHeader, + bump: u8, + authority_signer: u8, + rent_min: u64, + region_len: u16, +) { + state.authority = h.authority; + state.seed = h.seed; + state.set_next_exec_slot(h.next_exec); + state.set_interval_slots(h.interval); + state.set_remaining(if h.remaining_wire == 0 { + REMAINING_INFINITE + } else { + h.remaining_wire + }); + state.set_priority_tip(h.priority_tip); + state.set_executed(0); + state.set_rent_min(rent_min); + state.set_region_len(region_len); + state.bump = bump; + state.set_cu_limit(h.cu_limit); + state.authority_signer = authority_signer; +} + +/// The scheduled-ix tail must fit `Crank.region_len` (a `u16`). +const MAX_REGION_LEN: usize = u16::MAX as usize; + +/// Measure the exact tail length the scheduled ixs serialize to, validating the +/// per-ix structure, the instruction-count limit, and the `region_len` ceiling +/// in a single pass. Mirrors the byte accounting in [`write_tail`] so the caller +/// can allocate the precise account size up front; `write_tail` then re-validates +/// (incl. signer flags) and writes, yielding the same length. +pub fn measure_region(data: &[u8]) -> Result { + let mut cursor = CREATE_FIXED_PREFIX_LEN; + let mut region_len = 0usize; + let mut num_instructions = 0usize; + + while cursor < data.len() { + let (num_accounts, data_len, next) = parse_ix_header(data, cursor)?; + num_instructions += 1; + if num_instructions > MAX_INSTRUCTIONS { + return Err(HydraError::InvalidSchedule.into()); + } + let metas_len = num_accounts * SERIALIZED_META_SIZE; + // [num_accounts u16][metas][program_id 32][data_len u16][data] + region_len += 2 + metas_len + 32 + 2 + data_len; + cursor = next; + } + + if region_len > MAX_REGION_LEN { + return Err(HydraError::InvalidSchedule.into()); + } + Ok(region_len) +} + +/// Derive the crank PDA from `[CRANK_SEED_PREFIX, seed]` and verify it matches +/// the supplied account, returning the bump for the create CPI's signer seeds. +/// Shared by both `Create` paths. +pub fn derive_crank_pda( + crank_ai: &AccountView, + seed: &[u8; 32], + program_id: &Address, +) -> Result { + let (expected_pda, bump) = + Address::find_program_address(&[CRANK_SEED_PREFIX, seed], program_id); + if crank_ai.address() != &expected_pda { + return Err(ProgramError::InvalidSeeds); + } + Ok(bump) +} + +/// Finalize a freshly-allocated crank account: serialize the scheduled-ix tail +/// and write the header. The account must already be sized to +/// `CRANK_HEADER_SIZE + region_len`; `rent_min` is the cached rent floor for base +/// cranks and `0` for ephemeral cranks (which hold no lamports). Shared by both +/// `Create` paths. +pub fn write_crank( + crank_ai: &AccountView, + data: &[u8], + header: &CreateHeader, + bump: u8, + authority_signer: u8, + rent_min: u64, + region_len: usize, +) -> ProgramResult { + let mut account_data = crank_ai.try_borrow_mut()?; + let buf: &mut [u8] = &mut account_data; + if buf.len() < CRANK_HEADER_SIZE { + return Err(ProgramError::AccountDataTooSmall); + } + let (header_bytes, tail_bytes) = buf.split_at_mut(CRANK_HEADER_SIZE); + + let written = write_tail(tail_bytes, data)?; + if written != region_len { + return Err(HydraError::InvalidSchedule.into()); + } + + // SAFETY: split yields CRANK_HEADER_SIZE bytes; Crank is align-1 (compile-time checked). + let state = unsafe { load_crank_mut(header_bytes)? }; + write_header( + state, + header, + bump, + authority_signer, + rent_min, + region_len as u16, + ); + Ok(()) +} + +/// Validate + serialize the scheduled ixs of a `Create` payload into `tail`, +/// returning the bytes written. Every write is bounds-checked against +/// `tail.len()` so a wrongly-sized account fails cleanly instead of writing out +/// of bounds. +/// +/// Mirrors the tail layout produced by `processor::create` — see that file for +/// the wire format. Kept separate so the audited base path stays untouched. +pub fn write_tail(tail: &mut [u8], data: &[u8]) -> Result { + let cap = tail.len(); + let mut cursor = CREATE_FIXED_PREFIX_LEN; + let mut off = 0usize; + let mut num_instructions = 0usize; + + while cursor < data.len() { + let (num_accounts, data_len, next) = parse_ix_header(data, cursor)?; + num_instructions += 1; + if num_instructions > MAX_INSTRUCTIONS { + return Err(HydraError::InvalidSchedule.into()); + } + let metas_offset = cursor + CREATE_IX_HEADER_LEN; + let metas_len = num_accounts * SERIALIZED_META_SIZE; + let data_offset = metas_offset + metas_len; + // Scheduled ixs run top-level; reject any signer flag. + for i in 0..num_accounts { + if data[metas_offset + i * SERIALIZED_META_SIZE] & META_FLAG_SIGNER != 0 { + return Err(HydraError::SignerInScheduledIx.into()); + } + } + + // [num_accounts u16][metas][program_id 32][data_len u16][data] + let blob_len = 2 + metas_len + 32 + 2 + data_len; + if off + blob_len > cap { + return Err(ProgramError::AccountDataTooSmall); + } + tail[off..off + 2].copy_from_slice(&(num_accounts as u16).to_le_bytes()); + off += 2; + tail[off..off + metas_len].copy_from_slice(&data[metas_offset..data_offset]); + off += metas_len; + tail[off..off + 32].copy_from_slice(&data[cursor + 3..cursor + CREATE_IX_HEADER_LEN]); + off += 32; + tail[off..off + 2].copy_from_slice(&(data_len as u16).to_le_bytes()); + off += 2; + tail[off..off + data_len].copy_from_slice(&data[data_offset..next]); + off += data_len; + + cursor = next; + } + + Ok(off) +} + +/// Parse one scheduled-ix blob header at `cursor`, validating limits and bounds. +/// Returns `(num_accounts, data_len, next_cursor)`. +#[inline(always)] +pub fn parse_ix_header(data: &[u8], cursor: usize) -> Result<(usize, usize, usize), ProgramError> { + if cursor + CREATE_IX_HEADER_LEN > data.len() { + return Err(ProgramError::InvalidInstructionData); + } + let num_accounts = data[cursor] as usize; + let data_len = u16::from_le_bytes([data[cursor + 1], data[cursor + 2]]) as usize; + if num_accounts > MAX_ACCOUNTS || data_len > MAX_DATA_LEN { + return Err(HydraError::InvalidSchedule.into()); + } + let metas_len = num_accounts * SERIALIZED_META_SIZE; + let next = cursor + CREATE_IX_HEADER_LEN + metas_len + data_len; + if next > data.len() { + return Err(ProgramError::InvalidInstructionData); + } + Ok((num_accounts, data_len, next)) +} + +/// Parse the instructions sysvar, locate the region for +/// `current_ix_index + 1`, and byte-compare it against the crank's stored tail. +/// +/// Shared with the ephemeral-rollup `TriggerEphemeral` handler — the +/// follow-up binding is identical on both ledgers. +#[inline(always)] +pub fn verify_followup( + sysvar: &AccountView, + crank: &AccountView, + region_len: usize, +) -> ProgramResult { + // SAFETY: we're in a linear entrypoint flow with no outstanding borrows + // on either account. pinocchio's `borrow_unchecked` skips the refcell + // bookkeeping, which saves a handful of CUs per call. + let sv: &[u8] = unsafe { sysvar.borrow_unchecked() }; + let cr: &[u8] = unsafe { crank.borrow_unchecked() }; + + let sv_len = sv.len(); + if sv_len < 4 { + return Err(ProgramError::InvalidAccountData); + } + + // [len-2..len] = current_ix_index (u16 LE) + let current = unsafe { read_u16(sv.as_ptr().add(sv_len - 2)) } as usize; + let target = current + .checked_add(1) + .ok_or(HydraError::MissingFollowupInstruction)?; + + // [0..2] = num_instructions (u16 LE) + let num_ix = unsafe { read_u16(sv.as_ptr()) } as usize; + if target >= num_ix { + return Err(HydraError::MissingFollowupInstruction.into()); + } + + // [2 + 2*target..+2] = offset of instruction `target`'s region. + let off_pos = 2 + 2 * target; + if off_pos + 2 > sv_len { + return Err(ProgramError::InvalidAccountData); + } + let region_start = unsafe { read_u16(sv.as_ptr().add(off_pos)) } as usize; + let region_end = region_start + .checked_add(region_len) + .ok_or(HydraError::MismatchedFollowupIx)?; + if region_end > sv_len.saturating_sub(2) { + return Err(HydraError::MismatchedFollowupIx.into()); + } + + let tail_end = CRANK_HEADER_SIZE + .checked_add(region_len) + .ok_or(ProgramError::InvalidAccountData)?; + if tail_end > cr.len() { + return Err(ProgramError::InvalidAccountData); + } + let tail = &cr[CRANK_HEADER_SIZE..tail_end]; + let sv_region = &sv[region_start..region_end]; + + if sv_region != tail { + return Err(HydraError::MismatchedFollowupIx.into()); + } + Ok(()) +} + +#[inline(always)] +pub fn read_u64_le(data: &[u8], offset: usize) -> u64 { + // SAFETY: the caller ensures `offset + 8 <= data.len()`. + unsafe { u64::from_le_bytes(*(data.as_ptr().add(offset) as *const [u8; 8])) } +} + +#[inline(always)] +pub fn read_u32_le(data: &[u8], offset: usize) -> u32 { + // SAFETY: the caller ensures `offset + 4 <= data.len()`. + unsafe { u32::from_le_bytes(*(data.as_ptr().add(offset) as *const [u8; 4])) } +} + +/// # Safety +/// `p` must point to at least 2 readable bytes; the read is unaligned-safe. +#[inline(always)] +pub unsafe fn read_u16(p: *const u8) -> u16 { + core::ptr::read_unaligned(p as *const u16) +} diff --git a/programs/hydra-ephemeral/Cargo.toml b/programs/hydra-ephemeral/Cargo.toml new file mode 100644 index 0000000..d87c573 --- /dev/null +++ b/programs/hydra-ephemeral/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "hydra-ephemeral" +version.workspace = true +edition.workspace = true +license.workspace = true +description = "Hydra — permissionless crank for MagicBlock ephemeral rollups" + +[lib] +crate-type = ["cdylib"] + +[features] +default = [] +# Gates all `pinocchio_log::log!` invocations at compile time so release +# builds emit no log strings. +logging = [] +# Skip the on-chain entrypoint when this crate is consumed as a library +# (e.g. by integration tests that already loaded the .so separately). +no-entrypoint = [] + +[dependencies] +pinocchio = { workspace = true } +pinocchio-log = { workspace = true } +# CPI helpers for MagicBlock ephemeral accounts — the funding model that +# distinguishes this program from the base-layer `hydra` crate. +ephemeral-rollups-pinocchio = { workspace = true } +solana-define-syscall = { workspace = true } +hydra-api = { workspace = true, features = ["program"] } + +[package.metadata.solana] +program-id = "eHyd5BU8QffvHi4GnXwxrK4WpS7pM2x9UGKHBWii7mf" + +[lints] +workspace = true diff --git a/programs/hydra-ephemeral/src/entrypoint.rs b/programs/hydra-ephemeral/src/entrypoint.rs new file mode 100644 index 0000000..49ccf37 --- /dev/null +++ b/programs/hydra-ephemeral/src/entrypoint.rs @@ -0,0 +1,74 @@ +//! Program entrypoint and top-level discriminator dispatcher. + +use pinocchio::error::ProgramError; +use pinocchio::{ + no_allocator, nostd_panic_handler, program_entrypoint, AccountView, Address, ProgramResult, +}; + +use hydra_api::{consts::ix, HydraError}; + +use crate::processor; + +program_entrypoint!(process_instruction); +no_allocator!(); +nostd_panic_handler!(); + +pub fn process_instruction( + _program_id: &Address, + accounts: &[AccountView], + instruction_data: &[u8], +) -> ProgramResult { + inner_process_instruction(accounts, instruction_data).inspect_err(log_error) +} + +#[inline(never)] +fn inner_process_instruction(accounts: &[AccountView], instruction_data: &[u8]) -> ProgramResult { + let [discriminator, rest @ ..] = instruction_data else { + return Err(HydraError::InvalidInstruction.into()); + }; + + match *discriminator { + ix::CREATE => { + #[cfg(feature = "logging")] + pinocchio_log::log!("ix: Create"); + processor::create::process(accounts, rest) + } + ix::TRIGGER => { + #[cfg(feature = "logging")] + pinocchio_log::log!("ix: Trigger"); + processor::trigger::process(accounts, rest) + } + ix::CANCEL => { + #[cfg(feature = "logging")] + pinocchio_log::log!("ix: Cancel"); + processor::cancel::process(accounts, rest) + } + ix::CLOSE => { + #[cfg(feature = "logging")] + pinocchio_log::log!("ix: Close"); + processor::close::process(accounts, rest) + } + _ => Err(HydraError::InvalidInstruction.into()), + } +} + +#[cold] +fn log_error(_error: &ProgramError) { + // When `logging` is off, this is a no-op: zero CU on the error path, + // and the raw `ProgramError` propagates to the runtime. When `logging` + // is on, emit the variant's name (including `HydraError::*` for Custom + // values) through the `sol_log_` syscall — no `format!`, no alloc. + #[cfg(feature = "logging")] + { + // `to_str` is an inherent method on `ProgramError` that internally + // calls `HydraError::to_str` (defined in hydra-api::error) for + // `ProgramError::Custom(n)` values. + let msg: &'static str = _error.to_str::(); + #[cfg(target_os = "solana")] + // SAFETY: sol_log_ takes (ptr, len) of a byte buffer the syscall + // reads read-only for the duration of the call. + unsafe { + solana_define_syscall::definitions::sol_log_(msg.as_ptr(), msg.len() as u64); + } + } +} diff --git a/programs/hydra-ephemeral/src/lib.rs b/programs/hydra-ephemeral/src/lib.rs new file mode 100644 index 0000000..86d0077 --- /dev/null +++ b/programs/hydra-ephemeral/src/lib.rs @@ -0,0 +1,8 @@ +#![no_std] + +#[cfg(not(feature = "no-entrypoint"))] +mod entrypoint; + +mod processor; + +pub use hydra_api::ephemeral::*; diff --git a/programs/hydra/src/processor/ephemeral/cancel.rs b/programs/hydra-ephemeral/src/processor/cancel.rs similarity index 80% rename from programs/hydra/src/processor/ephemeral/cancel.rs rename to programs/hydra-ephemeral/src/processor/cancel.rs index 400a926..4eb91b7 100644 --- a/programs/hydra/src/processor/ephemeral/cancel.rs +++ b/programs/hydra-ephemeral/src/processor/cancel.rs @@ -8,15 +8,16 @@ use ephemeral_rollups_pinocchio::ephemeral_accounts::EphemeralAccount; use pinocchio::{error::ProgramError, AccountView, ProgramResult}; -use crate::processor::common::require_cancel_authority; -use crate::processor::ephemeral::common::check_magic_accounts; +use hydra_api::program::processor::require_cancel_authority; + +use crate::processor::common::check_magic_accounts; pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { let [authority, crank_ai, vault, magic_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - require_cancel_authority(authority, crank_ai, &hydra_api::ephemeral::ID)?; + require_cancel_authority(authority, crank_ai, &crate::ID)?; check_magic_accounts(vault, magic_program)?; // The ephemeral account need not sign on close; `authority` is the sponsor diff --git a/programs/hydra/src/processor/ephemeral/close.rs b/programs/hydra-ephemeral/src/processor/close.rs similarity index 86% rename from programs/hydra/src/processor/ephemeral/close.rs rename to programs/hydra-ephemeral/src/processor/close.rs index 126b72b..64fd53c 100644 --- a/programs/hydra/src/processor/ephemeral/close.rs +++ b/programs/hydra-ephemeral/src/processor/close.rs @@ -12,16 +12,17 @@ use pinocchio::{error::ProgramError, AccountView, ProgramResult}; use hydra_api::{state::load_crank, HydraError, STALENESS_THRESHOLD_SLOTS}; -use crate::helpers::get_clock_slot; -use crate::processor::common::{require_refund_recipient, require_signed_crank}; -use crate::processor::ephemeral::common::check_magic_accounts; +use hydra_api::program::helpers::get_clock_slot; +use hydra_api::program::processor::{require_refund_recipient, require_signed_crank}; + +use crate::processor::common::check_magic_accounts; pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { let [reporter, crank_ai, vault, magic_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - require_signed_crank(reporter, crank_ai, &hydra_api::ephemeral::ID)?; + require_signed_crank(reporter, crank_ai, &crate::ID)?; check_magic_accounts(vault, magic_program)?; let (stored_authority, remaining, next_exec_slot) = { diff --git a/programs/hydra/src/processor/ephemeral/common.rs b/programs/hydra-ephemeral/src/processor/common.rs similarity index 90% rename from programs/hydra/src/processor/ephemeral/common.rs rename to programs/hydra-ephemeral/src/processor/common.rs index 13461c2..fb94f31 100644 --- a/programs/hydra/src/processor/ephemeral/common.rs +++ b/programs/hydra-ephemeral/src/processor/common.rs @@ -1,4 +1,4 @@ -//! Shared helpers for the ephemeral-rollup crank processors. +//! Helpers specific to the ephemeral-rollup crank processors. use ephemeral_rollups_pinocchio::consts::{EPHEMERAL_VAULT_ID, MAGIC_PROGRAM_ID}; use pinocchio::{error::ProgramError, AccountView, ProgramResult}; diff --git a/programs/hydra/src/processor/ephemeral/create.rs b/programs/hydra-ephemeral/src/processor/create.rs similarity index 92% rename from programs/hydra/src/processor/ephemeral/create.rs rename to programs/hydra-ephemeral/src/processor/create.rs index 48e8569..1cbe79a 100644 --- a/programs/hydra/src/processor/ephemeral/create.rs +++ b/programs/hydra-ephemeral/src/processor/create.rs @@ -16,11 +16,11 @@ use pinocchio::{ }; use hydra_api::consts::{CRANK_HEADER_SIZE, CRANK_SEED_PREFIX}; - -use crate::processor::common::{ +use hydra_api::program::processor::{ derive_crank_pda, measure_region, parse_create_header, write_crank, }; -use crate::processor::ephemeral::common::check_magic_accounts; + +use crate::processor::common::check_magic_accounts; pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { let [sponsor, crank_ai, vault, magic_program] = accounts else { @@ -36,7 +36,7 @@ pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { // Size the account from the scheduled ixs (validates the schedule), then // allocate it. The exact tail is written below. let region_len = measure_region(data)?; - let bump = derive_crank_pda(crank_ai, &header.seed, &hydra_api::ephemeral::ID)?; + let bump = derive_crank_pda(crank_ai, &header.seed, &crate::ID)?; let data_len = CRANK_HEADER_SIZE + region_len; // The crank PDA must sign the create CPI (the ephemeral account is a signer diff --git a/programs/hydra-ephemeral/src/processor/mod.rs b/programs/hydra-ephemeral/src/processor/mod.rs new file mode 100644 index 0000000..f4af781 --- /dev/null +++ b/programs/hydra-ephemeral/src/processor/mod.rs @@ -0,0 +1,12 @@ +//! Ephemeral-rollup crank lifecycle. +//! +//! Schedule parsing, tail serialization and follow-up verification are shared +//! with the base-layer program via [`hydra_api::program`]; only the MagicBlock +//! ephemeral-account funding model lives here. + +pub mod cancel; +pub mod close; +pub mod create; +pub mod trigger; + +mod common; diff --git a/programs/hydra/src/processor/ephemeral/trigger.rs b/programs/hydra-ephemeral/src/processor/trigger.rs similarity index 92% rename from programs/hydra/src/processor/ephemeral/trigger.rs rename to programs/hydra-ephemeral/src/processor/trigger.rs index 1d37a87..bbfa592 100644 --- a/programs/hydra/src/processor/ephemeral/trigger.rs +++ b/programs/hydra-ephemeral/src/processor/trigger.rs @@ -12,15 +12,14 @@ use pinocchio::{ use hydra_api::{ consts::REMAINING_INFINITE, + program::{ + helpers::{get_clock_slot, get_stack_height, TRANSACTION_LEVEL_STACK_HEIGHT}, + processor::verify_followup, + }, state::{load_crank, load_crank_mut}, HydraError, }; -use crate::{ - helpers::{get_clock_slot, get_stack_height, TRANSACTION_LEVEL_STACK_HEIGHT}, - processor::common::verify_followup, -}; - pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { let [crank_ai, cranker_ai, ix_sysvar_ai] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); @@ -29,7 +28,7 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { if !cranker_ai.is_signer() { return Err(ProgramError::MissingRequiredSignature); } - if !crank_ai.owned_by(&hydra_api::ephemeral::ID) { + if !crank_ai.owned_by(&crate::ID) { return Err(ProgramError::InvalidAccountOwner); } if ix_sysvar_ai.address() != &INSTRUCTIONS_ID { diff --git a/programs/hydra/Cargo.toml b/programs/hydra/Cargo.toml index 74f8663..59f6c3d 100644 --- a/programs/hydra/Cargo.toml +++ b/programs/hydra/Cargo.toml @@ -23,20 +23,15 @@ cu-trace = [] # Uses the SIMD-0312 System Program instruction for prefunded crank PDAs. # Keep this disabled on mainnet until `create_account_allow_prefund` is active. # NOTE: requires pinocchio-system >= 0.6 (`CreateAccountAllowPrefund`), which is -# incompatible with the pinocchio 0.10 pin needed for ephemeral support. +# incompatible with the pinocchio 0.10 pin the ephemeral program needs. create-account-allow-prefund = [] -# Ephemeral-rollup crank instructions: schedule/run cranks that live as -# MagicBlock ephemeral accounts on the ephemeral rollup. Pulls in the -# `ephemeral-rollups-pinocchio` CPI helpers. -ephemeral = ["dep:ephemeral-rollups-pinocchio"] [dependencies] pinocchio = { workspace = true } pinocchio-system = { workspace = true } pinocchio-log = { workspace = true } -ephemeral-rollups-pinocchio = { workspace = true, optional = true } solana-define-syscall = { workspace = true } -hydra-api = { workspace = true } +hydra-api = { workspace = true, features = ["program"] } [package.metadata.solana] program-id = "Hydra17i1feui9deaxu6d1TzSQMRNHeBRkDR1Awy7zea" diff --git a/programs/hydra/src/lib.rs b/programs/hydra/src/lib.rs index ec5ee69..ac9a741 100644 --- a/programs/hydra/src/lib.rs +++ b/programs/hydra/src/lib.rs @@ -3,7 +3,6 @@ #[cfg(not(feature = "no-entrypoint"))] mod entrypoint; -mod helpers; mod processor; -pub use hydra_api::{base::ID as BASE_ID, ephemeral::ID as EPHEMERAL_ID}; +pub use hydra_api::base::*; diff --git a/programs/hydra/src/processor/base/common.rs b/programs/hydra/src/processor/base/common.rs deleted file mode 100644 index ea68d10..0000000 --- a/programs/hydra/src/processor/base/common.rs +++ /dev/null @@ -1,28 +0,0 @@ -//! Shared helpers for the base-layer crank processors. - -use pinocchio::{error::ProgramError, AccountView, ProgramResult}; - -/// Move all lamports out of `src` into `dst`. The runtime zeroes `src.data` -/// and reassigns ownership to the system program at the instruction boundary -/// because `src.lamports == 0` post-write. -#[inline(always)] -pub(super) fn drain_lamports(src: &AccountView, dst: &AccountView) -> ProgramResult { - let amount = src.lamports(); - let new_dst = dst - .lamports() - .checked_add(amount) - .ok_or(ProgramError::ArithmeticOverflow)?; - src.set_lamports(0); - dst.set_lamports(new_dst); - Ok(()) -} - -#[inline(always)] -pub(super) unsafe fn read_u64(p: *const u8) -> u64 { - core::ptr::read_unaligned(p as *const u64) -} - -#[inline(always)] -pub(super) unsafe fn write_u64(p: *mut u8, v: u64) { - core::ptr::write_unaligned(p as *mut u64, v); -} diff --git a/programs/hydra/src/processor/base/mod.rs b/programs/hydra/src/processor/base/mod.rs deleted file mode 100644 index 0c26488..0000000 --- a/programs/hydra/src/processor/base/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Base-layer crank lifecycle (feature `base`). - -pub mod cancel; -pub mod close; -pub mod create; -pub mod trigger; - -mod common; diff --git a/programs/hydra/src/processor/base/cancel.rs b/programs/hydra/src/processor/cancel.rs similarity index 67% rename from programs/hydra/src/processor/base/cancel.rs rename to programs/hydra/src/processor/cancel.rs index 08a324a..daf58f1 100644 --- a/programs/hydra/src/processor/base/cancel.rs +++ b/programs/hydra/src/processor/cancel.rs @@ -2,14 +2,14 @@ use pinocchio::{error::ProgramError, AccountView, ProgramResult}; -use crate::processor::base::common::drain_lamports; -use crate::processor::common::require_cancel_authority; +use crate::processor::common::drain_lamports; +use hydra_api::program::processor::require_cancel_authority; pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { let [authority, crank_ai, recipient] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - require_cancel_authority(authority, crank_ai, &hydra_api::base::ID)?; + require_cancel_authority(authority, crank_ai, &crate::ID)?; drain_lamports(crank_ai, recipient) } diff --git a/programs/hydra/src/processor/base/close.rs b/programs/hydra/src/processor/close.rs similarity index 93% rename from programs/hydra/src/processor/base/close.rs rename to programs/hydra/src/processor/close.rs index 6c93861..f916070 100644 --- a/programs/hydra/src/processor/base/close.rs +++ b/programs/hydra/src/processor/close.rs @@ -12,15 +12,15 @@ use hydra_api::{ HydraError, }; -use crate::helpers::get_clock_slot; -use crate::processor::common::{require_refund_recipient, require_signed_crank}; +use hydra_api::program::helpers::get_clock_slot; +use hydra_api::program::processor::{require_refund_recipient, require_signed_crank}; pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { let [reporter, crank_ai, recipient] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - require_signed_crank(reporter, crank_ai, &hydra_api::base::ID)?; + require_signed_crank(reporter, crank_ai, &crate::ID)?; // Snapshot fields we need from the crank header. let (stored_authority, remaining, rent_min, priority_tip, next_exec_slot, lamports_now) = { diff --git a/programs/hydra/src/processor/common.rs b/programs/hydra/src/processor/common.rs index e2031bc..ea68d10 100644 --- a/programs/hydra/src/processor/common.rs +++ b/programs/hydra/src/processor/common.rs @@ -1,369 +1,28 @@ -//! Shared helpers for the ephemeral-rollup crank processors. +//! Shared helpers for the base-layer crank processors. -use pinocchio::{error::ProgramError, AccountView, Address, ProgramResult}; +use pinocchio::{error::ProgramError, AccountView, ProgramResult}; -use hydra_api::{ - consts::{ - CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, MAX_DATA_LEN, MAX_INSTRUCTIONS, - META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, - }, - instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, - state::{load_crank, load_crank_mut, Crank}, - HydraError, CRANK_HEADER_SIZE, -}; - -/// `signer` must sign and `crank` must be Hydra-owned — the preamble of every -/// `Cancel` / `Close` path. -pub(super) fn require_signed_crank( - signer: &AccountView, - crank_ai: &AccountView, - program_id: &Address, -) -> ProgramResult { - if !signer.is_signer() { - return Err(ProgramError::MissingRequiredSignature); - } - if !crank_ai.owned_by(program_id) { - return Err(ProgramError::InvalidAccountOwner); - } - Ok(()) -} - -/// Anti-grief: when a crank has a non-zero authority, only that authority may -/// receive the rent refund. Shared by base and ephemeral `Close`. -pub(super) fn require_refund_recipient( - stored_authority: [u8; 32], - recipient: &AccountView, -) -> ProgramResult { - if stored_authority != [0u8; 32] && recipient.address().as_array() != &stored_authority { - return Err(HydraError::UnauthorizedAuthority.into()); - } - Ok(()) -} - -/// Authority-gated close preamble shared by base `Cancel` and `CancelEphemeral`: -/// `authority` signs a Hydra-owned crank and matches its stored (non-zero) -/// authority. -pub(super) fn require_cancel_authority( - authority: &AccountView, - crank_ai: &AccountView, - program_id: &Address, -) -> ProgramResult { - require_signed_crank(authority, crank_ai, program_id)?; - let stored = { - let data = crank_ai.try_borrow()?; - unsafe { load_crank(&data)? }.authority - }; - if stored == [0u8; 32] || authority.address().as_array() != &stored { - return Err(HydraError::UnauthorizedAuthority.into()); - } - Ok(()) -} - -/// The fixed-size scheduling prefix of a `Create` / `CreateEphemeral` payload. -/// `next_exec` / `interval` are slots for base-layer cranks and milliseconds for -/// ephemeral-rollup cranks; the bytes are identical either way. -pub(super) struct CreateHeader { - pub seed: [u8; 32], - pub authority: [u8; 32], - pub next_exec: u64, - pub interval: u64, - pub remaining_wire: u64, - pub priority_tip: u64, - pub cu_limit: u32, -} - -/// Parse + validate the fixed prefix of a `Create` payload. Requires at least -/// the prefix plus one scheduled-ix blob header. -pub(super) fn parse_create_header(data: &[u8]) -> Result { - if data.len() < CREATE_FIXED_PREFIX_LEN + CREATE_IX_HEADER_LEN { - return Err(ProgramError::InvalidInstructionData); - } - // SAFETY: bounds checked above; the reads only require byte alignment. - let header = CreateHeader { - seed: unsafe { *(data.as_ptr() as *const [u8; 32]) }, - authority: unsafe { *(data.as_ptr().add(32) as *const [u8; 32]) }, - next_exec: read_u64_le(data, 64), - interval: read_u64_le(data, 72), - remaining_wire: read_u64_le(data, 80), - priority_tip: read_u64_le(data, 88), - cu_limit: read_u32_le(data, 96), - }; - // `0` opts out of `SetComputeUnitLimit`; non-zero must fit the per-tx ceiling. - if header.cu_limit > MAX_COMPUTE_UNIT_LIMIT { - return Err(HydraError::InvalidSchedule.into()); - } - // A never-advancing infinite crank makes no sense. - if header.remaining_wire == 0 && header.interval == 0 { - return Err(HydraError::InvalidSchedule.into()); - } - Ok(header) -} - -/// Write the parsed prefix + computed fields into a freshly-allocated crank -/// header. `rent_min` is the cached rent floor for base cranks and `0` for -/// ephemeral cranks (which hold no lamports). +/// Move all lamports out of `src` into `dst`. The runtime zeroes `src.data` +/// and reassigns ownership to the system program at the instruction boundary +/// because `src.lamports == 0` post-write. #[inline(always)] -pub(super) fn write_header( - state: &mut Crank, - h: &CreateHeader, - bump: u8, - authority_signer: u8, - rent_min: u64, - region_len: u16, -) { - state.authority = h.authority; - state.seed = h.seed; - state.set_next_exec_slot(h.next_exec); - state.set_interval_slots(h.interval); - state.set_remaining(if h.remaining_wire == 0 { - REMAINING_INFINITE - } else { - h.remaining_wire - }); - state.set_priority_tip(h.priority_tip); - state.set_executed(0); - state.set_rent_min(rent_min); - state.set_region_len(region_len); - state.bump = bump; - state.set_cu_limit(h.cu_limit); - state.authority_signer = authority_signer; -} - -/// The scheduled-ix tail must fit `Crank.region_len` (a `u16`). -const MAX_REGION_LEN: usize = u16::MAX as usize; - -/// Measure the exact tail length the scheduled ixs serialize to, validating the -/// per-ix structure, the instruction-count limit, and the `region_len` ceiling -/// in a single pass. Mirrors the byte accounting in [`write_tail`] so the caller -/// can allocate the precise account size up front; `write_tail` then re-validates -/// (incl. signer flags) and writes, yielding the same length. -pub(super) fn measure_region(data: &[u8]) -> Result { - let mut cursor = CREATE_FIXED_PREFIX_LEN; - let mut region_len = 0usize; - let mut num_instructions = 0usize; - - while cursor < data.len() { - let (num_accounts, data_len, next) = parse_ix_header(data, cursor)?; - num_instructions += 1; - if num_instructions > MAX_INSTRUCTIONS { - return Err(HydraError::InvalidSchedule.into()); - } - let metas_len = num_accounts * SERIALIZED_META_SIZE; - // [num_accounts u16][metas][program_id 32][data_len u16][data] - region_len += 2 + metas_len + 32 + 2 + data_len; - cursor = next; - } - - if region_len > MAX_REGION_LEN { - return Err(HydraError::InvalidSchedule.into()); - } - Ok(region_len) -} - -/// Derive the crank PDA from `[CRANK_SEED_PREFIX, seed]` and verify it matches -/// the supplied account, returning the bump for the create CPI's signer seeds. -/// Shared by both `Create` paths. -pub(super) fn derive_crank_pda( - crank_ai: &AccountView, - seed: &[u8; 32], - program_id: &Address, -) -> Result { - let (expected_pda, bump) = - Address::find_program_address(&[CRANK_SEED_PREFIX, seed], program_id); - if crank_ai.address() != &expected_pda { - return Err(ProgramError::InvalidSeeds); - } - Ok(bump) -} - -/// Finalize a freshly-allocated crank account: serialize the scheduled-ix tail -/// and write the header. The account must already be sized to -/// `CRANK_HEADER_SIZE + region_len`; `rent_min` is the cached rent floor for base -/// cranks and `0` for ephemeral cranks (which hold no lamports). Shared by both -/// `Create` paths. -pub(super) fn write_crank( - crank_ai: &AccountView, - data: &[u8], - header: &CreateHeader, - bump: u8, - authority_signer: u8, - rent_min: u64, - region_len: usize, -) -> ProgramResult { - let mut account_data = crank_ai.try_borrow_mut()?; - let buf: &mut [u8] = &mut account_data; - if buf.len() < CRANK_HEADER_SIZE { - return Err(ProgramError::AccountDataTooSmall); - } - let (header_bytes, tail_bytes) = buf.split_at_mut(CRANK_HEADER_SIZE); - - let written = write_tail(tail_bytes, data)?; - if written != region_len { - return Err(HydraError::InvalidSchedule.into()); - } - - // SAFETY: split yields CRANK_HEADER_SIZE bytes; Crank is align-1 (compile-time checked). - let state = unsafe { load_crank_mut(header_bytes)? }; - write_header( - state, - header, - bump, - authority_signer, - rent_min, - region_len as u16, - ); +pub(super) fn drain_lamports(src: &AccountView, dst: &AccountView) -> ProgramResult { + let amount = src.lamports(); + let new_dst = dst + .lamports() + .checked_add(amount) + .ok_or(ProgramError::ArithmeticOverflow)?; + src.set_lamports(0); + dst.set_lamports(new_dst); Ok(()) } -/// Validate + serialize the scheduled ixs of a `Create` payload into `tail`, -/// returning the bytes written. Every write is bounds-checked against -/// `tail.len()` so a wrongly-sized account fails cleanly instead of writing out -/// of bounds. -/// -/// Mirrors the tail layout produced by `processor::create` — see that file for -/// the wire format. Kept separate so the audited base path stays untouched. -pub(super) fn write_tail(tail: &mut [u8], data: &[u8]) -> Result { - let cap = tail.len(); - let mut cursor = CREATE_FIXED_PREFIX_LEN; - let mut off = 0usize; - let mut num_instructions = 0usize; - - while cursor < data.len() { - let (num_accounts, data_len, next) = parse_ix_header(data, cursor)?; - num_instructions += 1; - if num_instructions > MAX_INSTRUCTIONS { - return Err(HydraError::InvalidSchedule.into()); - } - let metas_offset = cursor + CREATE_IX_HEADER_LEN; - let metas_len = num_accounts * SERIALIZED_META_SIZE; - let data_offset = metas_offset + metas_len; - // Scheduled ixs run top-level; reject any signer flag. - for i in 0..num_accounts { - if data[metas_offset + i * SERIALIZED_META_SIZE] & META_FLAG_SIGNER != 0 { - return Err(HydraError::SignerInScheduledIx.into()); - } - } - - // [num_accounts u16][metas][program_id 32][data_len u16][data] - let blob_len = 2 + metas_len + 32 + 2 + data_len; - if off + blob_len > cap { - return Err(ProgramError::AccountDataTooSmall); - } - tail[off..off + 2].copy_from_slice(&(num_accounts as u16).to_le_bytes()); - off += 2; - tail[off..off + metas_len].copy_from_slice(&data[metas_offset..data_offset]); - off += metas_len; - tail[off..off + 32].copy_from_slice(&data[cursor + 3..cursor + CREATE_IX_HEADER_LEN]); - off += 32; - tail[off..off + 2].copy_from_slice(&(data_len as u16).to_le_bytes()); - off += 2; - tail[off..off + data_len].copy_from_slice(&data[data_offset..next]); - off += data_len; - - cursor = next; - } - - Ok(off) -} - -/// Parse one scheduled-ix blob header at `cursor`, validating limits and bounds. -/// Returns `(num_accounts, data_len, next_cursor)`. -#[inline(always)] -pub(super) fn parse_ix_header( - data: &[u8], - cursor: usize, -) -> Result<(usize, usize, usize), ProgramError> { - if cursor + CREATE_IX_HEADER_LEN > data.len() { - return Err(ProgramError::InvalidInstructionData); - } - let num_accounts = data[cursor] as usize; - let data_len = u16::from_le_bytes([data[cursor + 1], data[cursor + 2]]) as usize; - if num_accounts > MAX_ACCOUNTS || data_len > MAX_DATA_LEN { - return Err(HydraError::InvalidSchedule.into()); - } - let metas_len = num_accounts * SERIALIZED_META_SIZE; - let next = cursor + CREATE_IX_HEADER_LEN + metas_len + data_len; - if next > data.len() { - return Err(ProgramError::InvalidInstructionData); - } - Ok((num_accounts, data_len, next)) -} - -/// Parse the instructions sysvar, locate the region for -/// `current_ix_index + 1`, and byte-compare it against the crank's stored tail. -/// -/// Shared with the ephemeral-rollup `TriggerEphemeral` handler — the -/// follow-up binding is identical on both ledgers. -#[inline(always)] -pub(crate) fn verify_followup( - sysvar: &AccountView, - crank: &AccountView, - region_len: usize, -) -> ProgramResult { - // SAFETY: we're in a linear entrypoint flow with no outstanding borrows - // on either account. pinocchio's `borrow_unchecked` skips the refcell - // bookkeeping, which saves a handful of CUs per call. - let sv: &[u8] = unsafe { sysvar.borrow_unchecked() }; - let cr: &[u8] = unsafe { crank.borrow_unchecked() }; - - let sv_len = sv.len(); - if sv_len < 4 { - return Err(ProgramError::InvalidAccountData); - } - - // [len-2..len] = current_ix_index (u16 LE) - let current = unsafe { read_u16(sv.as_ptr().add(sv_len - 2)) } as usize; - let target = current - .checked_add(1) - .ok_or(HydraError::MissingFollowupInstruction)?; - - // [0..2] = num_instructions (u16 LE) - let num_ix = unsafe { read_u16(sv.as_ptr()) } as usize; - if target >= num_ix { - return Err(HydraError::MissingFollowupInstruction.into()); - } - - // [2 + 2*target..+2] = offset of instruction `target`'s region. - let off_pos = 2 + 2 * target; - if off_pos + 2 > sv_len { - return Err(ProgramError::InvalidAccountData); - } - let region_start = unsafe { read_u16(sv.as_ptr().add(off_pos)) } as usize; - let region_end = region_start - .checked_add(region_len) - .ok_or(HydraError::MismatchedFollowupIx)?; - if region_end > sv_len.saturating_sub(2) { - return Err(HydraError::MismatchedFollowupIx.into()); - } - - let tail_end = CRANK_HEADER_SIZE - .checked_add(region_len) - .ok_or(ProgramError::InvalidAccountData)?; - if tail_end > cr.len() { - return Err(ProgramError::InvalidAccountData); - } - let tail = &cr[CRANK_HEADER_SIZE..tail_end]; - let sv_region = &sv[region_start..region_end]; - - if sv_region != tail { - return Err(HydraError::MismatchedFollowupIx.into()); - } - Ok(()) -} - -#[inline(always)] -pub(super) fn read_u64_le(data: &[u8], offset: usize) -> u64 { - // SAFETY: the caller ensures `offset + 8 <= data.len()`. - unsafe { u64::from_le_bytes(*(data.as_ptr().add(offset) as *const [u8; 8])) } -} - #[inline(always)] -pub(super) fn read_u32_le(data: &[u8], offset: usize) -> u32 { - // SAFETY: the caller ensures `offset + 4 <= data.len()`. - unsafe { u32::from_le_bytes(*(data.as_ptr().add(offset) as *const [u8; 4])) } +pub(super) unsafe fn read_u64(p: *const u8) -> u64 { + core::ptr::read_unaligned(p as *const u64) } #[inline(always)] -pub(super) unsafe fn read_u16(p: *const u8) -> u16 { - core::ptr::read_unaligned(p as *const u16) +pub(super) unsafe fn write_u64(p: *mut u8, v: u64) { + core::ptr::write_unaligned(p as *mut u64, v); } diff --git a/programs/hydra/src/processor/base/create.rs b/programs/hydra/src/processor/create.rs similarity index 95% rename from programs/hydra/src/processor/base/create.rs rename to programs/hydra/src/processor/create.rs index e27bdff..205810c 100644 --- a/programs/hydra/src/processor/base/create.rs +++ b/programs/hydra/src/processor/create.rs @@ -31,7 +31,7 @@ use pinocchio_system::instructions::{CreateAccountAllowPrefund, Funding}; use hydra_api::consts::{CRANK_HEADER_SIZE, CRANK_SEED_PREFIX}; -use crate::processor::common::{ +use hydra_api::program::processor::{ derive_crank_pda, measure_region, parse_create_header, write_crank, }; @@ -46,7 +46,7 @@ pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { // Size the account from the scheduled ixs (validates the schedule), verify // the PDA, then allocate at exactly that size. The tail is written below. let region_len = measure_region(data)?; - let bump = derive_crank_pda(crank_ai, &header.seed, &hydra_api::base::ID)?; + let bump = derive_crank_pda(crank_ai, &header.seed, &crate::ID)?; let total_size = CRANK_HEADER_SIZE + region_len; // One sysvar read serves both CreateAccount funding and the cached floor. @@ -71,7 +71,7 @@ pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { CreateAccountAllowPrefund { to: crank_ai, space: total_size as u64, - owner: &hydra_api::base::ID, + owner: &crate::ID, funding: (funding_lamports > 0).then_some(Funding { from: payer, lamports: funding_lamports, @@ -101,7 +101,7 @@ pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { .invoke_signed(&signers)?; Assign { account: crank_ai, - owner: &hydra_api::base::ID, + owner: &crate::ID, } .invoke_signed(&signers)?; } diff --git a/programs/hydra/src/processor/ephemeral/mod.rs b/programs/hydra/src/processor/ephemeral/mod.rs deleted file mode 100644 index 319001a..0000000 --- a/programs/hydra/src/processor/ephemeral/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Ephemeral-rollup crank lifecycle (feature `ephemeral`). - -pub mod cancel; -pub mod close; -pub mod create; -pub mod trigger; - -mod common; diff --git a/programs/hydra/src/processor/mod.rs b/programs/hydra/src/processor/mod.rs index d94b91c..2bf7297 100644 --- a/programs/hydra/src/processor/mod.rs +++ b/programs/hydra/src/processor/mod.rs @@ -1,11 +1,12 @@ -pub mod common; +//! Base-layer crank lifecycle. +//! +//! Schedule parsing, tail serialization and follow-up verification are shared +//! with the ephemeral-rollup program via [`hydra_api::program`]; only the +//! System-program funding model lives here. -#[cfg(not(feature = "ephemeral"))] -mod base; -#[cfg(not(feature = "ephemeral"))] -pub use base::*; +pub mod cancel; +pub mod close; +pub mod create; +pub mod trigger; -#[cfg(feature = "ephemeral")] -mod ephemeral; -#[cfg(feature = "ephemeral")] -pub use ephemeral::*; +mod common; diff --git a/programs/hydra/src/processor/base/trigger.rs b/programs/hydra/src/processor/trigger.rs similarity index 96% rename from programs/hydra/src/processor/base/trigger.rs rename to programs/hydra/src/processor/trigger.rs index f471304..1d10519 100644 --- a/programs/hydra/src/processor/base/trigger.rs +++ b/programs/hydra/src/processor/trigger.rs @@ -15,14 +15,13 @@ use hydra_api::{ HydraError, }; -use crate::{ +use hydra_api::program::{ helpers::{get_clock_slot, get_stack_height, TRANSACTION_LEVEL_STACK_HEIGHT}, - processor::{ - base::common::{read_u64, write_u64}, - common::{read_u16, verify_followup}, - }, + processor::{read_u16, verify_followup}, }; +use crate::processor::common::{read_u64, write_u64}; + // Field offsets inside the 120-byte `Crank` header, kept local to this file // so the raw reads below stay easy to verify against the account layout. const OFF_NEXT_EXEC_SLOT: usize = 64; @@ -43,7 +42,7 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { if !cranker_ai.is_signer() { return Err(ProgramError::MissingRequiredSignature); } - if !crank_ai.owned_by(&hydra_api::base::ID) { + if !crank_ai.owned_by(&crate::ID) { return Err(ProgramError::InvalidAccountOwner); } if ix_sysvar_ai.address() != &INSTRUCTIONS_ID { diff --git a/tests/e2e/tests/ephemeral_cranks.rs b/tests/e2e/tests/ephemeral_cranks.rs index 44183e2..05526f5 100644 --- a/tests/e2e/tests/ephemeral_cranks.rs +++ b/tests/e2e/tests/ephemeral_cranks.rs @@ -32,8 +32,8 @@ //! //! ```sh //! # from the hydra workspace root -//! cargo build-sbf -- --features ephemeral # target/deploy/hydra.so -//! cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml # target/deploy/hydra_noop.so +//! cargo build-sbf --manifest-path programs/hydra-ephemeral/Cargo.toml # target/deploy/hydra_ephemeral.so +//! cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml # target/deploy/hydra_noop.so //! ``` //! //! The `hydra-cranker` binary is built automatically by the test (see @@ -174,7 +174,7 @@ fn body(stack: &mut Stack, order: CreateOrder) -> Result<()> { let tmp = stack.tmp.path().to_path_buf(); // Resolve build artifacts up front so a missing prerequisite fails fast. - let hydra_so = artifact("target/deploy/hydra.so")?; + let hydra_so = artifact("target/deploy/hydra_ephemeral.so")?; let noop_so = artifact("target/deploy/hydra_noop.so")?; // The cranker MUST be the `ephemeral` build (it targets the `eHyd…` program // and skips the lamport-funding checks). A plain `cargo build -p From 1f24ace6b61462d752e67d48d84b474edc5ee0ef Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Tue, 30 Jun 2026 20:07:22 +0200 Subject: [PATCH 11/33] feat: refund ephemeral cranks --- README.md | 58 +++++----- crates/hydra-api/src/cpi.rs | 24 +++- crates/hydra-api/src/instruction.rs | 12 +- crates/hydra-api/src/program/processor.rs | 103 +++++++++++++++++- crates/hydra-cranker/src/fire.rs | 14 ++- .../hydra-ephemeral/src/processor/cancel.rs | 18 +-- .../hydra-ephemeral/src/processor/close.rs | 41 +++---- .../hydra-ephemeral/src/processor/trigger.rs | 28 ++++- programs/hydra/src/processor/cancel.rs | 6 +- programs/hydra/src/processor/close.rs | 75 +------------ programs/hydra/src/processor/common.rs | 22 +--- tests/lib.rs | 103 ++++++++++++++++++ 12 files changed, 330 insertions(+), 174 deletions(-) diff --git a/README.md b/README.md index 0b8f55e..fe82600 100644 --- a/README.md +++ b/README.md @@ -312,27 +312,31 @@ base-layer `hydra` program neither contains this code nor depends on `ephemeral-rollups-pinocchio`; the two programs share their schedule/verify logic through [`hydra_api::program`]. -The model is the same as the base crank — a crank stores scheduled instructions, -anyone triggers them when due, and `Trigger` verifies the follow-up siblings with -the same single `memcmp` — with two differences the ER forces: - -- **Ephemeral accounts hold zero lamports.** Rent (a flat per-byte fee) is paid by - a sponsor into a shared vault, not held in the account. So there is no cranker - reward, no priority-tip payout, and no rent floor: the ephemeral `Trigger` only - verifies the follow-up ix and advances the schedule (slot check, decrement - `remaining`, bump `executed`). -- **Creation is a single instruction.** The Magic program materializes the - ephemeral account synchronously, so `Create` allocates the crank (via a - Magic CPI signed by the crank PDA) and writes its header + scheduled-ix tail in - one instruction — no separate init step. - -Lifecycle: `Create` → `Trigger` (+ scheduled siblings, run -top-level on the ER) → `Cancel` (authority-gated) / `Close` -(permissionless, when the crank is exhausted or stuck). `Cancel`/`Close` CPI the -Magic program to close the ephemeral account and refund the vault rent to the -sponsor; if a non-zero `authority` is set, only that authority may close it. The -crank PDA derivation (`[b"crank", seed]`) and the on-chain `Crank` layout are -unchanged, so the template / verification model is identical. +The economic model is identical to the base crank — the cranker is paid +`CRANKER_REWARD + priority_tip` out of the crank's lamport balance on `Trigger`, +and `Cancel`/`Close` pay out the leftover balance — with two differences the ER +forces: + +- **Vault rent is separate from the crank balance.** The ephemeral account's rent + (a flat per-byte fee) is paid by a sponsor into a shared vault, not held in the + account, so the crank's stored `rent_min` is `0`. The crank still holds a plain + lamport balance (funded by the sponsor) that funds the cranker rewards, exactly + like base; the only `Trigger` floor is being able to afford the reward. +- **Creation/teardown go through the Magic program.** The Magic program + materializes the ephemeral account synchronously, so `Create` allocates the + crank (via a Magic CPI signed by the crank PDA) and writes its header + + scheduled-ix tail in one instruction. `Cancel`/`Close` first drain the crank's + leftover lamports to a `recipient` (the same bounty/refund split as base), then + CPI Magic `close` to deallocate the account and refund the vault rent to the + sponsor. + +Lifecycle: `Create` → `Trigger` (+ scheduled siblings, run top-level on the ER) → +`Cancel` (authority-gated) / `Close` (permissionless, when the crank is exhausted, +underfunded, or stuck). On teardown the leftover balance refunds to `recipient` +and the vault rent refunds to the sponsor (`authority` on `Cancel`, `reporter` on +`Close`); if a non-zero `authority` is set, only that authority may be the +`recipient`. The crank PDA derivation (`[b"crank", seed]`) and the on-chain +`Crank` layout are unchanged, so the template / verification model is identical. ### Instruction Reference (ephemeral) @@ -340,12 +344,12 @@ Same discriminators as the base program (`0–3`); the account shapes differ because creation/close go through the Magic program rather than the System program. -| Disc | Name | Accounts | Data | -| ---: | --------- | --------------------------------------------------- | ---------------- | -| 0 | `Create` | `sponsor(w,s), crank(w), vault(w), magic_program` | schedule payload | -| 1 | `Trigger` | `crank(w), cranker(w,s), instructions_sysvar` | none | -| 2 | `Cancel` | `authority(w,s), crank(w), vault(w), magic_program` | none | -| 3 | `Close` | `reporter(w,s), crank(w), vault(w), magic_program` | none | +| Disc | Name | Accounts | Data | +| ---: | --------- | ---------------------------------------------------------------- | ---------------- | +| 0 | `Create` | `sponsor(w,s), crank(w), vault(w), magic_program` | schedule payload | +| 1 | `Trigger` | `crank(w), cranker(w,s), instructions_sysvar` | none | +| 2 | `Cancel` | `authority(w,s), crank(w), recipient(w), vault(w), magic_program` | none | +| 3 | `Close` | `reporter(w,s), crank(w), recipient(w), vault(w), magic_program` | none | `vault` is the ephemeral rent vault and `magic_program` is MagicBlock's Magic program; `hydra-api` exposes both as `consts::magic::EPHEMERAL_VAULT_ID` / diff --git a/crates/hydra-api/src/cpi.rs b/crates/hydra-api/src/cpi.rs index 5cd12dc..e11c00a 100644 --- a/crates/hydra-api/src/cpi.rs +++ b/crates/hydra-api/src/cpi.rs @@ -218,12 +218,20 @@ pub mod ephemeral { authority: &AccountInfo<'a>, crank: &AccountInfo<'a>, recipient: &AccountInfo<'a>, + vault: &AccountInfo<'a>, + magic_program: &AccountInfo<'a>, signer_seeds: &[&[&[u8]]], ) -> Result<(), ProgramError> { - let ix = builder::cancel(*authority.key, *crank.key); + let ix = builder::cancel(*authority.key, *crank.key, *recipient.key); invoke_signed( &ix, - &[authority.clone(), crank.clone(), recipient.clone()], + &[ + authority.clone(), + crank.clone(), + recipient.clone(), + vault.clone(), + magic_program.clone(), + ], signer_seeds, ) } @@ -235,12 +243,20 @@ pub mod ephemeral { reporter: &AccountInfo<'a>, crank: &AccountInfo<'a>, recipient: &AccountInfo<'a>, + vault: &AccountInfo<'a>, + magic_program: &AccountInfo<'a>, signer_seeds: &[&[&[u8]]], ) -> Result<(), ProgramError> { - let ix = builder::close(*reporter.key, *crank.key); + let ix = builder::close(*reporter.key, *crank.key, *recipient.key); invoke_signed( &ix, - &[reporter.clone(), crank.clone(), recipient.clone()], + &[ + reporter.clone(), + crank.clone(), + recipient.clone(), + vault.clone(), + magic_program.clone(), + ], signer_seeds, ) } diff --git a/crates/hydra-api/src/instruction.rs b/crates/hydra-api/src/instruction.rs index 0a4f50d..4051745 100644 --- a/crates/hydra-api/src/instruction.rs +++ b/crates/hydra-api/src/instruction.rs @@ -314,13 +314,15 @@ mod client { } } - /// Build a `Cancel` instruction - pub fn cancel(authority: Pubkey, crank: Pubkey) -> Instruction { + /// Build a `Cancel` instruction. `recipient` receives the crank's drained + /// lamport balance; the vault rent refunds to `authority`. + pub fn cancel(authority: Pubkey, crank: Pubkey, recipient: Pubkey) -> Instruction { Instruction { program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new(authority, true), AccountMeta::new(crank, false), + AccountMeta::new(recipient, false), AccountMeta::new(EPHEMERAL_VAULT_ID, false), AccountMeta::new_readonly(MAGIC_PROGRAM_ID, false), ], @@ -328,13 +330,15 @@ mod client { } } - /// Build a `Close` instruction - pub fn close(reporter: Pubkey, crank: Pubkey) -> Instruction { + /// Build a `Close` instruction. `reporter` keeps the flat bounty (and the + /// vault rent refund); `recipient` receives the remaining balance. + pub fn close(reporter: Pubkey, crank: Pubkey, recipient: Pubkey) -> Instruction { Instruction { program_id: PROGRAM_ID, accounts: alloc::vec![ AccountMeta::new(reporter, true), AccountMeta::new(crank, false), + AccountMeta::new(recipient, false), AccountMeta::new(EPHEMERAL_VAULT_ID, false), AccountMeta::new_readonly(MAGIC_PROGRAM_ID, false), ], diff --git a/crates/hydra-api/src/program/processor.rs b/crates/hydra-api/src/program/processor.rs index 2b11da0..c58fb50 100644 --- a/crates/hydra-api/src/program/processor.rs +++ b/crates/hydra-api/src/program/processor.rs @@ -8,10 +8,12 @@ use pinocchio::{error::ProgramError, AccountView, Address, ProgramResult}; use crate::{ consts::{ - CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, MAX_DATA_LEN, MAX_INSTRUCTIONS, - META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, + CRANKER_REWARD, CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, MAX_DATA_LEN, + MAX_INSTRUCTIONS, META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, + STALENESS_THRESHOLD_SLOTS, }, instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, + program::helpers::get_clock_slot, state::{load_crank, load_crank_mut, Crank}, HydraError, CRANK_HEADER_SIZE, }; @@ -370,3 +372,100 @@ pub fn read_u32_le(data: &[u8], offset: usize) -> u32 { pub unsafe fn read_u16(p: *const u8) -> u16 { core::ptr::read_unaligned(p as *const u16) } + +/// Move all lamports out of `src` into `dst`. +#[inline(always)] +pub fn drain_lamports(src: &AccountView, dst: &AccountView) -> ProgramResult { + let amount = src.lamports(); + let new_dst = dst + .lamports() + .checked_add(amount) + .ok_or(ProgramError::ArithmeticOverflow)?; + src.set_lamports(0); + dst.set_lamports(new_dst); + Ok(()) +} + +/// Shared `Cancel`: authority-gated drain of the crank's full balance to +/// `recipient`. +pub fn process_cancel( + authority: &AccountView, + crank_ai: &AccountView, + recipient: &AccountView, + program_id: &Address, +) -> ProgramResult { + require_cancel_authority(authority, crank_ai, program_id)?; + drain_lamports(crank_ai, recipient) +} + +/// Shared `Close`: permissionless cleanup of an exhausted / underfunded / stuck +/// crank. Pays a flat `CRANKER_REWARD` bounty to `reporter`, refunds the +/// remaining balance to `recipient` (anti-grief: bound to the stored authority +/// when set), and zeroes the crank. +pub fn process_close( + reporter: &AccountView, + crank_ai: &AccountView, + recipient: &AccountView, + program_id: &Address, +) -> ProgramResult { + require_signed_crank(reporter, crank_ai, program_id)?; + + // Snapshot the fields we need from the crank header. + let (stored_authority, remaining, rent_min, priority_tip, next_exec_slot, lamports_now) = { + let data = crank_ai.try_borrow()?; + let state = unsafe { load_crank(&data)? }; + ( + state.authority, + state.remaining(), + state.rent_min(), + state.priority_tip(), + state.next_exec_slot(), + crank_ai.lamports(), + ) + }; + + // Pre-condition: exhausted OR underfunded OR stuck. + let exhausted = remaining == 0; + let next_reward = CRANKER_REWARD + .checked_add(priority_tip) + .ok_or(ProgramError::ArithmeticOverflow)?; + let underfunded = lamports_now + < rent_min + .checked_add(next_reward) + .ok_or(ProgramError::ArithmeticOverflow)?; + // `next_exec_slot` only advances on *successful* `Trigger`, so persistent + // failure pins it in the past. `saturating_sub` makes future-scheduled + // cranks (`next_exec_slot > current_slot`) trivially not-stale. + let current_slot = get_clock_slot()?; + let stuck = current_slot.saturating_sub(next_exec_slot) > STALENESS_THRESHOLD_SLOTS; + + if !(exhausted || underfunded || stuck) { + return Err(HydraError::NotClosable.into()); + } + + require_refund_recipient(stored_authority, recipient)?; + + // Flat bounty (2 × base fee) to whoever cranked the cleanup; the balance + // refunds to `recipient`. `min` handles a crank holding less than the + // bounty — reporter gets what's there, recipient gets nothing. + let bounty = CRANKER_REWARD.min(lamports_now); + let refund = lamports_now - bounty; + + crank_ai.set_lamports(0); + + let new_reporter = reporter + .lamports() + .checked_add(bounty) + .ok_or(ProgramError::ArithmeticOverflow)?; + reporter.set_lamports(new_reporter); + + // When `recipient` aliases `reporter`, the write above is visible here, so + // adding `refund` on top preserves the sum. Distinct accounts: clean credit. + let new_recipient = recipient + .lamports() + .checked_add(refund) + .ok_or(ProgramError::ArithmeticOverflow)?; + recipient.set_lamports(new_recipient); + + Ok(()) +} diff --git a/crates/hydra-cranker/src/fire.rs b/crates/hydra-cranker/src/fire.rs index 6f4dcc0..6acffa2 100644 --- a/crates/hydra-cranker/src/fire.rs +++ b/crates/hydra-cranker/src/fire.rs @@ -168,14 +168,16 @@ pub fn fire_close( entry: &CrankEntry, priority_fee_micro_lamports: u64, ) -> Result<()> { + // Refund recipient: the authority if set (anti-grief binds it on-chain), + // otherwise the cranker itself. + let recipient = if entry.authority == [0u8; 32] { + cranker.pubkey() + } else { + Pubkey::new_from_array(entry.authority) + }; let close = if crate::mode::is_ephemeral() { - ix::ephemeral::close(cranker.pubkey(), entry.pubkey) + ix::ephemeral::close(cranker.pubkey(), entry.pubkey, recipient) } else { - let recipient = if entry.authority == [0u8; 32] { - cranker.pubkey() - } else { - Pubkey::new_from_array(entry.authority) - }; ix::base::close(cranker.pubkey(), entry.pubkey, recipient) }; let blockhash = rpc.get_latest_blockhash().map_err(|e| { diff --git a/programs/hydra-ephemeral/src/processor/cancel.rs b/programs/hydra-ephemeral/src/processor/cancel.rs index 4eb91b7..213b64c 100644 --- a/programs/hydra-ephemeral/src/processor/cancel.rs +++ b/programs/hydra-ephemeral/src/processor/cancel.rs @@ -1,26 +1,28 @@ //! `Cancel` (disc 2). //! -//! Authority-gated close of an ephemeral crank. CPIs Magic `CloseEphemeralAccount`, -//! refunding the rent to `authority`. +//! Authority-gated drain of the crank's lamport balance to `recipient` (shared +//! with base via `process_cancel`), then a Magic `CloseEphemeralAccount` CPI to +//! deallocate the ephemeral account and refund its vault rent to `authority`. //! -//! Accounts: `[authority(w,s), crank(w), vault(w), magic_program(ro)]`. +//! Accounts: `[authority(w,s), crank(w), recipient(w), vault(w), magic_program(ro)]`. use ephemeral_rollups_pinocchio::ephemeral_accounts::EphemeralAccount; use pinocchio::{error::ProgramError, AccountView, ProgramResult}; -use hydra_api::program::processor::require_cancel_authority; +use hydra_api::program::processor::process_cancel; use crate::processor::common::check_magic_accounts; pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { - let [authority, crank_ai, vault, magic_program] = accounts else { + let [authority, crank_ai, recipient, vault, magic_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - require_cancel_authority(authority, crank_ai, &crate::ID)?; check_magic_accounts(vault, magic_program)?; - // The ephemeral account need not sign on close; `authority` is the sponsor - // (a real signer) and receives the rent refund. + process_cancel(authority, crank_ai, recipient, &crate::ID)?; + + // Deallocate the now zero-lamport ephemeral account; Magic refunds the vault + // rent to `authority`. EphemeralAccount::new(authority, crank_ai, vault, magic_program).close() } diff --git a/programs/hydra-ephemeral/src/processor/close.rs b/programs/hydra-ephemeral/src/processor/close.rs index 64fd53c..c1c63de 100644 --- a/programs/hydra-ephemeral/src/processor/close.rs +++ b/programs/hydra-ephemeral/src/processor/close.rs @@ -1,47 +1,32 @@ //! `Close` (disc 3). //! -//! Permissionless cleanup of an exhausted or stuck ephemeral crank. CPIs Magic -//! `CloseEphemeralAccount`, refunding the rent to `reporter`. If the crank has a -//! non-zero authority, only that authority may close it (so the refund can't be -//! redirected away from them). +//! Permissionless cleanup of an exhausted / underfunded / stuck ephemeral crank. +//! Pays the cranker bounty to `reporter` and refunds the remaining balance to +//! `recipient` (shared with base via `process_close`), then CPIs Magic +//! `CloseEphemeralAccount` to deallocate the account and refund its vault rent +//! to `reporter`. If the crank has a non-zero authority, only that authority may +//! be the refund `recipient` (anti-grief, enforced inside `process_close`). //! -//! Accounts: `[reporter(w,s), crank(w), vault(w), magic_program(ro)]`. +//! Accounts: `[reporter(w,s), crank(w), recipient(w), vault(w), magic_program(ro)]`. use ephemeral_rollups_pinocchio::ephemeral_accounts::EphemeralAccount; use pinocchio::{error::ProgramError, AccountView, ProgramResult}; -use hydra_api::{state::load_crank, HydraError, STALENESS_THRESHOLD_SLOTS}; - -use hydra_api::program::helpers::get_clock_slot; -use hydra_api::program::processor::{require_refund_recipient, require_signed_crank}; +use hydra_api::program::processor::process_close; use crate::processor::common::check_magic_accounts; pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { - let [reporter, crank_ai, vault, magic_program] = accounts else { + let [reporter, crank_ai, recipient, vault, magic_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - require_signed_crank(reporter, crank_ai, &crate::ID)?; check_magic_accounts(vault, magic_program)?; - let (stored_authority, remaining, next_exec_slot) = { - let data = crank_ai.try_borrow()?; - let s = unsafe { load_crank(&data)? }; - (s.authority, s.remaining(), s.next_exec_slot()) - }; - - // Exhausted OR stuck. There is no "underfunded" case: an ephemeral crank - // never holds lamports. - let exhausted = remaining == 0; - let current_slot = get_clock_slot()?; - let stuck = current_slot.saturating_sub(next_exec_slot) > STALENESS_THRESHOLD_SLOTS; - if !(exhausted || stuck) { - return Err(HydraError::NotClosable.into()); - } - - // The refund goes to `reporter`, so anti-grief binds the closer to the authority. - require_refund_recipient(stored_authority, reporter)?; + // Base-identical payout: closable check + bounty/refund split, zeroes crank. + process_close(reporter, crank_ai, recipient, &crate::ID)?; + // Deallocate the now zero-lamport ephemeral account; Magic refunds the vault + // rent to `reporter`. EphemeralAccount::new(reporter, crank_ai, vault, magic_program).close() } diff --git a/programs/hydra-ephemeral/src/processor/trigger.rs b/programs/hydra-ephemeral/src/processor/trigger.rs index bbfa592..75a19cf 100644 --- a/programs/hydra-ephemeral/src/processor/trigger.rs +++ b/programs/hydra-ephemeral/src/processor/trigger.rs @@ -1,8 +1,10 @@ //! `Trigger` (disc 1). //! //! Runs a crank's scheduled ixs once, on the ephemeral rollup. Same top-level + -//! instructions-sysvar + memcmp follow-up verification and schedule advance as -//! base `Trigger`, but moves no lamports (the ephemeral crank holds none). +//! instructions-sysvar + memcmp follow-up verification, cranker payout and +//! schedule advance as base `Trigger`. The crank holds its reward budget as a +//! plain lamport balance (funded by the sponsor); `rent_min` is `0` because the +//! ephemeral account's rent lives in the Magic vault, not in the account. //! //! Accounts: `[crank(w), cranker(w,s), instructions_sysvar]`. @@ -11,7 +13,7 @@ use pinocchio::{ }; use hydra_api::{ - consts::REMAINING_INFINITE, + consts::{CRANKER_REWARD, REMAINING_INFINITE}, program::{ helpers::{get_clock_slot, get_stack_height, TRANSACTION_LEVEL_STACK_HEIGHT}, processor::verify_followup, @@ -40,13 +42,14 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { let current_slot = get_clock_slot()?; - let (next_exec_slot, interval_slots, remaining, executed, region_len) = { + let (next_exec_slot, interval_slots, remaining, priority_tip, executed, region_len) = { let data = crank_ai.try_borrow()?; let s = unsafe { load_crank(&data)? }; ( s.next_exec_slot(), s.interval_slots(), s.remaining(), + s.priority_tip(), s.executed(), s.region_len(), ) @@ -59,8 +62,25 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { return Err(HydraError::Exhausted.into()); } + // Cranker reward, paid out of the crank's balance — same as base `Trigger`. + let reward = CRANKER_REWARD + .checked_add(priority_tip) + .ok_or(ProgramError::ArithmeticOverflow)?; + let new_crank_lamports = crank_ai + .lamports() + .checked_sub(reward) + .ok_or::(HydraError::InsufficientFunds.into())?; + verify_followup(ix_sysvar_ai, crank_ai, region_len as usize)?; + // Pay the cranker via direct lamport mutation. + crank_ai.set_lamports(new_crank_lamports); + let new_cranker_lamports = cranker_ai + .lamports() + .checked_add(reward) + .ok_or(ProgramError::ArithmeticOverflow)?; + cranker_ai.set_lamports(new_cranker_lamports); + let next_slot = next_exec_slot .checked_add(interval_slots) .ok_or(ProgramError::ArithmeticOverflow)?; diff --git a/programs/hydra/src/processor/cancel.rs b/programs/hydra/src/processor/cancel.rs index daf58f1..fefff7c 100644 --- a/programs/hydra/src/processor/cancel.rs +++ b/programs/hydra/src/processor/cancel.rs @@ -2,14 +2,12 @@ use pinocchio::{error::ProgramError, AccountView, ProgramResult}; -use crate::processor::common::drain_lamports; -use hydra_api::program::processor::require_cancel_authority; +use hydra_api::program::processor::process_cancel; pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { let [authority, crank_ai, recipient] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - require_cancel_authority(authority, crank_ai, &crate::ID)?; - drain_lamports(crank_ai, recipient) + process_cancel(authority, crank_ai, recipient, &crate::ID) } diff --git a/programs/hydra/src/processor/close.rs b/programs/hydra/src/processor/close.rs index f916070..9c51abf 100644 --- a/programs/hydra/src/processor/close.rs +++ b/programs/hydra/src/processor/close.rs @@ -1,83 +1,20 @@ //! `Close` (disc 3) — permissionless cleanup of exhausted / underfunded / //! stuck cranks. A crank is "stuck" when `next_exec_slot` has fallen more //! than `STALENESS_THRESHOLD_SLOTS` behind the current slot, which means no -//! cranker has successfully fired it in ~31 days — almost always because the +//! cranker has successfully fired it in ~10 days — almost always because the //! inner ix deterministically fails. +//! +//! The closable check + bounty/refund payout is shared with the ephemeral +//! program via [`hydra_api::program::processor::process_close`]. use pinocchio::{error::ProgramError, AccountView, ProgramResult}; -use hydra_api::{ - consts::{CRANKER_REWARD, STALENESS_THRESHOLD_SLOTS}, - state::load_crank, - HydraError, -}; - -use hydra_api::program::helpers::get_clock_slot; -use hydra_api::program::processor::{require_refund_recipient, require_signed_crank}; +use hydra_api::program::processor::process_close; pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { let [reporter, crank_ai, recipient] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - require_signed_crank(reporter, crank_ai, &crate::ID)?; - - // Snapshot fields we need from the crank header. - let (stored_authority, remaining, rent_min, priority_tip, next_exec_slot, lamports_now) = { - let data = crank_ai.try_borrow()?; - let state = unsafe { load_crank(&data)? }; - ( - state.authority, - state.remaining(), - state.rent_min(), - state.priority_tip(), - state.next_exec_slot(), - crank_ai.lamports(), - ) - }; - - // Pre-condition: exhausted OR underfunded OR stuck. - let exhausted = remaining == 0; - let next_reward = CRANKER_REWARD - .checked_add(priority_tip) - .ok_or(ProgramError::ArithmeticOverflow)?; - let underfunded = lamports_now - < rent_min - .checked_add(next_reward) - .ok_or(ProgramError::ArithmeticOverflow)?; - // `next_exec_slot` only advances on *successful* `Trigger`, so persistent - // failure pins it in the past. `saturating_sub` makes future-scheduled - // cranks (`next_exec_slot > current_slot`) trivially not-stale. - let current_slot = get_clock_slot()?; - let stuck = current_slot.saturating_sub(next_exec_slot) > STALENESS_THRESHOLD_SLOTS; - - if !(exhausted || underfunded || stuck) { - return Err(HydraError::NotClosable.into()); - } - - require_refund_recipient(stored_authority, recipient)?; - - // Flat bounty (2 × base fee) to whoever cranked the cleanup; the balance - // refunds to `recipient`. `min` handles a crank holding less than the - // bounty — reporter gets what's there, recipient gets nothing. - let bounty = CRANKER_REWARD.min(lamports_now); - let refund = lamports_now - bounty; - - crank_ai.set_lamports(0); - - let new_reporter = reporter - .lamports() - .checked_add(bounty) - .ok_or(ProgramError::ArithmeticOverflow)?; - reporter.set_lamports(new_reporter); - - // When `recipient` aliases `reporter`, the write above is visible here, so - // adding `refund` on top preserves the sum. Distinct accounts: clean credit. - let new_recipient = recipient - .lamports() - .checked_add(refund) - .ok_or(ProgramError::ArithmeticOverflow)?; - recipient.set_lamports(new_recipient); - - Ok(()) + process_close(reporter, crank_ai, recipient, &crate::ID) } diff --git a/programs/hydra/src/processor/common.rs b/programs/hydra/src/processor/common.rs index ea68d10..06d3ebb 100644 --- a/programs/hydra/src/processor/common.rs +++ b/programs/hydra/src/processor/common.rs @@ -1,22 +1,8 @@ -//! Shared helpers for the base-layer crank processors. - -use pinocchio::{error::ProgramError, AccountView, ProgramResult}; - -/// Move all lamports out of `src` into `dst`. The runtime zeroes `src.data` -/// and reassigns ownership to the system program at the instruction boundary -/// because `src.lamports == 0` post-write. -#[inline(always)] -pub(super) fn drain_lamports(src: &AccountView, dst: &AccountView) -> ProgramResult { - let amount = src.lamports(); - let new_dst = dst - .lamports() - .checked_add(amount) - .ok_or(ProgramError::ArithmeticOverflow)?; - src.set_lamports(0); - dst.set_lamports(new_dst); - Ok(()) -} +//! Raw-pointer field helpers for the base-layer `Trigger` hot path. The lamport +//! drain + close/cancel payout logic is shared with the ephemeral program via +//! [`hydra_api::program::processor`]. +/// Read/write the 8-byte header fields the `Trigger` hot path touches directly. #[inline(always)] pub(super) unsafe fn read_u64(p: *const u8) -> u64 { core::ptr::read_unaligned(p as *const u64) diff --git a/tests/lib.rs b/tests/lib.rs index e8b275d..b6bc0d7 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -26,6 +26,10 @@ use hydra_api::{ /// Absolute path to the built `.so` (without extension) — mollusk appends `.so`. pub const HYDRA_SO: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../target/deploy/hydra"); +/// Absolute path to the built ephemeral `.so` (without extension). +pub const HYDRA_EPHEMERAL_SO: &str = + concat!(env!("CARGO_MANIFEST_DIR"), "/../target/deploy/hydra_ephemeral"); + // --------------------------------------------------------------------------- // Helpers (pub so the bench file `benches/compute_units.rs` can reuse them) // --------------------------------------------------------------------------- @@ -50,6 +54,16 @@ pub fn mollusk_with_hydra() -> Mollusk { mollusk } +pub fn eph_id() -> Pubkey { + Pubkey::new_from_array(hydra_api::ephemeral::ID.to_bytes()) +} + +pub fn mollusk_with_hydra_ephemeral() -> Mollusk { + let mut mollusk = Mollusk::new(&eph_id(), HYDRA_EPHEMERAL_SO); + memo::add_program(&mut mollusk); + mollusk +} + /// Load the tiny pinocchio noop alongside hydra. Call this before using /// `NOOP_ID` as a scheduled program target. pub fn load_noop(mollusk: &mut Mollusk) { @@ -724,6 +738,95 @@ mod tests { assert_eq!(header.next_exec_slot(), 100, "slot advanced by interval"); } + /// The ephemeral `Trigger` must pay the cranker exactly like the base one. + /// Ephemeral `Create` CPIs the Magic program (unavailable in mollusk), so we + /// mint a valid crank via the base program — the `Crank` layout + region are + /// identical — then re-own it to the ephemeral program and trigger it. + #[test] + fn ephemeral_trigger_pays_cranker() { + let base = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let memo_data: &[u8] = b"tick"; + let priority_tip: u64 = 2_500; + + let create = create_ix( + payer, crank_pda, SEED, [0u8; 32], 0, 100, 10, priority_tip, 0, memo::ID, &[], + memo_data, + ); + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let (memo_id, memo_acct) = memo::keyed_account(); + let create_accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (memo_id, memo_acct.clone()), + (system_program, system_program_acct.clone()), + ]; + let after_create = base.process_transaction_instructions(&[create], &create_accounts); + assert!( + after_create.raw_result.is_ok(), + "base create failed: {:?}", + after_create.raw_result + ); + + // Re-own the freshly-minted crank to the ephemeral program and fund it + // as the cranker-reward budget (a sponsor would do this with a transfer). + let mut crank_acct = after_create + .resulting_accounts + .iter() + .find(|(k, _)| k == &crank_pda) + .map(|(_, a)| a.clone()) + .expect("crank after create"); + crank_acct.owner = eph_id(); + crank_acct.lamports += 1_000_000; + + let eph = mollusk_with_hydra_ephemeral(); + let cranker_starting: u64 = 0; + let trigger = hydra_api::instruction::ephemeral::trigger(crank_pda, cranker); + let scheduled = Instruction { + program_id: memo::ID, + accounts: vec![], + data: memo_data.to_vec(), + }; + let trigger_accounts = vec![ + (crank_pda, crank_acct), + (cranker, Account::new(cranker_starting, 0, &system_program)), + (memo_id, memo_acct), + (system_program, system_program_acct), + ]; + + let after = eph.process_transaction_instructions(&[trigger, scheduled], &trigger_accounts); + assert!( + after.raw_result.is_ok(), + "ephemeral trigger failed: {:?}", + after.raw_result + ); + + let cranker_acct = after + .resulting_accounts + .iter() + .find(|(k, _)| k == &cranker) + .map(|(_, a)| a) + .expect("cranker after trigger"); + assert_eq!( + cranker_acct.lamports, + cranker_starting + CRANKER_REWARD + priority_tip, + "ephemeral cranker reward" + ); + + let crank_after = after + .resulting_accounts + .iter() + .find(|(k, _)| k == &crank_pda) + .map(|(_, a)| a) + .expect("crank after trigger"); + let header = decode_header(&crank_after.data); + assert_eq!(header.executed(), 1, "executed++"); + assert_eq!(header.remaining(), 9, "remaining--"); + assert_eq!(header.next_exec_slot(), 100, "slot advanced by interval"); + } + #[test] fn cancel_with_matching_authority_refunds_recipient() { let mollusk = mollusk_with_hydra(); From 735568601968a46a93adce8ca259450bf6a65d1d Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 1 Jul 2026 15:45:12 +0200 Subject: [PATCH 12/33] test: exact funding --- tests/e2e/tests/ephemeral_cranks.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/e2e/tests/ephemeral_cranks.rs b/tests/e2e/tests/ephemeral_cranks.rs index 05526f5..5f5096e 100644 --- a/tests/e2e/tests/ephemeral_cranks.rs +++ b/tests/e2e/tests/ephemeral_cranks.rs @@ -64,6 +64,7 @@ use hydra_api::instruction::{ ephemeral::{self as eph}, CreateArgs, }; +use hydra_api::CRANKER_REWARD; use solana_client::rpc_client::RpcClient; use solana_commitment_config::CommitmentConfig; use solana_instruction::{AccountMeta, Instruction}; @@ -539,7 +540,11 @@ fn create_crank( scheduled: std::slice::from_ref(&sched), }, ); - let fund_ix = system_instruction::transfer(&sponsor.pubkey(), &crank, LAMPORTS_PER_SOL / 100); + let fund_ix = system_instruction::transfer( + &sponsor.pubkey(), + &crank, + CRANKER_REWARD * TARGET_EXECUTIONS, + ); send( rpc, &[create, fund_ix], From 12503626ef4c7a10f8e8e788f69837fdd685cd0d Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 1 Jul 2026 15:47:37 +0200 Subject: [PATCH 13/33] style: lint --- .github/workflows/ci.yml | 7 ------- tests/lib.rs | 18 +++++++++++++++--- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ff70ac..897b53a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,9 +36,6 @@ jobs: - name: Format — main workspace run: cargo fmt --all --check - - name: Format — tests/ephemeral crate - run: cargo fmt --manifest-path tests/ephemeral/Cargo.toml --all --check - - name: Format — tests/e2e crate run: cargo fmt --manifest-path tests/e2e/Cargo.toml --all --check @@ -118,10 +115,6 @@ jobs: working-directory: hydra run: cargo clippy -p hydra-ephemeral --all-targets -- -D warnings - - name: Clippy — ephemeral test crate - working-directory: hydra - run: cargo clippy --manifest-path tests/ephemeral/Cargo.toml --all-targets -- -D warnings - # --------------------------------------------------------------------------- # Live end-to-end: boots the real three-process stack (mb-test-validator + # ephemeral-validator + hydra-cranker) and asserts ephemeral cranks fire on diff --git a/tests/lib.rs b/tests/lib.rs index b6bc0d7..e6847fe 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -27,8 +27,10 @@ use hydra_api::{ pub const HYDRA_SO: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../target/deploy/hydra"); /// Absolute path to the built ephemeral `.so` (without extension). -pub const HYDRA_EPHEMERAL_SO: &str = - concat!(env!("CARGO_MANIFEST_DIR"), "/../target/deploy/hydra_ephemeral"); +pub const HYDRA_EPHEMERAL_SO: &str = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../target/deploy/hydra_ephemeral" +); // --------------------------------------------------------------------------- // Helpers (pub so the bench file `benches/compute_units.rs` can reuse them) @@ -752,7 +754,17 @@ mod tests { let priority_tip: u64 = 2_500; let create = create_ix( - payer, crank_pda, SEED, [0u8; 32], 0, 100, 10, priority_tip, 0, memo::ID, &[], + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + priority_tip, + 0, + memo::ID, + &[], memo_data, ); let (system_program, system_program_acct) = keyed_account_for_system_program(); From 139bb3904322e6c90a306b40c99625ddef7b7f16 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 1 Jul 2026 15:52:35 +0200 Subject: [PATCH 14/33] feat: remove unused lockfile --- tests/e2e/Cargo.lock | 5455 ------------------------------------------ 1 file changed, 5455 deletions(-) delete mode 100644 tests/e2e/Cargo.lock diff --git a/tests/e2e/Cargo.lock b/tests/e2e/Cargo.lock deleted file mode 100644 index 22afacd..0000000 --- a/tests/e2e/Cargo.lock +++ /dev/null @@ -1,5455 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "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", -] - -[[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 = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b16372df9ec6577a8e4140c85aa8b743d99945cbeebbc0d7b739136a4e601a4" -dependencies = [ - "ahash", - "solana-epoch-schedule", - "solana-hash 4.4.0", - "solana-keypair", - "solana-pubkey 4.2.0", - "solana-sha256-hasher", - "solana-svm-feature-set", -] - -[[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 = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "anyhow" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" - -[[package]] -name = "arc-swap" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" -dependencies = [ - "rustversion", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "ascii" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" - -[[package]] -name = "asn1-rs" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror 2.0.18", - "time", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "async-compression" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" -dependencies = [ - "compression-codecs", - "compression-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "async-lock" -version = "3.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[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 = "bincode" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" -dependencies = [ - "bincode_derive", - "unty", -] - -[[package]] -name = "bincode_derive" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" -dependencies = [ - "virtue", -] - -[[package]] -name = "bitflags" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" -dependencies = [ - "serde_core", -] - -[[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.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" -dependencies = [ - "borsh-derive", - "bytes", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "brotli" -version = "8.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - -[[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" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" -dependencies = [ - "serde", -] - -[[package]] -name = "caps" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" -dependencies = [ - "libc", -] - -[[package]] -name = "cc" -version = "1.2.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[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 = "cfg_eval" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "combine" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" -dependencies = [ - "ascii", - "byteorder", - "either", - "memchr", - "unreachable", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "compression-codecs" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" -dependencies = [ - "brotli", - "compression-core", - "flate2", - "memchr", -] - -[[package]] -name = "compression-core" -version = "0.4.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" -dependencies = [ - "encode_unicode", - "libc", - "unicode-width", - "windows-sys 0.61.2", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[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 = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest", - "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", -] - -[[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", -] - -[[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", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint 0.4.6", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[package]] -name = "derivation-path" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "dlopen2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[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", - "subtle", - "zeroize", -] - -[[package]] -name = "either" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "ephemeral-rollups-pinocchio" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a09b61c47e5b4eeb7add34e9d43d836784a66d78fa704606bebaa453bef73e21" -dependencies = [ - "bincode 2.0.1", - "pinocchio 0.10.2", - "pinocchio-pubkey", - "pinocchio-system", - "solana-address 2.6.1", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "fastbloom" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" -dependencies = [ - "getrandom 0.3.4", - "libm", - "rand 0.9.4", - "siphasher", -] - -[[package]] -name = "feature-probe" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" - -[[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 1.0.0", -] - -[[package]] -name = "five8_const" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" -dependencies = [ - "five8_core 0.1.2", -] - -[[package]] -name = "five8_const" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" -dependencies = [ - "five8_core 1.0.0", -] - -[[package]] -name = "five8_core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" - -[[package]] -name = "five8_core" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - -[[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-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix", - "windows-link", -] - -[[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", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasip2", - "wasm-bindgen", -] - -[[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.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "histogram" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.4.2", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http 1.4.2", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hydra-api" -version = "0.1.1" -dependencies = [ - "ephemeral-rollups-pinocchio", - "pinocchio 0.10.2", - "solana-address 2.6.1", - "solana-instruction", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "hydra-e2e-tests" -version = "0.0.0" -dependencies = [ - "anyhow", - "hydra-api", - "solana-client", - "solana-commitment-config", - "solana-instruction", - "solana-keypair", - "solana-message", - "solana-pubkey 4.2.0", - "solana-rpc-client-api", - "solana-signature", - "solana-signer", - "solana-system-interface 2.0.0", - "solana-transaction", -] - -[[package]] -name = "hyper" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "http 1.4.2", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" -dependencies = [ - "http 1.4.2", - "hyper", - "hyper-util", - "rustls", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 1.0.8", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-util", - "http 1.4.2", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" - -[[package]] -name = "icu_properties" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" - -[[package]] -name = "icu_provider" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", -] - -[[package]] -name = "indicatif" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" -dependencies = [ - "console", - "portable-atomic", - "unicode-width", - "unit-prefix", - "web-time", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "ipnet" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" - -[[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.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 = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine 4.6.7", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "jsonrpc-core" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" -dependencies = [ - "futures", - "futures-executor", - "futures-util", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "keccak" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" -dependencies = [ - "cpufeatures", -] - -[[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 = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - -[[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.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "memchr" -version = "2.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" - -[[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 = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "nix" -version = "0.31.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" -dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[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-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[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", -] - -[[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 = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "oid-registry" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -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 = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[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 = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest", -] - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[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 = "pinocchio" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8afe4f39c0e25cc471b35b89963312791a5162d45a86578cbeaad9e5e7d1b3b" - -[[package]] -name = "pinocchio" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06810dac15a4ef83d3dabdb4f2f22fb39c9adff669cd2781da4f716510a647c" -dependencies = [ - "solana-account-view", - "solana-address 2.6.1", - "solana-define-syscall 4.0.1", - "solana-instruction-view", - "solana-program-error", -] - -[[package]] -name = "pinocchio-pubkey" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0225638cadcbebae8932cb7f49cb5da7c15c21beb19f048f05a5ca7d93f065" -dependencies = [ - "five8_const 0.1.4", - "pinocchio 0.9.3", - "sha2-const-stable", -] - -[[package]] -name = "pinocchio-system" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24044a0815753862b558e179e78f03f7344cb755de48617a09d7d23b50883b6c" -dependencies = [ - "pinocchio 0.10.2", - "solana-address 2.6.1", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[package]] -name = "polyval" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "portable-atomic" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" - -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[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" -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 = "qstring" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "quinn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" -dependencies = [ - "bytes", - "fastbloom", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.4", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", -] - -[[package]] -name = "quote" -version = "1.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" -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.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.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.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "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 = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 1.4.2", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 1.0.8", -] - -[[package]] -name = "reqwest-middleware" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" -dependencies = [ - "anyhow", - "async-trait", - "http 1.4.2", - "reqwest", - "serde", - "thiserror 1.0.69", - "tower-service", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" - -[[package]] -name = "rustc-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-platform-verifier" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" -dependencies = [ - "core-foundation", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework", - "security-framework-sys", - "webpki-root-certs", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - -[[package]] -name = "rustls-webpki" -version = "0.103.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[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-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" -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", -] - -[[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_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[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", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "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 = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" - -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" - -[[package]] -name = "socket2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "solana-account" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" -dependencies = [ - "bincode 1.3.3", - "serde", - "serde_bytes", - "serde_derive", - "solana-account-info", - "solana-clock", - "solana-instruction-error", - "solana-pubkey 4.2.0", - "solana-sdk-ids", - "solana-sysvar", -] - -[[package]] -name = "solana-account-decoder" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cef67445b00fa0d3ab67ddd1397012d961cf74d1cb47224ba1375d351991181" -dependencies = [ - "Inflector", - "base64 0.22.1", - "bincode 1.3.3", - "bs58", - "bv", - "serde", - "serde_json", - "solana-account", - "solana-account-decoder-client-types", - "solana-address-lookup-table-interface", - "solana-clock", - "solana-config-interface", - "solana-epoch-schedule", - "solana-fee-calculator", - "solana-instruction", - "solana-loader-v3-interface", - "solana-nonce", - "solana-program-option", - "solana-program-pack", - "solana-pubkey 4.2.0", - "solana-rent 3.1.0", - "solana-sdk-ids", - "solana-slot-hashes", - "solana-slot-history", - "solana-stake-interface", - "solana-sysvar", - "solana-vote-interface", - "spl-generic-token", - "spl-token-2022-interface", - "spl-token-group-interface", - "spl-token-interface", - "spl-token-metadata-interface", - "thiserror 2.0.18", - "zstd", -] - -[[package]] -name = "solana-account-decoder-client-types" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da42c070e1d8a268c9ab746352ad1883c81af2529b3d11cb66d8484a746bd9d8" -dependencies = [ - "base64 0.22.1", - "bs58", - "serde", - "serde_json", - "solana-account", - "solana-pubkey 4.2.0", - "zstd", -] - -[[package]] -name = "solana-account-info" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" -dependencies = [ - "solana-address 2.6.1", - "solana-program-error", - "solana-program-memory", -] - -[[package]] -name = "solana-account-view" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37ca34c37f92ee341b73d5ce7c8ef5bb38e9a87955b4bd343c63fa18b149215" -dependencies = [ - "solana-address 2.6.1", - "solana-program-error", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c93e262f671bf402e1040e4a7e40b05d81da5956c7681948c975a0997517bb" -dependencies = [ - "borsh", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek", - "five8", - "five8_const 1.0.0", - "serde", - "serde_derive", - "sha2-const-stable", - "solana-atomic-u64", - "solana-define-syscall 5.1.0", - "solana-nullable", - "solana-program-error", - "solana-sanitize", - "solana-sha256-hasher", - "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 1.3.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" -dependencies = [ - "parking_lot", -] - -[[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-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0254ae347d34fbb7d4561c5b4a1de762f177cbbc6d11a257b69564a18bb91eb" -dependencies = [ - "async-trait", - "bincode 1.3.3", - "dashmap", - "futures", - "futures-util", - "indexmap", - "indicatif", - "log", - "quinn", - "rayon", - "solana-account", - "solana-client-traits", - "solana-commitment-config", - "solana-connection-cache", - "solana-epoch-info", - "solana-hash 4.4.0", - "solana-instruction", - "solana-keypair", - "solana-measure", - "solana-message", - "solana-net-utils", - "solana-pubkey 4.2.0", - "solana-pubsub-client", - "solana-quic-client", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-rpc-client-nonce-utils", - "solana-signature", - "solana-signer", - "solana-streamer", - "solana-time-utils", - "solana-tls-utils", - "solana-tpu-client", - "solana-transaction", - "solana-transaction-error", - "solana-transaction-status-client-types", - "solana-udp-client", - "thiserror 2.0.18", - "tokio", - "tokio-util", -] - -[[package]] -name = "solana-client-traits" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08618ed587e128105510c54ae3e456b9a06d674d8640db75afe66dad65cb4e02" -dependencies = [ - "solana-account", - "solana-commitment-config", - "solana-epoch-info", - "solana-hash 3.1.0", - "solana-instruction", - "solana-keypair", - "solana-message", - "solana-pubkey 3.0.0", - "solana-signature", - "solana-signer", - "solana-system-interface 2.0.0", - "solana-transaction", - "solana-transaction-error", -] - -[[package]] -name = "solana-clock" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0acdace90d96e2c9e70d681465b4fe888b6bcf27c354ae9774e9f8a3b72923d" -dependencies = [ - "serde", - "serde_derive", - "solana-get-sysvar", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", -] - -[[package]] -name = "solana-cluster-type" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a494cf8eda7d98d9f0144b288bb409c88308d2e86f15cc1045aa77b83304718" -dependencies = [ - "solana-hash 4.4.0", -] - -[[package]] -name = "solana-commitment-config" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1517aa49dcfa9cb793ef90e7aac81346d62ca4a546bb1a754030a033e3972e1c" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-config-interface" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e401ae56aed512821cc7a0adaa412ff97fecd2dff4602be7b1330d2daec0c4" -dependencies = [ - "bincode 1.3.3", - "serde", - "serde_derive", - "solana-account", - "solana-instruction", - "solana-pubkey 3.0.0", - "solana-sdk-ids", - "solana-short-vec", - "solana-system-interface 2.0.0", -] - -[[package]] -name = "solana-connection-cache" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891144968e18addbf553a00db8b15ffe906d1bced65fac35df97d42c40f2db1" -dependencies = [ - "async-trait", - "bincode 1.3.3", - "crossbeam-channel", - "futures-util", - "indexmap", - "log", - "rand 0.9.4", - "rayon", - "solana-keypair", - "solana-measure", - "solana-metrics", - "solana-time-utils", - "solana-transaction-error", - "thiserror 2.0.18", - "tokio", -] - -[[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-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 = "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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad280b1ed803853f7b453cb3ea9a57e600ca5599a63e69f7be199b486c0ec93" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", -] - -[[package]] -name = "solana-feature-gate-interface" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" -dependencies = [ - "serde", - "serde_derive", - "solana-program-error", - "solana-pubkey 4.2.0", - "solana-sdk-ids", -] - -[[package]] -name = "solana-fee-calculator" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef67f01cc6a0c72e99a08d0d484683f995de4c80e9568728fa77d1537f9b7e09" -dependencies = [ - "log", - "serde", - "serde_derive", -] - -[[package]] -name = "solana-get-sysvar" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef3bc859fc036ed490146793557386cbfae614ebba4adc704c37d94350824ed4" -dependencies = [ - "solana-address 2.6.1", - "solana-define-syscall 5.1.0", - "solana-program-error", -] - -[[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 = [ - "bytemuck", - "bytemuck_derive", - "five8", - "serde", - "serde_derive", - "solana-atomic-u64", - "solana-sanitize", -] - -[[package]] -name = "solana-inflation" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf104167e42e747602b88e02b25cacfc5de699c3b7cbba60d3250437e6a22ed" - -[[package]] -name = "solana-instruction" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" -dependencies = [ - "bincode 1.3.3", - "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-instruction-view" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60147e4d0a4620013df40bf30a86dd299203ff12fcb8b593cd51014fce0875d8" -dependencies = [ - "solana-account-view", - "solana-address 2.6.1", - "solana-define-syscall 4.0.1", - "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-keypair" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" -dependencies = [ - "ed25519-dalek", - "five8", - "five8_core 1.0.0", - "rand 0.9.4", - "solana-address 2.6.1", - "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", - "solana-instruction", - "solana-pubkey 4.2.0", - "solana-sdk-ids", -] - -[[package]] -name = "solana-measure" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6bf53782db446797b3cb1116edb00709b5767409724058bba14281673f56025" - -[[package]] -name = "solana-message" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" -dependencies = [ - "bincode 1.3.3", - "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-metrics" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b84339a82ea4e2b87dadf13bccf71d3dd6c42db26bbfae9c602663d6a0c892f" -dependencies = [ - "crossbeam-channel", - "gethostname", - "log", - "reqwest", - "solana-cluster-type", - "solana-sha256-hasher", - "solana-time-utils", - "thiserror 2.0.18", -] - -[[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-net-utils" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5456d9f922b0b222e305c7dae2ebdeecdb8f1cfa95e879ca81109349fc9b8927" -dependencies = [ - "anyhow", - "bincode 1.3.3", - "bytes", - "cfg-if", - "dashmap", - "itertools 0.14.0", - "log", - "nix", - "rand 0.9.4", - "serde", - "socket2", - "solana-serde", - "solana-svm-type-overrides", - "tokio", - "url", -] - -[[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-nullable" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0f95d3028ef0f682bb174b77379c19d5dae2904a649f4a103fe29be7a139980" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "solana-packet" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad62e1045c2347a0c0e219a6ceb0abfe904be622920996bfcac8d116fabe3c7" -dependencies = [ - "bincode 1.3.3", - "bitflags", - "cfg_eval", - "serde", - "serde_derive", - "serde_with", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-perf" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b28abb6bf9ef6d6bd57003dded119a4d20022a390405bc3f9a49c8b5abbc03be" -dependencies = [ - "ahash", - "bincode 1.3.3", - "bv", - "bytes", - "caps", - "curve25519-dalek", - "dlopen2", - "fnv", - "libc", - "log", - "nix", - "num_cpus", - "rand 0.9.4", - "rayon", - "serde", - "solana-hash 4.4.0", - "solana-message", - "solana-metrics", - "solana-packet", - "solana-pubkey 4.2.0", - "solana-sdk-ids", - "solana-short-vec", - "solana-signature", - "solana-time-utils", - "solana-transaction-context", -] - -[[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", -] - -[[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 = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" -dependencies = [ - "solana-address 1.1.0", -] - -[[package]] -name = "solana-pubkey" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" -dependencies = [ - "solana-address 2.6.1", -] - -[[package]] -name = "solana-pubsub-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cad54242be1408458425420623c6772e39417aa872deffde531cebea697f032" -dependencies = [ - "crossbeam-channel", - "futures-util", - "http 0.2.12", - "log", - "semver", - "serde", - "serde_json", - "solana-account-decoder-client-types", - "solana-clock", - "solana-pubkey 4.2.0", - "solana-rpc-client-types", - "solana-signature", - "thiserror 2.0.18", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url", -] - -[[package]] -name = "solana-quic-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c86939caa34beff3ac630ea84ce443e5f4eac83d1ef009da51b2e2465821a3e" -dependencies = [ - "async-lock", - "async-trait", - "futures", - "itertools 0.14.0", - "log", - "quinn", - "quinn-proto", - "rustls", - "solana-connection-cache", - "solana-keypair", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-pubkey 4.2.0", - "solana-rpc-client-api", - "solana-signer", - "solana-streamer", - "solana-tls-utils", - "solana-transaction-error", - "thiserror 2.0.18", - "tokio", -] - -[[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]] -name = "solana-rent" -version = "4.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f02fbe2669ebe5d851dbf29a02e91ed6244b051bb64fcc57e6644aba636063" -dependencies = [ - "solana-sdk-macro", -] - -[[package]] -name = "solana-reward-info" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f4c5c5b5599e640c15ead65be499d60f6ee62a5ba7aa7e23f5b0537046ed49" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-rpc-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1085efc9679ad7eb357b0bc711a16ff106a2f031bf7501d7279adf360fd6928f" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bincode 1.3.3", - "bs58", - "futures", - "indicatif", - "log", - "reqwest", - "reqwest-middleware", - "semver", - "serde", - "serde_json", - "solana-account", - "solana-account-decoder", - "solana-account-decoder-client-types", - "solana-clock", - "solana-commitment-config", - "solana-epoch-info", - "solana-epoch-schedule", - "solana-feature-gate-interface", - "solana-hash 4.4.0", - "solana-instruction", - "solana-message", - "solana-pubkey 4.2.0", - "solana-rpc-client-api", - "solana-signature", - "solana-transaction", - "solana-transaction-error", - "solana-transaction-status-client-types", - "solana-version", - "solana-vote-interface", - "tokio", -] - -[[package]] -name = "solana-rpc-client-api" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a12b9801d7bca997a8bc0494df224eafee830f6313cc65100c76bb5df4c46d" -dependencies = [ - "anyhow", - "jsonrpc-core", - "reqwest", - "reqwest-middleware", - "serde", - "serde_json", - "solana-account-decoder-client-types", - "solana-clock", - "solana-rpc-client-types", - "solana-signer", - "solana-transaction-error", - "solana-transaction-status-client-types", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-rpc-client-nonce-utils" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e2be4dff153d2df5b8ad07e0bd655a55fd672c2667fe6b6a48a87fa439ffa5" -dependencies = [ - "solana-account", - "solana-commitment-config", - "solana-hash 4.4.0", - "solana-message", - "solana-nonce", - "solana-pubkey 4.2.0", - "solana-rpc-client", - "solana-sdk-ids", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-rpc-client-types" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3196fe76562ac3a68deef16914074c60132321b681dbb33f5ea8d5adb1fe0b4d" -dependencies = [ - "base64 0.22.1", - "bs58", - "semver", - "serde", - "serde_json", - "solana-account", - "solana-account-decoder-client-types", - "solana-address 2.6.1", - "solana-clock", - "solana-commitment-config", - "solana-fee-calculator", - "solana-inflation", - "solana-reward-info", - "solana-transaction", - "solana-transaction-error", - "solana-transaction-status-client-types", - "solana-version", - "spl-generic-token", - "thiserror 2.0.18", -] - -[[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.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733b3657a0fab205102b799dbe17f85d3972cf984232c1b0b108fa6ba438e382" -dependencies = [ - "byteorder", - "combine 3.8.1", - "hash32", - "log", - "rustc-demangle", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-sdk-ids" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" -dependencies = [ - "solana-address 2.6.1", -] - -[[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", -] - -[[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", -] - -[[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 = "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", - "solana-define-syscall 4.0.1", - "solana-hash 4.4.0", -] - -[[package]] -name = "solana-short-vec" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8250a4495aad49ad20556a607da53bdcb20de78da10b65afbf918b7f1de647" -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", - "solana-sysvar-id", -] - -[[package]] -name = "solana-streamer" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9891af44a3cb707db4a393018bfe6b7cc3dd90390801a6f414ec246fabede4b0" -dependencies = [ - "arc-swap", - "bytes", - "crossbeam-channel", - "dashmap", - "futures", - "futures-util", - "histogram", - "indexmap", - "itertools 0.14.0", - "libc", - "log", - "nix", - "num_cpus", - "pem", - "percentage", - "quinn", - "quinn-proto", - "rand 0.9.4", - "rustls", - "smallvec", - "socket2", - "solana-keypair", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-packet", - "solana-perf", - "solana-pubkey 4.2.0", - "solana-signature", - "solana-signer", - "solana-time-utils", - "solana-tls-utils", - "solana-transaction-error", - "solana-transaction-metrics-tracker", - "thiserror 2.0.18", - "tokio", - "tokio-util", - "x509-parser", -] - -[[package]] -name = "solana-svm-feature-set" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2770de6ab3b2f74b1942128fe6e32f343f4df23b116e9b94bd6860b753d0551b" - -[[package]] -name = "solana-svm-type-overrides" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d07694a92c868df19651367412658373cb38386fca7d68454e925cd73ad090" -dependencies = [ - "rand 0.9.4", -] - -[[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-sysvar" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "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-id" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" -dependencies = [ - "solana-address 2.6.1", - "solana-sdk-ids", -] - -[[package]] -name = "solana-time-utils" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced92c60aa76ec4780a9d93f3bd64dfa916e1b998eacc6f1c110f3f444f02c9" - -[[package]] -name = "solana-tls-utils" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6db6c17ff9c5a1240a86185804541ee681024e7fc551821df007d2af220a66" -dependencies = [ - "rustls", - "solana-keypair", - "solana-pubkey 4.2.0", - "solana-signer", - "x509-parser", -] - -[[package]] -name = "solana-tpu-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde6ca8723785945cf0d6e51285e1b642c0d9ac7140412797d69c51d44d3b6a" -dependencies = [ - "async-trait", - "bincode 1.3.3", - "futures-util", - "indexmap", - "indicatif", - "log", - "rayon", - "solana-client-traits", - "solana-clock", - "solana-commitment-config", - "solana-connection-cache", - "solana-epoch-schedule", - "solana-measure", - "solana-message", - "solana-net-utils", - "solana-pubkey 4.2.0", - "solana-pubsub-client", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-signature", - "solana-signer", - "solana-transaction", - "solana-transaction-error", - "thiserror 2.0.18", - "tokio", -] - -[[package]] -name = "solana-transaction" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" -dependencies = [ - "bincode 1.3.3", - "serde", - "serde_derive", - "solana-address 2.6.1", - "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 = "solana-transaction-context" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081c70560c26b67c1e8451c71c08dd70a44f288aa1d006cd1554e9a834b1a72" -dependencies = [ - "bincode 1.3.3", - "serde", - "solana-account", - "solana-instruction", - "solana-instructions-sysvar", - "solana-pubkey 4.2.0", - "solana-rent 3.1.0", - "solana-sbpf", - "solana-sdk-ids", -] - -[[package]] -name = "solana-transaction-error" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441d6dcd51100e7d97c3fb3b723e08aa701066ff7afc00026fd8d8e222cb95b" -dependencies = [ - "serde", - "serde_derive", - "solana-instruction-error", - "solana-sanitize", -] - -[[package]] -name = "solana-transaction-metrics-tracker" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb1d14966612be1eefb10c325a6335a64f8fb5446c9b70dfcccdda21af9cab9" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "log", - "rand 0.9.4", - "solana-packet", - "solana-perf", - "solana-short-vec", - "solana-signature", -] - -[[package]] -name = "solana-transaction-status-client-types" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb387b44eec1887694ac2264e35951f0c0763014b6593ae17f13cb3088fa2cc" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "bs58", - "serde", - "serde_json", - "solana-account-decoder-client-types", - "solana-commitment-config", - "solana-instruction", - "solana-message", - "solana-pubkey 4.2.0", - "solana-reward-info", - "solana-signature", - "solana-transaction", - "solana-transaction-context", - "solana-transaction-error", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-udp-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6bc4cca754805d6b90b97c675de71c1e1492315127c2fda0798178a42ad63f" -dependencies = [ - "async-trait", - "solana-connection-cache", - "solana-keypair", - "solana-net-utils", - "solana-streamer", - "solana-transaction-error", - "thiserror 2.0.18", - "tokio", -] - -[[package]] -name = "solana-version" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5316d63c5a8dfce421d49f5c2234e568f8fe34e1a372d6f55e397f11c623b475" -dependencies = [ - "agave-feature-set", - "rand 0.9.4", - "semver", - "serde", - "solana-sanitize", - "solana-serde-varint", -] - -[[package]] -name = "solana-vote-interface" -version = "5.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d444ce30b6b4f9c281ba06061ea96638d063b53c2171b1e41ba02ebff79ed28f" -dependencies = [ - "bincode 1.3.3", - "cfg_eval", - "num-derive", - "num-traits", - "serde", - "serde_derive", - "serde_with", - "solana-clock", - "solana-hash 4.4.0", - "solana-instruction", - "solana-instruction-error", - "solana-pubkey 4.2.0", - "solana-rent 4.2.1", - "solana-sdk-ids", - "solana-serde-varint", - "solana-serialize-utils", - "solana-short-vec", - "solana-system-interface 3.2.0", -] - -[[package]] -name = "solana-zero-copy" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea15126ebdc7e270c50d43884369af9f51d2308156d46a18e351522a164844d" -dependencies = [ - "borsh", - "bytemuck", - "bytemuck_derive", -] - -[[package]] -name = "solana-zk-sdk" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" -dependencies = [ - "aes-gcm-siv", - "base64 0.22.1", - "bincode 1.3.3", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek", - "getrandom 0.2.17", - "itertools 0.12.1", - "js-sys", - "merlin", - "num-derive", - "num-traits", - "rand 0.8.6", - "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 = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "spl-discriminator" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e597c5ff9ed7c74a54dbc47bae2f06e4db8c98f4356ad280200dc11878266db1" -dependencies = [ - "bytemuck", - "solana-program-error", - "solana-sha256-hasher", - "spl-discriminator-derive", -] - -[[package]] -name = "spl-discriminator-derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" -dependencies = [ - "quote", - "spl-discriminator-syn", - "syn", -] - -[[package]] -name = "spl-discriminator-syn" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67" -dependencies = [ - "proc-macro2", - "quote", - "sha2", - "syn", - "thiserror 1.0.69", -] - -[[package]] -name = "spl-generic-token" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233df81b75ab99b42f002b5cdd6e65a7505ffa930624f7096a7580a56765e9cf" -dependencies = [ - "bytemuck", - "solana-pubkey 3.0.0", -] - -[[package]] -name = "spl-pod" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9c6e142cdf1e7e77f480053ec9f0ce989890768ddf91f619b50f39d1b456f5" -dependencies = [ - "borsh", - "bytemuck", - "bytemuck_derive", - "num-derive", - "num-traits", - "num_enum", - "solana-program-error", - "solana-program-option", - "solana-pubkey 3.0.0", - "solana-zero-copy", - "solana-zk-sdk", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-2022-interface" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fcd81188211f4b3c8a5eba7fd534c7142f9dd026123b3472492782cc72f4dc6" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-account-info", - "solana-instruction", - "solana-program-error", - "solana-program-option", - "solana-program-pack", - "solana-pubkey 3.0.0", - "solana-sdk-ids", - "solana-zk-sdk", - "spl-pod", - "spl-token-confidential-transfer-proof-extraction", - "spl-token-confidential-transfer-proof-generation", - "spl-token-group-interface", - "spl-token-metadata-interface", - "spl-type-length-value", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-confidential-transfer-proof-extraction" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879a9ebad0d77383d3ea71e7de50503554961ff0f4ef6cbca39ad126e6f6da3a" -dependencies = [ - "bytemuck", - "solana-account-info", - "solana-curve25519", - "solana-instruction", - "solana-instructions-sysvar", - "solana-msg", - "solana-program-error", - "solana-pubkey 3.0.0", - "solana-sdk-ids", - "solana-zk-sdk", - "spl-pod", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-confidential-transfer-proof-generation" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0cd59fce3dc00f563c6fa364d67c3f200d278eae681f4dc250240afcfe044b1" -dependencies = [ - "curve25519-dalek", - "solana-zk-sdk", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-group-interface" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841cbd6f2322d02719be4da1affedbe6495b1048b7b985ec9796032564026e22" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-address 2.6.1", - "solana-instruction", - "solana-nullable", - "solana-program-error", - "solana-zero-copy", - "spl-discriminator", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-interface" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c564ac05a7c8d8b12e988a37d82695b5ba4db376d07ea98bc4882c81f96c7f3" -dependencies = [ - "arrayref", - "bytemuck", - "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]] -name = "spl-token-metadata-interface" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c467c7c3bd056f8fe60119e7ec34ddd6f23052c2fa8f1f51999098063b72676" -dependencies = [ - "borsh", - "num-derive", - "num-traits", - "solana-borsh", - "solana-instruction", - "solana-program-error", - "solana-pubkey 3.0.0", - "spl-discriminator", - "spl-pod", - "spl-type-length-value", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-type-length-value" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2504631748c48d2a937414d64a12dcac4588d34bd07d355d648619c189d29435" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-account-info", - "solana-program-error", - "solana-zero-copy", - "spl-discriminator", - "thiserror 2.0.18", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[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 = "2.0.118" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[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", -] - -[[package]] -name = "time" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" -dependencies = [ - "deranged", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[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 = "tokio" -version = "1.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.26.11", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "futures-util", - "pin-project-lite", - "tokio", -] - -[[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 = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" -dependencies = [ - "async-compression", - "bitflags", - "bytes", - "futures-core", - "futures-util", - "http 1.4.2", - "http-body", - "http-body-util", - "pin-project-lite", - "tokio", - "tokio-util", - "tower", - "tower-layer", - "tower-service", - "url", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "log", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" -dependencies = [ - "bytes", - "data-encoding", - "http 1.4.2", - "httparse", - "log", - "rand 0.9.4", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror 2.0.18", - "utf-8", - "webpki-roots 0.26.11", -] - -[[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 = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unit-prefix" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -dependencies = [ - "void", -] - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "unty" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" - -[[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 = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "virtue" -version = "0.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[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.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.8", -] - -[[package]] -name = "webpki-roots" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" -dependencies = [ - "rustls-pki-types", -] - -[[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-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" -dependencies = [ - "pastey", - "proc-macro2", - "quote", - "thiserror 2.0.18", - "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", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - -[[package]] -name = "x509-parser" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" -dependencies = [ - "asn1-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror 2.0.18", - "time", -] - -[[package]] -name = "yoke" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[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", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerotrie" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] From a70d17ae9c7fab590d33f4cbdaa2d5c5feb38807 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Wed, 1 Jul 2026 15:57:06 +0200 Subject: [PATCH 15/33] feat: untrack lockfile --- .gitignore | 1 + Cargo.lock | 9307 ------------------------------------ examples/anchor/Cargo.lock | 3800 --------------- 3 files changed, 1 insertion(+), 13107 deletions(-) delete mode 100644 Cargo.lock delete mode 100644 examples/anchor/Cargo.lock diff --git a/.gitignore b/.gitignore index a99f04e..c9fc12c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ target/ # Anchor example is its own workspace with its own target dir. /examples/anchor/target +Cargo.lock hydra-keypair.json noop-keypair.json *.so diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 4afd48d..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,9307 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[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-bls12-381" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816773371021cd9bba7a7b4204a2a241cfb45b842f7cc0982bd946ffdcdc4a07" -dependencies = [ - "blst", - "blstrs", - "bytemuck", - "bytemuck_derive", - "group", - "pairing", -] - -[[package]] -name = "agave-feature-set" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a2c365c0245cbb8959de725fc2b44c754b673fdf34c9a7f9d4a25c35a7bf1" -dependencies = [ - "ahash", - "solana-epoch-schedule 2.2.1", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.3.0", - "solana-svm-feature-set 2.3.13", -] - -[[package]] -name = "agave-feature-set" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b16372df9ec6577a8e4140c85aa8b743d99945cbeebbc0d7b739136a4e601a4" -dependencies = [ - "ahash", - "solana-epoch-schedule 3.1.1", - "solana-hash 4.4.0", - "solana-keypair 3.1.2", - "solana-pubkey 4.2.0", - "solana-sha256-hasher 3.1.0", - "solana-svm-feature-set 4.0.0-beta.7", -] - -[[package]] -name = "agave-reserved-account-keys" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8289c8a8a2ef5aa10ce49a070f360f4e035ee3410b8d8f3580fb39d8cf042581" -dependencies = [ - "agave-feature-set 2.3.13", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", -] - -[[package]] -name = "agave-syscalls" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3407f9617bf6f29b303b78e579f80dcaf9209fb016a20b60ab89dab2732fbb" -dependencies = [ - "agave-bls12-381", - "bincode 1.3.3", - "libsecp256k1", - "num-traits", - "solana-account 3.4.0", - "solana-account-info 3.1.1", - "solana-big-mod-exp 3.0.0", - "solana-blake3-hasher 3.1.0", - "solana-bn254", - "solana-clock 3.1.0", - "solana-cpi 3.1.0", - "solana-curve25519 4.0.1", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-keccak-hasher 3.1.0", - "solana-loader-v3-interface 6.1.1", - "solana-poseidon", - "solana-program-entrypoint 3.1.1", - "solana-program-runtime", - "solana-pubkey 4.2.0", - "solana-sbpf", - "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 4.0.0-beta.7", - "solana-svm-log-collector", - "solana-svm-measure", - "solana-svm-timings", - "solana-svm-type-overrides", - "solana-sysvar 3.1.1", - "solana-sysvar-id 3.1.0", - "solana-transaction-context 4.0.0-beta.7", - "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 = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "anstream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" - -[[package]] -name = "anstyle-parse" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.61.2", -] - -[[package]] -name = "anyhow" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" - -[[package]] -name = "arc-swap" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" -dependencies = [ - "rustversion", -] - -[[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.118", -] - -[[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.118", -] - -[[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.118", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" - -[[package]] -name = "ascii" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" - -[[package]] -name = "ascii" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" - -[[package]] -name = "asn1-rs" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror 2.0.18", - "time", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "async-compression" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" -dependencies = [ - "compression-codecs", - "compression-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "async-lock" -version = "3.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "autotools" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef941527c41b0fc0dd48511a8154cd5fc7e29200a0ff8b7203c5d777dbc795cf" -dependencies = [ - "cc", -] - -[[package]] -name = "axum" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" -dependencies = [ - "axum-core", - "bytes", - "futures-util", - "http 1.4.2", - "http-body", - "http-body-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "sync_wrapper", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" -dependencies = [ - "bytes", - "futures-core", - "http 1.4.2", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[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 = "bincode" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" -dependencies = [ - "bincode_derive", - "unty", -] - -[[package]] -name = "bincode_derive" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" -dependencies = [ - "virtue", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" -dependencies = [ - "serde_core", -] - -[[package]] -name = "bitvec" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[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", - "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]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -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 = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2", -] - -[[package]] -name = "blst" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "blstrs" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" -dependencies = [ - "blst", - "byte-slice-cast", - "ff", - "group", - "pairing", - "rand_core 0.6.4", - "serde", - "subtle", -] - -[[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.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" -dependencies = [ - "borsh-derive 1.7.0", - "bytes", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" -dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" -dependencies = [ - "once_cell", - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "brotli" -version = "8.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - -[[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 = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "bytemuck" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" -dependencies = [ - "serde", -] - -[[package]] -name = "caps" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" -dependencies = [ - "libc", -] - -[[package]] -name = "cc" -version = "1.2.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[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 = "cfg_eval" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "chunked_transfer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common 0.1.7", - "inout", -] - -[[package]] -name = "clap" -version = "4.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "clap_lex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" - -[[package]] -name = "cmov" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" - -[[package]] -name = "colorchoice" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" - -[[package]] -name = "combine" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" -dependencies = [ - "ascii 0.9.3", - "byteorder", - "either", - "memchr", - "unreachable", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "compression-codecs" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" -dependencies = [ - "brotli", - "compression-core", - "flate2", - "memchr", -] - -[[package]] -name = "compression-core" -version = "0.4.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" -dependencies = [ - "encode_unicode", - "libc", - "unicode-width", - "windows-sys 0.61.2", -] - -[[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-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 = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[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 = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.7" -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 = "ctrlc" -version = "3.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" -dependencies = [ - "dispatch2", - "nix", - "windows-sys 0.61.2", -] - -[[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 = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[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 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.118", -] - -[[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.118", -] - -[[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.118", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" - -[[package]] -name = "defmt" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f" -dependencies = [ - "bitflags 1.3.2", - "defmt-macros", -] - -[[package]] -name = "defmt-macros" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b" -dependencies = [ - "defmt-parser", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "defmt-parser" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" -dependencies = [ - "thiserror 2.0.18", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint 0.4.6", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[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 0.10.4", - "const-oid", - "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 = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.13.0", - "block2", - "libc", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "dlopen2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[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 2.2.0", - "spki", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature 2.2.0", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519 1.5.3", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519 2.2.3", - "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.118", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "enum-iterator" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4549325971814bda7a44061bf3fe7e487d447cba01e4220a4b454d630d7a016" -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.118", -] - -[[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.118", -] - -[[package]] -name = "env_filter" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "jiff", - "log", -] - -[[package]] -name = "ephemeral-rollups-pinocchio" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a09b61c47e5b4eeb7add34e9d43d836784a66d78fa704606bebaa453bef73e21" -dependencies = [ - "bincode 2.0.1", - "pinocchio 0.10.2", - "pinocchio-pubkey", - "pinocchio-system", - "solana-address 2.6.1", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "fastbloom" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" -dependencies = [ - "getrandom 0.3.4", - "libm", - "rand 0.9.4", - "siphasher", -] - -[[package]] -name = "fastrand" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" - -[[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 = [ - "bitvec", - "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" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" -dependencies = [ - "five8_core 1.0.0", -] - -[[package]] -name = "five8_const" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" -dependencies = [ - "five8_core 0.1.2", -] - -[[package]] -name = "five8_const" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" -dependencies = [ - "five8_core 1.0.0", -] - -[[package]] -name = "five8_core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" - -[[package]] -name = "five8_core" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" - -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - -[[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-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[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 = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix", - "windows-link", -] - -[[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", - "js-sys", - "libc", - "r-efi 5.3.0", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" -dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand 0.8.6", - "rand_core 0.6.4", - "rand_xorshift", - "subtle", -] - -[[package]] -name = "h2" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.4.2", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[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.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "histogram" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.4.2", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http 1.4.2", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hybrid-array" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" -dependencies = [ - "typenum", -] - -[[package]] -name = "hydra" -version = "0.1.1" -dependencies = [ - "hydra-api", - "pinocchio 0.10.2", - "pinocchio-log", - "pinocchio-system", - "solana-define-syscall 5.1.0", -] - -[[package]] -name = "hydra-api" -version = "0.1.1" -dependencies = [ - "ephemeral-rollups-pinocchio", - "pinocchio 0.10.2", - "solana-account-info 3.1.1", - "solana-address 2.6.1", - "solana-cpi 3.1.0", - "solana-define-syscall 5.1.0", - "solana-instruction 3.4.0", - "solana-program-error 3.0.1", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "hydra-cranker" -version = "0.1.1" -dependencies = [ - "anyhow", - "clap", - "crossbeam-channel", - "ctrlc", - "env_logger", - "futures", - "hydra-api", - "log", - "prometheus", - "solana-account-decoder-client-types 4.0.0-beta.7", - "solana-client", - "solana-commitment-config 3.1.1", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-keypair 3.1.2", - "solana-message 3.1.0", - "solana-pubkey 4.2.0", - "solana-pubsub-client", - "solana-rpc-client-api", - "solana-signature 3.4.1", - "solana-signer 3.0.1", - "solana-transaction 3.1.0", - "tiny_http", - "tokio", - "yellowstone-grpc-client", - "yellowstone-grpc-proto", -] - -[[package]] -name = "hydra-e2e-tests" -version = "0.0.0" -dependencies = [ - "anyhow", - "crossbeam-channel", - "hydra-api", - "solana-client", - "solana-commitment-config 3.1.1", - "solana-instruction 3.4.0", - "solana-keypair 3.1.2", - "solana-message 3.1.0", - "solana-pubkey 4.2.0", - "solana-pubsub-client", - "solana-rpc-client-api", - "solana-signature 3.4.1", - "solana-signer 3.0.1", - "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", -] - -[[package]] -name = "hydra-ephemeral" -version = "0.1.1" -dependencies = [ - "ephemeral-rollups-pinocchio", - "hydra-api", - "pinocchio 0.10.2", - "pinocchio-log", - "solana-define-syscall 5.1.0", -] - -[[package]] -name = "hydra-example-native" -version = "0.1.0" -dependencies = [ - "hydra-api", - "mollusk-svm", - "solana-account 3.4.0", - "solana-account-info 3.1.1", - "solana-instruction 3.4.0", - "solana-program-entrypoint 3.1.1", - "solana-program-error 3.0.1", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "hydra-example-pinocchio" -version = "0.1.0" -dependencies = [ - "hydra-api", - "mollusk-svm", - "pinocchio 0.10.2", - "pinocchio-system", - "solana-account 3.4.0", - "solana-instruction 3.4.0", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "hydra-noop" -version = "0.1.0" -dependencies = [ - "pinocchio 0.10.2", - "pinocchio-log", -] - -[[package]] -name = "hydra-tests" -version = "0.1.1" -dependencies = [ - "hydra-api", - "mollusk-svm", - "mollusk-svm-programs-memo", - "solana-account 3.4.0", - "solana-instruction 3.4.0", - "solana-logger", - "solana-pubkey 4.2.0", - "solana-svm-log-collector", - "solana-system-interface 2.0.0", -] - -[[package]] -name = "hyper" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http 1.4.2", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" -dependencies = [ - "http 1.4.2", - "hyper", - "hyper-util", - "rustls", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 1.0.8", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-util", - "http 1.4.2", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" - -[[package]] -name = "icu_properties" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" - -[[package]] -name = "icu_provider" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", -] - -[[package]] -name = "indicatif" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" -dependencies = [ - "console", - "portable-atomic", - "unicode-width", - "unit-prefix", - "web-time", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "ipnet" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[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 = "jiff" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" -dependencies = [ - "defmt", - "jiff-static", - "log", - "portable-atomic", - "portable-atomic-util", - "serde_core", -] - -[[package]] -name = "jiff-static" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine 4.6.7", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.118", -] - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "jsonrpc-core" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" -dependencies = [ - "futures", - "futures-executor", - "futures-util", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2 0.10.9", - "signature 2.2.0", -] - -[[package]] -name = "kaigan" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ba15de5aeb137f0f65aa3bf82187647f1285abfe5b20c80c2c37f7007ad519a" -dependencies = [ - "borsh 0.10.4", - "serde", -] - -[[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 = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libsecp256k1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" -dependencies = [ - "arrayref", - "base64 0.12.3", - "digest 0.9.0", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.7.3", - "serde", - "sha2 0.9.9", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "light-poseidon" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" -dependencies = [ - "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 = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - -[[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.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "memchr" -version = "2.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" - -[[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 = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "mollusk-svm" -version = "0.12.1-agave-4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2463c0d920535dc1a43a0e0ab8100f0dba5699e687f5593bad543440362574d5" -dependencies = [ - "agave-feature-set 4.0.0-beta.7", - "agave-syscalls", - "bincode 1.3.3", - "mollusk-svm-error", - "mollusk-svm-result", - "solana-account 3.4.0", - "solana-bpf-loader-program", - "solana-clock 3.1.0", - "solana-compute-budget", - "solana-epoch-rewards 3.0.2", - "solana-epoch-schedule 3.1.1", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-instructions-sysvar 3.0.1", - "solana-loader-v3-interface 6.1.1", - "solana-loader-v4-interface 3.1.0", - "solana-logger", - "solana-message 3.1.0", - "solana-precompile-error", - "solana-program-error 3.0.1", - "solana-program-runtime", - "solana-pubkey 4.2.0", - "solana-rent 3.1.0", - "solana-sdk-ids 3.1.0", - "solana-slot-hashes 3.0.2", - "solana-stake-interface 2.0.2", - "solana-svm-callback", - "solana-svm-log-collector", - "solana-svm-timings", - "solana-svm-transaction", - "solana-system-program", - "solana-sysvar 3.1.1", - "solana-sysvar-id 3.1.0", - "solana-transaction-context 4.0.0-beta.7", - "solana-transaction-error 3.2.1", -] - -[[package]] -name = "mollusk-svm-error" -version = "0.12.1-agave-4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51aa68fc50ff8a75fdde2ad966156f553a94e5a2ae680bc4fdd0d682a25e81e0" -dependencies = [ - "solana-pubkey 4.2.0", - "thiserror 2.0.18", -] - -[[package]] -name = "mollusk-svm-programs-memo" -version = "0.12.1-agave-4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb5e0de9a80a67f93bcae44252e0c70f022459f34f5982cea5626fa0b61db30" -dependencies = [ - "mollusk-svm", - "solana-account 3.4.0", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "mollusk-svm-result" -version = "0.12.1-agave-4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29cb13af9a3aa05994d2bc327210177654c7ce3eb815791687dc24a339a05bd6" -dependencies = [ - "solana-account 3.4.0", - "solana-instruction 3.4.0", - "solana-program-error 3.0.1", - "solana-pubkey 4.2.0", - "solana-rent 3.1.0", - "solana-transaction-error 3.2.1", -] - -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - -[[package]] -name = "nix" -version = "0.31.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" -dependencies = [ - "bitflags 2.13.0", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[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-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[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.118", -] - -[[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 = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "objc2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" -dependencies = [ - "objc2-encode", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "oid-registry" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[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 = "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 = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[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 = "petgraph" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" -dependencies = [ - "fixedbitset", - "hashbrown 0.15.5", - "indexmap", -] - -[[package]] -name = "pin-project" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pinocchio" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8afe4f39c0e25cc471b35b89963312791a5162d45a86578cbeaad9e5e7d1b3b" - -[[package]] -name = "pinocchio" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06810dac15a4ef83d3dabdb4f2f22fb39c9adff669cd2781da4f716510a647c" -dependencies = [ - "solana-account-view", - "solana-address 2.6.1", - "solana-define-syscall 4.0.1", - "solana-instruction-view", - "solana-program-error 3.0.1", -] - -[[package]] -name = "pinocchio-log" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd11022408f312e6179ece321c1f7dc0d1b2aa7765fddd39b2a7378d65a899e8" -dependencies = [ - "pinocchio-log-macro", -] - -[[package]] -name = "pinocchio-log-macro" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69fb52edb3c5736b044cc462b0957b9767d0f574d138f4e2761438c498a4b467" -dependencies = [ - "quote", - "regex", - "syn 1.0.109", -] - -[[package]] -name = "pinocchio-pubkey" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0225638cadcbebae8932cb7f49cb5da7c15c21beb19f048f05a5ca7d93f065" -dependencies = [ - "five8_const 0.1.4", - "pinocchio 0.9.3", - "sha2-const-stable", -] - -[[package]] -name = "pinocchio-system" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24044a0815753862b558e179e78f03f7344cb755de48617a09d7d23b50883b6c" -dependencies = [ - "pinocchio 0.10.2", - "solana-address 2.6.1", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[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 = "portable-atomic" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" - -[[package]] -name = "portable-atomic-util" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" -dependencies = [ - "portable-atomic", -] - -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.118", -] - -[[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.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[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 = "prometheus" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" -dependencies = [ - "cfg-if", - "fnv", - "lazy_static", - "memchr", - "parking_lot", - "thiserror 1.0.69", -] - -[[package]] -name = "prost" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" -dependencies = [ - "heck", - "itertools 0.14.0", - "log", - "multimap", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "pulldown-cmark", - "pulldown-cmark-to-cmark", - "regex", - "syn 2.0.118", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "prost-types" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" -dependencies = [ - "prost", -] - -[[package]] -name = "protobuf-src" -version = "1.1.0+21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1" -dependencies = [ - "autotools", -] - -[[package]] -name = "pulldown-cmark" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" -dependencies = [ - "bitflags 2.13.0", - "memchr", - "unicase", -] - -[[package]] -name = "pulldown-cmark-to-cmark" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" -dependencies = [ - "pulldown-cmark", -] - -[[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.118", -] - -[[package]] -name = "quinn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" -dependencies = [ - "bytes", - "fastbloom", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.4", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", -] - -[[package]] -name = "quote" -version = "1.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" -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 = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.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 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]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.13.0", -] - -[[package]] -name = "regex" -version = "1.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 1.4.2", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 1.0.8", -] - -[[package]] -name = "reqwest-middleware" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" -dependencies = [ - "anyhow", - "async-trait", - "http 1.4.2", - "reqwest", - "serde", - "thiserror 1.0.69", - "tower-service", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" - -[[package]] -name = "rustc-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags 2.13.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-platform-verifier" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" -dependencies = [ - "core-foundation", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework", - "security-framework-sys", - "webpki-root-certs", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - -[[package]] -name = "rustls-webpki" -version = "0.103.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[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 = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags 2.13.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[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-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" -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.118", -] - -[[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_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[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.118", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - -[[package]] -name = "sha2-const-stable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" - -[[package]] -name = "sha3" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" - -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" - -[[package]] -name = "socket2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "solana-account" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f949fe4edaeaea78c844023bfc1c898e0b1f5a100f8a8d2d0f85d0a7b090258" -dependencies = [ - "bincode 1.3.3", - "serde", - "serde_bytes", - "serde_derive", - "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", - "solana-sysvar 2.3.0", -] - -[[package]] -name = "solana-account" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" -dependencies = [ - "bincode 1.3.3", - "qualifier_attr", - "serde", - "serde_bytes", - "serde_derive", - "solana-account-info 3.1.1", - "solana-clock 3.1.0", - "solana-instruction-error", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", - "solana-sysvar 3.1.1", -] - -[[package]] -name = "solana-account-decoder" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba71c97fa4d85ce4a1e0e79044ad0406c419382be598c800202903a7688ce71a" -dependencies = [ - "Inflector", - "base64 0.22.1", - "bincode 1.3.3", - "bs58", - "bv", - "serde", - "serde_derive", - "serde_json", - "solana-account 2.2.1", - "solana-account-decoder-client-types 2.3.13", - "solana-address-lookup-table-interface 2.2.2", - "solana-clock 2.2.3", - "solana-config-program-client", - "solana-epoch-schedule 2.2.1", - "solana-fee-calculator 2.2.1", - "solana-instruction 2.3.3", - "solana-loader-v3-interface 5.0.0", - "solana-nonce 2.2.1", - "solana-program-option 2.2.1", - "solana-program-pack 2.2.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-slot-hashes 2.2.1", - "solana-slot-history 2.2.1", - "solana-stake-interface 1.2.1", - "solana-sysvar 2.3.0", - "solana-vote-interface 2.2.6", - "spl-generic-token 1.0.1", - "spl-token", - "spl-token-2022", - "spl-token-group-interface 0.6.0", - "spl-token-metadata-interface 0.7.0", - "thiserror 2.0.18", - "zstd", -] - -[[package]] -name = "solana-account-decoder" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cef67445b00fa0d3ab67ddd1397012d961cf74d1cb47224ba1375d351991181" -dependencies = [ - "Inflector", - "base64 0.22.1", - "bincode 1.3.3", - "bs58", - "bv", - "serde", - "serde_json", - "solana-account 3.4.0", - "solana-account-decoder-client-types 4.0.0-beta.7", - "solana-address-lookup-table-interface 3.1.0", - "solana-clock 3.1.0", - "solana-config-interface", - "solana-epoch-schedule 3.1.1", - "solana-fee-calculator 3.2.2", - "solana-instruction 3.4.0", - "solana-loader-v3-interface 6.1.1", - "solana-nonce 3.2.0", - "solana-program-option 3.1.0", - "solana-program-pack 3.1.0", - "solana-pubkey 4.2.0", - "solana-rent 3.1.0", - "solana-sdk-ids 3.1.0", - "solana-slot-hashes 3.0.2", - "solana-slot-history 3.0.1", - "solana-stake-interface 2.0.2", - "solana-sysvar 3.1.1", - "solana-vote-interface 5.1.1", - "spl-generic-token 2.0.1", - "spl-token-2022-interface", - "spl-token-group-interface 0.7.2", - "spl-token-interface", - "spl-token-metadata-interface 0.8.0", - "thiserror 2.0.18", - "zstd", -] - -[[package]] -name = "solana-account-decoder-client-types" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5519e8343325b707f17fbed54fcefb325131b692506d0af9e08a539d15e4f8cf" -dependencies = [ - "base64 0.22.1", - "bs58", - "serde", - "serde_derive", - "serde_json", - "solana-account 2.2.1", - "solana-pubkey 2.4.0", - "zstd", -] - -[[package]] -name = "solana-account-decoder-client-types" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da42c070e1d8a268c9ab746352ad1883c81af2529b3d11cb66d8484a746bd9d8" -dependencies = [ - "base64 0.22.1", - "bs58", - "serde", - "serde_json", - "solana-account 3.4.0", - "solana-pubkey 4.2.0", - "zstd", -] - -[[package]] -name = "solana-account-info" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" -dependencies = [ - "bincode 1.3.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" -dependencies = [ - "solana-address 2.6.1", - "solana-program-error 3.0.1", - "solana-program-memory 3.1.0", -] - -[[package]] -name = "solana-account-view" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37ca34c37f92ee341b73d5ce7c8ef5bb38e9a87955b4bd343c63fa18b149215" -dependencies = [ - "solana-address 2.6.1", - "solana-program-error 3.0.1", -] - -[[package]] -name = "solana-address" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" -dependencies = [ - "solana-address 2.6.1", -] - -[[package]] -name = "solana-address" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c93e262f671bf402e1040e4a7e40b05d81da5956c7681948c975a0997517bb" -dependencies = [ - "borsh 1.7.0", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 4.1.3", - "five8 1.0.0", - "five8_const 1.0.0", - "serde", - "serde_derive", - "sha2-const-stable", - "solana-atomic-u64 3.0.1", - "solana-define-syscall 5.1.0", - "solana-nullable", - "solana-program-error 3.0.1", - "solana-sanitize 3.0.1", - "solana-sha256-hasher 3.1.0", - "wincode", -] - -[[package]] -name = "solana-address-lookup-table-interface" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1673f67efe870b64a65cb39e6194be5b26527691ce5922909939961a6e6b395" -dependencies = [ - "bincode 1.3.3", - "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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115b4f773acc4f3f3cb986b0d335e9845c0368c82b0940410935bc11ae065578" -dependencies = [ - "bincode 1.3.3", - "bytemuck", - "serde", - "serde_derive", - "solana-clock 3.1.0", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", - "solana-slot-hashes 3.0.2", -] - -[[package]] -name = "solana-atomic-u64" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" -dependencies = [ - "parking_lot", -] - -[[package]] -name = "solana-atomic-u64" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" -dependencies = [ - "parking_lot", -] - -[[package]] -name = "solana-big-mod-exp" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "solana-define-syscall 2.3.0", -] - -[[package]] -name = "solana-big-mod-exp" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "solana-define-syscall 3.0.0", -] - -[[package]] -name = "solana-bincode" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" -dependencies = [ - "bincode 1.3.3", - "serde", - "solana-instruction 2.3.3", -] - -[[package]] -name = "solana-bincode" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" -dependencies = [ - "bincode 1.3.3", - "serde_core", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" -dependencies = [ - "blake3", - "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", - "solana-define-syscall 5.1.0", - "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.7.0", -] - -[[package]] -name = "solana-borsh" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" -dependencies = [ - "borsh 1.7.0", -] - -[[package]] -name = "solana-bpf-loader-program" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edf1bfaec45842de224500eca224d17483c749e8408b79edac0fa55d99d0ef8" -dependencies = [ - "agave-syscalls", - "bincode 1.3.3", - "qualifier_attr", - "solana-account 3.4.0", - "solana-bincode 3.1.0", - "solana-clock 3.1.0", - "solana-instruction 3.4.0", - "solana-loader-v3-interface 6.1.1", - "solana-loader-v4-interface 3.1.0", - "solana-packet", - "solana-program-entrypoint 3.1.1", - "solana-program-runtime", - "solana-pubkey 4.2.0", - "solana-sbpf", - "solana-sdk-ids 3.1.0", - "solana-svm-feature-set 4.0.0-beta.7", - "solana-svm-log-collector", - "solana-svm-measure", - "solana-svm-type-overrides", - "solana-system-interface 3.2.0", - "solana-transaction-context 4.0.0-beta.7", -] - -[[package]] -name = "solana-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0254ae347d34fbb7d4561c5b4a1de762f177cbbc6d11a257b69564a18bb91eb" -dependencies = [ - "async-trait", - "bincode 1.3.3", - "dashmap", - "futures", - "futures-util", - "indexmap", - "indicatif", - "log", - "quinn", - "rayon", - "solana-account 3.4.0", - "solana-client-traits", - "solana-commitment-config 3.1.1", - "solana-connection-cache", - "solana-epoch-info", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-keypair 3.1.2", - "solana-measure", - "solana-message 3.1.0", - "solana-net-utils", - "solana-pubkey 4.2.0", - "solana-pubsub-client", - "solana-quic-client", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-rpc-client-nonce-utils", - "solana-signature 3.4.1", - "solana-signer 3.0.1", - "solana-streamer", - "solana-time-utils", - "solana-tls-utils", - "solana-tpu-client", - "solana-transaction 3.1.0", - "solana-transaction-error 3.2.1", - "solana-transaction-status-client-types 4.0.0-beta.7", - "solana-udp-client", - "thiserror 2.0.18", - "tokio", - "tokio-util", -] - -[[package]] -name = "solana-client-traits" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08618ed587e128105510c54ae3e456b9a06d674d8640db75afe66dad65cb4e02" -dependencies = [ - "solana-account 3.4.0", - "solana-commitment-config 3.1.1", - "solana-epoch-info", - "solana-hash 3.1.0", - "solana-instruction 3.4.0", - "solana-keypair 3.1.2", - "solana-message 3.1.0", - "solana-pubkey 3.0.0", - "solana-signature 3.4.1", - "solana-signer 3.0.1", - "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", - "solana-transaction-error 3.2.1", -] - -[[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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea35d8f69b67daddb921a9da7f78ca591b533cf5e98833cd9ae62fdc2e4652c" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-cluster-type" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a494cf8eda7d98d9f0144b288bb409c88308d2e86f15cc1045aa77b83304718" -dependencies = [ - "solana-hash 4.4.0", -] - -[[package]] -name = "solana-commitment-config" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac49c4dde3edfa832de1697e9bcdb7c3b3f7cb7a1981b7c62526c8bb6700fb73" - -[[package]] -name = "solana-commitment-config" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1517aa49dcfa9cb793ef90e7aac81346d62ca4a546bb1a754030a033e3972e1c" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-compute-budget" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aea798cdce381dc8ac72ca970a30fab63bf208f3c2879841a997dc335d07cd6" -dependencies = [ - "solana-fee-structure", - "solana-program-runtime", -] - -[[package]] -name = "solana-config-interface" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e401ae56aed512821cc7a0adaa412ff97fecd2dff4602be7b1330d2daec0c4" -dependencies = [ - "bincode 1.3.3", - "serde", - "serde_derive", - "solana-account 3.4.0", - "solana-instruction 3.4.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-short-vec 3.2.2", - "solana-system-interface 2.0.0", -] - -[[package]] -name = "solana-config-program-client" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53aceac36f105fd4922e29b4f0c1f785b69d7b3e7e387e384b8985c8e0c3595e" -dependencies = [ - "bincode 1.3.3", - "borsh 0.10.4", - "kaigan", - "serde", - "solana-program", -] - -[[package]] -name = "solana-connection-cache" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891144968e18addbf553a00db8b15ffe906d1bced65fac35df97d42c40f2db1" -dependencies = [ - "async-trait", - "bincode 1.3.3", - "crossbeam-channel", - "futures-util", - "indexmap", - "log", - "rand 0.9.4", - "rayon", - "solana-keypair 3.1.2", - "solana-measure", - "solana-metrics", - "solana-time-utils", - "solana-transaction-error 3.2.1", - "thiserror 2.0.18", - "tokio", -] - -[[package]] -name = "solana-cpi" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" -dependencies = [ - "solana-account-info 2.3.0", - "solana-define-syscall 2.3.0", - "solana-instruction 2.3.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 3.1.1", - "solana-define-syscall 4.0.1", - "solana-instruction 3.4.0", - "solana-program-error 3.0.1", - "solana-pubkey 4.2.0", - "solana-stable-layout 3.0.1", -] - -[[package]] -name = "solana-curve25519" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae4261b9a8613d10e77ac831a8fa60b6fa52b9b103df46d641deff9f9812a23" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 4.1.3", - "solana-define-syscall 2.3.0", - "subtle", - "thiserror 2.0.18", -] - -[[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 4.1.3", - "solana-define-syscall 3.0.0", - "subtle", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-curve25519" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b4d2a4bf0d0b0a86c22111917e86e8bd39a7b31420fb2c7d73eb83761fc7af" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 4.1.3", - "solana-define-syscall 5.1.0", - "subtle", - "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" -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 = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "939756d798b25c5ec3cca10e06212bdca3b1443cb9bb740a38124f58b258737b" -dependencies = [ - "derivation-path", - "qstring", - "uriparse", -] - -[[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-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" -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.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 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-epoch-schedule" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fce071fbddecc55d727b1d7ed16a629afe4f6e4c217bc8d00af3b785f6f67ed" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-epoch-schedule" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad280b1ed803853f7b453cb3ea9a57e600ca5599a63e69f7be199b486c0ec93" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-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-feature-gate-interface" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f5c5382b449e8e4e3016fb05e418c53d57782d8b5c30aa372fc265654b956d" -dependencies = [ - "bincode 1.3.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" -dependencies = [ - "serde", - "serde_derive", - "solana-program-error 3.0.1", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", -] - -[[package]] -name = "solana-fee-calculator" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89bc408da0fb3812bc3008189d148b4d3e08252c79ad810b245482a3f70cd8d" -dependencies = [ - "log", - "serde", - "serde_derive", -] - -[[package]] -name = "solana-fee-calculator" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef67f01cc6a0c72e99a08d0d484683f995de4c80e9568728fa77d1537f9b7e09" -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 = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" -dependencies = [ - "borsh 1.7.0", - "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" -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 = [ - "bytemuck", - "bytemuck_derive", - "five8 1.0.0", - "serde", - "serde_derive", - "solana-atomic-u64 3.0.1", - "solana-sanitize 3.0.1", -] - -[[package]] -name = "solana-inflation" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf104167e42e747602b88e02b25cacfc5de699c3b7cbba60d3250437e6a22ed" - -[[package]] -name = "solana-instruction" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab5682934bd1f65f8d2c16f21cb532526fcc1a09f796e2cacdb091eee5774ad" -dependencies = [ - "bincode 1.3.3", - "borsh 1.7.0", - "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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" -dependencies = [ - "bincode 1.3.3", - "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 3.0.1", -] - -[[package]] -name = "solana-instruction-view" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60147e4d0a4620013df40bf30a86dd299203ff12fcb8b593cd51014fce0875d8" -dependencies = [ - "solana-account-view", - "solana-address 2.6.1", - "solana-define-syscall 4.0.1", - "solana-program-error 3.0.1", -] - -[[package]] -name = "solana-instructions-sysvar" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" -dependencies = [ - "bitflags 2.13.0", - "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]] -name = "solana-instructions-sysvar" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0732294560e88ecdb2bbc656e67383e9f88c78ec09469cef172f0d28cd1bcd" -dependencies = [ - "bitflags 2.13.0", - "solana-account-info 3.1.1", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-program-error 3.0.1", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-serialize-utils 3.1.2", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-keccak-hasher" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" -dependencies = [ - "sha3", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-keccak-hasher" -version = "3.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 = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd3f04aa1a05c535e93e121a95f66e7dcccf57e007282e8255535d24bf1e98bb" -dependencies = [ - "ed25519-dalek 1.0.1", - "five8 0.2.1", - "rand 0.7.3", - "solana-pubkey 2.4.0", - "solana-seed-phrase 2.2.1", - "solana-signature 2.3.0", - "solana-signer 2.2.1", - "wasm-bindgen", -] - -[[package]] -name = "solana-keypair" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" -dependencies = [ - "ed25519-dalek 2.2.0", - "five8 1.0.0", - "five8_core 1.0.0", - "rand 0.9.4", - "solana-address 2.6.1", - "solana-seed-phrase 3.0.0", - "solana-signature 3.4.1", - "solana-signer 3.0.1", -] - -[[package]] -name = "solana-last-restart-slot" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6360ac2fdc72e7463565cd256eedcf10d7ef0c28a1249d261ec168c1b55cdd" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-last-restart-slot" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426711c6564b790026e45cabec3c64b971864c48b6b2d83c0ebf52a118bb4cda" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-loader-v2-interface" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8ab08006dad78ae7cd30df8eea0539e207d08d91eaefb3e1d49a446e1c49654" -dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "solana-instruction 2.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]] -name = "solana-loader-v3-interface" -version = "6.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0538d4dbc9022e01616f1c58f2db98ece739c5d5ed4a2ef8737a953e76a2d4" -dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "solana-instruction 3.4.0", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", -] - -[[package]] -name = "solana-loader-v4-interface" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "706a777242f1f39a83e2a96a2a6cb034cb41169c6ecbee2cf09cb873d9659e7e" -dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "solana-instruction 2.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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" -dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "solana-instruction 3.4.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-system-interface 2.0.0", -] - -[[package]] -name = "solana-logger" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef7421d1092680d72065edbf5c7605856719b021bf5f173656c71febcdd5d003" -dependencies = [ - "env_logger", - "lazy_static", - "libc", - "log", - "signal-hook", -] - -[[package]] -name = "solana-measure" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6bf53782db446797b3cb1116edb00709b5767409724058bba14281673f56025" - -[[package]] -name = "solana-message" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1796aabce376ff74bf89b78d268fa5e683d7d7a96a0a4e4813ec34de49d5314b" -dependencies = [ - "bincode 1.3.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" -dependencies = [ - "bincode 1.3.3", - "lazy_static", - "serde", - "serde_derive", - "solana-address 2.6.1", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-short-vec 3.2.2", - "solana-transaction-error 3.2.1", -] - -[[package]] -name = "solana-metrics" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b84339a82ea4e2b87dadf13bccf71d3dd6c42db26bbfae9c602663d6a0c892f" -dependencies = [ - "crossbeam-channel", - "gethostname", - "log", - "reqwest", - "solana-cluster-type", - "solana-sha256-hasher 3.1.0", - "solana-time-utils", - "thiserror 2.0.18", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726b7cbbc6be6f1c6f29146ac824343b9415133eee8cce156452ad1db93f8008" -dependencies = [ - "solana-define-syscall 5.1.0", -] - -[[package]] -name = "solana-native-token" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61515b880c36974053dd499c0510066783f0cc6ac17def0c7ef2a244874cf4a9" - -[[package]] -name = "solana-net-utils" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5456d9f922b0b222e305c7dae2ebdeecdb8f1cfa95e879ca81109349fc9b8927" -dependencies = [ - "anyhow", - "bincode 1.3.3", - "bytes", - "cfg-if", - "dashmap", - "itertools 0.14.0", - "log", - "nix", - "rand 0.9.4", - "serde", - "socket2", - "solana-serde", - "solana-svm-type-overrides", - "tokio", - "url", -] - -[[package]] -name = "solana-nonce" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703e22eb185537e06204a5bd9d509b948f0066f2d1d814a6f475dafb3ddf1325" -dependencies = [ - "serde", - "serde_derive", - "solana-fee-calculator 2.2.1", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.3.0", -] - -[[package]] -name = "solana-nonce" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95dbc9f2e33b6c10e231df15cb2a3bff9ea7eab6347f9e316fe75c97fd67bbb" -dependencies = [ - "serde", - "serde_derive", - "solana-fee-calculator 3.2.2", - "solana-hash 4.4.0", - "solana-pubkey 4.2.0", - "solana-sha256-hasher 3.1.0", -] - -[[package]] -name = "solana-nonce-account" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" -dependencies = [ - "solana-account 3.4.0", - "solana-hash 3.1.0", - "solana-nonce 3.2.0", - "solana-sdk-ids 3.1.0", -] - -[[package]] -name = "solana-nullable" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0f95d3028ef0f682bb174b77379c19d5dae2904a649f4a103fe29be7a139980" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "solana-packet" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad62e1045c2347a0c0e219a6ceb0abfe904be622920996bfcac8d116fabe3c7" -dependencies = [ - "bincode 1.3.3", - "bitflags 2.13.0", - "cfg_eval", - "serde", - "serde_derive", - "serde_with", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-perf" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b28abb6bf9ef6d6bd57003dded119a4d20022a390405bc3f9a49c8b5abbc03be" -dependencies = [ - "ahash", - "bincode 1.3.3", - "bv", - "bytes", - "caps", - "curve25519-dalek 4.1.3", - "dlopen2", - "fnv", - "libc", - "log", - "nix", - "num_cpus", - "rand 0.9.4", - "rayon", - "serde", - "solana-hash 4.4.0", - "solana-message 3.1.0", - "solana-metrics", - "solana-packet", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", - "solana-short-vec 3.2.2", - "solana-signature 3.4.1", - "solana-time-utils", - "solana-transaction-context 4.0.0-beta.7", -] - -[[package]] -name = "solana-poseidon" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "737b8ab25bf4cc8e618f80f1fe40709b2ace708bc764a36b8a4c81eea8c07034" -dependencies = [ - "ark-bn254 0.4.0", - "ark-bn254 0.5.0", - "light-poseidon 0.2.0", - "light-poseidon 0.4.0", - "solana-define-syscall 4.0.1", - "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 = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" -dependencies = [ - "bincode 1.3.3", - "blake3", - "borsh 0.10.4", - "borsh 1.7.0", - "bs58", - "bytemuck", - "console_error_panic_hook", - "console_log", - "getrandom 0.2.17", - "lazy_static", - "log", - "memoffset", - "num-bigint 0.4.6", - "num-derive", - "num-traits", - "rand 0.8.6", - "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", - "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", - "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-entrypoint" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ce041b1a0ed275290a5008ee1a4a6c48f5054c8a3d78d313c08958a06aedbd" -dependencies = [ - "solana-account-info 2.3.0", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-program-entrypoint" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c9b0a1ff494e05f503a08b3d51150b73aa639544631e510279d6375f290997" -dependencies = [ - "solana-account-info 3.1.1", - "solana-define-syscall 4.0.1", - "solana-program-error 3.0.1", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-program-error" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee2e0217d642e2ea4bee237f37bd61bb02aec60da3647c48ff88f6556ade775" -dependencies = [ - "borsh 1.7.0", - "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 1.7.0", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4068648649653c2c50546e9a7fb761791b5ab0cda054c771bb5808d3a4b9eb52" -dependencies = [ - "solana-define-syscall 4.0.1", -] - -[[package]] -name = "solana-program-option" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc677a2e9bc616eda6dbdab834d463372b92848b2bfe4a1ed4e4b4adba3397d0" - -[[package]] -name = "solana-program-option" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a88006a9b8594088cec9027ab77caaaa258a2aaa2083d3f086c44b42e50aeab" - -[[package]] -name = "solana-program-pack" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "319f0ef15e6e12dc37c597faccb7d62525a509fec5f6975ecb9419efddeb277b" -dependencies = [ - "solana-program-error 2.2.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 3.0.1", -] - -[[package]] -name = "solana-program-runtime" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7d2dca474d6a6af35c670ec82a0f20cdab1fd7978502d61f4797f840e2eb7e" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "cfg-if", - "itertools 0.14.0", - "log", - "percentage", - "rand 0.9.4", - "serde", - "solana-account 3.4.0", - "solana-account-info 3.1.1", - "solana-clock 3.1.0", - "solana-epoch-rewards 3.0.2", - "solana-epoch-schedule 3.1.1", - "solana-fee-structure", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-last-restart-slot 3.0.1", - "solana-loader-v3-interface 6.1.1", - "solana-program-entrypoint 3.1.1", - "solana-pubkey 4.2.0", - "solana-rent 3.1.0", - "solana-sbpf", - "solana-sdk-ids 3.1.0", - "solana-slot-hashes 3.0.2", - "solana-stable-layout 3.0.1", - "solana-stake-interface 2.0.2", - "solana-svm-callback", - "solana-svm-feature-set 4.0.0-beta.7", - "solana-svm-log-collector", - "solana-svm-measure", - "solana-svm-timings", - "solana-svm-transaction", - "solana-svm-type-overrides", - "solana-system-interface 3.2.0", - "solana-sysvar 3.1.1", - "solana-sysvar-id 3.1.0", - "solana-transaction-context 4.0.0-beta.7", - "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.7.0", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 4.1.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" -dependencies = [ - "solana-address 1.1.0", -] - -[[package]] -name = "solana-pubkey" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" -dependencies = [ - "solana-address 2.6.1", -] - -[[package]] -name = "solana-pubsub-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cad54242be1408458425420623c6772e39417aa872deffde531cebea697f032" -dependencies = [ - "crossbeam-channel", - "futures-util", - "http 0.2.12", - "log", - "semver", - "serde", - "serde_json", - "solana-account-decoder-client-types 4.0.0-beta.7", - "solana-clock 3.1.0", - "solana-pubkey 4.2.0", - "solana-rpc-client-types", - "solana-signature 3.4.1", - "thiserror 2.0.18", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url", -] - -[[package]] -name = "solana-quic-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c86939caa34beff3ac630ea84ce443e5f4eac83d1ef009da51b2e2465821a3e" -dependencies = [ - "async-lock", - "async-trait", - "futures", - "itertools 0.14.0", - "log", - "quinn", - "quinn-proto", - "rustls", - "solana-connection-cache", - "solana-keypair 3.1.2", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-pubkey 4.2.0", - "solana-rpc-client-api", - "solana-signer 3.0.1", - "solana-streamer", - "solana-tls-utils", - "solana-transaction-error 3.2.1", - "thiserror 2.0.18", - "tokio", -] - -[[package]] -name = "solana-rent" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1aea8fdea9de98ca6e8c2da5827707fb3842833521b528a713810ca685d2480" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-rent" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e860d5499a705369778647e97d760f7670adfb6fc8419dd3d568deccd46d5487" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-rent" -version = "4.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f02fbe2669ebe5d851dbf29a02e91ed6244b051bb64fcc57e6644aba636063" -dependencies = [ - "solana-sdk-macro 3.0.1", -] - -[[package]] -name = "solana-reward-info" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18205b69139b1ae0ab8f6e11cdcb627328c0814422ad2482000fa2ca54ae4a2f" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-reward-info" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f4c5c5b5599e640c15ead65be499d60f6ee62a5ba7aa7e23f5b0537046ed49" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-rpc-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1085efc9679ad7eb357b0bc711a16ff106a2f031bf7501d7279adf360fd6928f" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bincode 1.3.3", - "bs58", - "futures", - "indicatif", - "log", - "reqwest", - "reqwest-middleware", - "semver", - "serde", - "serde_json", - "solana-account 3.4.0", - "solana-account-decoder 4.0.0-beta.7", - "solana-account-decoder-client-types 4.0.0-beta.7", - "solana-clock 3.1.0", - "solana-commitment-config 3.1.1", - "solana-epoch-info", - "solana-epoch-schedule 3.1.1", - "solana-feature-gate-interface 3.1.0", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-message 3.1.0", - "solana-pubkey 4.2.0", - "solana-rpc-client-api", - "solana-signature 3.4.1", - "solana-transaction 3.1.0", - "solana-transaction-error 3.2.1", - "solana-transaction-status-client-types 4.0.0-beta.7", - "solana-version", - "solana-vote-interface 5.1.1", - "tokio", -] - -[[package]] -name = "solana-rpc-client-api" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a12b9801d7bca997a8bc0494df224eafee830f6313cc65100c76bb5df4c46d" -dependencies = [ - "anyhow", - "jsonrpc-core", - "reqwest", - "reqwest-middleware", - "serde", - "serde_json", - "solana-account-decoder-client-types 4.0.0-beta.7", - "solana-clock 3.1.0", - "solana-rpc-client-types", - "solana-signer 3.0.1", - "solana-transaction-error 3.2.1", - "solana-transaction-status-client-types 4.0.0-beta.7", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-rpc-client-nonce-utils" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e2be4dff153d2df5b8ad07e0bd655a55fd672c2667fe6b6a48a87fa439ffa5" -dependencies = [ - "solana-account 3.4.0", - "solana-commitment-config 3.1.1", - "solana-hash 4.4.0", - "solana-message 3.1.0", - "solana-nonce 3.2.0", - "solana-pubkey 4.2.0", - "solana-rpc-client", - "solana-sdk-ids 3.1.0", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-rpc-client-types" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3196fe76562ac3a68deef16914074c60132321b681dbb33f5ea8d5adb1fe0b4d" -dependencies = [ - "base64 0.22.1", - "bs58", - "semver", - "serde", - "serde_json", - "solana-account 3.4.0", - "solana-account-decoder-client-types 4.0.0-beta.7", - "solana-address 2.6.1", - "solana-clock 3.1.0", - "solana-commitment-config 3.1.1", - "solana-fee-calculator 3.2.2", - "solana-inflation", - "solana-reward-info 5.0.0", - "solana-transaction 3.1.0", - "solana-transaction-error 3.2.1", - "solana-transaction-status-client-types 4.0.0-beta.7", - "solana-version", - "spl-generic-token 2.0.1", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-sanitize" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" - -[[package]] -name = "solana-sanitize" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" - -[[package]] -name = "solana-sbpf" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733b3657a0fab205102b799dbe17f85d3972cf984232c1b0b108fa6ba438e382" -dependencies = [ - "byteorder", - "combine 3.8.1", - "hash32", - "libc", - "log", - "rand 0.8.6", - "rustc-demangle", - "thiserror 2.0.18", - "winapi", -] - -[[package]] -name = "solana-sdk-ids" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5d8b9cc68d5c88b062a33e23a6466722467dde0035152d8fb1afbcdf350a5f" -dependencies = [ - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-sdk-ids" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" -dependencies = [ - "solana-address 2.6.1", -] - -[[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.118", -] - -[[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.118", -] - -[[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" -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-security-txt" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94a02d486b28f219a4f8f5d7dd93cbfbb93c9f466cb7871c22e50cd5ae9a7a2" - -[[package]] -name = "solana-seed-derivable" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beb82b5adb266c6ea90e5cf3967235644848eac476c5a1f2f9283a143b7c97f" -dependencies = [ - "solana-derivation-path 2.2.1", -] - -[[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 3.0.0", -] - -[[package]] -name = "solana-seed-phrase" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36187af2324f079f65a675ec22b31c24919cb4ac22c79472e85d819db9bbbc15" -dependencies = [ - "hmac", - "pbkdf2", - "sha2 0.10.9", -] - -[[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" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a7e155eba458ecfb0107b98236088c3764a09ddf0201ec29e52a0be40857113" -dependencies = [ - "serde", -] - -[[package]] -name = "solana-serde-varint" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "950e5b83e839dc0f92c66afc124bb8f40e89bc90f0579e8ec5499296d27f54e3" -dependencies = [ - "serde", -] - -[[package]] -name = "solana-serialize-utils" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e" -dependencies = [ - "solana-instruction 2.3.3", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-serialize-utils" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761357b0853c9623bf12c1d2314b3d6160a85b087b84c45224fb85766d22616b" -dependencies = [ - "solana-instruction-error", - "solana-pubkey 4.2.0", - "solana-sanitize 3.0.1", -] - -[[package]] -name = "solana-sha256-hasher" -version = "2.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]] -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 = "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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8250a4495aad49ad20556a607da53bdcb20de78da10b65afbf918b7f1de647" -dependencies = [ - "serde_core", -] - -[[package]] -name = "solana-signature" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c" -dependencies = [ - "ed25519-dalek 1.0.1", - "five8 0.2.1", - "serde", - "serde-big-array", - "serde_derive", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-signature" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0364c7577c3c82a693ce28a1febc8d1b5d1b0a175fdc2114ae6186b69effe1e" -dependencies = [ - "ed25519-dalek 2.2.0", - "five8 1.0.0", - "serde", - "serde-big-array", - "serde_derive", - "solana-sanitize 3.0.1", - "wincode", -] - -[[package]] -name = "solana-signer" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c41991508a4b02f021c1342ba00bcfa098630b213726ceadc7cb032e051975b" -dependencies = [ - "solana-pubkey 2.4.0", - "solana-signature 2.3.0", - "solana-transaction-error 2.2.1", -] - -[[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 3.4.1", - "solana-transaction-error 3.2.1", -] - -[[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]] -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 3.1.0", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-slot-history" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ccc1b2067ca22754d5283afb2b0126d61eae734fc616d23871b0943b0d935e" -dependencies = [ - "bv", - "serde", - "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-slot-history" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0622d03a823770f7763afd866e012b296d5a3cbbbe51e110b5bd9ab3441efdca" -dependencies = [ - "bv", - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-stable-layout" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54" -dependencies = [ - "solana-instruction 2.3.3", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-stable-layout" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" -dependencies = [ - "solana-instruction 3.4.0", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-stake-interface" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c" -dependencies = [ - "borsh 0.10.4", - "borsh 1.7.0", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" -dependencies = [ - "num-traits", - "serde", - "serde_derive", - "solana-clock 3.1.0", - "solana-cpi 3.1.0", - "solana-instruction 3.4.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 3.1.0", -] - -[[package]] -name = "solana-streamer" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9891af44a3cb707db4a393018bfe6b7cc3dd90390801a6f414ec246fabede4b0" -dependencies = [ - "arc-swap", - "bytes", - "crossbeam-channel", - "dashmap", - "futures", - "futures-util", - "histogram", - "indexmap", - "itertools 0.14.0", - "libc", - "log", - "nix", - "num_cpus", - "pem", - "percentage", - "quinn", - "quinn-proto", - "rand 0.9.4", - "rustls", - "smallvec", - "socket2", - "solana-keypair 3.1.2", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-packet", - "solana-perf", - "solana-pubkey 4.2.0", - "solana-signature 3.4.1", - "solana-signer 3.0.1", - "solana-time-utils", - "solana-tls-utils", - "solana-transaction-error 3.2.1", - "solana-transaction-metrics-tracker", - "thiserror 2.0.18", - "tokio", - "tokio-util", - "x509-parser", -] - -[[package]] -name = "solana-svm-callback" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93b1a838ccefa6cf68e21ca189b116d62fbc35863f90f130f8df5e475f4f62b" -dependencies = [ - "solana-account 3.4.0", - "solana-clock 3.1.0", - "solana-precompile-error", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-svm-feature-set" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f24b836eb4d74ec255217bdbe0f24f64a07adeac31aca61f334f91cd4a3b1d5" - -[[package]] -name = "solana-svm-feature-set" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2770de6ab3b2f74b1942128fe6e32f343f4df23b116e9b94bd6860b753d0551b" - -[[package]] -name = "solana-svm-log-collector" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cbf4f01eb9bcb5067f8dba54faff46ce6e2994257a200ee7bb1c33d77cb920e" -dependencies = [ - "log", -] - -[[package]] -name = "solana-svm-measure" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f8d068d88ee2b88c74cfa5bb7bca7834fe018aa8f3df1ed283f1ac38649c7f" - -[[package]] -name = "solana-svm-timings" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95296e38354367ab4a9cf479d249f672725a5ffd8cae53be007d2fb59a95bbda" -dependencies = [ - "eager", - "enum-iterator", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-svm-transaction" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45b79ea0ddc2af9283e86af3bc0480a0a677ba9c3b7575fd57ded6c0ae1cc689" -dependencies = [ - "solana-hash 4.4.0", - "solana-message 3.1.0", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", - "solana-signature 3.4.1", - "solana-transaction 3.1.0", -] - -[[package]] -name = "solana-svm-type-overrides" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d07694a92c868df19651367412658373cb38386fca7d68454e925cd73ad090" -dependencies = [ - "rand 0.9.4", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" -dependencies = [ - "num-traits", - "serde", - "serde_derive", - "solana-instruction 3.4.0", - "solana-msg 3.1.0", - "solana-program-error 3.0.1", - "solana-pubkey 3.0.0", -] - -[[package]] -name = "solana-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 3.4.0", - "solana-msg 3.1.0", - "solana-program-error 3.0.1", -] - -[[package]] -name = "solana-system-program" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07658a2f4fba704cdcd27896e26d4991b3c9648978adccc1fbe2184040f4bcf1" -dependencies = [ - "bincode 1.3.3", - "log", - "serde", - "solana-account 3.4.0", - "solana-bincode 3.1.0", - "solana-fee-calculator 3.2.2", - "solana-instruction 3.4.0", - "solana-nonce 3.2.0", - "solana-nonce-account", - "solana-packet", - "solana-program-runtime", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", - "solana-svm-log-collector", - "solana-svm-type-overrides", - "solana-system-interface 3.2.0", - "solana-sysvar 3.1.1", - "solana-transaction-context 4.0.0-beta.7", -] - -[[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 1.3.3", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "lazy_static", - "serde", - "serde_derive", - "solana-account-info 3.1.1", - "solana-clock 3.1.0", - "solana-define-syscall 4.0.1", - "solana-epoch-rewards 3.0.2", - "solana-epoch-schedule 3.1.1", - "solana-fee-calculator 3.2.2", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-last-restart-slot 3.0.1", - "solana-program-entrypoint 3.1.1", - "solana-program-error 3.0.1", - "solana-program-memory 3.1.0", - "solana-pubkey 4.2.0", - "solana-rent 3.1.0", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-slot-hashes 3.0.2", - "solana-slot-history 3.0.1", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-sysvar-id" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1" -dependencies = [ - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", -] - -[[package]] -name = "solana-sysvar-id" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" -dependencies = [ - "solana-address 2.6.1", - "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-tls-utils" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6db6c17ff9c5a1240a86185804541ee681024e7fc551821df007d2af220a66" -dependencies = [ - "rustls", - "solana-keypair 3.1.2", - "solana-pubkey 4.2.0", - "solana-signer 3.0.1", - "x509-parser", -] - -[[package]] -name = "solana-tpu-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde6ca8723785945cf0d6e51285e1b642c0d9ac7140412797d69c51d44d3b6a" -dependencies = [ - "async-trait", - "bincode 1.3.3", - "futures-util", - "indexmap", - "indicatif", - "log", - "rayon", - "solana-client-traits", - "solana-clock 3.1.0", - "solana-commitment-config 3.1.1", - "solana-connection-cache", - "solana-epoch-schedule 3.1.1", - "solana-measure", - "solana-message 3.1.0", - "solana-net-utils", - "solana-pubkey 4.2.0", - "solana-pubsub-client", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-signature 3.4.1", - "solana-signer 3.0.1", - "solana-transaction 3.1.0", - "solana-transaction-error 3.2.1", - "thiserror 2.0.18", - "tokio", -] - -[[package]] -name = "solana-transaction" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80657d6088f721148f5d889c828ca60c7daeedac9a8679f9ec215e0c42bcbf41" -dependencies = [ - "serde", - "serde_derive", - "solana-hash 2.3.0", - "solana-instruction 2.3.3", - "solana-keypair 2.2.3", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-short-vec 2.2.1", - "solana-signature 2.3.0", - "solana-transaction-error 2.2.1", - "wasm-bindgen", -] - -[[package]] -name = "solana-transaction" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" -dependencies = [ - "bincode 1.3.3", - "serde", - "serde_derive", - "solana-address 2.6.1", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-message 3.1.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-short-vec 3.2.2", - "solana-signature 3.4.1", - "solana-signer 3.0.1", - "solana-transaction-error 3.2.1", -] - -[[package]] -name = "solana-transaction-context" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a312304361987a85b2ef2293920558e6612876a639dd1309daf6d0d59ef2fe" -dependencies = [ - "bincode 1.3.3", - "serde", - "serde_derive", - "solana-account 2.2.1", - "solana-instruction 2.3.3", - "solana-instructions-sysvar 2.2.2", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", -] - -[[package]] -name = "solana-transaction-context" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081c70560c26b67c1e8451c71c08dd70a44f288aa1d006cd1554e9a834b1a72" -dependencies = [ - "bincode 1.3.3", - "qualifier_attr", - "serde", - "solana-account 3.4.0", - "solana-instruction 3.4.0", - "solana-instructions-sysvar 3.0.1", - "solana-pubkey 4.2.0", - "solana-rent 3.1.0", - "solana-sbpf", - "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 = [ - "serde", - "serde_derive", - "solana-instruction 2.3.3", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-transaction-error" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441d6dcd51100e7d97c3fb3b723e08aa701066ff7afc00026fd8d8e222cb95b" -dependencies = [ - "serde", - "serde_derive", - "solana-instruction-error", - "solana-sanitize 3.0.1", -] - -[[package]] -name = "solana-transaction-metrics-tracker" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb1d14966612be1eefb10c325a6335a64f8fb5446c9b70dfcccdda21af9cab9" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "log", - "rand 0.9.4", - "solana-packet", - "solana-perf", - "solana-short-vec 3.2.2", - "solana-signature 3.4.1", -] - -[[package]] -name = "solana-transaction-status" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135f92f4192cc68900c665becf97fc0a6500ae5a67ff347bf2cbc20ecfefa821" -dependencies = [ - "Inflector", - "agave-reserved-account-keys", - "base64 0.22.1", - "bincode 1.3.3", - "borsh 1.7.0", - "bs58", - "log", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder 2.3.13", - "solana-address-lookup-table-interface 2.2.2", - "solana-clock 2.2.3", - "solana-hash 2.3.0", - "solana-instruction 2.3.3", - "solana-loader-v2-interface", - "solana-loader-v3-interface 5.0.0", - "solana-message 2.4.0", - "solana-program-option 2.2.1", - "solana-pubkey 2.4.0", - "solana-reward-info 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-signature 2.3.0", - "solana-stake-interface 1.2.1", - "solana-system-interface 1.0.0", - "solana-transaction 2.2.3", - "solana-transaction-error 2.2.1", - "solana-transaction-status-client-types 2.3.13", - "solana-vote-interface 2.2.6", - "spl-associated-token-account", - "spl-memo", - "spl-token", - "spl-token-2022", - "spl-token-group-interface 0.6.0", - "spl-token-metadata-interface 0.7.0", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-transaction-status-client-types" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f1d7c2387c35850848212244d2b225847666cb52d3bd59a5c409d2c300303d" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "bs58", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder-client-types 2.3.13", - "solana-commitment-config 2.2.1", - "solana-message 2.4.0", - "solana-reward-info 2.2.1", - "solana-signature 2.3.0", - "solana-transaction 2.2.3", - "solana-transaction-context 2.3.13", - "solana-transaction-error 2.2.1", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-transaction-status-client-types" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb387b44eec1887694ac2264e35951f0c0763014b6593ae17f13cb3088fa2cc" -dependencies = [ - "base64 0.22.1", - "bincode 1.3.3", - "bs58", - "serde", - "serde_json", - "solana-account-decoder-client-types 4.0.0-beta.7", - "solana-commitment-config 3.1.1", - "solana-instruction 3.4.0", - "solana-message 3.1.0", - "solana-pubkey 4.2.0", - "solana-reward-info 5.0.0", - "solana-signature 3.4.1", - "solana-transaction 3.1.0", - "solana-transaction-context 4.0.0-beta.7", - "solana-transaction-error 3.2.1", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-udp-client" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6bc4cca754805d6b90b97c675de71c1e1492315127c2fda0798178a42ad63f" -dependencies = [ - "async-trait", - "solana-connection-cache", - "solana-keypair 3.1.2", - "solana-net-utils", - "solana-streamer", - "solana-transaction-error 3.2.1", - "thiserror 2.0.18", - "tokio", -] - -[[package]] -name = "solana-version" -version = "4.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5316d63c5a8dfce421d49f5c2234e568f8fe34e1a372d6f55e397f11c623b475" -dependencies = [ - "agave-feature-set 4.0.0-beta.7", - "rand 0.9.4", - "semver", - "serde", - "solana-sanitize 3.0.1", - "solana-serde-varint 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 1.3.3", - "num-derive", - "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]] -name = "solana-vote-interface" -version = "5.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d444ce30b6b4f9c281ba06061ea96638d063b53c2171b1e41ba02ebff79ed28f" -dependencies = [ - "bincode 1.3.3", - "cfg_eval", - "num-derive", - "num-traits", - "serde", - "serde_derive", - "serde_with", - "solana-clock 3.1.0", - "solana-hash 4.4.0", - "solana-instruction 3.4.0", - "solana-instruction-error", - "solana-pubkey 4.2.0", - "solana-rent 4.2.1", - "solana-sdk-ids 3.1.0", - "solana-serde-varint 3.0.1", - "solana-serialize-utils 3.1.2", - "solana-short-vec 3.2.2", - "solana-system-interface 3.2.0", -] - -[[package]] -name = "solana-zero-copy" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea15126ebdc7e270c50d43884369af9f51d2308156d46a18e351522a164844d" -dependencies = [ - "borsh 1.7.0", - "bytemuck", - "bytemuck_derive", -] - -[[package]] -name = "solana-zk-sdk" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b9fc6ec37d16d0dccff708ed1dd6ea9ba61796700c3bb7c3b401973f10f63b" -dependencies = [ - "aes-gcm-siv", - "base64 0.22.1", - "bincode 1.3.3", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 4.1.3", - "itertools 0.12.1", - "js-sys", - "merlin", - "num-derive", - "num-traits", - "rand 0.8.6", - "serde", - "serde_derive", - "serde_json", - "sha3", - "solana-derivation-path 2.2.1", - "solana-instruction 2.3.3", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-seed-derivable 2.2.1", - "solana-seed-phrase 2.2.1", - "solana-signature 2.3.0", - "solana-signer 2.2.1", - "subtle", - "thiserror 2.0.18", - "wasm-bindgen", - "zeroize", -] - -[[package]] -name = "solana-zk-sdk" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" -dependencies = [ - "aes-gcm-siv", - "base64 0.22.1", - "bincode 1.3.3", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 4.1.3", - "getrandom 0.2.17", - "itertools 0.12.1", - "js-sys", - "merlin", - "num-derive", - "num-traits", - "rand 0.8.6", - "serde", - "serde_derive", - "serde_json", - "sha3", - "solana-derivation-path 3.0.0", - "solana-instruction 3.4.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-seed-derivable 3.0.0", - "solana-seed-phrase 3.0.0", - "solana-signature 3.4.1", - "solana-signer 3.0.1", - "subtle", - "thiserror 2.0.18", - "wasm-bindgen", - "zeroize", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "spl-associated-token-account" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae179d4a26b3c7a20c839898e6aed84cb4477adf108a366c95532f058aea041b" -dependencies = [ - "borsh 1.7.0", - "num-derive", - "num-traits", - "solana-program", - "spl-associated-token-account-client", - "spl-token", - "spl-token-2022", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-associated-token-account-client" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f8349dbcbe575f354f9a533a21f272f3eb3808a49e2fdc1c34393b88ba76cb" -dependencies = [ - "solana-instruction 2.3.3", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "spl-discriminator" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3" -dependencies = [ - "bytemuck", - "solana-program-error 2.2.2", - "solana-sha256-hasher 2.3.0", - "spl-discriminator-derive", -] - -[[package]] -name = "spl-discriminator" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e597c5ff9ed7c74a54dbc47bae2f06e4db8c98f4356ad280200dc11878266db1" -dependencies = [ - "bytemuck", - "solana-program-error 3.0.1", - "solana-sha256-hasher 3.1.0", - "spl-discriminator-derive", -] - -[[package]] -name = "spl-discriminator-derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" -dependencies = [ - "quote", - "spl-discriminator-syn", - "syn 2.0.118", -] - -[[package]] -name = "spl-discriminator-syn" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67" -dependencies = [ - "proc-macro2", - "quote", - "sha2 0.10.9", - "syn 2.0.118", - "thiserror 1.0.69", -] - -[[package]] -name = "spl-elgamal-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65edfeed09cd4231e595616aa96022214f9c9d2be02dea62c2b30d5695a6833a" -dependencies = [ - "bytemuck", - "solana-account-info 2.3.0", - "solana-cpi 2.2.1", - "solana-instruction 2.3.3", - "solana-msg 2.2.1", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", - "solana-sysvar 2.3.0", - "solana-zk-sdk 2.3.13", - "spl-pod 0.5.1", - "spl-token-confidential-transfer-proof-extraction 0.3.0", -] - -[[package]] -name = "spl-generic-token" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741a62a566d97c58d33f9ed32337ceedd4e35109a686e31b1866c5dfa56abddc" -dependencies = [ - "bytemuck", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "spl-generic-token" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233df81b75ab99b42f002b5cdd6e65a7505ffa930624f7096a7580a56765e9cf" -dependencies = [ - "bytemuck", - "solana-pubkey 3.0.0", -] - -[[package]] -name = "spl-memo" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb" -dependencies = [ - "solana-account-info 2.3.0", - "solana-instruction 2.3.3", - "solana-msg 2.2.1", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "spl-pod" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d994afaf86b779104b4a95ba9ca75b8ced3fdb17ee934e38cb69e72afbe17799" -dependencies = [ - "borsh 1.7.0", - "bytemuck", - "bytemuck_derive", - "num-derive", - "num-traits", - "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-program-option 2.2.1", - "solana-pubkey 2.4.0", - "solana-zk-sdk 2.3.13", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-pod" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9c6e142cdf1e7e77f480053ec9f0ce989890768ddf91f619b50f39d1b456f5" -dependencies = [ - "borsh 1.7.0", - "bytemuck", - "bytemuck_derive", - "num-derive", - "num-traits", - "num_enum", - "solana-program-error 3.0.1", - "solana-program-option 3.1.0", - "solana-pubkey 3.0.0", - "solana-zero-copy", - "solana-zk-sdk 4.0.0", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-program-error" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdebc8b42553070b75aa5106f071fef2eb798c64a7ec63375da4b1f058688c6" -dependencies = [ - "num-derive", - "num-traits", - "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "spl-program-error-derive", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-program-error-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2539e259c66910d78593475540e8072f0b10f0f61d7607bbf7593899ed52d0" -dependencies = [ - "proc-macro2", - "quote", - "sha2 0.10.9", - "syn 2.0.118", -] - -[[package]] -name = "spl-tlv-account-resolution" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1408e961215688715d5a1063cbdcf982de225c45f99c82b4f7d7e1dd22b998d7" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "solana-account-info 2.3.0", - "solana-decode-error", - "solana-instruction 2.3.3", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "spl-discriminator 0.4.1", - "spl-pod 0.5.1", - "spl-program-error", - "spl-type-length-value 0.8.0", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053067c6a82c705004f91dae058b11b4780407e9ccd6799dc9e7d0fab5f242da" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-account-info 2.3.0", - "solana-cpi 2.2.1", - "solana-decode-error", - "solana-instruction 2.3.3", - "solana-msg 2.2.1", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-program-memory 2.3.1", - "solana-program-option 2.2.1", - "solana-program-pack 2.2.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-sysvar 2.3.0", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-2022" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f0dfbb079eebaee55e793e92ca5f433744f4b71ee04880bfd6beefba5973e5" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-account-info 2.3.0", - "solana-clock 2.2.3", - "solana-cpi 2.2.1", - "solana-decode-error", - "solana-instruction 2.3.3", - "solana-msg 2.2.1", - "solana-native-token", - "solana-program-entrypoint 2.3.0", - "solana-program-error 2.2.2", - "solana-program-memory 2.3.1", - "solana-program-option 2.2.1", - "solana-program-pack 2.2.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-security-txt", - "solana-system-interface 1.0.0", - "solana-sysvar 2.3.0", - "solana-zk-sdk 2.3.13", - "spl-elgamal-registry", - "spl-memo", - "spl-pod 0.5.1", - "spl-token", - "spl-token-confidential-transfer-ciphertext-arithmetic", - "spl-token-confidential-transfer-proof-extraction 0.3.0", - "spl-token-confidential-transfer-proof-generation 0.4.1", - "spl-token-group-interface 0.6.0", - "spl-token-metadata-interface 0.7.0", - "spl-transfer-hook-interface", - "spl-type-length-value 0.8.0", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-2022-interface" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fcd81188211f4b3c8a5eba7fd534c7142f9dd026123b3472492782cc72f4dc6" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-account-info 3.1.1", - "solana-instruction 3.4.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 3.1.0", - "solana-zk-sdk 4.0.0", - "spl-pod 0.7.3", - "spl-token-confidential-transfer-proof-extraction 0.5.1", - "spl-token-confidential-transfer-proof-generation 0.5.1", - "spl-token-group-interface 0.7.2", - "spl-token-metadata-interface 0.8.0", - "spl-type-length-value 0.9.1", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-confidential-transfer-ciphertext-arithmetic" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cddd52bfc0f1c677b41493dafa3f2dbbb4b47cf0990f08905429e19dc8289b35" -dependencies = [ - "base64 0.22.1", - "bytemuck", - "solana-curve25519 2.3.13", - "solana-zk-sdk 2.3.13", -] - -[[package]] -name = "spl-token-confidential-transfer-proof-extraction" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe2629860ff04c17bafa9ba4bed8850a404ecac81074113e1f840dbd0ebb7bd6" -dependencies = [ - "bytemuck", - "solana-account-info 2.3.0", - "solana-curve25519 2.3.13", - "solana-instruction 2.3.3", - "solana-instructions-sysvar 2.2.2", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-zk-sdk 2.3.13", - "spl-pod 0.5.1", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-confidential-transfer-proof-extraction" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879a9ebad0d77383d3ea71e7de50503554961ff0f4ef6cbca39ad126e6f6da3a" -dependencies = [ - "bytemuck", - "solana-account-info 3.1.1", - "solana-curve25519 3.1.14", - "solana-instruction 3.4.0", - "solana-instructions-sysvar 3.0.1", - "solana-msg 3.1.0", - "solana-program-error 3.0.1", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-zk-sdk 4.0.0", - "spl-pod 0.7.3", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-confidential-transfer-proof-generation" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa27b9174bea869a7ebf31e0be6890bce90b1a4288bc2bbf24bd413f80ae3fde" -dependencies = [ - "curve25519-dalek 4.1.3", - "solana-zk-sdk 2.3.13", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-confidential-transfer-proof-generation" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0cd59fce3dc00f563c6fa364d67c3f200d278eae681f4dc250240afcfe044b1" -dependencies = [ - "curve25519-dalek 4.1.3", - "solana-zk-sdk 4.0.0", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-group-interface" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5597b4cd76f85ce7cd206045b7dc22da8c25516573d42d267c8d1fd128db5129" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "solana-decode-error", - "solana-instruction 2.3.3", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "spl-discriminator 0.4.1", - "spl-pod 0.5.1", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-group-interface" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841cbd6f2322d02719be4da1affedbe6495b1048b7b985ec9796032564026e22" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-address 2.6.1", - "solana-instruction 3.4.0", - "solana-nullable", - "solana-program-error 3.0.1", - "solana-zero-copy", - "spl-discriminator 0.5.2", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-interface" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c564ac05a7c8d8b12e988a37d82695b5ba4db376d07ea98bc4882c81f96c7f3" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-instruction 3.4.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 3.1.0", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-metadata-interface" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304d6e06f0de0c13a621464b1fd5d4b1bebf60d15ca71a44d3839958e0da16ee" -dependencies = [ - "borsh 1.7.0", - "num-derive", - "num-traits", - "solana-borsh 2.2.1", - "solana-decode-error", - "solana-instruction 2.3.3", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "spl-discriminator 0.4.1", - "spl-pod 0.5.1", - "spl-type-length-value 0.8.0", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-metadata-interface" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c467c7c3bd056f8fe60119e7ec34ddd6f23052c2fa8f1f51999098063b72676" -dependencies = [ - "borsh 1.7.0", - "num-derive", - "num-traits", - "solana-borsh 3.0.2", - "solana-instruction 3.4.0", - "solana-program-error 3.0.1", - "solana-pubkey 3.0.0", - "spl-discriminator 0.5.2", - "spl-pod 0.7.3", - "spl-type-length-value 0.9.1", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-transfer-hook-interface" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e905b849b6aba63bde8c4badac944ebb6c8e6e14817029cbe1bc16829133bd" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "solana-account-info 2.3.0", - "solana-cpi 2.2.1", - "solana-decode-error", - "solana-instruction 2.3.3", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "spl-discriminator 0.4.1", - "spl-pod 0.5.1", - "spl-program-error", - "spl-tlv-account-resolution", - "spl-type-length-value 0.8.0", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-type-length-value" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d417eb548214fa822d93f84444024b4e57c13ed6719d4dcc68eec24fb481e9f5" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "solana-account-info 2.3.0", - "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "spl-discriminator 0.4.1", - "spl-pod 0.5.1", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-type-length-value" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2504631748c48d2a937414d64a12dcac4588d34bd07d355d648619c189d29435" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-account-info 3.1.1", - "solana-program-error 3.0.1", - "solana-zero-copy", - "spl-discriminator 0.5.2", - "thiserror 2.0.18", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[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.118" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" -dependencies = [ - "fastrand", - "getrandom 0.4.3", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[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.118", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" -dependencies = [ - "deranged", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny_http" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" -dependencies = [ - "ascii 1.1.0", - "chunked_transfer", - "httpdate", - "log", -] - -[[package]] -name = "tinystr" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[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 = "tokio" -version = "1.52.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.26.11", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "futures-util", - "pin-project-lite", - "tokio", -] - -[[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 = "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 = "tonic" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" -dependencies = [ - "async-trait", - "axum", - "base64 0.22.1", - "bytes", - "flate2", - "h2", - "http 1.4.2", - "http-body", - "http-body-util", - "hyper", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "rustls-native-certs", - "socket2", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", - "zstd", -] - -[[package]] -name = "tonic-build" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68f61875ac5293cf72e6c8cf0158086428c82c37229e98c840878f1706b0322" -dependencies = [ - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "tonic-health" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcfab99db777fba2802f0dfa861d1628d1ae916fb199d29819941f139ae85082" -dependencies = [ - "prost", - "tokio", - "tokio-stream", - "tonic", - "tonic-prost", -] - -[[package]] -name = "tonic-prost" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" -dependencies = [ - "bytes", - "prost", - "tonic", -] - -[[package]] -name = "tonic-prost-build" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "654e5643eff75d7f8c99197ce1440ed19a3474eada74c12bbac488b2cafdae27" -dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "prost-types", - "quote", - "syn 2.0.118", - "tempfile", - "tonic-build", -] - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "indexmap", - "pin-project-lite", - "slab", - "sync_wrapper", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" -dependencies = [ - "async-compression", - "bitflags 2.13.0", - "bytes", - "futures-core", - "futures-util", - "http 1.4.2", - "http-body", - "http-body-util", - "pin-project-lite", - "tokio", - "tokio-util", - "tower", - "tower-layer", - "tower-service", - "url", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" -dependencies = [ - "bytes", - "data-encoding", - "http 1.4.2", - "httparse", - "log", - "rand 0.9.4", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror 2.0.18", - "utf-8", - "webpki-roots 0.26.11", -] - -[[package]] -name = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "unicase" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unit-prefix" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" - -[[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 = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "unty" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" - -[[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 = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "virtue" -version = "0.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[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.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.118", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.8", -] - -[[package]] -name = "webpki-roots" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" -dependencies = [ - "rustls-pki-types", -] - -[[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-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" -dependencies = [ - "pastey", - "proc-macro2", - "quote", - "thiserror 2.0.18", - "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.118", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x509-parser" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" -dependencies = [ - "asn1-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror 2.0.18", - "time", -] - -[[package]] -name = "yellowstone-grpc-client" -version = "9.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38a9ba079420757406d603cd5f27b8c6f6e94c415c30a43b19ef4a0c4a5ff0d1" -dependencies = [ - "bytes", - "futures", - "thiserror 1.0.69", - "tonic", - "tonic-health", - "yellowstone-grpc-proto", -] - -[[package]] -name = "yellowstone-grpc-proto" -version = "9.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbba21b6046eff1c9be2366a70d7264763b10004306e874b54409503a39e5f1e" -dependencies = [ - "anyhow", - "bincode 1.3.3", - "prost", - "prost-types", - "protobuf-src", - "solana-account 2.2.1", - "solana-account-decoder 2.3.13", - "solana-clock 2.2.3", - "solana-hash 2.3.0", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", - "solana-signature 2.3.0", - "solana-transaction 2.2.3", - "solana-transaction-context 2.3.13", - "solana-transaction-error 2.2.1", - "solana-transaction-status", - "tonic", - "tonic-build", - "tonic-prost", - "tonic-prost-build", -] - -[[package]] -name = "yoke" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", - "synstructure", -] - -[[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.118", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "zerotrie" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/examples/anchor/Cargo.lock b/examples/anchor/Cargo.lock deleted file mode 100644 index a161b39..0000000 --- a/examples/anchor/Cargo.lock +++ /dev/null @@ -1,3800 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "agave-bls12-381" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d9a1b5f771a2c8da108a1492203478e07838cf2db8743b8c868533d713d41d" -dependencies = [ - "blst", - "blstrs", - "bytemuck", - "bytemuck_derive", - "group", - "pairing", -] - -[[package]] -name = "agave-feature-set" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e41538180f5ded6d08a69c75b4f48c4c6ba8098d7e790b3d694a6bc081fbc7" -dependencies = [ - "ahash", - "solana-epoch-schedule", - "solana-hash 4.4.0", - "solana-keypair", - "solana-pubkey 4.2.0", - "solana-sha256-hasher", - "solana-svm-feature-set", -] - -[[package]] -name = "agave-syscalls" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a7bd728013fd439061aee37da3efff4fddbc07d21aaaf33f508794cfbe42ee" -dependencies = [ - "agave-bls12-381", - "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 4.4.0", - "solana-instruction", - "solana-keccak-hasher", - "solana-loader-v3-interface", - "solana-poseidon", - "solana-program-entrypoint", - "solana-program-runtime", - "solana-pubkey 4.2.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", - "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 = "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "anchor-attribute-access-control" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8cd233e382ea499e3c1e51bf4f0cb367abb37bb64e9e3667a5d618af3fe265" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-account" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e12171382e24c5cda6b0f7236a4f6bb9b657da997780c88a0ef794a419298bf" -dependencies = [ - "anchor-syn", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-constant" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510f8db71375446405dfabdaf157fb7d3fbf33470c98ed75fad4c467e8ca0080" -dependencies = [ - "anchor-syn", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-error" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b203169a49ea74da7782281e740ea8e21017c85f8f3b1ab452712c9796d28f" -dependencies = [ - "anchor-syn", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-event" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50a462651e573ec6cc632e8f607e8b1e11f620f6fc26badaeff04fd49f45cc1" -dependencies = [ - "anchor-syn", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-program" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84704ee25a7e788afd9d846945cba536cfdcd53b463e8a337cf237cd897ca4d9" -dependencies = [ - "anchor-lang-idl", - "anchor-syn", - "anyhow", - "heck", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-derive-accounts" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98bf49664527c7bb0ebca04e9b5bfb618d6ceb849ef44a8149241d244bbfb0f6" -dependencies = [ - "anchor-syn", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-derive-serde" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8140a40827bdfd74720f1f3084778fa081262f2f43bd4bdbc350f98ce1b341c6" -dependencies = [ - "anchor-syn", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-derive-space" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee5b6fa5dde037399d3e0bb322a1c7360ad8adc6b6afdd797d19566c039dcfb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-lang" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bac4de7c9a9a69180798af701e22302cc0ebf2ef683b843706a1b7809454735" -dependencies = [ - "anchor-attribute-access-control", - "anchor-attribute-account", - "anchor-attribute-constant", - "anchor-attribute-error", - "anchor-attribute-event", - "anchor-attribute-program", - "anchor-derive-accounts", - "anchor-derive-serde", - "anchor-derive-space", - "anchor-lang-idl", - "base64 0.21.7", - "bincode", - "borsh", - "bytemuck", - "const-crypto", - "solana-account-info", - "solana-clock", - "solana-cpi", - "solana-define-syscall 3.0.0", - "solana-feature-gate-interface", - "solana-instruction", - "solana-instructions-sysvar", - "solana-invoke", - "solana-loader-v3-interface", - "solana-msg", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", - "solana-program-option", - "solana-program-pack", - "solana-pubkey 3.0.0", - "solana-sdk-ids", - "solana-stake-interface", - "solana-system-interface 2.0.0", - "solana-sysvar", - "solana-sysvar-id", - "thiserror 1.0.69", -] - -[[package]] -name = "anchor-lang-idl" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308910c7570f3598e631648dd33ce1a6016cfcb019542667f696b0ffb37e7001" -dependencies = [ - "anchor-lang-idl-spec", - "anyhow", - "heck", - "regex", - "serde", - "serde_json", - "sha2 0.10.9", -] - -[[package]] -name = "anchor-lang-idl-spec" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" -dependencies = [ - "anyhow", - "serde", -] - -[[package]] -name = "anchor-syn" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6940253e80acf0f8e83b1ebd9c4772c496aedcce6ad19aa85ce75d0b6b188298" -dependencies = [ - "anyhow", - "bs58", - "cargo_toml", - "heck", - "proc-macro2", - "quote", - "serde", - "sha2 0.10.9", - "syn 1.0.109", - "thiserror 1.0.69", -] - -[[package]] -name = "anstream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" - -[[package]] -name = "anstyle-parse" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys", -] - -[[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.118", -] - -[[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.118", -] - -[[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.118", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" - -[[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" -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.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.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 = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" - -[[package]] -name = "bitvec" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[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.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "blstrs" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" -dependencies = [ - "blst", - "byte-slice-cast", - "ff", - "group", - "pairing", - "rand_core 0.6.4", - "serde", - "subtle", -] - -[[package]] -name = "borsh" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" -dependencies = [ - "borsh-derive", - "bytes", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[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 = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "bytemuck" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" - -[[package]] -name = "cargo_toml" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" -dependencies = [ - "serde", - "toml", -] - -[[package]] -name = "cc" -version = "1.2.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" -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 = "colorchoice" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" - -[[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-crypto" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c06f1eb05f06cf2e380fdded278fbf056a38974299d77960555a311dcf91a52" -dependencies = [ - "keccak-const", - "sha2-const-stable", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "constant_time_eq" -version = "0.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 = "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.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 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.118", -] - -[[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.118", -] - -[[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.118", -] - -[[package]] -name = "defmt" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f" -dependencies = [ - "bitflags 1.3.2", - "defmt-macros", -] - -[[package]] -name = "defmt-macros" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b" -dependencies = [ - "defmt-parser", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "defmt-parser" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" -dependencies = [ - "thiserror 2.0.18", -] - -[[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 = "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 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 = "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.118", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "enum-iterator" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4549325971814bda7a44061bf3fe7e487d447cba01e4220a4b454d630d7a016" -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.118", -] - -[[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.118", -] - -[[package]] -name = "env_filter" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "jiff", - "log", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys", -] - -[[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 = [ - "bitvec", - "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" -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 = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand 0.8.6", - "rand_core 0.6.4", - "rand_xorshift", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "hydra-api" -version = "0.1.1" -dependencies = [ - "pinocchio", - "solana-account-info", - "solana-address 2.6.1", - "solana-cpi", - "solana-instruction", - "solana-program-error", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "hydra-example-anchor" -version = "0.1.0" -dependencies = [ - "anchor-lang", - "hydra-api", - "mollusk-svm", - "solana-account", - "solana-instruction", - "solana-pubkey 4.2.0", -] - -[[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 0.17.1", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[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.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 = "jiff" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" -dependencies = [ - "defmt", - "jiff-static", - "log", - "portable-atomic", - "portable-atomic-util", - "serde_core", -] - -[[package]] -name = "jiff-static" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2 0.10.9", - "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 = "keccak-const" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d8d8ce877200136358e0bbff3a77965875db3af755a11e1fa6b1b3e2df13ea" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.186" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" - -[[package]] -name = "libsecp256k1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" -dependencies = [ - "arrayref", - "base64 0.12.3", - "digest 0.9.0", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.7.3", - "serde", - "sha2 0.9.9", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "light-poseidon" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" -dependencies = [ - "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 = "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.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" - -[[package]] -name = "memchr" -version = "2.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" - -[[package]] -name = "mollusk-svm" -version = "0.12.1-agave-4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2463c0d920535dc1a43a0e0ab8100f0dba5699e687f5593bad543440362574d5" -dependencies = [ - "agave-feature-set", - "agave-syscalls", - "bincode", - "mollusk-svm-error", - "mollusk-svm-result", - "solana-account", - "solana-bpf-loader-program", - "solana-clock", - "solana-compute-budget", - "solana-epoch-rewards", - "solana-epoch-schedule", - "solana-hash 4.4.0", - "solana-instruction", - "solana-instruction-error", - "solana-instructions-sysvar", - "solana-loader-v3-interface", - "solana-loader-v4-interface", - "solana-logger", - "solana-message", - "solana-precompile-error", - "solana-program-error", - "solana-program-runtime", - "solana-pubkey 4.2.0", - "solana-rent", - "solana-sdk-ids", - "solana-slot-hashes", - "solana-stake-interface", - "solana-svm-callback", - "solana-svm-log-collector", - "solana-svm-timings", - "solana-svm-transaction", - "solana-system-program", - "solana-sysvar", - "solana-sysvar-id", - "solana-transaction-context", - "solana-transaction-error", -] - -[[package]] -name = "mollusk-svm-error" -version = "0.12.1-agave-4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51aa68fc50ff8a75fdde2ad966156f553a94e5a2ae680bc4fdd0d682a25e81e0" -dependencies = [ - "solana-pubkey 4.2.0", - "thiserror 2.0.18", -] - -[[package]] -name = "mollusk-svm-result" -version = "0.12.1-agave-4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29cb13af9a3aa05994d2bc327210177654c7ce3eb815791687dc24a339a05bd6" -dependencies = [ - "solana-account", - "solana-instruction", - "solana-program-error", - "solana-pubkey 4.2.0", - "solana-rent", - "solana-transaction-error", -] - -[[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-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 = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[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 = "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 = "percentage" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" -dependencies = [ - "num", -] - -[[package]] -name = "pinocchio" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cababcb62a2e739c7078ae16eda02789a6e3edd21bbdded864e85c38a7914d" -dependencies = [ - "solana-account-view", - "solana-address 2.6.1", - "solana-define-syscall 5.1.0", - "solana-instruction-view", - "solana-program-error", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "portable-atomic" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" - -[[package]] -name = "portable-atomic-util" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" -dependencies = [ - "portable-atomic", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.12+spec-1.1.0", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[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 = "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.118", -] - -[[package]] -name = "quote" -version = "1.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" -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 = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.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 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]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.13.0", -] - -[[package]] -name = "regex" -version = "1.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" - -[[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-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" -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_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" -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.118", -] - -[[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_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.9.0", - "opaque-debug", -] - -[[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 0.10.7", -] - -[[package]] -name = "sha2-const-stable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" - -[[package]] -name = "sha3" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "smallvec" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" - -[[package]] -name = "solana-account" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" -dependencies = [ - "bincode", - "qualifier_attr", - "serde", - "serde_bytes", - "serde_derive", - "solana-account-info", - "solana-clock", - "solana-instruction-error", - "solana-pubkey 4.2.0", - "solana-sdk-ids", - "solana-sysvar", -] - -[[package]] -name = "solana-account-info" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" -dependencies = [ - "solana-address 2.6.1", - "solana-program-error", - "solana-program-memory", -] - -[[package]] -name = "solana-account-view" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc141b940560430425ebaadb7645496c45f6a10fad9911d719bd03eab7f4d422" -dependencies = [ - "solana-address 2.6.1", - "solana-program-error", -] - -[[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" -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 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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" -dependencies = [ - "blake3", - "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", - "solana-define-syscall 5.1.0", - "thiserror 2.0.18", -] - -[[package]] -name = "solana-bpf-loader-program" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33714bbd14ee6030920b72a26c773964655a92f869175617feb8e6a33e5c9fc4" -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 4.2.0", - "solana-sbpf", - "solana-sdk-ids", - "solana-svm-feature-set", - "solana-svm-log-collector", - "solana-svm-measure", - "solana-svm-type-overrides", - "solana-system-interface 3.2.0", - "solana-transaction-context", -] - -[[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 = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14437d8820ba2084951f7990b03cc53b86fc55a5b5716ee12f4511e4cacec18b" -dependencies = [ - "solana-fee-structure", - "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 = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b4d2a4bf0d0b0a86c22111917e86e8bd39a7b31420fb2c7d73eb83761fc7af" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "curve25519-dalek", - "solana-define-syscall 5.1.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-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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad280b1ed803853f7b453cb3ea9a57e600ca5599a63e69f7be199b486c0ec93" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", -] - -[[package]] -name = "solana-feature-gate-interface" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" -dependencies = [ - "solana-program-error", - "solana-pubkey 4.2.0", - "solana-sdk-ids", -] - -[[package]] -name = "solana-fee-calculator" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef67f01cc6a0c72e99a08d0d484683f995de4c80e9568728fa77d1537f9b7e09" -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 = [ - "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", - "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-instruction-view" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab7a27d0c4214b9f7389c3dd00b68c93093a67f1dcc5b7893aebe299bbcbb47" -dependencies = [ - "solana-account-view", - "solana-address 2.6.1", - "solana-define-syscall 5.1.0", - "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 2.13.0", - "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-invoke" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4065031f5c7dd29ef5f5003c1a353011eeabbafa6c5a5033da0cedbfca824b94" -dependencies = [ - "solana-account-info", - "solana-define-syscall 3.0.0", - "solana-instruction", - "solana-program-entrypoint", - "solana-stable-layout", -] - -[[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.6.1", - "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", - "solana-instruction", - "solana-pubkey 4.2.0", - "solana-sdk-ids", - "solana-system-interface 3.2.0", -] - -[[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-logger" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef7421d1092680d72065edbf5c7605856719b021bf5f173656c71febcdd5d003" -dependencies = [ - "env_logger", - "lazy_static", - "libc", - "log", - "signal-hook", -] - -[[package]] -name = "solana-message" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" -dependencies = [ - "lazy_static", - "solana-address 2.6.1", - "solana-hash 4.4.0", - "solana-instruction", - "solana-sanitize", - "solana-sdk-ids", - "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-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 = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad62e1045c2347a0c0e219a6ceb0abfe904be622920996bfcac8d116fabe3c7" -dependencies = [ - "bitflags 2.13.0", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-poseidon" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "737b8ab25bf4cc8e618f80f1fe40709b2ace708bc764a36b8a4c81eea8c07034" -dependencies = [ - "ark-bn254 0.4.0", - "ark-bn254 0.5.0", - "light-poseidon 0.2.0", - "light-poseidon 0.4.0", - "solana-define-syscall 4.0.1", - "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-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", -] - -[[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 = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b4f1d58aac20d62ad133f7cfe018281d22fce89d2f78c063f2ebf96f005d8d" -dependencies = [ - "base64 0.22.1", - "bincode", - "cfg-if", - "itertools 0.14.0", - "log", - "percentage", - "rand 0.9.4", - "serde", - "solana-account", - "solana-account-info", - "solana-clock", - "solana-epoch-rewards", - "solana-epoch-schedule", - "solana-fee-structure", - "solana-hash 4.4.0", - "solana-instruction", - "solana-last-restart-slot", - "solana-loader-v3-interface", - "solana-program-entrypoint", - "solana-pubkey 4.2.0", - "solana-rent", - "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 3.2.0", - "solana-sysvar", - "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.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]] -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.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733b3657a0fab205102b799dbe17f85d3972cf984232c1b0b108fa6ba438e382" -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 2.6.1", -] - -[[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.118", -] - -[[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-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-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-signature" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0364c7577c3c82a693ce28a1febc8d1b5d1b0a175fdc2114ae6186b69effe1e" -dependencies = [ - "ed25519-dalek", - "five8", - "serde", - "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", - "solana-sysvar-id", -] - -[[package]] -name = "solana-svm-callback" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3001438e7765fdfcbbe2d556439e358984a3b3b880bcda1c7f1f3091ce817b0c" -dependencies = [ - "solana-account", - "solana-clock", - "solana-precompile-error", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-svm-feature-set" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ada78631678a5a5139d6491bb8729143192c6afd30945dd8cddd974b174d7f7" - -[[package]] -name = "solana-svm-log-collector" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d30ddddd9d907772d34ecc8efacfb4ad65469f1f02e4d21da422d03594f52df" -dependencies = [ - "log", -] - -[[package]] -name = "solana-svm-measure" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c944cc0aa7eb1b8f754546d3f851d30ff6602667dc61377c28bcd186b1beaf" - -[[package]] -name = "solana-svm-timings" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4540c51ccc83931a33323eb1b7a1e9cae9eb8f4a45c2abc5d235c6c9b775252" -dependencies = [ - "eager", - "enum-iterator", - "solana-pubkey 4.2.0", -] - -[[package]] -name = "solana-svm-transaction" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08508c2781c618d70f0524c673d347fa568963d9b0169efb6ef812d8203246c2" -dependencies = [ - "solana-hash 4.4.0", - "solana-message", - "solana-pubkey 4.2.0", - "solana-sdk-ids", - "solana-signature", - "solana-transaction", -] - -[[package]] -name = "solana-svm-type-overrides" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da24176c92931464ac3dae45b8be137bf747f838d022f41728405f958c63e32d" -dependencies = [ - "rand 0.9.4", -] - -[[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 = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd11fb16042bd0ff41f6679aae98d79b25f85f797edfebf5c0c73e497e1bf826" -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 4.2.0", - "solana-sdk-ids", - "solana-svm-log-collector", - "solana-svm-type-overrides", - "solana-system-interface 3.2.0", - "solana-sysvar", - "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", - "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 2.6.1", - "solana-sdk-ids", -] - -[[package]] -name = "solana-transaction" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" -dependencies = [ - "solana-address 2.6.1", - "solana-hash 4.4.0", - "solana-instruction", - "solana-instruction-error", - "solana-message", - "solana-sanitize", - "solana-sdk-ids", - "solana-signature", - "solana-transaction-error", -] - -[[package]] -name = "solana-transaction-context" -version = "4.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee065d9e0a7d374c012d541083b1e72832a7f016ac2ab493f535d07fa89c26d" -dependencies = [ - "bincode", - "qualifier_attr", - "serde", - "solana-account", - "solana-instruction", - "solana-instructions-sysvar", - "solana-pubkey 4.2.0", - "solana-rent", - "solana-sbpf", - "solana-sdk-ids", -] - -[[package]] -name = "solana-transaction-error" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441d6dcd51100e7d97c3fb3b723e08aa701066ff7afc00026fd8d8e222cb95b" -dependencies = [ - "solana-instruction-error", - "solana-sanitize", -] - -[[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.118" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[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.118", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[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" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[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.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_write", - "winnow 0.7.15", -] - -[[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 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.3", -] - -[[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 1.0.3", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[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 = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -dependencies = [ - "void", -] - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[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.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" -dependencies = [ - "pastey", - "proc-macro2", - "quote", - "thiserror 2.0.18", - "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.118", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "zerocopy" -version = "0.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.118", -] - -[[package]] -name = "zeroize" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" From 17e6a011aeaae573966bfc6efe10dddee068d419 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Thu, 2 Jul 2026 16:02:23 +0200 Subject: [PATCH 16/33] feat: unsafe mode --- crates/hydra-cranker/src/cache.rs | 67 +++++++++++++++++++++++++++++++ crates/hydra-cranker/src/main.rs | 25 +++++++++++- 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/crates/hydra-cranker/src/cache.rs b/crates/hydra-cranker/src/cache.rs index 2c7a6da..dc35d69 100644 --- a/crates/hydra-cranker/src/cache.rs +++ b/crates/hydra-cranker/src/cache.rs @@ -70,6 +70,21 @@ impl CrankEntry { self.lamports >= self.rent_min.saturating_add(reward) } + /// True if any scheduled instruction lists `account` among its metas, + /// regardless of the stored read/write flag. Such a crank is unsafe to run + /// when `account` is the cranker's own pubkey: as the tx fee payer the + /// cranker is signer + writable, so the runtime promotes every reference to + /// it and the crank can never fire (and must not, since it would grant a + /// scheduled ix write access to the cranker's account). + pub fn references_account(&self, account: &Pubkey) -> bool { + hydra_api::instruction::scheduled_ixs_from_crank(&self.data) + .map(|ixs| { + ixs.iter() + .any(|ix| ix.accounts.iter().any(|m| &m.pubkey == account)) + }) + .unwrap_or(false) + } + /// Mirrors on-chain `Close` pre-condition: exhausted OR underfunded OR /// stuck (`current_slot - next_exec_slot > STALENESS_THRESHOLD_SLOTS`). pub fn is_closable(&self, current_slot: u64) -> bool { @@ -132,3 +147,55 @@ pub fn apply_update(cache: &Cache, pubkey: Pubkey, lamports: u64, data: &[u8]) - } } } + +#[cfg(test)] +mod tests { + use super::*; + use hydra_api::consts::{CRANK_HEADER_SIZE, META_FLAG_WRITABLE}; + + /// Build a raw crank buffer (120-byte header + one scheduled ix that lists + /// `metas` in the on-chain tail wire layout). + fn crank_with_metas(metas: &[(Pubkey, bool)]) -> Vec { + let mut data = vec![0u8; CRANK_HEADER_SIZE]; + // tail: [num_accounts u16][ [flag u8][pk 32] * n ][program_id 32][data_len u16][data] + data.extend_from_slice(&(metas.len() as u16).to_le_bytes()); + for (pk, writable) in metas { + data.push(if *writable { META_FLAG_WRITABLE } else { 0 }); + data.extend_from_slice(pk.as_ref()); + } + data.extend_from_slice(Pubkey::new_unique().as_ref()); // program_id + data.extend_from_slice(&0u16.to_le_bytes()); // data_len = 0 + data + } + + #[test] + fn references_account_detects_metas_regardless_of_flag() { + let cranker = Pubkey::new_unique(); + let other = Pubkey::new_unique(); + + // Read-only reference is still a reference. + let ro = CrankEntry::from_raw( + Pubkey::new_unique(), + 1, + &crank_with_metas(&[(cranker, false)]), + ) + .unwrap(); + assert!(ro.references_account(&cranker)); + assert!(!ro.references_account(&other)); + + // Writable reference too. + let rw = CrankEntry::from_raw( + Pubkey::new_unique(), + 1, + &crank_with_metas(&[(cranker, true)]), + ) + .unwrap(); + assert!(rw.references_account(&cranker)); + + // A schedule that does not mention the cranker is safe. + let clean = + CrankEntry::from_raw(Pubkey::new_unique(), 1, &crank_with_metas(&[(other, true)])) + .unwrap(); + assert!(!clean.references_account(&cranker)); + } +} diff --git a/crates/hydra-cranker/src/main.rs b/crates/hydra-cranker/src/main.rs index 2ffc3e5..6e019aa 100644 --- a/crates/hydra-cranker/src/main.rs +++ b/crates/hydra-cranker/src/main.rs @@ -109,6 +109,14 @@ struct Cli { default_value_t = false )] trigger_skip_preflight: bool, + /// Run *every* eligible crank, including ones whose scheduled instructions + /// reference the cranker's own pubkey. Such cranks can't actually fire — as + /// the fee payer the cranker is promoted to signer + writable, so the + /// follow-up bytes never match the stored template — and would, if they + /// could, hand a scheduled ix write access to the cranker's account. They + /// are skipped by default; this flag opts back in. + #[arg(long = "unsafe", env = "HYDRA_CRANKER_UNSAFE", default_value_t = false)] + run_unsafe: bool, } fn default_ws_url(rpc_url: &str) -> String { @@ -148,7 +156,11 @@ fn main() -> Result<()> { let args = Cli::parse(); let cranker = load_keypair(&args.keypair)?; - log::info!("cranker pubkey = {}", cranker.pubkey()); + let cranker_pubkey = cranker.pubkey(); + log::info!("cranker pubkey = {}", cranker_pubkey); + if args.run_unsafe { + log::warn!("--unsafe: running cranks that reference the cranker's own pubkey"); + } // Bootstrap must use the same commitment as `programSubscribe` or a // reconnect hands off a stale cache. @@ -255,6 +267,17 @@ fn main() -> Result<()> { if entry.is_closable(slot) { clos.push(entry.clone()); } else if entry.is_eligible(slot) { + // A crank that references the cranker's own pubkey can never + // fire (the cranker is promoted to signer + writable as the + // fee payer) and is unsafe to run — skip unless `--unsafe`. + if !args.run_unsafe && entry.references_account(&cranker_pubkey) { + log::debug!( + "slot {}: skipping crank {} — references cranker pubkey (use --unsafe to run)", + slot, + entry.pubkey + ); + continue; + } elig.push(entry.clone()); } } From dceaa48671945ce645589035eb5b1201f89f0dab Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Thu, 2 Jul 2026 17:20:26 +0200 Subject: [PATCH 17/33] fix: writability conflict tracking --- crates/hydra-api/src/consts.rs | 8 + crates/hydra-api/src/error.rs | 7 + programs/hydra/src/processor/create.rs | 62 +++++- tests/lib.rs | 284 +++++++++++++++++++++++++ 4 files changed, 355 insertions(+), 6 deletions(-) diff --git a/crates/hydra-api/src/consts.rs b/crates/hydra-api/src/consts.rs index e7811bc..1e71f1a 100644 --- a/crates/hydra-api/src/consts.rs +++ b/crates/hydra-api/src/consts.rs @@ -22,6 +22,14 @@ pub const MAX_INSTRUCTIONS: usize = 16; /// Max bytes of the scheduled ix's `data` field. pub const MAX_DATA_LEN: usize = 1024; +/// Solana's per-transaction account-lock ceiling (`MAX_TX_ACCOUNT_LOCKS`). A +/// `Trigger` tx must lock the crank, cranker, instructions sysvar, the invoked +/// programs, *and every scheduled account*, so a schedule referencing more than +/// this many distinct accounts can never be cranked. `Create` uses it to bound +/// the writability-conflict scan to a fixed, stack-sized buffer: any schedule +/// exceeding it is rejected as un-crankable. +pub const MAX_TX_ACCOUNT_LOCKS: usize = 128; + /// Internal sentinel in `Crank.remaining` meaning "execute forever". /// Wire-level `0` is converted to this at `Create`. pub const REMAINING_INFINITE: u64 = u64::MAX; diff --git a/crates/hydra-api/src/error.rs b/crates/hydra-api/src/error.rs index 696bb16..ec7feb7 100644 --- a/crates/hydra-api/src/error.rs +++ b/crates/hydra-api/src/error.rs @@ -26,6 +26,11 @@ pub enum HydraError { /// `Create` data was well-formed but semantically invalid (e.g. /// `remaining = 0 && interval_slots = 0`). InvalidSchedule = 9, + /// A scheduled pubkey appears read-only in one instruction and writable in + /// another. The runtime promotes it to writable in every instruction region + /// of the crank tx, so the promoted instructions-sysvar bytes could never + /// match the read-only flag stored here and `Trigger` would never fire. + ConflictingAccountWritability = 10, } impl From for ProgramError { @@ -50,6 +55,7 @@ impl TryFrom for HydraError { 7 => Ok(Self::MismatchedFollowupIx), 8 => Ok(Self::SignerInScheduledIx), 9 => Ok(Self::InvalidSchedule), + 10 => Ok(Self::ConflictingAccountWritability), _ => Err(ProgramError::InvalidArgument), } } @@ -68,6 +74,7 @@ impl ToStr for HydraError { Self::MismatchedFollowupIx => "HydraError::MismatchedFollowupIx", Self::SignerInScheduledIx => "HydraError::SignerInScheduledIx", Self::InvalidSchedule => "HydraError::InvalidSchedule", + Self::ConflictingAccountWritability => "HydraError::ConflictingAccountWritability", } } } diff --git a/programs/hydra/src/processor/create.rs b/programs/hydra/src/processor/create.rs index 0b9b053..3e653bc 100644 --- a/programs/hydra/src/processor/create.rs +++ b/programs/hydra/src/processor/create.rs @@ -32,13 +32,23 @@ use pinocchio_system::instructions::{CreateAccountAllowPrefund, Funding}; use hydra_api::{ consts::{ ix as _ix, CRANK_HEADER_SIZE, CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, - MAX_DATA_LEN, MAX_INSTRUCTIONS, META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, + MAX_DATA_LEN, MAX_INSTRUCTIONS, MAX_TX_ACCOUNT_LOCKS, META_FLAG_SIGNER, META_FLAG_WRITABLE, + REMAINING_INFINITE, SERIALIZED_META_SIZE, }, instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, state::load_crank_mut, HydraError, }; +/// Per-unique-account writability state used by the conflict scan in `process`. +/// `Unknown` fills the unused slots of the fixed tracking buffer. +#[derive(Clone, Copy, PartialEq, Eq)] +enum Writability { + Unknown, + ReadOnly, + Writable, +} + pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { let [payer, crank_ai, _system_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); @@ -162,6 +172,16 @@ pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { let mut cursor = CREATE_FIXED_PREFIX_LEN; let mut off = 0usize; let mut num_instructions = 0usize; + + // Writability-conflict tracker. Each distinct scheduled account is + // recorded once, keyed by the offset of its pubkey within `data` (so we + // store 4 bytes, not a 32-byte key), alongside the read/write state it + // was first seen with. On a later occurrence with the opposite state we + // reject. + let mut seen_pubkey_offsets = [0u32; MAX_TX_ACCOUNT_LOCKS]; + let mut seen_writability = [Writability::Unknown; MAX_TX_ACCOUNT_LOCKS]; + let mut num_distinct_accounts = 0usize; + while cursor < data.len() { if cursor + CREATE_IX_HEADER_LEN > data.len() { return Err(ProgramError::InvalidInstructionData); @@ -182,13 +202,43 @@ pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { if next > data.len() { return Err(ProgramError::InvalidInstructionData); } - // Reject any signer flag — scheduled ixs run top-level, they can - // only be signed by real keys, and this program can't produce a - // signature for a declared pubkey anyway. - for i in 0..num_accounts { - if data[metas_offset + i * SERIALIZED_META_SIZE] & META_FLAG_SIGNER != 0 { + // For each meta: reject signer flags (scheduled ixs run top-level and + // can only be signed by real keys, which this program can't produce), + // and fold the account into the writability-conflict tracker. + for account_index in 0..num_accounts { + let meta_offset = metas_offset + account_index * SERIALIZED_META_SIZE; + let meta_flag = data[meta_offset]; + if meta_flag & META_FLAG_SIGNER != 0 { return Err(HydraError::SignerInScheduledIx.into()); } + let meta_writability = if meta_flag & META_FLAG_WRITABLE != 0 { + Writability::Writable + } else { + Writability::ReadOnly + }; + let pubkey_offset = meta_offset + 1; + let meta_pubkey = &data[pubkey_offset..pubkey_offset + 32]; + let mut already_seen = false; + for seen_index in 0..num_distinct_accounts { + let seen_offset = seen_pubkey_offsets[seen_index] as usize; + if data[seen_offset..seen_offset + 32] == *meta_pubkey { + if seen_writability[seen_index] != meta_writability { + return Err(HydraError::ConflictingAccountWritability.into()); + } + already_seen = true; + break; + } + } + if !already_seen { + // A distinct account that can't fit in a `Trigger` tx's lock + // set makes the whole crank un-triggerable. + if num_distinct_accounts == MAX_TX_ACCOUNT_LOCKS { + return Err(HydraError::InvalidSchedule.into()); + } + seen_pubkey_offsets[num_distinct_accounts] = pubkey_offset as u32; + seen_writability[num_distinct_accounts] = meta_writability; + num_distinct_accounts += 1; + } } // Tail blob, instructions-sysvar layout: // [num_accounts u16][metas][program_id 32][data_len u16][data] diff --git a/tests/lib.rs b/tests/lib.rs index beebe11..f3dc544 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -1156,6 +1156,290 @@ mod tests { ); } + #[test] + fn create_rejects_conflicting_account_writability() { + // Same pubkey read-only in ix0, writable in ix1. On-chain the message + // compiler promotes it to writable everywhere, so the stored read-only + // flag could never match the instructions sysvar and the crank would be + // un-fireable. `Create` must reject it up front. + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let shared = Pubkey::new_unique(); + + let create = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[ + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::readonly(shared)], + data: b"a", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::writable(shared)], + data: b"b", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + let result = mollusk.process_transaction_instructions(&[create], &accounts); + assert!( + result.raw_result.is_err(), + "create must reject a pubkey that is read-only in one ix and writable in another" + ); + } + + #[test] + fn create_rejects_conflict_across_nonadjacent_ixs() { + // The conflict is between ix0 (read-only) and ix2 (writable), with an + // unrelated ix in between — exercises the cross-instruction tracker. + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let shared = Pubkey::new_unique(); + let filler = Pubkey::new_unique(); + + let create = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[ + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::readonly(shared)], + data: b"a", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::readonly(filler)], + data: b"b", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::writable(shared)], + data: b"c", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + let result = mollusk.process_transaction_instructions(&[create], &accounts); + assert!( + result.raw_result.is_err(), + "create must reject a read-only/writable conflict across non-adjacent ixs" + ); + } + + #[test] + fn create_accepts_same_account_readonly_across_ixs() { + // The same account read-only in two different ixs is consistent — the + // tracker must treat it as one account, not a conflict. + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let shared = Pubkey::new_unique(); + + let create = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[ + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::readonly(shared)], + data: b"a", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::readonly(shared)], + data: b"b", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + let result = mollusk.process_transaction_instructions(&[create], &accounts); + assert!( + result.raw_result.is_ok(), + "create must accept the same account read-only across ixs: {:?}", + result.raw_result + ); + } + + #[test] + fn create_accepts_consistent_account_writability() { + // The same account writable in *both* siblings is fine — no promotion + // conflict — and must not be caught by the rejection above. + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let shared = Pubkey::new_unique(); + + let create = create_ix_multi( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + &[ + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::writable(shared)], + data: b"a", + }, + ScheduledIx { + program_id: memo::ID, + metas: &[SchedMeta::writable(shared)], + data: b"b", + }, + ], + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (system_program, system_program_acct), + ]; + let result = mollusk.process_transaction_instructions(&[create], &accounts); + assert!( + result.raw_result.is_ok(), + "create must accept consistent writability: {:?}", + result.raw_result + ); + } + + /// A scheduled ix that lists the eventual cranker's account as read-only + /// cannot be used to sneak a write to it. On-chain the cranker is the fee + /// payer — signer + writable — so the message compiler promotes that meta + /// to signer+writable in every instruction region of the sysvar. The stored + /// template kept it read-only (Create forbids storing a signer flag at all, + /// and the cranker is unknown at schedule time), so the promoted bytes can + /// never match and `Trigger` reverts before the sibling ever runs — the + /// write to the cranker account is impossible. + /// + /// mollusk builds the sysvar from each ix's own meta (no promotion), so we + /// model the runtime promotion by handing the follow-up ix the cranker meta + /// already signer+writable — the exact bytes the validator emits. + #[test] + fn scheduled_ix_writing_cranker_as_readonly_cannot_fire() { + let mut mollusk = mollusk_with_hydra(); + load_noop(&mut mollusk); + let payer = Pubkey::new_unique(); + let cranker = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + + // Schedule a noop that references the cranker's pubkey as a read-only + // account. All `Create` sees is a read-only meta on some pubkey. + let create = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 0, + 0, + NOOP_ID, + &[SchedMeta::readonly(cranker)], + b"x", + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + (crank_pda, Account::default()), + (cranker, Account::new(0, 0, &system_program)), + (system_program, system_program_acct), + ]; + let after_create = mollusk.process_transaction_instructions(&[create], &accounts); + assert!( + after_create.raw_result.is_ok(), + "create (cranker referenced read-only): {:?}", + after_create.raw_result + ); + + let mut funded = after_create.resulting_accounts.clone(); + for (k, a) in funded.iter_mut() { + if *k == crank_pda { + a.lamports += 1_000_000; + } + } + let cranker_before = funded + .iter() + .find(|(k, _)| *k == cranker) + .map(|(_, a)| a.lamports) + .unwrap(); + + // The cranker is the fee payer, so its meta in the sibling region is + // signer+writable on-chain — not the stored read-only. + let trigger = trigger_ix(crank_pda, cranker); + let sibling = Instruction { + program_id: NOOP_ID, + accounts: vec![AccountMeta::new(cranker, true)], // promoted signer+writable + data: b"x".to_vec(), + }; + let after = mollusk.process_transaction_instructions(&[trigger, sibling], &funded); + assert!( + after.raw_result.is_err(), + "trigger must reject: promoted cranker meta != stored read-only, so the write is blocked" + ); + + // The tx reverted, so the cranker was neither written nor paid. + let cranker_after = after + .resulting_accounts + .iter() + .find(|(k, _)| *k == cranker) + .map(|(_, a)| a.lamports) + .unwrap(); + assert_eq!( + cranker_before, cranker_after, + "cranker balance must be untouched" + ); + } + #[test] fn trigger_rejects_before_slot() { let mollusk = mollusk_with_hydra(); From 001fb1feee862cdbda8ef3b1520449f1ff9b8d6f Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Thu, 2 Jul 2026 18:40:07 +0200 Subject: [PATCH 18/33] fix: create account when unfunded --- programs/hydra/src/processor/create.rs | 55 +++++++++++++++++--------- tests/lib.rs | 54 +++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 19 deletions(-) diff --git a/programs/hydra/src/processor/create.rs b/programs/hydra/src/processor/create.rs index 3e653bc..5c5217b 100644 --- a/programs/hydra/src/processor/create.rs +++ b/programs/hydra/src/processor/create.rs @@ -25,7 +25,7 @@ use pinocchio::{ AccountView, Address, ProgramResult, UnsafeResize, }; #[cfg(not(feature = "create-account-allow-prefund"))] -use pinocchio_system::instructions::{Allocate, Assign, Transfer}; +use pinocchio_system::instructions::{Allocate, Assign, CreateAccount, Transfer}; #[cfg(feature = "create-account-allow-prefund")] use pinocchio_system::instructions::{CreateAccountAllowPrefund, Funding}; @@ -135,28 +135,45 @@ pub fn process(accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { #[cfg(not(feature = "create-account-allow-prefund"))] { - let funding_lamports = rent_min.saturating_sub(crank_ai.lamports()); - if funding_lamports == 0 && !payer.is_signer() { - return Err(ProgramError::MissingRequiredSignature); - } - if funding_lamports > 0 { - Transfer { + let prefunded = crank_ai.lamports(); + if prefunded == 0 { + // Fresh PDA (the common case): one `CreateAccount` CPI funds, + // allocates, and assigns in a single system-program invocation — + // a third of the CU of the split path below. + CreateAccount { from: payer, to: crank_ai, - lamports: funding_lamports, + lamports: rent_min, + space: total_size as u64, + owner: &hydra_api::ID, } - .invoke()?; - } - Allocate { - account: crank_ai, - space: total_size as u64, - } - .invoke_signed(&signers)?; - Assign { - account: crank_ai, - owner: &hydra_api::ID, + .invoke_signed(&signers)?; + } else { + // Prefunded PDA: `CreateAccount` rejects accounts that already hold + // lamports, so top up the shortfall then allocate + assign. + let funding_lamports = rent_min.saturating_sub(prefunded); + if funding_lamports == 0 && !payer.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + if funding_lamports > 0 { + Transfer { + from: payer, + to: crank_ai, + lamports: funding_lamports, + } + .invoke()?; + } + Allocate { + account: crank_ai, + space: total_size as u64, + } + .invoke_signed(&signers)?; + Assign { + account: crank_ai, + owner: &hydra_api::ID, + } + .invoke_signed(&signers)?; } - .invoke_signed(&signers)?; } // Validate each scheduled ix and re-serialize it into the tail in the diff --git a/tests/lib.rs b/tests/lib.rs index f3dc544..73191cd 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -618,6 +618,60 @@ mod tests { assert!(header.rent_min() > 0, "rent_min should be cached"); } + /// A crank PDA that already holds lamports can't be created with a single + /// `CreateAccount` (the system program rejects nonzero-balance targets), so + /// `Create` falls back to Transfer-shortfall + Allocate + Assign. Exercise + /// that branch with a partially prefunded PDA. + #[test] + fn create_succeeds_on_prefunded_crank_pda() { + let mollusk = mollusk_with_hydra(); + let payer = Pubkey::new_unique(); + let (crank_pda, _bump) = find_crank(&SEED); + let memo_data: &[u8] = b"tick"; + + let ix = create_ix( + payer, + crank_pda, + SEED, + [0u8; 32], + 0, + 100, + 10, + 1_000, + 0, + memo::ID, + &[], + memo_data, + ); + + let (system_program, system_program_acct) = keyed_account_for_system_program(); + let accounts = vec![ + (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), + // Prefunded but below rent-exemption: forces the shortfall path. + (crank_pda, Account::new(1, 0, &system_program)), + (system_program, system_program_acct), + ]; + + let result = mollusk.process_transaction_instructions(&[ix], &accounts); + assert!( + result.raw_result.is_ok(), + "create on prefunded pda failed: {:?}", + result.raw_result + ); + + let crank_acct = result + .resulting_accounts + .iter() + .find(|(k, _)| k == &crank_pda) + .map(|(_, a)| a) + .expect("crank account"); + assert_eq!(crank_acct.owner, hydra_id(), "owner mismatch"); + let header = decode_header(&crank_acct.data); + assert_eq!(header.seed, SEED); + assert_eq!(header.interval_slots(), 100); + assert!(header.rent_min() > 0, "rent_min should be cached"); + } + #[test] fn trigger_happy_path_pays_reward_and_advances() { let mollusk = mollusk_with_hydra(); From 15a6f76317dcfbb3b0f9d4f77bcbc9a37fea5a78 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 11:09:44 +0200 Subject: [PATCH 19/33] fix: delegate cranker --- tests/e2e/tests/ephemeral_cranks.rs | 59 ++++++++++++++++------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/tests/e2e/tests/ephemeral_cranks.rs b/tests/e2e/tests/ephemeral_cranks.rs index 5f5096e..7681477 100644 --- a/tests/e2e/tests/ephemeral_cranks.rs +++ b/tests/e2e/tests/ephemeral_cranks.rs @@ -187,7 +187,8 @@ fn body(stack: &mut Stack, order: CreateOrder) -> Result<()> { // `sponsor` is delegated (signs CreateEphemeral, pays rent); `fee_payer` is // a plain system wallet that covers tx fees (the delegated sponsor can't be - // a fee payer); `cranker` pays for the triggers it submits. + // a fee payer); `cranker` submits the triggers *and* is credited their + // `CRANKER_REWARD`, so it too must be delegated. let sponsor = Keypair::new(); let fee_payer = Keypair::new(); let cranker = Keypair::new(); @@ -225,19 +226,22 @@ fn body(stack: &mut Stack, order: CreateOrder) -> Result<()> { ); wait_for_rpc(&base_rpc, "base", Duration::from_secs(10))?; - // 2. Fund the three keypairs on the base, then delegate the sponsor so the - // rollup will let it spend its own lamports (the rent paid inside - // CreateEphemeral). The fee_payer and cranker stay plain system wallets. + // 2. Fund the three keypairs on the base, then delegate the sponsor and the + // cranker so the rollup will let their own lamports change: the sponsor + // pays the vault rent inside CreateEphemeral, and the cranker is credited + // each trigger's CRANKER_REWARD (a fee-payer write the rollup only allows + // for a delegated account). The fee_payer stays a plain system wallet. airdrop(&base_rpc, &sponsor.pubkey(), 100 * LAMPORTS_PER_SOL)?; airdrop(&base_rpc, &fee_payer.pubkey(), 10 * LAMPORTS_PER_SOL)?; airdrop(&base_rpc, &cranker.pubkey(), 10 * LAMPORTS_PER_SOL)?; - delegate_sponsor(&base_rpc, &sponsor, &fee_payer)?; + delegate(&base_rpc, &sponsor, &fee_payer)?; + delegate(&base_rpc, &cranker, &fee_payer)?; eprintln!( - "[stack] funded + delegated sponsor {} (fee_payer {}, cranker {})", + "[stack] funded + delegated sponsor {} and cranker {} (fee_payer {})", sponsor.pubkey(), - fee_payer.pubkey(), - cranker.pubkey() + cranker.pubkey(), + fee_payer.pubkey() ); // 3. Ephemeral rollup, syncing against the base. It clones the sponsor (as a @@ -449,25 +453,28 @@ fn assert_cranker_bootstrapped_empty(tmp: &Path) -> Result<()> { // --- Sponsor delegation ----------------------------------------------------- -/// Make the sponsor an **on-curve delegated** account so the rollup will let it -/// spend its own lamports (paying the ephemeral-account rent inside -/// `CreateEphemeral`). On the rollup, a fee payer whose lamports change must be -/// `delegated()` (`magicblock-svm/.../access_permissions.rs`) — and an -/// undelegated escrow does *not* set that flag on the wallet. The supported -/// path is the on-curve delegation flow (see MagicBlock's `oncurve-delegation` -/// example): the wallet `assign`s itself to the delegation program, then is -/// delegated to the validator, in one base-layer transaction. +/// Make `account` an **on-curve delegated** account so the rollup will let its +/// own lamports change during a transaction. On the rollup, an account whose +/// lamports change must be `delegated()` — for the fee payer specifically, a +/// non-delegated write is rejected with `InvalidAccountForFee` +/// (`magicblock-svm/.../access_permissions.rs`); an undelegated escrow does +/// *not* set that flag on the wallet. The supported path is the on-curve +/// delegation flow (see MagicBlock's `oncurve-delegation` example): the wallet +/// `assign`s itself to the delegation program, then is delegated to the +/// validator, in one base-layer transaction. The rollup restores the original +/// (system) owner when it clones the account, so a delegated on-curve wallet is +/// still a valid fee payer there. /// -/// A separate, system-owned `fee_payer` covers the transaction fee — the -/// delegated sponsor can't be the fee payer (it's owned by the delegation -/// program), and a delegated account also can't `system_program::transfer`. -fn delegate_sponsor(base: &RpcClient, sponsor: &Keypair, fee_payer: &Keypair) -> Result<()> { +/// A separate, system-owned `fee_payer` covers this base-layer transaction fee — +/// on the base, `account` is owned by the delegation program after `assign`, so +/// it can't be the fee payer nor `system_program::transfer`. +fn delegate(base: &RpcClient, account: &Keypair, fee_payer: &Keypair) -> Result<()> { let dlp = delegation_program_id(); let system = system_program_id(); - let acct = sponsor.pubkey(); + let acct = account.pubkey(); // The wallet reassigns its own owner to the delegation program (it signs). - let assign = system_instruction::assign(&acct, &dlp); + let assign_ix = system_instruction::assign(&acct, &dlp); // delegation program `Delegate` (disc 0). PDAs: delegate buffer under the // *owner* (system) program, record + metadata under the delegation program. @@ -484,7 +491,7 @@ fn delegate_sponsor(base: &RpcClient, sponsor: &Keypair, fee_payer: &Keypair) -> data.extend_from_slice(&0u32.to_le_bytes()); // seeds: empty data.push(1u8); // validator: Some(..) data.extend_from_slice(er_validator_identity().as_ref()); - let delegate = Instruction { + let delegate_ix = Instruction { program_id: dlp, accounts: vec![ AccountMeta::new(fee_payer.pubkey(), true), // payer @@ -499,11 +506,11 @@ fn delegate_sponsor(base: &RpcClient, sponsor: &Keypair, fee_payer: &Keypair) -> }; send( base, - &[assign, delegate], + &[assign_ix, delegate_ix], &fee_payer.pubkey(), - &[fee_payer, sponsor], + &[fee_payer, account], ) - .context("delegate sponsor (on-curve)") + .with_context(|| format!("delegate {acct} (on-curve)")) } // --- Crank helpers ---------------------------------------------------------- From 76cf1592f866d1379ddc123f897cd44a3fda17ca Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 16:08:30 +0200 Subject: [PATCH 20/33] fix: conflicts --- crates/hydra-cranker/src/cache.rs | 5 +++-- programs/hydra/Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/hydra-cranker/src/cache.rs b/crates/hydra-cranker/src/cache.rs index 1c2337b..3cf1e08 100644 --- a/crates/hydra-cranker/src/cache.rs +++ b/crates/hydra-cranker/src/cache.rs @@ -10,8 +10,9 @@ use std::{ use solana_pubkey::Pubkey; -use hydra_api::consts::{ - CRANKER_REWARD, CRANK_HEADER_SIZE, REMAINING_INFINITE, STALENESS_THRESHOLD_SLOTS, +use hydra_api::{ + consts::{CRANKER_REWARD, CRANK_HEADER_SIZE, REMAINING_INFINITE, STALENESS_THRESHOLD_SLOTS}, + SERIALIZED_META_SIZE, }; /// Minimal decoded projection of a Crank account — just the fields we need diff --git a/programs/hydra/Cargo.toml b/programs/hydra/Cargo.toml index cb74c42..90d5e1e 100644 --- a/programs/hydra/Cargo.toml +++ b/programs/hydra/Cargo.toml @@ -30,7 +30,7 @@ create-account-allow-prefund = [] # `unsafe-account-resize` lets `Create` shrink the crank account from its O(1) # over-provisioned size down to the exact tail length (a length-only update, # no syscall), so the scheduled ixs are parsed in a single pass. -pinocchio = { workspace = true, features = ["unsafe-account-resize"] } +pinocchio = { workspace = true } pinocchio-system = { workspace = true } pinocchio-log = { workspace = true } solana-define-syscall = { workspace = true } From cb62015b1064d313164f022cf46b8f914a64e641 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 16:51:14 +0200 Subject: [PATCH 21/33] fix: account meta --- crates/hydra-api/src/cpi.rs | 52 +++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/crates/hydra-api/src/cpi.rs b/crates/hydra-api/src/cpi.rs index e11c00a..8f02f75 100644 --- a/crates/hydra-api/src/cpi.rs +++ b/crates/hydra-api/src/cpi.rs @@ -178,12 +178,12 @@ pub mod ephemeral { //! # Example //! //! ```ignore - //! use hydra_api::cpi::native as hydra_cpi; + //! use hydra_api::cpi::ephemeral::native as hydra_cpi; //! use hydra_api::instruction::{CreateArgs, SchedMeta}; //! //! // Inside your user-facing instruction's handler: //! hydra_cpi::create( - //! payer_ai, crank_ai, system_program_ai, + //! sponsor_ai, crank_ai, vault_ai, magic_program_ai, //! &CreateArgs { seed, authority: [0u8; 32], /* ... */ }, //! )?; //! ``` @@ -196,16 +196,22 @@ pub mod ephemeral { #[inline] pub fn create<'a>( - payer: &AccountInfo<'a>, + sponsor: &AccountInfo<'a>, crank: &AccountInfo<'a>, - system_program: &AccountInfo<'a>, + vault: &AccountInfo<'a>, + magic_program: &AccountInfo<'a>, args: &CreateArgs<'_>, signer_seeds: &[&[&[u8]]], ) -> Result<(), ProgramError> { - let ix = builder::create(*payer.key, *crank.key, args); + let ix = builder::create(*sponsor.key, *crank.key, args); invoke_signed( &ix, - &[payer.clone(), crank.clone(), system_program.clone()], + &[ + sponsor.clone(), + crank.clone(), + vault.clone(), + magic_program.clone(), + ], signer_seeds, ) } @@ -282,9 +288,10 @@ pub mod ephemeral { #[inline] pub fn create( - payer: &AccountView, + sponsor: &AccountView, crank: &AccountView, - system_program: &AccountView, + vault: &AccountView, + magic_program: &AccountView, args: &CreateArgs<'_>, signers: &[Signer], ) -> ProgramResult { @@ -299,12 +306,13 @@ pub mod ephemeral { program_id: &crate::ephemeral::ID, data: &data, accounts: &[ - InstructionAccount::writable(payer.address()), + InstructionAccount::writable_signer(sponsor.address()), InstructionAccount::writable(crank.address()), - InstructionAccount::writable(system_program.address()), + InstructionAccount::writable(vault.address()), + InstructionAccount::readonly(magic_program.address()), ], }; - invoke_signed(&ix, &[payer, crank, system_program], signers) + invoke_signed(&ix, &[sponsor, crank, vault, magic_program], signers) } #[inline(always)] @@ -312,20 +320,28 @@ pub mod ephemeral { authority: &AccountView, crank: &AccountView, recipient: &AccountView, + vault: &AccountView, + magic_program: &AccountView, signers: &[Signer], ) -> ProgramResult { let data = [disc::CANCEL]; let metas = [ - InstructionAccount::readonly_signer(authority.address()), + InstructionAccount::writable_signer(authority.address()), InstructionAccount::writable(crank.address()), InstructionAccount::writable(recipient.address()), + InstructionAccount::writable(vault.address()), + InstructionAccount::readonly(magic_program.address()), ]; let ix = InstructionView { program_id: &crate::ephemeral::ID, accounts: &metas, data: &data, }; - invoke_signed(&ix, &[authority, crank, recipient], signers) + invoke_signed( + &ix, + &[authority, crank, recipient, vault, magic_program], + signers, + ) } #[inline(always)] @@ -333,6 +349,8 @@ pub mod ephemeral { reporter: &AccountView, crank: &AccountView, recipient: &AccountView, + vault: &AccountView, + magic_program: &AccountView, signers: &[Signer], ) -> ProgramResult { let data = [disc::CLOSE]; @@ -340,13 +358,19 @@ pub mod ephemeral { InstructionAccount::writable_signer(reporter.address()), InstructionAccount::writable(crank.address()), InstructionAccount::writable(recipient.address()), + InstructionAccount::writable(vault.address()), + InstructionAccount::readonly(magic_program.address()), ]; let ix = InstructionView { program_id: &crate::ephemeral::ID, accounts: &metas, data: &data, }; - invoke_signed(&ix, &[reporter, crank, recipient], signers) + invoke_signed( + &ix, + &[reporter, crank, recipient, vault, magic_program], + signers, + ) } } } From 25ab7a8603b71729110f36b92fa255892edca171 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 17:49:53 +0200 Subject: [PATCH 22/33] fix: divergent economics --- Cargo.toml | 1 - crates/hydra-api/src/consts.rs | 59 ++-- crates/hydra-api/src/program/processor.rs | 69 +--- crates/hydra-cranker/src/cache.rs | 28 +- crates/hydra-cranker/src/main.rs | 4 +- .../hydra-ephemeral/src/processor/close.rs | 2 +- .../hydra-ephemeral/src/processor/trigger.rs | 7 +- programs/hydra/src/processor/close.rs | 2 +- programs/hydra/src/processor/trigger.rs | 4 +- tests/e2e/tests/ephemeral_cranks.rs | 2 +- tests/lib.rs | 296 +----------------- 11 files changed, 85 insertions(+), 389 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3b9b455..7ec701b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,5 +60,4 @@ overflow-checks = true [workspace.lints.rust] unexpected_cfgs = { level = "warn", check-cfg = [ 'cfg(target_os, values("solana"))', - 'cfg(feature, values("create-account-allow-prefund", "custom-alloc", "custom-panic", "no-entrypoint", "logging", "ephemeral", "program"))', ] } diff --git a/crates/hydra-api/src/consts.rs b/crates/hydra-api/src/consts.rs index b10a5ad..8b091c9 100644 --- a/crates/hydra-api/src/consts.rs +++ b/crates/hydra-api/src/consts.rs @@ -4,16 +4,8 @@ /// Seed prefix for the Crank PDA: `[b"crank", seed_bytes]`. pub const CRANK_SEED_PREFIX: &[u8] = b"crank"; -/// Solana base transaction fee (lamports per signature). -#[cfg(not(feature = "ephemeral"))] -pub const BASE_FEE_LAMPORTS: u64 = 5_000; -/// 100x cheaper on the ephemeral rollup. -#[cfg(feature = "ephemeral")] pub const BASE_FEE_LAMPORTS: u64 = 50; -/// Flat per-trigger reward paid to the cranker. Equals `2 × base_fee`. -pub const CRANKER_REWARD: u64 = 2 * BASE_FEE_LAMPORTS; - /// Max metas a single scheduled ix may declare. pub const MAX_ACCOUNTS: usize = 32; @@ -26,14 +18,6 @@ pub const MAX_INSTRUCTIONS: usize = 16; /// Max bytes of the scheduled ix's `data` field. pub const MAX_DATA_LEN: usize = 1024; -/// Solana's per-transaction account-lock ceiling (`MAX_TX_ACCOUNT_LOCKS`). A -/// `Trigger` tx must lock the crank, cranker, instructions sysvar, the invoked -/// programs, *and every scheduled account*, so a schedule referencing more than -/// this many distinct accounts can never be cranked. `Create` uses it to bound -/// the writability-conflict scan to a fixed, stack-sized buffer: any schedule -/// exceeding it is rejected as un-crankable. -pub const MAX_TX_ACCOUNT_LOCKS: usize = 128; - /// Internal sentinel in `Crank.remaining` meaning "execute forever". /// Wire-level `0` is converted to this at `Create`. pub const REMAINING_INFINITE: u64 = u64::MAX; @@ -46,19 +30,6 @@ pub const CRANK_HEADER_SIZE: usize = 120; /// "don't emit `SetComputeUnitLimit`" (inherits the 200 k/ix default). pub const MAX_COMPUTE_UNIT_LIMIT: u32 = 1_400_000; -/// Expected number of slots per day. -#[cfg(not(feature = "ephemeral"))] -pub const SLOT_FREQUENCY_MS: u64 = 400; -#[cfg(feature = "ephemeral")] -pub const SLOT_FREQUENCY_MS: u64 = 50; - -/// Slots of overdue past `next_exec_slot` after which a crank is considered -/// stuck and `Close` becomes permissionlessly callable. `next_exec_slot` only -/// advances on successful `Trigger`, so a crank whose inner ixs deterministically -/// fails (or whose target is paused) would otherwise pin its rent forever. -/// ~10 days -pub const STALENESS_THRESHOLD_SLOTS: u64 = 10 * 86_400_000 / SLOT_FREQUENCY_MS; - /// Per-meta size in both the on-chain template bytes and the instructions /// sysvar wire format: `[1 flag byte][32-byte pubkey]`. pub const SERIALIZED_META_SIZE: usize = 33; @@ -76,3 +47,33 @@ pub mod ix { pub const CANCEL: u8 = 2; pub const CLOSE: u8 = 3; } + +pub mod base { + /// Solana base transaction fee (lamports per signature) on the base layer. + pub const BASE_FEE_LAMPORTS: u64 = 5_000; + /// Flat per-trigger reward paid to the cranker. Equals `2 × base_fee`. + pub const CRANKER_REWARD: u64 = 2 * BASE_FEE_LAMPORTS; + /// Base-layer slot time (milliseconds per slot). + pub const SLOT_FREQUENCY_MS: u64 = 400; + /// Slots of overdue past `next_exec_slot` after which a crank is considered + /// stuck and `Close` becomes permissionlessly callable. `next_exec_slot` only + /// advances on successful `Trigger`, so a crank whose inner ixs deterministically + /// fails (or whose target is paused) would otherwise pin its rent forever. + /// ~10 days + pub const STALENESS_THRESHOLD_SLOTS: u64 = 10 * 86_400_000 / SLOT_FREQUENCY_MS; +} + +pub mod ephemeral { + /// 100x cheaper than the base layer. + pub const BASE_FEE_LAMPORTS: u64 = 50; + /// Flat per-trigger reward paid to the cranker. Equals `2 × base_fee`. + pub const CRANKER_REWARD: u64 = 2 * BASE_FEE_LAMPORTS; + /// Ephemeral-rollup slot time (milliseconds per slot). + pub const SLOT_FREQUENCY_MS: u64 = 50; + /// Slots of overdue past `next_exec_slot` after which a crank is considered + /// stuck and `Close` becomes permissionlessly callable. `next_exec_slot` only + /// advances on successful `Trigger`, so a crank whose inner ixs deterministically + /// fails (or whose target is paused) would otherwise pin its rent forever. + /// ~10 days + pub const STALENESS_THRESHOLD_SLOTS: u64 = 10 * 86_400_000 / SLOT_FREQUENCY_MS; +} diff --git a/crates/hydra-api/src/program/processor.rs b/crates/hydra-api/src/program/processor.rs index d49ada2..0259ad7 100644 --- a/crates/hydra-api/src/program/processor.rs +++ b/crates/hydra-api/src/program/processor.rs @@ -8,25 +8,15 @@ use pinocchio::{error::ProgramError, AccountView, Address, ProgramResult}; use crate::{ consts::{ - CRANKER_REWARD, CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, MAX_DATA_LEN, + self, CRANK_SEED_PREFIX, MAX_ACCOUNTS, MAX_COMPUTE_UNIT_LIMIT, MAX_DATA_LEN, MAX_INSTRUCTIONS, META_FLAG_SIGNER, REMAINING_INFINITE, SERIALIZED_META_SIZE, - STALENESS_THRESHOLD_SLOTS, }, instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}, program::helpers::get_clock_slot, state::{load_crank, load_crank_mut, Crank}, - HydraError, CRANK_HEADER_SIZE, MAX_TX_ACCOUNT_LOCKS, META_FLAG_WRITABLE, + HydraError, CRANK_HEADER_SIZE, }; -/// Per-unique-account writability state used by the conflict scan in `process`. -/// `Unknown` fills the unused slots of the fixed tracking buffer. -#[derive(Clone, Copy, PartialEq, Eq)] -enum Writability { - Unknown, - ReadOnly, - Writable, -} - /// `signer` must sign and `crank` must be Hydra-owned — the preamble of every /// `Cancel` / `Close` path. pub fn require_signed_crank( @@ -243,15 +233,6 @@ pub fn write_tail(tail: &mut [u8], data: &[u8]) -> Result { let mut off = 0usize; let mut num_instructions = 0usize; - // Writability-conflict tracker. Each distinct scheduled account is - // recorded once, keyed by the offset of its pubkey within `data` (so we - // store 4 bytes, not a 32-byte key), alongside the read/write state it - // was first seen with. On a later occurrence with the opposite state we - // reject. - let mut seen_pubkey_offsets = [0u32; MAX_TX_ACCOUNT_LOCKS]; - let mut seen_writability = [Writability::Unknown; MAX_TX_ACCOUNT_LOCKS]; - let mut num_distinct_accounts = 0usize; - while cursor < data.len() { let (num_accounts, data_len, next) = parse_ix_header(data, cursor)?; num_instructions += 1; @@ -270,34 +251,6 @@ pub fn write_tail(tail: &mut [u8], data: &[u8]) -> Result { if meta_flag & META_FLAG_SIGNER != 0 { return Err(HydraError::SignerInScheduledIx.into()); } - let meta_writability = if meta_flag & META_FLAG_WRITABLE != 0 { - Writability::Writable - } else { - Writability::ReadOnly - }; - let pubkey_offset = meta_offset + 1; - let meta_pubkey = &data[pubkey_offset..pubkey_offset + 32]; - let mut already_seen = false; - for seen_index in 0..num_distinct_accounts { - let seen_offset = seen_pubkey_offsets[seen_index] as usize; - if data[seen_offset..seen_offset + 32] == *meta_pubkey { - if seen_writability[seen_index] != meta_writability { - return Err(HydraError::ConflictingAccountWritability.into()); - } - already_seen = true; - break; - } - } - if !already_seen { - // A distinct account that can't fit in a `Trigger` tx's lock - // set makes the whole crank un-triggerable. - if num_distinct_accounts == MAX_TX_ACCOUNT_LOCKS { - return Err(HydraError::InvalidSchedule.into()); - } - seen_pubkey_offsets[num_distinct_accounts] = pubkey_offset as u32; - seen_writability[num_distinct_accounts] = meta_writability; - num_distinct_accounts += 1; - } } // [num_accounts u16][metas][program_id 32][data_len u16][data] @@ -457,7 +410,19 @@ pub fn process_close( crank_ai: &AccountView, recipient: &AccountView, program_id: &Address, + is_ephemeral: bool, ) -> ProgramResult { + let cranker_reward = if is_ephemeral { + consts::ephemeral::CRANKER_REWARD + } else { + consts::base::CRANKER_REWARD + }; + let staleness_threshold_slots = if is_ephemeral { + consts::ephemeral::STALENESS_THRESHOLD_SLOTS + } else { + consts::base::STALENESS_THRESHOLD_SLOTS + }; + require_signed_crank(reporter, crank_ai, program_id)?; // Snapshot the fields we need from the crank header. @@ -476,7 +441,7 @@ pub fn process_close( // Pre-condition: exhausted OR underfunded OR stuck. let exhausted = remaining == 0; - let next_reward = CRANKER_REWARD + let next_reward = cranker_reward .checked_add(priority_tip) .ok_or(ProgramError::ArithmeticOverflow)?; let underfunded = lamports_now @@ -487,7 +452,7 @@ pub fn process_close( // failure pins it in the past. `saturating_sub` makes future-scheduled // cranks (`next_exec_slot > current_slot`) trivially not-stale. let current_slot = get_clock_slot()?; - let stuck = current_slot.saturating_sub(next_exec_slot) > STALENESS_THRESHOLD_SLOTS; + let stuck = current_slot.saturating_sub(next_exec_slot) > staleness_threshold_slots; if !(exhausted || underfunded || stuck) { return Err(HydraError::NotClosable.into()); @@ -498,7 +463,7 @@ pub fn process_close( // Flat bounty (2 × base fee) to whoever cranked the cleanup; the balance // refunds to `recipient`. `min` handles a crank holding less than the // bounty — reporter gets what's there, recipient gets nothing. - let bounty = CRANKER_REWARD.min(lamports_now); + let bounty = cranker_reward.min(lamports_now); let refund = lamports_now - bounty; crank_ai.set_lamports(0); diff --git a/crates/hydra-cranker/src/cache.rs b/crates/hydra-cranker/src/cache.rs index 3cf1e08..99bbf5a 100644 --- a/crates/hydra-cranker/src/cache.rs +++ b/crates/hydra-cranker/src/cache.rs @@ -11,7 +11,7 @@ use std::{ use solana_pubkey::Pubkey; use hydra_api::{ - consts::{CRANKER_REWARD, CRANK_HEADER_SIZE, REMAINING_INFINITE, STALENESS_THRESHOLD_SLOTS}, + consts::{self, CRANK_HEADER_SIZE, REMAINING_INFINITE}, SERIALIZED_META_SIZE, }; @@ -38,6 +38,22 @@ pub struct CrankEntry { pub data: Vec, } +fn cranker_reward(is_ephemeral: bool) -> u64 { + if is_ephemeral { + consts::ephemeral::CRANKER_REWARD + } else { + consts::base::CRANKER_REWARD + } +} + +fn staleness_threshold_slots(is_ephemeral: bool) -> u64 { + if is_ephemeral { + consts::ephemeral::STALENESS_THRESHOLD_SLOTS + } else { + consts::base::STALENESS_THRESHOLD_SLOTS + } +} + impl CrankEntry { /// Decode the header offsets from the raw account bytes. Returns `None` /// if the buffer is too small or malformed. @@ -68,14 +84,14 @@ impl CrankEntry { /// Mirrors Hydra's on-chain Trigger pre-flight: slot reached, not /// exhausted, enough lamports to cover reward + tip above the rent floor. - pub fn is_eligible(&self, current_slot: u64) -> bool { + pub fn is_eligible(&self, current_slot: u64, is_ephemeral: bool) -> bool { if current_slot < self.next_exec_slot { return false; } if self.remaining == 0 { return false; } - let reward = CRANKER_REWARD.saturating_add(self.priority_tip); + let reward = cranker_reward(is_ephemeral).saturating_add(self.priority_tip); self.lamports >= self.rent_min.saturating_add(reward) } @@ -125,16 +141,16 @@ impl CrankEntry { /// Mirrors on-chain `Close` pre-condition: exhausted OR underfunded OR /// stuck (`current_slot - next_exec_slot > STALENESS_THRESHOLD_SLOTS`). - pub fn is_closable(&self, current_slot: u64) -> bool { + pub fn is_closable(&self, current_slot: u64, is_ephemeral: bool) -> bool { if self.remaining == 0 { return true; } - let next_reward = CRANKER_REWARD.saturating_add(self.priority_tip); + let next_reward = cranker_reward(is_ephemeral).saturating_add(self.priority_tip); if self.lamports < self.rent_min.saturating_add(next_reward) { return true; } // `saturating_sub` keeps future-scheduled cranks trivially not stale. - current_slot.saturating_sub(self.next_exec_slot) > STALENESS_THRESHOLD_SLOTS + current_slot.saturating_sub(self.next_exec_slot) > staleness_threshold_slots(is_ephemeral) } } diff --git a/crates/hydra-cranker/src/main.rs b/crates/hydra-cranker/src/main.rs index 4806cce..08a8e00 100644 --- a/crates/hydra-cranker/src/main.rs +++ b/crates/hydra-cranker/src/main.rs @@ -279,9 +279,9 @@ fn main() -> Result<()> { let mut elig = Vec::new(); let mut clos = Vec::new(); for entry in guard.values() { - if entry.is_closable(slot) { + if entry.is_closable(slot, args.ephemeral) { clos.push(entry.clone()); - } else if entry.is_eligible(slot) { + } else if entry.is_eligible(slot, args.ephemeral) { // A crank that references the cranker's own pubkey can never // fire (the cranker is promoted to signer + writable as the // fee payer) and is unsafe to run — skip unless `--unsafe`. diff --git a/programs/hydra-ephemeral/src/processor/close.rs b/programs/hydra-ephemeral/src/processor/close.rs index c1c63de..d58caf2 100644 --- a/programs/hydra-ephemeral/src/processor/close.rs +++ b/programs/hydra-ephemeral/src/processor/close.rs @@ -24,7 +24,7 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { check_magic_accounts(vault, magic_program)?; // Base-identical payout: closable check + bounty/refund split, zeroes crank. - process_close(reporter, crank_ai, recipient, &crate::ID)?; + process_close(reporter, crank_ai, recipient, &crate::ID, false)?; // Deallocate the now zero-lamport ephemeral account; Magic refunds the vault // rent to `reporter`. diff --git a/programs/hydra-ephemeral/src/processor/trigger.rs b/programs/hydra-ephemeral/src/processor/trigger.rs index 75a19cf..28e0241 100644 --- a/programs/hydra-ephemeral/src/processor/trigger.rs +++ b/programs/hydra-ephemeral/src/processor/trigger.rs @@ -13,7 +13,7 @@ use pinocchio::{ }; use hydra_api::{ - consts::{CRANKER_REWARD, REMAINING_INFINITE}, + consts::{ephemeral, REMAINING_INFINITE}, program::{ helpers::{get_clock_slot, get_stack_height, TRANSACTION_LEVEL_STACK_HEIGHT}, processor::verify_followup, @@ -62,8 +62,9 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { return Err(HydraError::Exhausted.into()); } - // Cranker reward, paid out of the crank's balance — same as base `Trigger`. - let reward = CRANKER_REWARD + // Cranker reward, paid out of the crank's balance — same as base `Trigger`, + // but at the ephemeral-rollup rate. + let reward = ephemeral::CRANKER_REWARD .checked_add(priority_tip) .ok_or(ProgramError::ArithmeticOverflow)?; let new_crank_lamports = crank_ai diff --git a/programs/hydra/src/processor/close.rs b/programs/hydra/src/processor/close.rs index 9c51abf..5c45cdd 100644 --- a/programs/hydra/src/processor/close.rs +++ b/programs/hydra/src/processor/close.rs @@ -16,5 +16,5 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { return Err(ProgramError::NotEnoughAccountKeys); }; - process_close(reporter, crank_ai, recipient, &crate::ID) + process_close(reporter, crank_ai, recipient, &crate::ID, false) } diff --git a/programs/hydra/src/processor/trigger.rs b/programs/hydra/src/processor/trigger.rs index 1d10519..eedc933 100644 --- a/programs/hydra/src/processor/trigger.rs +++ b/programs/hydra/src/processor/trigger.rs @@ -11,7 +11,7 @@ use pinocchio::{ }; use hydra_api::{ - consts::{CRANKER_REWARD, CRANK_HEADER_SIZE, REMAINING_INFINITE}, + consts::{base, CRANK_HEADER_SIZE, REMAINING_INFINITE}, HydraError, }; @@ -77,7 +77,7 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { return Err(HydraError::Exhausted.into()); } - let reward = CRANKER_REWARD + let reward = base::CRANKER_REWARD .checked_add(hdr.priority_tip) .ok_or(ProgramError::ArithmeticOverflow)?; let new_crank_lamports = crank_ai diff --git a/tests/e2e/tests/ephemeral_cranks.rs b/tests/e2e/tests/ephemeral_cranks.rs index 7681477..b2f2f2f 100644 --- a/tests/e2e/tests/ephemeral_cranks.rs +++ b/tests/e2e/tests/ephemeral_cranks.rs @@ -59,12 +59,12 @@ use std::time::{Duration, Instant}; use anyhow::{anyhow, bail, Context, Result}; use crossbeam_channel::RecvTimeoutError; +use hydra_api::consts::ephemeral::CRANKER_REWARD; use hydra_api::instruction::{self as ix, ScheduledIx}; use hydra_api::instruction::{ ephemeral::{self as eph}, CreateArgs, }; -use hydra_api::CRANKER_REWARD; use solana_client::rpc_client::RpcClient; use solana_commitment_config::CommitmentConfig; use solana_instruction::{AccountMeta, Instruction}; diff --git a/tests/lib.rs b/tests/lib.rs index 71b497e..f89dfed 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -494,9 +494,7 @@ pub fn print_cu_table() { #[cfg(test)] mod tests { - use hydra_api::{ - instruction::CreateArgs, state::region_len_for, CRANKER_REWARD, STALENESS_THRESHOLD_SLOTS, - }; + use hydra_api::{consts::base, instruction::CreateArgs, state::region_len_for}; use super::*; @@ -784,7 +782,7 @@ mod tests { assert_eq!( cranker_acct.lamports, - cranker_starting + CRANKER_REWARD + priority_tip, + cranker_starting + base::CRANKER_REWARD + priority_tip, "cranker reward" ); @@ -877,7 +875,7 @@ mod tests { .expect("cranker after trigger"); assert_eq!( cranker_acct.lamports, - cranker_starting + CRANKER_REWARD + priority_tip, + cranker_starting + base::CRANKER_REWARD + priority_tip, "ephemeral cranker reward" ); @@ -1228,7 +1226,7 @@ mod tests { #[test] fn close_permissionless_when_stuck() { let mut mollusk = mollusk_with_hydra(); - mollusk.sysvars.clock.slot = STALENESS_THRESHOLD_SLOTS + 1; + mollusk.sysvars.clock.slot = base::STALENESS_THRESHOLD_SLOTS + 1; let payer = Pubkey::new_unique(); let reporter = Pubkey::new_unique(); @@ -1325,290 +1323,6 @@ mod tests { ); } - #[test] - fn create_rejects_conflicting_account_writability() { - // Same pubkey read-only in ix0, writable in ix1. On-chain the message - // compiler promotes it to writable everywhere, so the stored read-only - // flag could never match the instructions sysvar and the crank would be - // un-fireable. `Create` must reject it up front. - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let shared = Pubkey::new_unique(); - - let create = create_ix_multi( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, - &[ - ScheduledIx { - program_id: memo::ID.to_bytes(), - metas: &[SchedMeta::readonly(shared.to_bytes())], - data: b"a", - }, - ScheduledIx { - program_id: memo::ID.to_bytes(), - metas: &[SchedMeta::writable(shared.to_bytes())], - data: b"b", - }, - ], - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (system_program, system_program_acct), - ]; - let result = mollusk.process_transaction_instructions(&[create], &accounts); - assert!( - result.raw_result.is_err(), - "create must reject a pubkey that is read-only in one ix and writable in another" - ); - } - - #[test] - fn create_rejects_conflict_across_nonadjacent_ixs() { - // The conflict is between ix0 (read-only) and ix2 (writable), with an - // unrelated ix in between — exercises the cross-instruction tracker. - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let shared = Pubkey::new_unique(); - let filler = Pubkey::new_unique(); - - let create = create_ix_multi( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, - &[ - ScheduledIx { - program_id: memo::ID.to_bytes(), - metas: &[SchedMeta::readonly(shared.to_bytes())], - data: b"a", - }, - ScheduledIx { - program_id: memo::ID.to_bytes(), - metas: &[SchedMeta::readonly(filler.to_bytes())], - data: b"b", - }, - ScheduledIx { - program_id: memo::ID.to_bytes(), - metas: &[SchedMeta::writable(shared.to_bytes())], - data: b"c", - }, - ], - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (system_program, system_program_acct), - ]; - let result = mollusk.process_transaction_instructions(&[create], &accounts); - assert!( - result.raw_result.is_err(), - "create must reject a read-only/writable conflict across non-adjacent ixs" - ); - } - - #[test] - fn create_accepts_same_account_readonly_across_ixs() { - // The same account read-only in two different ixs is consistent — the - // tracker must treat it as one account, not a conflict. - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let shared = Pubkey::new_unique(); - - let create = create_ix_multi( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, - &[ - ScheduledIx { - program_id: memo::ID.to_bytes(), - metas: &[SchedMeta::readonly(shared.to_bytes())], - data: b"a", - }, - ScheduledIx { - program_id: memo::ID.to_bytes(), - metas: &[SchedMeta::readonly(shared.to_bytes())], - data: b"b", - }, - ], - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (system_program, system_program_acct), - ]; - let result = mollusk.process_transaction_instructions(&[create], &accounts); - assert!( - result.raw_result.is_ok(), - "create must accept the same account read-only across ixs: {:?}", - result.raw_result - ); - } - - #[test] - fn create_accepts_consistent_account_writability() { - // The same account writable in *both* siblings is fine — no promotion - // conflict — and must not be caught by the rejection above. - let mollusk = mollusk_with_hydra(); - let payer = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - let shared = Pubkey::new_unique(); - - let create = create_ix_multi( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, - &[ - ScheduledIx { - program_id: memo::ID.to_bytes(), - metas: &[SchedMeta::writable(shared.to_bytes())], - data: b"a", - }, - ScheduledIx { - program_id: memo::ID.to_bytes(), - metas: &[SchedMeta::writable(shared.to_bytes())], - data: b"b", - }, - ], - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (system_program, system_program_acct), - ]; - let result = mollusk.process_transaction_instructions(&[create], &accounts); - assert!( - result.raw_result.is_ok(), - "create must accept consistent writability: {:?}", - result.raw_result - ); - } - - /// A scheduled ix that lists the eventual cranker's account as read-only - /// cannot be used to sneak a write to it. On-chain the cranker is the fee - /// payer — signer + writable — so the message compiler promotes that meta - /// to signer+writable in every instruction region of the sysvar. The stored - /// template kept it read-only (Create forbids storing a signer flag at all, - /// and the cranker is unknown at schedule time), so the promoted bytes can - /// never match and `Trigger` reverts before the sibling ever runs — the - /// write to the cranker account is impossible. - /// - /// mollusk builds the sysvar from each ix's own meta (no promotion), so we - /// model the runtime promotion by handing the follow-up ix the cranker meta - /// already signer+writable — the exact bytes the validator emits. - #[test] - fn scheduled_ix_writing_cranker_as_readonly_cannot_fire() { - let mut mollusk = mollusk_with_hydra(); - load_noop(&mut mollusk); - let payer = Pubkey::new_unique(); - let cranker = Pubkey::new_unique(); - let (crank_pda, _bump) = find_crank(&SEED); - - // Schedule a noop that references the cranker's pubkey as a read-only - // account. All `Create` sees is a read-only meta on some pubkey. - let create = create_ix( - payer, - crank_pda, - SEED, - [0u8; 32], - 0, - 100, - 10, - 0, - 0, - NOOP_ID, - &[SchedMeta::readonly(cranker.to_bytes())], - b"x", - ); - - let (system_program, system_program_acct) = keyed_account_for_system_program(); - let accounts = vec![ - (payer, Account::new(PAYER_LAMPORTS, 0, &system_program)), - (crank_pda, Account::default()), - (cranker, Account::new(0, 0, &system_program)), - (system_program, system_program_acct), - ]; - let after_create = mollusk.process_transaction_instructions(&[create], &accounts); - assert!( - after_create.raw_result.is_ok(), - "create (cranker referenced read-only): {:?}", - after_create.raw_result - ); - - let mut funded = after_create.resulting_accounts.clone(); - for (k, a) in funded.iter_mut() { - if *k == crank_pda { - a.lamports += 1_000_000; - } - } - let cranker_before = funded - .iter() - .find(|(k, _)| *k == cranker) - .map(|(_, a)| a.lamports) - .unwrap(); - - // The cranker is the fee payer, so its meta in the sibling region is - // signer+writable on-chain — not the stored read-only. - let trigger = trigger_ix(crank_pda, cranker); - let sibling = Instruction { - program_id: NOOP_ID, - accounts: vec![AccountMeta::new(cranker, true)], // promoted signer+writable - data: b"x".to_vec(), - }; - let after = mollusk.process_transaction_instructions(&[trigger, sibling], &funded); - assert!( - after.raw_result.is_err(), - "trigger must reject: promoted cranker meta != stored read-only, so the write is blocked" - ); - - // The tx reverted, so the cranker was neither written nor paid. - let cranker_after = after - .resulting_accounts - .iter() - .find(|(k, _)| *k == cranker) - .map(|(_, a)| a.lamports) - .unwrap(); - assert_eq!( - cranker_before, cranker_after, - "cranker balance must be untouched" - ); - } - #[test] fn trigger_rejects_before_slot() { let mollusk = mollusk_with_hydra(); @@ -2094,7 +1808,7 @@ mod tests { // One Trigger = one reward + one schedule advance, regardless of ix count. assert_eq!( cranker_acct.lamports, - cranker_starting + CRANKER_REWARD + priority_tip, + cranker_starting + base::CRANKER_REWARD + priority_tip, "single reward per trigger" ); let header = decode_header(&crank_acct.data); From a3a2269a5474b99f3ffa6e98596cdf08f70e499c Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 18:16:41 +0200 Subject: [PATCH 23/33] feat: gate ephemeral close --- README.md | 16 +++++--- .../hydra-ephemeral/src/processor/close.rs | 38 ++++++++++++++----- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index ea08c11..86ce371 100644 --- a/README.md +++ b/README.md @@ -355,12 +355,16 @@ forces: sponsor. Lifecycle: `Create` → `Trigger` (+ scheduled siblings, run top-level on the ER) → -`Cancel` (authority-gated) / `Close` (permissionless, when the crank is exhausted, -underfunded, or stuck). On teardown the leftover balance refunds to `recipient` -and the vault rent refunds to the sponsor (`authority` on `Cancel`, `reporter` on -`Close`); if a non-zero `authority` is set, only that authority may be the -`recipient`. The crank PDA derivation (`[b"crank", seed]`) and the on-chain -`Crank` layout are unchanged, so the template / verification model is identical. +`Cancel` (authority-gated) / `Close` (exhausted, underfunded, or stuck). On +teardown the leftover balance refunds to `recipient` and the vault rent refunds +to whoever signs the teardown. Because the Magic program refunds the vault rent +to the teardown's signer, `Close` is only *permissionless for unowned cranks* +(`authority == 0`): when a non-zero `authority` is set, only that authority may +`Close` the crank (and only that authority may be the `recipient`), so the whole +teardown — bounty, leftover balance, and vault rent — stays with the owner rather +than an arbitrary reporter. Unowned cranks stay permissionlessly closable by +anyone. The crank PDA derivation (`[b"crank", seed]`) and the on-chain `Crank` +layout are unchanged, so the template / verification model is identical. ### Instruction Reference (ephemeral) diff --git a/programs/hydra-ephemeral/src/processor/close.rs b/programs/hydra-ephemeral/src/processor/close.rs index d58caf2..a84570c 100644 --- a/programs/hydra-ephemeral/src/processor/close.rs +++ b/programs/hydra-ephemeral/src/processor/close.rs @@ -1,18 +1,24 @@ //! `Close` (disc 3). //! -//! Permissionless cleanup of an exhausted / underfunded / stuck ephemeral crank. -//! Pays the cranker bounty to `reporter` and refunds the remaining balance to -//! `recipient` (shared with base via `process_close`), then CPIs Magic -//! `CloseEphemeralAccount` to deallocate the account and refund its vault rent -//! to `reporter`. If the crank has a non-zero authority, only that authority may -//! be the refund `recipient` (anti-grief, enforced inside `process_close`). +//! Cleanup of an exhausted / underfunded / stuck ephemeral crank. Pays the +//! cranker bounty to `reporter` and refunds the remaining balance to `recipient` +//! (shared with base via `process_close`), then CPIs Magic +//! `CloseEphemeralAccount` to deallocate the account and refund its vault rent. +//! +//! Unlike the base `Close`, this is only permissionless for *unowned* cranks +//! (`authority == 0`). When a crank carries a non-zero authority, only that +//! authority may close it. The reason is the vault rent: Magic refunds it to the +//! teardown's signer, so a permissionless close would hand an owned crank's rent +//! to an arbitrary `reporter`. Gating owned cranks to their authority keeps the +//! whole teardown — bounty, leftover balance, and vault rent — with the owner, +//! while unowned cranks stay permissionlessly closable by anyone. //! //! Accounts: `[reporter(w,s), crank(w), recipient(w), vault(w), magic_program(ro)]`. use ephemeral_rollups_pinocchio::ephemeral_accounts::EphemeralAccount; use pinocchio::{error::ProgramError, AccountView, ProgramResult}; -use hydra_api::program::processor::process_close; +use hydra_api::{program::processor::process_close, state::load_crank, HydraError}; use crate::processor::common::check_magic_accounts; @@ -23,10 +29,22 @@ pub fn process(accounts: &[AccountView], _data: &[u8]) -> ProgramResult { check_magic_accounts(vault, magic_program)?; - // Base-identical payout: closable check + bounty/refund split, zeroes crank. - process_close(reporter, crank_ai, recipient, &crate::ID, false)?; + // A crank with an authority can only be closed by that authority: Magic + // refunds the vault rent to the teardown's signer, so this keeps an owned + // crank's rent with its owner instead of an arbitrary reporter. Unowned + // cranks (`authority == 0`) stay permissionlessly closable. + let stored_authority = { + let data = crank_ai.try_borrow()?; + unsafe { load_crank(&data)? }.authority + }; + if stored_authority != [0u8; 32] && reporter.address().as_array() != &stored_authority { + return Err(HydraError::UnauthorizedAuthority.into()); + } + + // Closable check + bounty/refund split, zeroes crank (ephemeral economics). + process_close(reporter, crank_ai, recipient, &crate::ID, true)?; // Deallocate the now zero-lamport ephemeral account; Magic refunds the vault - // rent to `reporter`. + // rent to `reporter` (== the authority for owned cranks, per the gate above). EphemeralAccount::new(reporter, crank_ai, vault, magic_program).close() } From 307f1fd262de929e47c5a0c99c15d7de67258c54 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 18:18:56 +0200 Subject: [PATCH 24/33] fix: remove obsolete error --- crates/hydra-api/src/error.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/crates/hydra-api/src/error.rs b/crates/hydra-api/src/error.rs index ec7feb7..696bb16 100644 --- a/crates/hydra-api/src/error.rs +++ b/crates/hydra-api/src/error.rs @@ -26,11 +26,6 @@ pub enum HydraError { /// `Create` data was well-formed but semantically invalid (e.g. /// `remaining = 0 && interval_slots = 0`). InvalidSchedule = 9, - /// A scheduled pubkey appears read-only in one instruction and writable in - /// another. The runtime promotes it to writable in every instruction region - /// of the crank tx, so the promoted instructions-sysvar bytes could never - /// match the read-only flag stored here and `Trigger` would never fire. - ConflictingAccountWritability = 10, } impl From for ProgramError { @@ -55,7 +50,6 @@ impl TryFrom for HydraError { 7 => Ok(Self::MismatchedFollowupIx), 8 => Ok(Self::SignerInScheduledIx), 9 => Ok(Self::InvalidSchedule), - 10 => Ok(Self::ConflictingAccountWritability), _ => Err(ProgramError::InvalidArgument), } } @@ -74,7 +68,6 @@ impl ToStr for HydraError { Self::MismatchedFollowupIx => "HydraError::MismatchedFollowupIx", Self::SignerInScheduledIx => "HydraError::SignerInScheduledIx", Self::InvalidSchedule => "HydraError::InvalidSchedule", - Self::ConflictingAccountWritability => "HydraError::ConflictingAccountWritability", } } } From fd06710fd1e0db316b259910e007cee535c4e049 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 18:50:35 +0200 Subject: [PATCH 25/33] feat: remove incompatible feature --- programs/hydra/Cargo.toml | 5 -- programs/hydra/src/processor/create.rs | 82 +++++++++----------------- 2 files changed, 29 insertions(+), 58 deletions(-) diff --git a/programs/hydra/Cargo.toml b/programs/hydra/Cargo.toml index 90d5e1e..0ddbec7 100644 --- a/programs/hydra/Cargo.toml +++ b/programs/hydra/Cargo.toml @@ -20,11 +20,6 @@ no-entrypoint = [] # Each checkpoint costs ~110 CU, so the visible Trigger CU ~doubles — only # enable when profiling. cu-trace = [] -# Uses the SIMD-0312 System Program instruction for prefunded crank PDAs. -# Keep this disabled on mainnet until `create_account_allow_prefund` is active. -# NOTE: requires pinocchio-system >= 0.6 (`CreateAccountAllowPrefund`), which is -# incompatible with the pinocchio 0.10 pin the ephemeral program needs. -create-account-allow-prefund = [] [dependencies] # `unsafe-account-resize` lets `Create` shrink the crank account from its O(1) diff --git a/programs/hydra/src/processor/create.rs b/programs/hydra/src/processor/create.rs index dc7d2e9..9972f4b 100644 --- a/programs/hydra/src/processor/create.rs +++ b/programs/hydra/src/processor/create.rs @@ -24,10 +24,7 @@ use pinocchio::{ sysvars::{rent::Rent, Sysvar}, AccountView, ProgramResult, }; -#[cfg(not(feature = "create-account-allow-prefund"))] use pinocchio_system::instructions::{Allocate, Assign, CreateAccount, Transfer}; -#[cfg(feature = "create-account-allow-prefund")] -use pinocchio_system::instructions::{CreateAccountAllowPrefund, Funding}; use hydra_api::{ consts::{CRANK_HEADER_SIZE, CRANK_SEED_PREFIX}, @@ -61,65 +58,44 @@ pub fn process(accounts: &[AccountView], data: &[u8]) -> ProgramResult { ]; let signers = [Signer::from(&seeds_arr)]; - #[cfg(feature = "create-account-allow-prefund")] - { - let funding_lamports = rent_min.saturating_sub(crank_ai.lamports()); - if funding_lamports == 0 && !payer.is_signer() { - return Err(ProgramError::MissingRequiredSignature); - } - CreateAccountAllowPrefund { + let prefunded = crank_ai.lamports(); + if prefunded == 0 { + // Fresh PDA (the common case): one `CreateAccount` CPI funds, + // allocates, and assigns in a single system-program invocation — + // a third of the CU of the split path below. + CreateAccount { + from: payer, to: crank_ai, + lamports: rent_min, space: total_size as u64, owner: &crate::ID, - funding: (funding_lamports > 0).then_some(Funding { - from: payer, - lamports: funding_lamports, - }), } .invoke_signed(&signers)?; - } - - #[cfg(not(feature = "create-account-allow-prefund"))] - { - let prefunded = crank_ai.lamports(); - if prefunded == 0 { - // Fresh PDA (the common case): one `CreateAccount` CPI funds, - // allocates, and assigns in a single system-program invocation — - // a third of the CU of the split path below. - CreateAccount { + } else { + // Prefunded PDA: `CreateAccount` rejects accounts that already hold + // lamports, so top up the shortfall then allocate + assign. + let funding_lamports = rent_min.saturating_sub(prefunded); + if funding_lamports == 0 && !payer.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + if funding_lamports > 0 { + Transfer { from: payer, to: crank_ai, - lamports: rent_min, - space: total_size as u64, - owner: &crate::ID, - } - .invoke_signed(&signers)?; - } else { - // Prefunded PDA: `CreateAccount` rejects accounts that already hold - // lamports, so top up the shortfall then allocate + assign. - let funding_lamports = rent_min.saturating_sub(prefunded); - if funding_lamports == 0 && !payer.is_signer() { - return Err(ProgramError::MissingRequiredSignature); - } - if funding_lamports > 0 { - Transfer { - from: payer, - to: crank_ai, - lamports: funding_lamports, - } - .invoke()?; - } - Allocate { - account: crank_ai, - space: total_size as u64, - } - .invoke_signed(&signers)?; - Assign { - account: crank_ai, - owner: &crate::ID, + lamports: funding_lamports, } - .invoke_signed(&signers)?; + .invoke()?; + } + Allocate { + account: crank_ai, + space: total_size as u64, } + .invoke_signed(&signers)?; + Assign { + account: crank_ai, + owner: &crate::ID, + } + .invoke_signed(&signers)?; } // The account is sized to `region_len`, so `write_crank` fills it exactly. From 213513b9d7dcbe1e2d8785f8d975ee37c90aad2c Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 19:02:42 +0200 Subject: [PATCH 26/33] fix: anchor example in CI --- .github/workflows/ci.yml | 3 +++ examples/anchor/programs/hydra-example-anchor/Cargo.toml | 8 ++++++++ examples/anchor/programs/hydra-example-anchor/src/lib.rs | 4 ++-- .../anchor/programs/hydra-example-anchor/tests/mollusk.rs | 4 ++-- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 897b53a..83ac039 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,6 +67,9 @@ jobs: - name: Clippy run: cargo clippy --workspace --all-targets -- -D warnings + - name: Check — anchor example + run: cargo check --manifest-path examples/anchor/Cargo.toml --all-targets + - name: Build on-chain programs run: | cargo build-sbf --manifest-path programs/hydra/Cargo.toml diff --git a/examples/anchor/programs/hydra-example-anchor/Cargo.toml b/examples/anchor/programs/hydra-example-anchor/Cargo.toml index f118748..e67553a 100644 --- a/examples/anchor/programs/hydra-example-anchor/Cargo.toml +++ b/examples/anchor/programs/hydra-example-anchor/Cargo.toml @@ -17,6 +17,9 @@ no-entrypoint = [] no-idl = [] no-log-ix-name = [] idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-panic = [] +custom-heap = [] [dependencies] anchor-lang = "1.0" @@ -34,3 +37,8 @@ solana-instruction = "3" solana-pubkey = "4" # Host-side builders + PDA helpers. hydra-api = { path = "../../../../crates/hydra-api", features = ["client"] } + +[lints.rust.unexpected_cfgs] +level = "warn" +priority = 0 +check-cfg = ['cfg(target_os, values("solana"))'] diff --git a/examples/anchor/programs/hydra-example-anchor/src/lib.rs b/examples/anchor/programs/hydra-example-anchor/src/lib.rs index 03e41f6..543e4af 100644 --- a/examples/anchor/programs/hydra-example-anchor/src/lib.rs +++ b/examples/anchor/programs/hydra-example-anchor/src/lib.rs @@ -9,7 +9,7 @@ use anchor_lang::prelude::*; use hydra_api::{ - cpi::native as hydra_cpi, + cpi::base::native as hydra_cpi, instruction::{CreateArgs, ScheduledIx}, }; @@ -37,7 +37,7 @@ pub mod hydra_example_anchor { priority_tip: 1_000, cu_limit: 0, // no on-chain CU override scheduled: &[ScheduledIx { - program_id: target_program_id, + program_id: target_program_id.to_bytes(), metas: &[], data: b"tick", }], diff --git a/examples/anchor/programs/hydra-example-anchor/tests/mollusk.rs b/examples/anchor/programs/hydra-example-anchor/tests/mollusk.rs index 9d4ad4b..da8764d 100644 --- a/examples/anchor/programs/hydra-example-anchor/tests/mollusk.rs +++ b/examples/anchor/programs/hydra-example-anchor/tests/mollusk.rs @@ -36,7 +36,7 @@ const HYDRA_SO: &str = concat!( ); fn hydra_id() -> Pubkey { - Pubkey::new_from_array(hydra_api::ID.to_bytes()) + Pubkey::new_from_array(hydra_api::base::ID.to_bytes()) } #[test] @@ -63,7 +63,7 @@ fn schedule_creates_crank_via_cpi_into_hydra() { // Derive the crank PDA the example will create. let seed = [0x11u8; 32]; - let (crank_addr, _bump) = hydra_api::state::find_crank_pda(&seed); + let (crank_addr, _bump) = hydra_api::state::find_base_crank_pda(&seed); let crank = Pubkey::new_from_array(crank_addr.to_bytes()); let payer = Pubkey::new_unique(); let target_program_id = Pubkey::new_unique(); From fbbd43223aa88d20b54f2781fce53d90996a748d Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 19:12:52 +0200 Subject: [PATCH 27/33] docs: fix header --- crates/hydra-api/src/program/processor.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/hydra-api/src/program/processor.rs b/crates/hydra-api/src/program/processor.rs index 0259ad7..d031039 100644 --- a/crates/hydra-api/src/program/processor.rs +++ b/crates/hydra-api/src/program/processor.rs @@ -65,8 +65,11 @@ pub fn require_cancel_authority( } /// The fixed-size scheduling prefix of a `Create` / `CreateEphemeral` payload. -/// `next_exec` / `interval` are slots for base-layer cranks and milliseconds for -/// ephemeral-rollup cranks; the bytes are identical either way. +/// `next_exec` / `interval` are slot counts on both ledgers — base-layer slots +/// for base cranks, ephemeral-rollup slots for ephemeral cranks (the ER runs +/// faster, so the same wall-clock interval is more slots). Both `Trigger` +/// handlers compare against the ledger's own clock slot and advance +/// `next_exec_slot` by `interval_slots`; the wire bytes are identical either way. pub struct CreateHeader { pub seed: [u8; 32], pub authority: [u8; 32], From bd29172430e76b0f2bddec10ece38b5b32146fbf Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 19:16:26 +0200 Subject: [PATCH 28/33] feat: use body_len --- crates/hydra-api/src/instruction.rs | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/crates/hydra-api/src/instruction.rs b/crates/hydra-api/src/instruction.rs index a952bb7..db3dfd1 100644 --- a/crates/hydra-api/src/instruction.rs +++ b/crates/hydra-api/src/instruction.rs @@ -193,7 +193,7 @@ mod client { use solana_pubkey::{pubkey, Pubkey}; use crate::consts::{ix, META_FLAG_WRITABLE}; - use crate::instruction::{CREATE_FIXED_PREFIX_LEN, CREATE_IX_HEADER_LEN}; + use crate::instruction::CREATE_FIXED_PREFIX_LEN; use super::*; @@ -232,12 +232,7 @@ mod client { /// Build a `Create` instruction scheduling a single instruction. pub fn create(payer: Pubkey, crank: Pubkey, args: &CreateArgs<'_>) -> Instruction { - let body_len: usize = args - .scheduled - .iter() - .map(|s| CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) - .sum(); - let mut data = vec![0_u8; 1 + CREATE_FIXED_PREFIX_LEN + body_len]; + let mut data = vec![0_u8; 1 + CREATE_FIXED_PREFIX_LEN + args.body_len()]; args.write_to(&mut data); Instruction { @@ -309,12 +304,7 @@ mod client { /// Build a `Create` instruction pub fn create(sponsor: Pubkey, crank: Pubkey, args: &CreateArgs<'_>) -> Instruction { - let body_len: usize = args - .scheduled - .iter() - .map(|s| super::CREATE_IX_HEADER_LEN + 33 * s.metas.len() + s.data.len()) - .sum(); - let mut data = vec![0_u8; 1 + super::CREATE_FIXED_PREFIX_LEN + body_len]; + let mut data = vec![0_u8; 1 + super::CREATE_FIXED_PREFIX_LEN + args.body_len()]; args.write_to(&mut data); Instruction { From cba4277ebbf70dcba642758070e2e2ce38e1f7b2 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 21:23:56 +0200 Subject: [PATCH 29/33] fix: client --- crates/hydra-api/src/cpi.rs | 12 ++++++------ examples/anchor/Anchor.toml | 19 +++++-------------- .../programs/hydra-example-anchor/src/lib.rs | 2 +- tests/lib.rs | 8 ++++++-- 4 files changed, 18 insertions(+), 23 deletions(-) diff --git a/crates/hydra-api/src/cpi.rs b/crates/hydra-api/src/cpi.rs index 8f02f75..cc65fca 100644 --- a/crates/hydra-api/src/cpi.rs +++ b/crates/hydra-api/src/cpi.rs @@ -111,16 +111,16 @@ pub mod base { } let mut data = [0_u8; N]; - args.write_to(&mut data); + let written = args.write_to(&mut data); let ix = InstructionView { program_id: &crate::base::ID, - data: &data, accounts: &[ - InstructionAccount::writable(payer.address()), + InstructionAccount::writable_signer(payer.address()), InstructionAccount::writable(crank.address()), - InstructionAccount::writable(system_program.address()), + InstructionAccount::readonly(system_program.address()), ], + data: &data[..written], }; invoke_signed(&ix, &[payer, crank, system_program], signers) @@ -300,11 +300,11 @@ pub mod ephemeral { } let mut data = [0_u8; N]; - args.write_to(&mut data); + let written = args.write_to(&mut data); let ix = InstructionView { program_id: &crate::ephemeral::ID, - data: &data, + data: &data[..written], accounts: &[ InstructionAccount::writable_signer(sponsor.address()), InstructionAccount::writable(crank.address()), diff --git a/examples/anchor/Anchor.toml b/examples/anchor/Anchor.toml index 83fb843..722a9d1 100644 --- a/examples/anchor/Anchor.toml +++ b/examples/anchor/Anchor.toml @@ -5,26 +5,17 @@ anchor_version = "1.0.0" resolution = true skip-lint = false -[programs.localnet] -hydra_example_anchor = "Xyj597GykzwSu44muqNHtYs2aKUgm9ydNoHNySTDFs5" - [programs.devnet] hydra_example_anchor = "Xyj597GykzwSu44muqNHtYs2aKUgm9ydNoHNySTDFs5" -[registry] -url = "https://api.apr.dev" +[programs.localnet] +hydra_example_anchor = "rgMuTEnEYWEK3EzqH9MkFthU9shDAPLgZX7dztEbBf4" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# The mollusk test lives inside the program crate (tests/mollusk.rs). -# Mollusk runs in-process — no validator, no deploy — so invoke via: -# -# anchor test --skip-local-validator --skip-deploy -# -# (Plain `anchor test` spins up a local validator and tries to deploy, -# which is unnecessary; adding those two flags makes Anchor skip both -# and just run this script.) test = "cargo test --manifest-path programs/hydra-example-anchor/Cargo.toml --test mollusk -- --nocapture" + +[hooks] diff --git a/examples/anchor/programs/hydra-example-anchor/src/lib.rs b/examples/anchor/programs/hydra-example-anchor/src/lib.rs index 543e4af..e9c7fbd 100644 --- a/examples/anchor/programs/hydra-example-anchor/src/lib.rs +++ b/examples/anchor/programs/hydra-example-anchor/src/lib.rs @@ -13,7 +13,7 @@ use hydra_api::{ instruction::{CreateArgs, ScheduledIx}, }; -declare_id!("Xyj597GykzwSu44muqNHtYs2aKUgm9ydNoHNySTDFs5"); +declare_id!("rgMuTEnEYWEK3EzqH9MkFthU9shDAPLgZX7dztEbBf4"); #[program] pub mod hydra_example_anchor { diff --git a/tests/lib.rs b/tests/lib.rs index f89dfed..1428ae9 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -494,7 +494,11 @@ pub fn print_cu_table() { #[cfg(test)] mod tests { - use hydra_api::{consts::base, instruction::CreateArgs, state::region_len_for}; + use hydra_api::{ + consts::{base, ephemeral}, + instruction::CreateArgs, + state::region_len_for, + }; use super::*; @@ -875,7 +879,7 @@ mod tests { .expect("cranker after trigger"); assert_eq!( cranker_acct.lamports, - cranker_starting + base::CRANKER_REWARD + priority_tip, + cranker_starting + ephemeral::CRANKER_REWARD + priority_tip, "ephemeral cranker reward" ); From d5d68a452e44e58866d3b7b8c060fa3a84e541b1 Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 22:35:06 +0200 Subject: [PATCH 30/33] feat: add makefile --- .github/workflows/ci.yml | 76 +++------------------------ Makefile | 108 +++++++++++++++++++++++++++++++++++++++ README.md | 40 ++++++++++----- 3 files changed, 143 insertions(+), 81 deletions(-) create mode 100644 Makefile diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 83ac039..2ca090e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,8 +18,7 @@ env: jobs: # --------------------------------------------------------------------------- - # Formatting — covers both the main workspace and the isolated `tests/ephemeral` - # crate (it has its own `[workspace]`, so `--all` on the root doesn't reach it). + # Formatting — covers all root workspace members, including `tests/e2e`. # --------------------------------------------------------------------------- fmt: name: rustfmt @@ -33,11 +32,8 @@ jobs: toolchain: 1.91.1 components: rustfmt - - name: Format — main workspace - run: cargo fmt --all --check - - - name: Format — tests/e2e crate - run: cargo fmt --manifest-path tests/e2e/Cargo.toml --all --check + - name: Check formatting + run: make fmt-check # --------------------------------------------------------------------------- # Default feature set: lint + tests with the `ephemeral` feature OFF. @@ -52,7 +48,7 @@ jobs: uses: dtolnay/rust-toolchain@master with: toolchain: 1.91.1 - components: clippy + components: clippy,rustfmt - name: Install Solana toolchain (build-sbf) run: | @@ -64,59 +60,8 @@ jobs: - uses: Swatinem/rust-cache@v2 - - name: Clippy - run: cargo clippy --workspace --all-targets -- -D warnings - - - name: Check — anchor example - run: cargo check --manifest-path examples/anchor/Cargo.toml --all-targets - - - name: Build on-chain programs - run: | - cargo build-sbf --manifest-path programs/hydra/Cargo.toml - cargo build-sbf --manifest-path programs/hydra-ephemeral/Cargo.toml - cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml - - - name: Test - run: cargo nextest run -p hydra-tests - - # --------------------------------------------------------------------------- - # `ephemeral` feature set: lint + the end-to-end lifecycle tests that run - # against MagicSVM. The `tests/ephemeral` crate pulls `magicsvm` via a sibling - # path dependency (`../../../magicsvm/crates/magicsvm`), so it's checked out - # next to this repo. - # --------------------------------------------------------------------------- - ephemeral: - name: lint (ephemeral) - runs-on: ubuntu-latest - steps: - - name: Checkout hydra - uses: actions/checkout@v4 - with: - path: hydra - - - name: Install Rust (clippy) - uses: dtolnay/rust-toolchain@master - with: - toolchain: 1.91.1 - components: clippy - - - name: Install Solana toolchain (build-sbf) - run: | - sh -c "$(curl -sSfL https://release.anza.xyz/${SOLANA_VERSION}/install)" - echo "$HOME/.local/share/solana/install/active_release/bin" >> "$GITHUB_PATH" - - - name: Install cargo-nextest - uses: taiki-e/install-action@nextest - - - uses: Swatinem/rust-cache@v2 - with: - workspaces: | - hydra - hydra/tests/ephemeral - - - name: Clippy — program (ephemeral) - working-directory: hydra - run: cargo clippy -p hydra-ephemeral --all-targets -- -D warnings + - name: Default CI checks + run: make ci # --------------------------------------------------------------------------- # Live end-to-end: boots the real three-process stack (mb-test-validator + @@ -163,14 +108,9 @@ jobs: tests/e2e - name: Clippy — e2e crate - run: cargo clippy --manifest-path tests/e2e/Cargo.toml --all-targets -- -D warnings - - - name: Build on-chain programs (ephemeral) - run: | - cargo build-sbf --manifest-path programs/hydra-ephemeral/Cargo.toml - cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml + run: make lint-e2e - name: Test — live ephemeral cranks # The test is `#[ignore]` (spawns external validators); it builds the # hydra-cranker itself and runs it with `--ephemeral`. - run: cargo test --manifest-path tests/e2e/Cargo.toml -- --ignored --nocapture --test-threads=1 + run: make test-e2e diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..41ca2ad --- /dev/null +++ b/Makefile @@ -0,0 +1,108 @@ +# Hydra — build & test commands. +# +# Quickstart: +# make build # compile the on-chain programs (needed before tests) +# make test # run the hydra-tests suite +# make ci # everything the default CI job runs, locally +# +# Run `make` or `make help` for the full list. +# +# Toolchain prerequisites: +# - Rust + `cargo build-sbf` (Solana/Anza toolchain) +# - cargo-nextest -> `make install-tools` +# - anchor CLI -> only for `make build-examples` +# - @magicblock-labs/ephemeral-validator (npm) -> only for `make test-e2e` + +SHELL := /bin/bash +.DEFAULT_GOAL := help + +# Manifests for the crates that live outside the default workspace build. +BASE_MANIFEST := programs/hydra/Cargo.toml +EPHEMERAL_MANIFEST := programs/hydra-ephemeral/Cargo.toml +NOOP_MANIFEST := tests/programs/noop/Cargo.toml +NATIVE_MANIFEST := examples/native/Cargo.toml +PINOCCHIO_MANIFEST := examples/pinocchio/Cargo.toml +ANCHOR_MANIFEST := examples/anchor/Cargo.toml +E2E_MANIFEST := tests/e2e/Cargo.toml + +CLIPPY := --all-targets -- -D warnings + +.PHONY: help +help: ## Show this help + @grep -hE '^[a-zA-Z0-9_-]+:.*?## ' $(MAKEFILE_LIST) \ + | awk 'BEGIN{FS=":.*?## "}{printf " \033[36m%-16s\033[0m %s\n", $$1, $$2}' + +# --------------------------------------------------------------------------- +# Build — on-chain SBF programs (artifacts land in target/deploy/*.so). +# --------------------------------------------------------------------------- +.PHONY: build build-base build-ephemeral build-noop build-examples + +build: build-base build-ephemeral ## build-sbf the base + ephemeral hydra programs + +build-base: build-noop ## build-sbf the base hydra program + cargo build-sbf --manifest-path $(BASE_MANIFEST) + +build-ephemeral: build-noop ## build-sbf the ephemeral-rollup hydra program + cargo build-sbf --manifest-path $(EPHEMERAL_MANIFEST) + +build-noop: ## build-sbf the noop test program (target of scheduled ixs) + cargo build-sbf --manifest-path $(NOOP_MANIFEST) + +build-examples: ## build-sbf the native + pinocchio example programs + cargo build-sbf --manifest-path $(NATIVE_MANIFEST) + cargo build-sbf --manifest-path $(PINOCCHIO_MANIFEST) + cd examples/anchor && anchor build + +# --------------------------------------------------------------------------- +# Format & lint (mirrors the fmt + default CI jobs). +# --------------------------------------------------------------------------- +.PHONY: fmt fmt-check lint lint-e2e lint-ephemeral + +fmt: ## Format the workspace + cargo fmt --all + +fmt-check: ## Check formatting without writing (CI) + cargo fmt --all --check + +lint: ## Clippy the workspace and check the excluded anchor example + cargo clippy --workspace $(CLIPPY) + cargo check --manifest-path $(ANCHOR_MANIFEST) --all-targets + +lint-e2e: ## Clippy only the e2e crate + cargo clippy --manifest-path $(E2E_MANIFEST) $(CLIPPY) + +# --------------------------------------------------------------------------- +# Test. `hydra-tests` and the example mollusk tests load the compiled .so +# files at runtime, so the build targets are prerequisites. +# --------------------------------------------------------------------------- +.PHONY: test test-examples test-e2e test-all bench cu-table + +test: build-base ## Run the hydra-tests suite (unit + integration, via nextest) + cargo nextest run -p hydra-tests + +test-examples: build-base build-examples ## Run the native + pinocchio example mollusk tests + cargo nextest run -p hydra-example-native -p hydra-example-pinocchio + +test-e2e: build-ephemeral build-noop ## Live e2e: spawns validators + cranker (needs the ephemeral-validator npm pkg) + cargo test --manifest-path $(E2E_MANIFEST) -- --ignored --nocapture --test-threads=1 + +test-all: test test-examples test-e2e ## Run hydra-tests, examples, and live e2e + +bench: build-base ## Run the compute-unit benchmarks + cargo bench -p hydra-tests + +cu-table: build-base ## Print the per-instruction CU table (the ignored cu_table test) + cargo test -p hydra-tests cu_table -- --ignored --nocapture + +# --------------------------------------------------------------------------- +# Aggregate / housekeeping. +# --------------------------------------------------------------------------- +.PHONY: ci install-tools clean + +ci: fmt-check lint build test ## Run the default CI job locally (fmt-check + lint + build + test) + +install-tools: ## Install cargo-nextest (Solana/anchor/node toolchains are installed separately) + cargo install cargo-nextest --locked + +clean: ## Remove Cargo build artifacts + cargo clean diff --git a/README.md b/README.md index 86ce371..362762f 100644 --- a/README.md +++ b/README.md @@ -81,22 +81,39 @@ payload size (it is a one-time cost dominated by the account-creation syscall). Reproduce: ```sh -cargo build-sbf --manifest-path programs/hydra/Cargo.toml -cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml -cargo test -p hydra-tests cu_table -- --ignored --nocapture +make cu-table ``` ## Build +Run `make help` to list the available targets. Common commands: + +- `make build` — build the base and ephemeral on-chain programs. +- `make fmt` / `make fmt-check` — format Rust sources or check formatting. +- `make lint` — run clippy for the workspace, plus the Anchor example check. +- `make test` — run the main `hydra-tests` suite. +- `make test-examples` — run the native and Pinocchio example tests. +- `make test-e2e` — run the live ephemeral-rollup e2e test. +- `make cu-table` — reproduce the compute-unit table. +- `make ci` — run the default CI checks locally. +- `make install-tools` — install `cargo-nextest`. +- `make clean` — remove Cargo build artifacts. + ```sh -# Build the on-chain program. -cargo build-sbf --manifest-path programs/hydra/Cargo.toml +# Show available build, lint, and test targets. +make help + +# Build the on-chain programs. +make build # Build the cranker. cargo build -p hydra-cranker -# Run the test suite. -cargo test -p hydra-tests +# Run the main test suite. +make test + +# Run the default CI checks locally. +make ci ``` ## Integrating Hydra @@ -412,13 +429,10 @@ The validators ship as an npm package; `mb-test-validator` wraps ```sh npm install -g @magicblock-labs/ephemeral-validator # mb-test-validator + ephemeral-validator -# Build the on-chain artifacts the rollup clones (the hydra-cranker is built -# automatically by the test and run with `--ephemeral`). -cargo build-sbf --manifest-path programs/hydra-ephemeral/Cargo.toml -cargo build-sbf --manifest-path tests/programs/noop/Cargo.toml - # The test is `#[ignore]` (it spawns external validators); run it explicitly. -cargo test --manifest-path tests/e2e/Cargo.toml -- --ignored --nocapture +# `make test-e2e` builds the on-chain artifacts the rollup clones first. The +# hydra-cranker is built automatically by the test and run with `--ephemeral`. +make test-e2e ``` CI runs this as the `e2e` job in `.github/workflows/ci.yml`. From c3b10f292ab2afab7d789de68b8d7aeb84a9624f Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Mon, 6 Jul 2026 22:51:48 +0200 Subject: [PATCH 31/33] fix: increase file limits --- .github/workflows/ci.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2ca090e..c5f8c70 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -111,6 +111,8 @@ jobs: run: make lint-e2e - name: Test — live ephemeral cranks - # The test is `#[ignore]` (spawns external validators); it builds the - # hydra-cranker itself and runs it with `--ephemeral`. - run: make test-e2e + run: | + sudo prlimit --pid $$ --nofile=1048576:1048576 + sudo sysctl fs.inotify.max_user_instances=1280 + sudo sysctl fs.inotify.max_user_watches=655360 + make test-e2e From 7e38e4ac4b7749dae089cdd21a69c44678e7992a Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Tue, 7 Jul 2026 10:54:56 +0200 Subject: [PATCH 32/33] fix: update validators --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c5f8c70..a1e5414 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,7 +75,7 @@ jobs: runs-on: ubuntu-latest env: # Pin to the version the test was developed against. - EPHEMERAL_VALIDATOR_VERSION: 0.12.3 + EPHEMERAL_VALIDATOR_VERSION: 0.13.3 steps: - uses: actions/checkout@v4 From 07d584a5b43a9d2ff23f42f0458ccba14c74239d Mon Sep 17 00:00:00 2001 From: Dodecahedr0x Date: Tue, 7 Jul 2026 11:12:43 +0200 Subject: [PATCH 33/33] feat: clean processes --- tests/e2e/tests/ephemeral_cranks.rs | 39 ++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/tests/e2e/tests/ephemeral_cranks.rs b/tests/e2e/tests/ephemeral_cranks.rs index b2f2f2f..ef709f2 100644 --- a/tests/e2e/tests/ephemeral_cranks.rs +++ b/tests/e2e/tests/ephemeral_cranks.rs @@ -86,6 +86,11 @@ const BASE_WS_PORT: u16 = BASE_RPC_PORT + 1; /// which is exactly what the cranker's `http→ws` URL derivation assumes. const ER_RPC_PORT: u16 = 7799; +/// CI runs these ignored tests back-to-back on fixed ports. If a validator +/// wrapper leaves its real child outside our process group, sweep only these +/// e2e process names before the next scenario starts. +const STACK_PROCESS_PATTERN: &str = "[m]b-test-validator|[e]phemeral-validator|[h]ydra-cranker"; + /// The bundled noop program — its on-chain address is its build keypair's /// pubkey (`target/deploy/hydra_noop-keypair.json`). Scheduled cranks point at /// it; it ignores its accounts and data. @@ -152,7 +157,8 @@ fn cranker_catches_cranks_created_after_start() { fn run_scenario(order: CreateOrder) { let _guard = STACK_LOCK.lock().unwrap_or_else(|e| e.into_inner()); - assert_ports_free().expect("e2e ports available"); + cleanup_leftover_stack_processes(); + wait_for_ports_free(Duration::from_secs(5)).expect("e2e ports available"); let tmp = TempDir::new().expect("temp dir"); let mut stack = Stack { children: Vec::new(), @@ -168,6 +174,8 @@ fn run_scenario(order: CreateOrder) { // Tear the stack down (and delete the temp dir) *before* asserting, so a // panic never leaks child processes. drop(stack); + cleanup_leftover_stack_processes(); + wait_for_ports_free(Duration::from_secs(5)).expect("e2e ports released"); result.expect("e2e ephemeral crank test"); } @@ -352,6 +360,35 @@ fn assert_ports_free() -> Result<()> { Ok(()) } +fn wait_for_ports_free(timeout: Duration) -> Result<()> { + let deadline = Instant::now() + timeout; + loop { + match assert_ports_free() { + Ok(()) => return Ok(()), + Err(e) if Instant::now() >= deadline => return Err(e), + Err(_) => thread::sleep(Duration::from_millis(100)), + } + } +} + +fn cleanup_leftover_stack_processes() { + if std::env::var_os("CI").is_none() { + return; + } + + signal_stack_processes("-INT"); + thread::sleep(Duration::from_millis(500)); + signal_stack_processes("-KILL"); +} + +fn signal_stack_processes(signal: &str) { + let _ = Command::new("pkill") + .args([signal, "-f", STACK_PROCESS_PATTERN]) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status(); +} + /// Create `NUM_CRANKS` cranks on the rollup in parallel, asserting each materialized. /// Returns their PDAs in index order. fn create_cranks(sponsor: &Keypair, fee_payer: &Keypair, noop_id: Pubkey) -> Result> {