From 0ded29ccca6cd746be24bfb0e5f24cff2dd80c3f Mon Sep 17 00:00:00 2001 From: dhruvja Date: Thu, 9 Jul 2026 00:07:46 +0530 Subject: [PATCH 1/2] feat: add sealed bid auction example --- README.md | 12 +- scripts/projects.sh | 3 +- sealed-auction/README.md | 69 + sealed-auction/anchor/Anchor.toml | 32 + sealed-auction/anchor/Cargo.lock | 4345 +++++++++++++++++ sealed-auction/anchor/Cargo.toml | 15 + sealed-auction/anchor/package.json | 29 + .../anchor/programs/sealed-auction/Cargo.toml | 25 + .../programs/sealed-auction/src/error.rs | 33 + .../anchor/programs/sealed-auction/src/lib.rs | 1108 +++++ .../programs/sealed-auction/src/state.rs | 46 + sealed-auction/anchor/tests/sealed-auction.ts | 1094 +++++ sealed-auction/anchor/tsconfig.json | 10 + sealed-auction/anchor/yarn.lock | 1399 ++++++ 14 files changed, 8218 insertions(+), 2 deletions(-) create mode 100644 sealed-auction/README.md create mode 100644 sealed-auction/anchor/Anchor.toml create mode 100644 sealed-auction/anchor/Cargo.lock create mode 100644 sealed-auction/anchor/Cargo.toml create mode 100644 sealed-auction/anchor/package.json create mode 100644 sealed-auction/anchor/programs/sealed-auction/Cargo.toml create mode 100644 sealed-auction/anchor/programs/sealed-auction/src/error.rs create mode 100644 sealed-auction/anchor/programs/sealed-auction/src/lib.rs create mode 100644 sealed-auction/anchor/programs/sealed-auction/src/state.rs create mode 100644 sealed-auction/anchor/tests/sealed-auction.ts create mode 100644 sealed-auction/anchor/tsconfig.json create mode 100644 sealed-auction/anchor/yarn.lock diff --git a/README.md b/README.md index a8d51d9..bd7aa98 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,17 @@ Focused demos of individual capabilities — on-curve delegation, actions, ephem

Up/down SPL-token prediction flow using session keys and an ER price oracle.

- + +
+

🔐 Sealed Auction / Anchor

+

+Anchor +Privacy +Tokens +

+

Private sealed bids with SPL Token escrow.

+
+ diff --git a/scripts/projects.sh b/scripts/projects.sh index 8f55d9b..bde8760 100755 --- a/scripts/projects.sh +++ b/scripts/projects.sh @@ -15,7 +15,7 @@ REGULAR_PROJECTS=(anchor-counter binary-prediction crank-counter ephemeral-account-chats magic-actions oracle-priced-purchase pinocchio-counter rust-counter session-keys spl-tokens) VRF_PROJECTS=(rewards-delegated-vrf roll-dice pinocchio-roll-dice) -TEE_PROJECTS=(private-counter pinocchio-private-counter rock-paper-scissor) +TEE_PROJECTS=(private-counter pinocchio-private-counter rock-paper-scissor sealed-auction) ALL_PROJECTS=("${REGULAR_PROJECTS[@]}" "${VRF_PROJECTS[@]}" "${TEE_PROJECTS[@]}") @@ -39,6 +39,7 @@ project_dir() { private-counter) echo "private-counter/anchor" ;; pinocchio-private-counter) echo "private-counter/pinocchio" ;; rock-paper-scissor) echo "rock-paper-scissor/anchor" ;; + sealed-auction) echo "sealed-auction/anchor" ;; oncurve-delegation) echo "oncurve-delegation/client" ;; *) echo "" ;; esac diff --git a/sealed-auction/README.md b/sealed-auction/README.md new file mode 100644 index 0000000..b98fc90 --- /dev/null +++ b/sealed-auction/README.md @@ -0,0 +1,69 @@ +# Sealed Auction + +Private first-price sealed-bid auction using a MagicBlock private Ephemeral Rollup and SPL Token +escrow. + +The seller escrows a fixed Token A lot in an L1 SPL token account owned by the auction PDA. Bidders +pre-fund Token B however they want, can consolidate balances on the ER, and then submit hidden, +fully collateralized Token B bids on the private ER. After the deadline, the program reads the +private bid accounts on-chain, selects the highest bid, and releases the L1 Token A lot to the +winner. Token B proceeds and loser refunds are settled on the ER from a delegated auction-owned +Token B escrow, while auction-sponsored private bid accounts are closed before the auction PDA is +undelegated. + +## What This Teaches + +- Private ER permissions for hidden bid state. +- L1 SPL Token escrow for a public seller lot. +- Auction-sponsored ER-only bid PDAs plus an auction-owned delegated Token B escrow. +- Count-checked bid scanning and cleanup-gated auction undelegation. + +## Flow + +1. `initialize_auction` creates the auction, parks the seller's Token A in an auction PDA ATA, + creates the auction PDA's Token B ATA/eATA, delegates that Token B escrow to the ER, and preloads + sponsor lamports into the auction PDA. +2. Bidders can pre-fund and consolidate Token B outside the auction using normal delegated SPL token + transfers. +3. `delegate_auction` moves the count-only auction state to ER; auction state remains public because + it does not store bid amounts or bidder keys. +4. `place_bid` creates an auction-sponsored `Bid` PDA and moves Token B from the bidder's ER balance + into the auction-owned Token B escrow. +5. `init_bid_permission` immediately attaches private PER access to the created bid PDA. +6. `end_auction` requires exactly `bid_count` unique valid bid PDAs, scans them on ER, and records + the winner without undelegating the auction. +7. `settle_winning_bid` pays the winning Token B amount from the auction escrow to the seller on ER + and closes the winning bid account back to the auction PDA. +8. Losing bidders run `claim_refund` on ER; refunds are paid from the auction escrow and close losing + bid accounts back to the auction PDA. +9. `undelegate_auction` is allowed only after every accepted bid has been closed. +10. `finalize` runs on L1 after auction undelegation and transfers Token A to the winner. + +No-bid auctions can be undelegated immediately after `end_auction`, then use `reclaim_unsold_lot`. + +## Run + +From this directory: + +```bash +yarn build +yarn test:local +``` + +`yarn test:local` runs the deterministic account-graph checks without requiring a live local stack. +Those checks assert the auction-sponsored count-only instruction surface: no separate sponsor PDA, +no bidder key array in auction state, `end_auction` stays on ER, and `undelegate_auction` remains the +only commit/undelegate step. Under the repository harness, the localnet tests also verify Token A L1 +custody and that sponsor lamports are preloaded into the auction PDA during initialization. +The full privacy and settlement walkthrough needs the standard MagicBlock local stack and QFS/TEE +endpoints from `../../scripts/local-env.sh`: + +```bash +yarn setup +RUN_SEALED_AUCTION_LIVE=1 yarn test:local +``` + +## Out Of Scope + +Reserve prices, Vickrey pricing, Dutch auctions, cranks, session keys, unbounded bidder sets, and a +frontend UI. diff --git a/sealed-auction/anchor/Anchor.toml b/sealed-auction/anchor/Anchor.toml new file mode 100644 index 0000000..43d2d43 --- /dev/null +++ b/sealed-auction/anchor/Anchor.toml @@ -0,0 +1,32 @@ +[toolchain] +anchor_version = "1.0.2" + +[features] +resolution = true +skip-lint = false + +[programs.devnet] +sealed-auction = "F4vB5Ki7ZWnkht1shp2TCHG7GszLxRZ6pbizGNQecmor" + +[programs.localnet] +sealed-auction = "F4vB5Ki7ZWnkht1shp2TCHG7GszLxRZ6pbizGNQecmor" + +[registry] +url = "https://api.apr.dev" + +[provider] +cluster = "devnet" +wallet = "~/.config/solana/id.json" + +[[test.genesis]] +address = "DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh" +program = "../../binary-prediction/anchor/tests/fixtures/dlp.so" +upgradeable = false + +[[test.genesis]] +address = "SPLxh1LVZzEkX99H6rqYizhytLWPZVV296zyYDPagv2" +program = "../../binary-prediction/anchor/tests/fixtures/ephemeral_token_program.so" +upgradeable = false + +[scripts] +test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/sealed-auction.ts" diff --git a/sealed-auction/anchor/Cargo.lock b/sealed-auction/anchor/Cargo.lock new file mode 100644 index 0000000..6696838 --- /dev/null +++ b/sealed-auction/anchor/Cargo.lock @@ -0,0 +1,4345 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.7", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "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", + "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 = "anchor-attribute-access-control" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc4b6b3c3f3e37a0b7d537e03a36bfb0415ee11b4443fa4190437cf26a874b6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "anchor-attribute-account" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e8b1468add67e6a69732883e58d23a18be51538994adaae69c9b3fe967e6be" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "anchor-attribute-constant" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e1e3ade39ba05716ddc3b792859d838cccf43f5f4913ae8a163de7a2ed7f7e" +dependencies = [ + "anchor-syn", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "anchor-attribute-error" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e026f0ff09d740fd1821bbf97d9ac649c123ff92f04b9197b002494af4acf1" +dependencies = [ + "anchor-syn", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "anchor-attribute-event" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aafc8e26eb16a0c4129661f6857c42f301859fc2ee10f4e5287d571f0ea07f5" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "anchor-attribute-program" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6844e657ffe049b073389efb843bb281d08579b8a47ef294365f729b35ed3dca" +dependencies = [ + "anchor-lang-idl", + "anchor-syn", + "anyhow", + "heck 0.3.3", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "anchor-derive-accounts" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c87a6769d7cf2deed8d3351d6d1d8aa05a3a07751f1418ab6b34aaa307bd34b" +dependencies = [ + "anchor-syn", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "anchor-derive-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f014d99530ae48a81f710f150688c5c542fdeee3af8998010e147a64d7a697c" +dependencies = [ + "anchor-syn", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "anchor-derive-space" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ba30c2d844e7440c491ad5f3e25f93115c6c9319df480eda460ce96030832b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[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 1.7.0", + "bytemuck", + "const-crypto", + "solana-account-info 3.1.1", + "solana-clock 3.1.1", + "solana-cpi 3.1.0", + "solana-define-syscall 3.0.0", + "solana-feature-gate-interface 3.1.0", + "solana-instruction 3.4.0", + "solana-instructions-sysvar 3.0.1", + "solana-invoke", + "solana-loader-v3-interface 6.1.1", + "solana-msg 3.1.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", + "solana-program-option 3.1.0", + "solana-program-pack 3.1.0", + "solana-pubkey 3.0.0", + "solana-sdk-ids 3.1.0", + "solana-stake-interface 2.0.2", + "solana-system-interface 2.0.0", + "solana-sysvar 3.1.1", + "solana-sysvar-id 3.1.0", + "thiserror 1.0.69", +] + +[[package]] +name = "anchor-lang-idl" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47914b4290ae2bdf4ec203aa821e6eba86d7c78ef497918938038dcc6919f953" +dependencies = [ + "anchor-lang-idl-spec", + "anyhow", + "heck 0.3.3", + "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-spl" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8005eef3a48a9a8cb21b126ae3bb252647e353afe6ef7f19e545177801c841" +dependencies = [ + "anchor-lang", + "spl-associated-token-account-interface", + "spl-pod", + "spl-token-2022-interface", + "spl-token-group-interface", + "spl-token-interface", + "spl-token-metadata-interface", +] + +[[package]] +name = "anchor-syn" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f6c61ef5b47db60700087bb6e419284b3461ba8f59040e1f6827aa9e9a5bc4" +dependencies = [ + "anyhow", + "bs58", + "cargo_toml", + "heck 0.3.3", + "proc-macro2", + "quote", + "serde", + "sha2 0.11.0", + "syn 2.0.118", + "thiserror 1.0.69", +] + +[[package]] +name = "anyhow" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[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.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.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 = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" +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 = "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 = "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 = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[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", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +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 = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid 0.9.6", + "zeroize", +] + +[[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.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 0.9.6", + "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", + "const-oid 0.10.2", + "crypto-common 0.2.2", + "ctutils", +] + +[[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 = "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 = "ephemeral-rollups-sdk" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bce9a6d4849f9f394bd6ba63fb916d61d6d04197fde797030d597b4b06c63cbd" +dependencies = [ + "anchor-lang", + "base64ct", + "bincode", + "bytemuck", + "ephemeral-rollups-sdk-attribute-action", + "ephemeral-rollups-sdk-attribute-commit", + "ephemeral-rollups-sdk-attribute-delegate", + "ephemeral-rollups-sdk-attribute-ephemeral", + "ephemeral-rollups-sdk-attribute-ephemeral-accounts", + "five8 0.2.1", + "getrandom 0.2.17", + "magicblock-delegation-program-api", + "magicblock-magic-program-api", + "num-derive", + "num-traits", + "solana-account-info 2.3.0", + "solana-address 2.6.1", + "solana-program 2.3.0", + "solana-program 3.0.0", + "solana-program-error 2.2.2", + "solana-system-interface 2.0.0", + "thiserror 1.0.69", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-action" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c9dedd8dab5a5705e96984d6d930915b2b19bb929f246523776f5e3bfa83ef4" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-commit" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba975885220357ecde2b8daa8f8d27e580563344857f2dcd935609165937da10" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-delegate" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1baeb3f22db564e419d6e68d1244184620a2321cb1521da65443d5a065179814" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-ephemeral" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc336479439a54ab12f2dcb2ce37cbd1183caa80fb461ac2b12346a4c707d3f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ephemeral-rollups-sdk-attribute-ephemeral-accounts" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6338f039a9feb8569312492336dc929dec5abf7208faa45bb7562c2c319308" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "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", +] + +[[package]] +name = "five8" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_const" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_const" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "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 = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.12", +] + +[[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 = "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 = "hybrid-array" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +dependencies = [ + "typenum", +] + +[[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.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +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.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +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 = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "lock_api" +version = "0.4.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", + "borsh 0.10.4", + "borsh 1.7.0", + "bytemuck", + "const-crypto", + "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-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.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dc8fba0307c90b91b70c9ed06d4242d6c4159f331b2f05bf8f875c2a94e0e98" +dependencies = [ + "bincode", + "const-crypto", + "serde", + "solana-program 3.0.0", + "solana-signature", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.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-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 = "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 = "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 = "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 0.5.11", +] + +[[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 = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.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_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[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 = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[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 = "sealed-auction" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "ephemeral-rollups-sdk", +] + +[[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_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[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" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[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 = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[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-info" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" +dependencies = [ + "bincode", + "serde", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-account-info" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" +dependencies = [ + "bincode", + "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", + "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", + "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 = [ + "solana-clock 3.1.1", + "solana-pubkey 4.2.0", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.1.0", +] + +[[package]] +name = "solana-atomic-u64" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-atomic-u64" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-big-mod-exp" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" +dependencies = [ + "num-bigint", + "num-traits", + "solana-define-syscall 2.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", + "num-traits", + "solana-define-syscall 3.0.0", +] + +[[package]] +name = "solana-bincode" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" +dependencies = [ + "bincode", + "serde", + "solana-instruction 2.3.3", +] + +[[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-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-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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0acdace90d96e2c9e70d681465b4fe888b6bcf27c354ae9774e9f8a3b72923d" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-cpi" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" +dependencies = [ + "solana-account-info 2.3.0", + "solana-define-syscall 2.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-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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf7eb4986b0b1d6f562b21f75a836f1a6df6e00c275efcef50aab5c144dc59e" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8116e6ffa6002237d5ab5edcbda17f9ba66b6742c45a89c9fb40a94dbacd4c1d" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "solana-program-error 3.0.1", + "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.1", + "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", + "serde", + "serde_derive", + "solana-account", + "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 = [ + "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-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 3.0.1", +] + +[[package]] +name = "solana-hash" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" +dependencies = [ + "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-instruction" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab5682934bd1f65f8d2c16f21cb532526fcc1a09f796e2cacdb091eee5774ad" +dependencies = [ + "bincode", + "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", + "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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7d34343838343a3755b7dfb1e438d94c6db2263b519cfe3c2257af932b6e93" +dependencies = [ + "num-traits", + "solana-program-error 3.0.1", +] + +[[package]] +name = "solana-instruction-view" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60147e4d0a4620013df40bf30a86dd299203ff12fcb8b593cd51014fce0875d8" +dependencies = [ + "solana-account-view", + "solana-address 2.6.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-invoke" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4065031f5c7dd29ef5f5003c1a353011eeabbafa6c5a5033da0cedbfca824b94" +dependencies = [ + "solana-account-info 3.1.1", + "solana-define-syscall 3.0.0", + "solana-instruction 3.4.0", + "solana-program-entrypoint 3.1.1", + "solana-stable-layout 3.0.1", +] + +[[package]] +name = "solana-keccak-hasher" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" +dependencies = [ + "sha3", + "solana-define-syscall 2.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-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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22474b83d3c7c318e1c3a725784fc2d1d03b728e36369e58ce48769a61ed85e" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "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", + "solana-system-interface 3.2.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-message" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1796aabce376ff74bf89b78d268fa5e683d7d7a96a0a4e4813ec34de49d5314b" +dependencies = [ + "bincode", + "blake3", + "lazy_static", + "serde", + "serde_derive", + "solana-bincode", + "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 = [ + "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.3.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 = [ + "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-nullable" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7b49f68ccea949a6ea75f485dbe2e17cf4c1d894ed262371d584269359e1a0" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "solana-program" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" +dependencies = [ + "bincode", + "blake3", + "bs58", + "bytemuck", + "console_error_panic_hook", + "console_log", + "getrandom 0.2.17", + "lazy_static", + "log", + "memoffset", + "num-bigint", + "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", + "solana-blake3-hasher 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", + "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", + "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", + "solana-clock 3.1.1", + "solana-cpi 3.1.0", + "solana-define-syscall 3.0.0", + "solana-epoch-rewards 3.1.0", + "solana-epoch-schedule 3.2.0", + "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.1.0", + "solana-msg 3.1.0", + "solana-native-token 3.0.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", + "solana-program-option 3.1.0", + "solana-program-pack 3.1.0", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-secp256k1-recover 3.2.0", + "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.1.0", + "solana-slot-history 3.1.0", + "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 = [ + "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-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 = [ + "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-sanitize" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" + +[[package]] +name = "solana-sanitize" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" + +[[package]] +name = "solana-sdk-ids" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5d8b9cc68d5c88b062a33e23a6466722467dde0035152d8fb1afbcdf350a5f" +dependencies = [ + "solana-pubkey 2.4.0", +] + +[[package]] +name = "solana-sdk-ids" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" +dependencies = [ + "solana-address 2.6.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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a1ad3ed7846631c88c71c5d2f21a2ecb6b61da333d9be173b6b061b35609ae" +dependencies = [ + "k256", + "solana-define-syscall 5.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-seed-derivable" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7bdb72758e3bec33ed0e2658a920f1f35dfb9ed576b951d20d63cb61ecd95c" +dependencies = [ + "solana-derivation-path", +] + +[[package]] +name = "solana-seed-phrase" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" +dependencies = [ + "hmac", + "pbkdf2", + "sha2 0.10.9", +] + +[[package]] +name = "solana-serde-varint" +version = "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 = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0364c7577c3c82a693ce28a1febc8d1b5d1b0a175fdc2114ae6186b69effe1e" +dependencies = [ + "five8 1.0.0", + "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", + "solana-transaction-error 3.3.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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7ce2b4b8911bf2db3de7b6266e67bfc21a6a9f8c566fb096d9782ca2ad16ee" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40427c04d3e808493cb5e3d1a97cef84d7c15cb6f89b15c5684d0d4027105600" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-get-sysvar", + "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 = [ + "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.1", + "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-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-sysvar" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c3595f95069f3d90f275bb9bd235a1973c4d059028b0a7f81baca2703815db" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info 2.3.0", + "solana-clock 2.2.3", + "solana-define-syscall 2.3.0", + "solana-epoch-rewards 2.2.1", + "solana-epoch-schedule 2.2.1", + "solana-fee-calculator 2.2.1", + "solana-hash 2.3.0", + "solana-instruction 2.3.3", + "solana-instructions-sysvar 2.2.2", + "solana-last-restart-slot 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-slot-hashes 2.2.1", + "solana-slot-history 2.2.1", + "solana-stake-interface 1.2.1", + "solana-sysvar-id 2.2.1", +] + +[[package]] +name = "solana-sysvar" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info 3.1.1", + "solana-clock 3.1.1", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards 3.1.0", + "solana-epoch-schedule 3.2.0", + "solana-fee-calculator 3.2.2", + "solana-hash 4.4.0", + "solana-instruction 3.4.0", + "solana-last-restart-slot 3.1.0", + "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.1.0", + "solana-slot-history 3.1.0", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-sysvar-id" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1" +dependencies = [ + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +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-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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a949797bc1ac31836d0070e791083028a8c2e0d493fa4cf51c0bed7a04c65c22" +dependencies = [ + "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", + "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-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 = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "getrandom 0.2.17", + "itertools", + "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", + "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-associated-token-account-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6433917b60441d68d99a17e121d9db0ea15a9a69c0e5afa34649cf5ba12612f" +dependencies = [ + "solana-instruction 3.4.0", + "solana-pubkey 3.0.0", +] + +[[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-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", + "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", + "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 3.1.1", + "solana-curve25519", + "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", + "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 3.4.0", + "solana-nullable", + "solana-program-error 3.0.1", + "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 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.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", + "solana-instruction 3.4.0", + "solana-program-error 3.0.1", + "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 3.1.1", + "solana-program-error 3.0.1", + "solana-zero-copy", + "spl-discriminator", + "thiserror 2.0.18", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.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 = "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" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[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 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_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[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 = "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 = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "uuid" +version = "1.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.118", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[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 = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75726053136156d419e285b9b7eddaaea9e3fea6ce32eed44a89901f0bd98de1" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4714fd92cf900833d49538023a9b3915155210801d1c1169eba513b2addefd71" +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/sealed-auction/anchor/Cargo.toml b/sealed-auction/anchor/Cargo.toml new file mode 100644 index 0000000..14a951c --- /dev/null +++ b/sealed-auction/anchor/Cargo.toml @@ -0,0 +1,15 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/sealed-auction/anchor/package.json b/sealed-auction/anchor/package.json new file mode 100644 index 0000000..6c5a2e5 --- /dev/null +++ b/sealed-auction/anchor/package.json @@ -0,0 +1,29 @@ +{ + "scripts": { + "lint:fix": "prettier --config ../../.prettierrc.json --ignore-path ../../.prettierignore --no-error-on-unmatched-pattern */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier --config ../../.prettierrc.json --ignore-path ../../.prettierignore --no-error-on-unmatched-pattern */*.js \"*/**/*{.js,.ts}\" --check", + "test": "yarn test:local", + "build": "anchor keys sync && anchor build", + "test:local": ". ../../scripts/local-env.sh && npx ts-mocha -p ./tsconfig.json -t 1000000 tests/sealed-auction.ts", + "setup": "cd ../.. && SETUP_ONLY=1 ./scripts/test-locally.sh sealed-auction" + }, + "dependencies": { + "@coral-xyz/anchor": "0.32.1", + "@magicblock-labs/ephemeral-rollups-sdk": "0.14.3", + "tweetnacl": "^1.0.3" + }, + "devDependencies": { + "@solana/spl-token": "^0.4.14", + "@types/bn.js": "^5.1.0", + "@types/chai": "^5.2.2", + "@types/mocha": "^10.0.10", + "chai": "^5.2.0", + "mocha": "^11.2.2", + "prettier": "^3.5.3", + "ts-mocha": "^11.1.0", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" + }, + "license": "MIT", + "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" +} diff --git a/sealed-auction/anchor/programs/sealed-auction/Cargo.toml b/sealed-auction/anchor/programs/sealed-auction/Cargo.toml new file mode 100644 index 0000000..89dd4cd --- /dev/null +++ b/sealed-auction/anchor/programs/sealed-auction/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "sealed-auction" +version = "0.1.0" +description = "Private sealed-bid auction example for MagicBlock Ephemeral Rollups" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "sealed_auction" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +custom-heap = [] +custom-panic = [] +anchor-debug = [] + +[dependencies] +anchor-lang = { version = "=1.0.2", features = ["init-if-needed"] } +anchor-spl = { version = "=1.0.2" } +ephemeral-rollups-sdk = { version = "=0.14.3", features = ["anchor", "access-control"] } diff --git a/sealed-auction/anchor/programs/sealed-auction/src/error.rs b/sealed-auction/anchor/programs/sealed-auction/src/error.rs new file mode 100644 index 0000000..848e945 --- /dev/null +++ b/sealed-auction/anchor/programs/sealed-auction/src/error.rs @@ -0,0 +1,33 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum ErrorCode { + #[msg("amount must be greater than zero")] + InvalidAmount, + #[msg("deadline must be in the future")] + DeadlineInPast, + #[msg("auction is not open")] + AuctionClosed, + #[msg("auction is not ended")] + AuctionNotEnded, + #[msg("too many bidders")] + TooManyBidders, + #[msg("missing bid account")] + MissingBid, + #[msg("invalid bid account")] + InvalidBid, + #[msg("winning bidder cannot claim a refund")] + WinnerCannotRefund, + #[msg("bid was already refunded")] + AlreadyRefunded, + #[msg("token account is not owned by the expected authority")] + InvalidTokenOwner, + #[msg("token account mint mismatch")] + MintMismatch, + #[msg("invalid bid escrow account")] + InvalidBidEscrow, + #[msg("duplicate bid account")] + DuplicateBid, + #[msg("not all bid accounts are closed")] + UnclosedBids, +} diff --git a/sealed-auction/anchor/programs/sealed-auction/src/lib.rs b/sealed-auction/anchor/programs/sealed-auction/src/lib.rs new file mode 100644 index 0000000..6394c57 --- /dev/null +++ b/sealed-auction/anchor/programs/sealed-auction/src/lib.rs @@ -0,0 +1,1108 @@ +use anchor_lang::prelude::*; +use anchor_lang::solana_program::{ + instruction::{AccountMeta, Instruction}, + program::invoke, +}; +use anchor_lang::system_program::{transfer as transfer_lamports, Transfer as LamportsTransfer}; +use anchor_spl::associated_token::AssociatedToken; +use anchor_spl::token::{self, Mint, Token, TokenAccount, Transfer as SplTransfer}; +use ephemeral_rollups_sdk::{ + access_control::{ + instructions::{CloseEphemeralPermissionCpi, CreateEphemeralPermissionCpi}, + structs::{ + EphemeralMembersArgs, EphemeralPermission, Member, AUTHORITY_FLAG, PERMISSION_SEED, + TX_BALANCES_FLAG, TX_LOGS_FLAG, TX_MESSAGE_FLAG, + }, + }, + anchor::{commit, delegate, ephemeral, ephemeral_accounts}, + consts::{EPHEMERAL_VAULT_ID, MAGIC_PROGRAM_ID, PERMISSION_PROGRAM_ID}, + cpi::DelegateConfig, + ephem::MagicIntentBundleBuilder, +}; + +mod error; +mod state; + +use error::ErrorCode; +use state::{Auction, AuctionStatus, Bid, MAX_BIDDERS}; + +declare_id!("F4vB5Ki7ZWnkht1shp2TCHG7GszLxRZ6pbizGNQecmor"); + +pub const AUCTION_SEED: &[u8] = b"auction"; +pub const BID_SEED: &[u8] = b"bid"; +pub const EPHEMERAL_SPL_TOKEN_PROGRAM_ID: Pubkey = + pubkey!("SPLxh1LVZzEkX99H6rqYizhytLWPZVV296zyYDPagv2"); +pub const DELEGATION_PROGRAM_ID: Pubkey = pubkey!("DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh"); + +#[ephemeral] +#[program] +pub mod sealed_auction { + use super::*; + + pub fn initialize_auction( + ctx: Context, + auction_id: u64, + lot_amount: u64, + deadline_ts: i64, + sponsor_lamports: u64, + ) -> Result<()> { + require!(lot_amount > 0, ErrorCode::InvalidAmount); + require!( + deadline_ts > Clock::get()?.unix_timestamp, + ErrorCode::DeadlineInPast + ); + + transfer_lamports( + CpiContext::new( + ctx.accounts.system_program.key(), + LamportsTransfer { + from: ctx.accounts.auctioneer.to_account_info(), + to: ctx.accounts.auction.to_account_info(), + }, + ), + ephemeral_rollups_sdk::ephemeral_accounts::rent(EphemeralPermission::size_of( + MAX_BIDDERS + 1, + ) as u32) + .checked_add(sponsor_lamports) + .ok_or(ErrorCode::InvalidAmount)?, + )?; + + let auction_key = ctx.accounts.auction.key(); + let auction = &mut ctx.accounts.auction; + auction.auctioneer = ctx.accounts.auctioneer.key(); + auction.auction_id = auction_id; + auction.token_a_mint = ctx.accounts.token_a_mint.key(); + auction.token_b_mint = ctx.accounts.token_b_mint.key(); + auction.lot_amount = lot_amount; + auction.deadline_ts = deadline_ts; + auction.bid_count = 0; + auction.closed_bid_count = 0; + auction.highest_bid = 0; + auction.highest_bidder = Pubkey::default(); + auction.status = AuctionStatus::Open; + auction.lot_claimed = false; + auction.bump = ctx.bumps.auction; + + token::transfer( + CpiContext::new( + ctx.accounts.token_program.key(), + SplTransfer { + from: ctx.accounts.seller_token_a_account.to_account_info(), + to: ctx.accounts.auction_token_a_account.to_account_info(), + authority: ctx.accounts.auctioneer.to_account_info(), + }, + ), + lot_amount, + )?; + + let validator = ctx.accounts.validator.as_ref().map(|v| v.key()); + init_ephemeral_ata( + &ctx.accounts.ephemeral_token_program, + &ctx.accounts.auction_token_b_ephemeral_ata, + ctx.accounts.auction.to_account_info(), + &ctx.accounts.token_b_mint, + &ctx.accounts.auctioneer, + &ctx.accounts.system_program, + )?; + delegate_ephemeral_ata( + &ctx.accounts.ephemeral_token_program, + &ctx.accounts.auctioneer, + &ctx.accounts.auction_token_b_ephemeral_ata, + &ctx.accounts.auction_token_b_eata_buffer, + &ctx.accounts.auction_token_b_eata_record, + &ctx.accounts.auction_token_b_eata_metadata, + &ctx.accounts.delegation_program, + &ctx.accounts.system_program, + validator, + )?; + + msg!( + "Initialized auction {} with Token A lot {} held on L1", + auction_key, + lot_amount + ); + Ok(()) + } + + pub fn delegate_auction(ctx: Context, auction_id: u64) -> Result<()> { + let validator = ctx.accounts.validator.as_ref().map(|v| v.key()); + let auctioneer = ctx.accounts.auctioneer.key(); + let auction_id_bytes = auction_id.to_le_bytes(); + ctx.accounts.delegate_auction( + &ctx.accounts.auctioneer, + &[AUCTION_SEED, auctioneer.as_ref(), &auction_id_bytes], + DelegateConfig { + validator, + ..Default::default() + }, + )?; + Ok(()) + } + + pub fn init_auction_permission(ctx: Context, auction_id: u64) -> Result<()> { + require_eq!(ctx.accounts.auction.auction_id, auction_id); + if ctx.accounts.permission.lamports() > 0 { + msg!("Auction permission already exists"); + return Ok(()); + } + + let auction_id_bytes = ctx.accounts.auction.auction_id.to_le_bytes(); + let bump = [ctx.bumps.auction]; + let signers: &[&[u8]] = &[ + AUCTION_SEED, + ctx.accounts.auction.auctioneer.as_ref(), + &auction_id_bytes, + &bump, + ]; + let members = vec![permission_member(ctx.accounts.auction.auctioneer)]; + + CreateEphemeralPermissionCpi { + payer: ctx.accounts.auction.to_account_info(), + permissioned_account: ctx.accounts.auction.to_account_info(), + permission: ctx.accounts.permission.to_account_info(), + vault: ctx.accounts.ephemeral_vault.to_account_info(), + magic_program: ctx.accounts.magic_program.to_account_info(), + permission_program: ctx.accounts.permission_program.to_account_info(), + args: EphemeralMembersArgs { + is_private: false, + members, + }, + } + .invoke_signed(&[signers])?; + Ok(()) + } + + pub fn place_bid(ctx: Context, auction_id: u64, amount: u64) -> Result<()> { + require!(amount > 0, ErrorCode::InvalidAmount); + require_eq!(ctx.accounts.auction.auction_id, auction_id); + require!( + ctx.accounts.auction.status == AuctionStatus::Open, + ErrorCode::AuctionClosed + ); + require!( + Clock::get()?.unix_timestamp < ctx.accounts.auction.deadline_ts, + ErrorCode::AuctionClosed + ); + require!( + (ctx.accounts.auction.bid_count as usize) < MAX_BIDDERS, + ErrorCode::TooManyBidders + ); + + let auction_key = ctx.accounts.auction.key(); + let bidder = ctx.accounts.bidder.key(); + + ctx.accounts.create_ephemeral_bid((8 + Bid::LEN) as u32)?; + + token::transfer( + CpiContext::new( + ctx.accounts.token_program.key(), + SplTransfer { + from: ctx.accounts.bidder_token_b_account.to_account_info(), + to: ctx.accounts.auction_token_b_account.to_account_info(), + authority: ctx.accounts.bidder.to_account_info(), + }, + ), + amount, + )?; + + let bidder_index = ctx.accounts.auction.bid_count; + let bid = Bid { + auction: auction_key, + bidder, + amount, + bidder_index, + refunded: false, + escrow: ctx.accounts.auction_token_b_account.key(), + bump: ctx.bumps.bid, + }; + write_bid(&ctx.accounts.bid.to_account_info(), &bid)?; + + ctx.accounts.auction.bid_count = bidder_index + 1; + + msg!("Bid {} placed for auction {}", amount, auction_key); + Ok(()) + } + + pub fn init_bid_permission(ctx: Context, auction_id: u64) -> Result<()> { + require_eq!(ctx.accounts.auction.auction_id, auction_id); + require_keys_eq!( + ctx.accounts.bid.auction, + ctx.accounts.auction.key(), + ErrorCode::InvalidBid + ); + if !ctx.accounts.bid_permission.data_is_empty() { + msg!("Bid permission already exists"); + return Ok(()); + } + + let auction_id_bytes = ctx.accounts.auction.auction_id.to_le_bytes(); + let auction_bump = [ctx.accounts.auction.bump]; + let auction_signers: &[&[u8]] = &[ + AUCTION_SEED, + ctx.accounts.auction.auctioneer.as_ref(), + &auction_id_bytes, + &auction_bump, + ]; + let auction_key = ctx.accounts.auction.key(); + let bid_bump = [ctx.accounts.bid.bump]; + let bid_signers: &[&[u8]] = &[ + BID_SEED, + auction_key.as_ref(), + ctx.accounts.bid.bidder.as_ref(), + &bid_bump, + ]; + let bid_members = vec![ + permission_member(ctx.accounts.auction.auctioneer), + permission_member(ctx.accounts.bid.bidder), + ]; + CreateEphemeralPermissionCpi { + payer: ctx.accounts.auction.to_account_info(), + permissioned_account: ctx.accounts.bid.to_account_info(), + permission: ctx.accounts.bid_permission.to_account_info(), + vault: ctx.accounts.ephemeral_vault.to_account_info(), + magic_program: ctx.accounts.magic_program.to_account_info(), + permission_program: ctx.accounts.permission_program.to_account_info(), + args: EphemeralMembersArgs { + is_private: true, + members: bid_members, + }, + } + .invoke_signed(&[auction_signers, bid_signers])?; + + msg!("Bid permission created for {}", ctx.accounts.bid.key()); + Ok(()) + } + + pub fn end_auction(ctx: Context, auction_id: u64) -> Result<()> { + require_eq!(ctx.accounts.auction.auction_id, auction_id); + require!( + ctx.accounts.auction.status == AuctionStatus::Open, + ErrorCode::AuctionClosed + ); + require!( + Clock::get()?.unix_timestamp >= ctx.accounts.auction.deadline_ts, + ErrorCode::DeadlineInPast + ); + + let auction_key = ctx.accounts.auction.key(); + let bid_count = ctx.accounts.auction.bid_count as usize; + require!( + ctx.remaining_accounts.len() == bid_count, + ErrorCode::MissingBid + ); + + let mut highest_bid = 0; + let mut highest_bidder = Pubkey::default(); + let mut highest_index = u8::MAX; + + for index in 0..bid_count { + let bid_info = &ctx.remaining_accounts[index]; + let bid = Account::::try_from(bid_info)?; + require_keys_eq!(bid.auction, auction_key, ErrorCode::InvalidBid); + let expected_bid = Pubkey::find_program_address( + &[BID_SEED, auction_key.as_ref(), bid.bidder.as_ref()], + ctx.program_id, + ) + .0; + require_keys_eq!(bid_info.key(), expected_bid, ErrorCode::InvalidBid); + require!( + (bid.bidder_index as usize) < bid_count, + ErrorCode::InvalidBid + ); + + for previous_index in 0..index { + let previous_info = &ctx.remaining_accounts[previous_index]; + require_keys_neq!(bid_info.key(), previous_info.key(), ErrorCode::DuplicateBid); + let previous_bid = Account::::try_from(previous_info)?; + require!( + bid.bidder_index != previous_bid.bidder_index, + ErrorCode::DuplicateBid + ); + } + + if bid.amount > highest_bid + || (bid.amount == highest_bid && bid.bidder_index < highest_index) + { + highest_bid = bid.amount; + highest_bidder = bid.bidder; + highest_index = bid.bidder_index; + } + } + + let auction = &mut ctx.accounts.auction; + auction.highest_bid = highest_bid; + auction.highest_bidder = highest_bidder; + auction.status = AuctionStatus::Ended; + msg!( + "Ended auction {} with winner {}", + auction_key, + highest_bidder + ); + Ok(()) + } + + pub fn undelegate_auction(ctx: Context, auction_id: u64) -> Result<()> { + require_eq!(ctx.accounts.auction.auction_id, auction_id); + require!( + ctx.accounts.auction.status == AuctionStatus::Ended, + ErrorCode::AuctionNotEnded + ); + require_eq!( + ctx.accounts.auction.closed_bid_count, + ctx.accounts.auction.bid_count, + ErrorCode::UnclosedBids + ); + MagicIntentBundleBuilder::new( + ctx.accounts.payer.to_account_info(), + ctx.accounts.magic_context.to_account_info(), + ctx.accounts.magic_program.to_account_info(), + ) + .commit_and_undelegate(&[ctx.accounts.auction.to_account_info()]) + .build_and_invoke()?; + Ok(()) + } + + pub fn finalize(ctx: Context, auction_id: u64) -> Result<()> { + require_eq!(ctx.accounts.auction.auction_id, auction_id); + require!( + ctx.accounts.auction.status == AuctionStatus::Ended, + ErrorCode::AuctionNotEnded + ); + require!( + ctx.accounts.auction.highest_bidder != Pubkey::default(), + ErrorCode::MissingBid + ); + + let auction_id_bytes = ctx.accounts.auction.auction_id.to_le_bytes(); + let auction_bump = [ctx.accounts.auction.bump]; + let auction_seeds: &[&[u8]] = &[ + AUCTION_SEED, + ctx.accounts.auction.auctioneer.as_ref(), + &auction_id_bytes, + &auction_bump, + ]; + token::transfer( + CpiContext::new_with_signer( + ctx.accounts.token_program.key(), + SplTransfer { + from: ctx.accounts.auction_token_a_account.to_account_info(), + to: ctx.accounts.winner_token_a_account.to_account_info(), + authority: ctx.accounts.auction.to_account_info(), + }, + &[auction_seeds], + ), + ctx.accounts.auction.lot_amount, + )?; + + let auction = &mut ctx.accounts.auction; + auction.status = AuctionStatus::Settled; + auction.lot_claimed = true; + Ok(()) + } + + pub fn reclaim_unsold_lot(ctx: Context, auction_id: u64) -> Result<()> { + require_eq!(ctx.accounts.auction.auction_id, auction_id); + require!( + ctx.accounts.auction.status == AuctionStatus::Ended, + ErrorCode::AuctionNotEnded + ); + require!( + ctx.accounts.auction.highest_bidder == Pubkey::default(), + ErrorCode::InvalidBid + ); + + let auction_id_bytes = ctx.accounts.auction.auction_id.to_le_bytes(); + let auction_bump = [ctx.accounts.auction.bump]; + let auction_seeds: &[&[u8]] = &[ + AUCTION_SEED, + ctx.accounts.auction.auctioneer.as_ref(), + &auction_id_bytes, + &auction_bump, + ]; + token::transfer( + CpiContext::new_with_signer( + ctx.accounts.token_program.key(), + SplTransfer { + from: ctx.accounts.auction_token_a_account.to_account_info(), + to: ctx.accounts.seller_token_a_account.to_account_info(), + authority: ctx.accounts.auction.to_account_info(), + }, + &[auction_seeds], + ), + ctx.accounts.auction.lot_amount, + )?; + + let auction = &mut ctx.accounts.auction; + auction.status = AuctionStatus::Settled; + auction.lot_claimed = true; + Ok(()) + } + + pub fn settle_winning_bid(ctx: Context) -> Result<()> { + require!( + ctx.accounts.auction.status == AuctionStatus::Ended, + ErrorCode::AuctionNotEnded + ); + require!( + ctx.accounts.auction.highest_bidder != Pubkey::default(), + ErrorCode::MissingBid + ); + + let auction = ctx.accounts.auction.key(); + let winner = ctx.accounts.auction.highest_bidder; + let winning_bid_info = ctx.accounts.winning_bid.to_account_info(); + let bid = read_bid(&winning_bid_info)?; + require_keys_eq!(bid.auction, auction, ErrorCode::InvalidBid); + require_keys_eq!(bid.bidder, winner, ErrorCode::InvalidBid); + require_eq!( + bid.amount, + ctx.accounts.auction.highest_bid, + ErrorCode::InvalidBid + ); + require_keys_eq!( + bid.escrow, + ctx.accounts.auction_token_b_account.key(), + ErrorCode::InvalidBidEscrow + ); + + let auction_id_bytes = ctx.accounts.auction.auction_id.to_le_bytes(); + let auction_bump = [ctx.accounts.auction.bump]; + let auction_signers: &[&[u8]] = &[ + AUCTION_SEED, + ctx.accounts.auction.auctioneer.as_ref(), + &auction_id_bytes, + &auction_bump, + ]; + let bid_bump = [bid.bump]; + let bid_seeds: &[&[u8]] = &[BID_SEED, auction.as_ref(), winner.as_ref(), &bid_bump]; + token::transfer( + CpiContext::new_with_signer( + ctx.accounts.token_program.key(), + SplTransfer { + from: ctx.accounts.auction_token_b_account.to_account_info(), + to: ctx.accounts.seller_token_b_account.to_account_info(), + authority: ctx.accounts.auction.to_account_info(), + }, + &[auction_signers], + ), + bid.amount, + )?; + + close_bid_permission(&CloseBidPermissionAccounts { + sponsor: ctx.accounts.auction.to_account_info(), + bid: ctx.accounts.winning_bid.to_account_info(), + permission: ctx.accounts.bid_permission.to_account_info(), + ephemeral_vault: ctx.accounts.vault.to_account_info(), + magic_program: ctx.accounts.magic_program.to_account_info(), + permission_program: ctx.accounts.permission_program.to_account_info(), + sponsor_signers: auction_signers, + bid_signers: bid_seeds, + })?; + ctx.accounts.close_ephemeral_winning_bid()?; + ctx.accounts.auction.closed_bid_count = ctx + .accounts + .auction + .closed_bid_count + .checked_add(1) + .ok_or(ErrorCode::TooManyBidders)?; + Ok(()) + } + + pub fn claim_refund(ctx: Context) -> Result<()> { + require!( + ctx.accounts.auction.status == AuctionStatus::Ended, + ErrorCode::AuctionNotEnded + ); + let auction = ctx.accounts.auction.key(); + let bid_info = ctx.accounts.bid.to_account_info(); + let bid = read_bid(&bid_info)?; + require_keys_eq!(bid.auction, auction, ErrorCode::InvalidBid); + require_keys_eq!(bid.bidder, ctx.accounts.bidder.key(), ErrorCode::InvalidBid); + require!( + bid.bidder != ctx.accounts.auction.highest_bidder, + ErrorCode::WinnerCannotRefund + ); + require!(!bid.refunded, ErrorCode::AlreadyRefunded); + require_keys_eq!( + bid.escrow, + ctx.accounts.auction_token_b_account.key(), + ErrorCode::InvalidBidEscrow + ); + + let auction_id_bytes = ctx.accounts.auction.auction_id.to_le_bytes(); + let auction_bump = [ctx.accounts.auction.bump]; + let auction_signers: &[&[u8]] = &[ + AUCTION_SEED, + ctx.accounts.auction.auctioneer.as_ref(), + &auction_id_bytes, + &auction_bump, + ]; + let bid_bump = [bid.bump]; + let bid_seeds: &[&[u8]] = &[ + BID_SEED, + bid.auction.as_ref(), + bid.bidder.as_ref(), + &bid_bump, + ]; + token::transfer( + CpiContext::new_with_signer( + ctx.accounts.token_program.key(), + SplTransfer { + from: ctx.accounts.auction_token_b_account.to_account_info(), + to: ctx.accounts.bidder_token_b_account.to_account_info(), + authority: ctx.accounts.auction.to_account_info(), + }, + &[auction_signers], + ), + bid.amount, + )?; + + close_bid_permission(&CloseBidPermissionAccounts { + sponsor: ctx.accounts.auction.to_account_info(), + bid: ctx.accounts.bid.to_account_info(), + permission: ctx.accounts.bid_permission.to_account_info(), + ephemeral_vault: ctx.accounts.vault.to_account_info(), + magic_program: ctx.accounts.magic_program.to_account_info(), + permission_program: ctx.accounts.permission_program.to_account_info(), + sponsor_signers: auction_signers, + bid_signers: bid_seeds, + })?; + ctx.accounts.close_ephemeral_bid()?; + ctx.accounts.auction.closed_bid_count = ctx + .accounts + .auction + .closed_bid_count + .checked_add(1) + .ok_or(ErrorCode::TooManyBidders)?; + Ok(()) + } +} + +fn permission_member(pubkey: Pubkey) -> Member { + Member { + flags: AUTHORITY_FLAG | TX_LOGS_FLAG | TX_MESSAGE_FLAG | TX_BALANCES_FLAG, + pubkey, + } +} + +fn write_bid(account_info: &AccountInfo, bid: &Bid) -> Result<()> { + let mut data = account_info.try_borrow_mut_data()?; + bid.try_serialize(&mut &mut data[..])?; + Ok(()) +} + +fn read_bid(account_info: &AccountInfo) -> Result { + let data = account_info.try_borrow_data()?; + let mut cursor = &data[..]; + Bid::try_deserialize(&mut cursor) +} + +fn init_ephemeral_ata<'info>( + program: &UncheckedAccount<'info>, + ephemeral_ata: &UncheckedAccount<'info>, + owner: AccountInfo<'info>, + mint: &Account<'info, Mint>, + payer: &Signer<'info>, + system_program: &Program<'info, System>, +) -> Result<()> { + let instruction = Instruction { + program_id: EPHEMERAL_SPL_TOKEN_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(ephemeral_ata.key(), false), + AccountMeta::new(payer.key(), true), + AccountMeta::new_readonly(owner.key(), false), + AccountMeta::new_readonly(mint.key(), false), + AccountMeta::new_readonly(system_program.key(), false), + ], + data: vec![0], + }; + invoke( + &instruction, + &[ + ephemeral_ata.to_account_info(), + payer.to_account_info(), + owner, + mint.to_account_info(), + system_program.to_account_info(), + program.to_account_info(), + ], + )?; + Ok(()) +} + +#[allow(clippy::too_many_arguments)] +fn delegate_ephemeral_ata<'info>( + program: &UncheckedAccount<'info>, + payer: &Signer<'info>, + ephemeral_ata: &UncheckedAccount<'info>, + buffer: &UncheckedAccount<'info>, + record: &UncheckedAccount<'info>, + metadata: &UncheckedAccount<'info>, + delegation_program: &UncheckedAccount<'info>, + system_program: &Program<'info, System>, + validator: Option, +) -> Result<()> { + let mut data = vec![4]; + if let Some(validator) = validator { + data.extend_from_slice(validator.as_ref()); + } + + let instruction = Instruction { + program_id: EPHEMERAL_SPL_TOKEN_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(payer.key(), true), + AccountMeta::new(ephemeral_ata.key(), false), + AccountMeta::new_readonly(EPHEMERAL_SPL_TOKEN_PROGRAM_ID, false), + AccountMeta::new(buffer.key(), false), + AccountMeta::new(record.key(), false), + AccountMeta::new(metadata.key(), false), + AccountMeta::new_readonly(delegation_program.key(), false), + AccountMeta::new_readonly(system_program.key(), false), + ], + data, + }; + invoke( + &instruction, + &[ + payer.to_account_info(), + ephemeral_ata.to_account_info(), + program.to_account_info(), + buffer.to_account_info(), + record.to_account_info(), + metadata.to_account_info(), + delegation_program.to_account_info(), + system_program.to_account_info(), + ], + )?; + Ok(()) +} + +fn ephemeral_ata_pda(owner: &Pubkey, mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[owner.as_ref(), mint.as_ref()], + &EPHEMERAL_SPL_TOKEN_PROGRAM_ID, + ) + .0 +} + +fn eata_buffer_address(delegated_account: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[b"buffer", delegated_account.as_ref()], + &EPHEMERAL_SPL_TOKEN_PROGRAM_ID, + ) + .0 +} + +fn record_pda(delegated_account: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[b"delegation", delegated_account.as_ref()], + &DELEGATION_PROGRAM_ID, + ) + .0 +} + +fn metadata_pda(delegated_account: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[b"delegation-metadata", delegated_account.as_ref()], + &DELEGATION_PROGRAM_ID, + ) + .0 +} + +struct CloseBidPermissionAccounts<'a, 'info> { + sponsor: AccountInfo<'info>, + bid: AccountInfo<'info>, + permission: AccountInfo<'info>, + ephemeral_vault: AccountInfo<'info>, + magic_program: AccountInfo<'info>, + permission_program: AccountInfo<'info>, + sponsor_signers: &'a [&'a [u8]], + bid_signers: &'a [&'a [u8]], +} + +fn close_bid_permission(accounts: &CloseBidPermissionAccounts<'_, '_>) -> Result<()> { + CloseEphemeralPermissionCpi { + payer: accounts.sponsor.clone(), + authority: accounts.bid.clone(), + permissioned_account: accounts.bid.clone(), + permission: accounts.permission.clone(), + vault: accounts.ephemeral_vault.clone(), + magic_program: accounts.magic_program.clone(), + permission_program: accounts.permission_program.clone(), + authority_is_signer: false, + } + .invoke_signed(&[accounts.sponsor_signers, accounts.bid_signers])?; + Ok(()) +} + +#[derive(Accounts)] +#[instruction(auction_id: u64)] +pub struct InitializeAuction<'info> { + #[account(mut)] + pub auctioneer: Signer<'info>, + pub token_a_mint: Account<'info, Mint>, + pub token_b_mint: Box>, + #[account( + init, + payer = auctioneer, + space = 8 + Auction::LEN, + seeds = [AUCTION_SEED, auctioneer.key().as_ref(), &auction_id.to_le_bytes()], + bump + )] + pub auction: Box>, + #[account( + init, + payer = auctioneer, + associated_token::mint = token_a_mint, + associated_token::authority = auction + )] + pub auction_token_a_account: Account<'info, TokenAccount>, + #[account( + init, + payer = auctioneer, + associated_token::mint = token_b_mint, + associated_token::authority = auction + )] + pub auction_token_b_account: Box>, + #[account( + mut, + constraint = auction_token_b_ephemeral_ata.key() == ephemeral_ata_pda(&auction.key(), &token_b_mint.key()) @ ErrorCode::InvalidBidEscrow + )] + /// CHECK: Auction PDA's e-token balance account for Token B. + pub auction_token_b_ephemeral_ata: UncheckedAccount<'info>, + #[account( + mut, + constraint = auction_token_b_eata_buffer.key() == eata_buffer_address(&auction_token_b_ephemeral_ata.key()) @ ErrorCode::InvalidBidEscrow + )] + /// CHECK: Delegation buffer PDA for the auction Token-B eATA. + pub auction_token_b_eata_buffer: UncheckedAccount<'info>, + #[account( + mut, + constraint = auction_token_b_eata_record.key() == record_pda(&auction_token_b_ephemeral_ata.key()) @ ErrorCode::InvalidBidEscrow + )] + /// CHECK: Delegation record PDA for the auction Token-B eATA. + pub auction_token_b_eata_record: UncheckedAccount<'info>, + #[account( + mut, + constraint = auction_token_b_eata_metadata.key() == metadata_pda(&auction_token_b_ephemeral_ata.key()) @ ErrorCode::InvalidBidEscrow + )] + /// CHECK: Delegation metadata PDA for the auction Token-B eATA. + pub auction_token_b_eata_metadata: UncheckedAccount<'info>, + #[account( + mut, + token::mint = token_a_mint, + token::authority = auctioneer + )] + pub seller_token_a_account: Account<'info, TokenAccount>, + #[account(address = EPHEMERAL_SPL_TOKEN_PROGRAM_ID)] + /// CHECK: Fixed Ephemeral SPL Token program id. + pub ephemeral_token_program: UncheckedAccount<'info>, + #[account(address = DELEGATION_PROGRAM_ID)] + /// CHECK: Fixed delegation program id. + pub delegation_program: UncheckedAccount<'info>, + /// CHECK: Optional ER validator account used by the e-token delegation CPI. + pub validator: Option>, + pub token_program: Program<'info, Token>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +#[ephemeral_accounts] +#[derive(Accounts)] +#[instruction(auction_id: u64)] +pub struct PlaceBid<'info> { + #[account(mut)] + pub payer: Signer<'info>, + pub bidder: Signer<'info>, + pub token_b_mint: Account<'info, Mint>, + #[account( + mut, + sponsor, + seeds = [AUCTION_SEED, auction.auctioneer.as_ref(), &auction.auction_id.to_le_bytes()], + constraint = auction.auctioneer == payer.key() @ ErrorCode::InvalidBid, + constraint = auction.token_b_mint == token_b_mint.key() @ ErrorCode::MintMismatch, + bump = auction.bump + )] + pub auction: Account<'info, Auction>, + /// CHECK: Ephemeral bid PDA sponsored by the auction. + #[account( + mut, + eph, + seeds = [BID_SEED, auction.key().as_ref(), bidder.key().as_ref()], + bump + )] + pub bid: UncheckedAccount<'info>, + #[account( + mut, + constraint = bidder_token_b_account.owner == bidder.key() @ ErrorCode::InvalidTokenOwner, + constraint = bidder_token_b_account.mint == token_b_mint.key() @ ErrorCode::MintMismatch + )] + pub bidder_token_b_account: Box>, + #[account( + mut, + token::mint = token_b_mint, + token::authority = auction + )] + pub auction_token_b_account: Box>, + pub token_program: Program<'info, Token>, +} + +#[derive(Accounts)] +#[instruction(auction_id: u64)] +pub struct InitBidPermission<'info> { + #[account( + mut, + seeds = [AUCTION_SEED, auction.auctioneer.as_ref(), &auction.auction_id.to_le_bytes()], + bump = auction.bump + )] + pub auction: Account<'info, Auction>, + #[account( + mut, + seeds = [BID_SEED, auction.key().as_ref(), bid.bidder.as_ref()], + constraint = bid.auction == auction.key() @ ErrorCode::InvalidBid, + bump = bid.bump + )] + pub bid: Account<'info, Bid>, + #[account(mut)] + /// CHECK: Verified by the Permission Program. + pub bid_permission: UncheckedAccount<'info>, + #[account(address = PERMISSION_PROGRAM_ID)] + /// CHECK: Fixed Permission Program id. + pub permission_program: UncheckedAccount<'info>, + #[account(mut, address = EPHEMERAL_VAULT_ID)] + /// CHECK: Verified by the Magic Program. + pub ephemeral_vault: UncheckedAccount<'info>, + #[account(address = MAGIC_PROGRAM_ID)] + /// CHECK: Fixed Magic Program id. + pub magic_program: UncheckedAccount<'info>, +} + +#[derive(Accounts)] +#[instruction(auction_id: u64)] +pub struct EndAuction<'info> { + #[account(mut)] + pub auctioneer: Signer<'info>, + #[account( + mut, + seeds = [AUCTION_SEED, auction.auctioneer.as_ref(), &auction_id.to_le_bytes()], + has_one = auctioneer, + bump = auction.bump + )] + pub auction: Account<'info, Auction>, +} + +#[commit] +#[derive(Accounts)] +#[instruction(auction_id: u64)] +pub struct UndelegateAuction<'info> { + #[account(mut)] + pub payer: Signer<'info>, + #[account( + mut, + seeds = [AUCTION_SEED, auction.auctioneer.as_ref(), &auction_id.to_le_bytes()], + bump = auction.bump + )] + pub auction: Account<'info, Auction>, +} + +#[derive(Accounts)] +#[instruction(auction_id: u64)] +pub struct Finalize<'info> { + #[account( + mut, + seeds = [AUCTION_SEED, auction.auctioneer.as_ref(), &auction_id.to_le_bytes()], + bump = auction.bump + )] + pub auction: Account<'info, Auction>, + #[account(constraint = token_a_mint.key() == auction.token_a_mint @ ErrorCode::MintMismatch)] + pub token_a_mint: Box>, + #[account( + mut, + token::mint = token_a_mint, + token::authority = auction + )] + pub auction_token_a_account: Box>, + #[account( + mut, + token::mint = token_a_mint, + token::authority = auction.highest_bidder + )] + pub winner_token_a_account: Box>, + pub token_program: Program<'info, Token>, +} + +#[derive(Accounts)] +#[instruction(auction_id: u64)] +pub struct ReclaimUnsoldLot<'info> { + #[account( + mut, + seeds = [AUCTION_SEED, auction.auctioneer.as_ref(), &auction_id.to_le_bytes()], + bump = auction.bump + )] + pub auction: Box>, + #[account(constraint = token_a_mint.key() == auction.token_a_mint @ ErrorCode::MintMismatch)] + pub token_a_mint: Box>, + #[account( + mut, + token::mint = token_a_mint, + token::authority = auction + )] + pub auction_token_a_account: Box>, + #[account( + mut, + token::mint = token_a_mint, + token::authority = auction.auctioneer + )] + pub seller_token_a_account: Box>, + pub token_program: Program<'info, Token>, +} + +#[ephemeral_accounts] +#[derive(Accounts)] +pub struct SettleWinningBid<'info> { + #[account(mut)] + /// CHECK: Anyone can crank this, but payment is constrained to the auctioneer token account. + pub crank: UncheckedAccount<'info>, + #[account( + mut, + sponsor, + seeds = [AUCTION_SEED, auction.auctioneer.as_ref(), &auction.auction_id.to_le_bytes()], + bump = auction.bump + )] + pub auction: Account<'info, Auction>, + /// CHECK: Ephemeral winning bid PDA sponsored by the auction. + #[account( + mut, + eph, + seeds = [ + BID_SEED, + auction.key().as_ref(), + auction.highest_bidder.as_ref() + ], + bump + )] + pub winning_bid: UncheckedAccount<'info>, + #[account(constraint = token_b_mint.key() == auction.token_b_mint @ ErrorCode::MintMismatch)] + pub token_b_mint: Account<'info, Mint>, + #[account( + mut, + token::mint = token_b_mint, + token::authority = auction + )] + pub auction_token_b_account: Account<'info, TokenAccount>, + #[account( + mut, + token::mint = token_b_mint, + token::authority = auction.auctioneer + )] + pub seller_token_b_account: Account<'info, TokenAccount>, + #[account(mut)] + /// CHECK: Verified by the Permission Program. + pub bid_permission: UncheckedAccount<'info>, + #[account(address = PERMISSION_PROGRAM_ID)] + /// CHECK: Fixed Permission Program id. + pub permission_program: UncheckedAccount<'info>, + #[account(address = MAGIC_PROGRAM_ID)] + /// CHECK: Fixed Magic Program id. + pub magic_program: UncheckedAccount<'info>, + pub token_program: Program<'info, Token>, +} + +#[ephemeral_accounts] +#[derive(Accounts)] +pub struct ClaimRefund<'info> { + /// CHECK: Bidder identity is verified against the Bid account and token destination authority. + pub bidder: UncheckedAccount<'info>, + #[account( + mut, + sponsor, + seeds = [AUCTION_SEED, auction.auctioneer.as_ref(), &auction.auction_id.to_le_bytes()], + bump = auction.bump + )] + pub auction: Account<'info, Auction>, + /// CHECK: Ephemeral bid PDA sponsored by the auction. + #[account( + mut, + eph, + seeds = [ + BID_SEED, + auction.key().as_ref(), + bidder.key().as_ref() + ], + bump + )] + pub bid: UncheckedAccount<'info>, + #[account(constraint = token_b_mint.key() == auction.token_b_mint @ ErrorCode::MintMismatch)] + pub token_b_mint: Account<'info, Mint>, + #[account( + mut, + token::mint = token_b_mint, + token::authority = auction + )] + pub auction_token_b_account: Account<'info, TokenAccount>, + #[account( + mut, + token::mint = token_b_mint, + token::authority = bidder + )] + pub bidder_token_b_account: Account<'info, TokenAccount>, + #[account(mut)] + /// CHECK: Verified by the Permission Program. + pub bid_permission: UncheckedAccount<'info>, + #[account(address = PERMISSION_PROGRAM_ID)] + /// CHECK: Fixed Permission Program id. + pub permission_program: UncheckedAccount<'info>, + #[account(address = MAGIC_PROGRAM_ID)] + /// CHECK: Fixed Magic Program id. + pub magic_program: UncheckedAccount<'info>, + pub token_program: Program<'info, Token>, +} + +#[delegate] +#[derive(Accounts)] +#[instruction(auction_id: u64)] +pub struct DelegateAuction<'info> { + #[account(mut)] + pub auctioneer: Signer<'info>, + #[account( + mut, + del, + seeds = [AUCTION_SEED, auctioneer.key().as_ref(), &auction_id.to_le_bytes()], + bump + )] + /// CHECK: Delegated account is deserialized by later ER instructions. + pub auction: UncheckedAccount<'info>, + /// CHECK: Checked by the delegation program. + pub validator: Option>, +} + +#[derive(Accounts)] +#[instruction(auction_id: u64)] +pub struct AuctionPermission<'info> { + #[account(mut)] + pub auctioneer: Signer<'info>, + #[account( + mut, + seeds = [AUCTION_SEED, auctioneer.key().as_ref(), &auction_id.to_le_bytes()], + has_one = auctioneer, + bump + )] + pub auction: Account<'info, Auction>, + #[account( + mut, + seeds = [PERMISSION_SEED, auction.key().as_ref()], + bump, + seeds::program = PERMISSION_PROGRAM_ID + )] + /// CHECK: Verified by the Permission Program. + pub permission: UncheckedAccount<'info>, + #[account(address = PERMISSION_PROGRAM_ID)] + /// CHECK: Fixed Permission Program id. + pub permission_program: UncheckedAccount<'info>, + #[account(mut, address = EPHEMERAL_VAULT_ID)] + /// CHECK: Verified by the Magic Program. + pub ephemeral_vault: UncheckedAccount<'info>, + #[account(address = MAGIC_PROGRAM_ID)] + /// CHECK: Fixed Magic Program id. + pub magic_program: UncheckedAccount<'info>, +} diff --git a/sealed-auction/anchor/programs/sealed-auction/src/state.rs b/sealed-auction/anchor/programs/sealed-auction/src/state.rs new file mode 100644 index 0000000..22c02e4 --- /dev/null +++ b/sealed-auction/anchor/programs/sealed-auction/src/state.rs @@ -0,0 +1,46 @@ +use anchor_lang::prelude::*; + +pub const MAX_BIDDERS: usize = 5; + +#[account] +pub struct Auction { + pub auctioneer: Pubkey, + pub auction_id: u64, + pub token_a_mint: Pubkey, + pub token_b_mint: Pubkey, + pub lot_amount: u64, + pub deadline_ts: i64, + pub bid_count: u8, + pub closed_bid_count: u8, + pub highest_bid: u64, + pub highest_bidder: Pubkey, + pub status: AuctionStatus, + pub lot_claimed: bool, + pub bump: u8, +} + +impl Auction { + pub const LEN: usize = 32 + 8 + 32 + 32 + 8 + 8 + 1 + 1 + 8 + 32 + 1 + 1 + 1; +} + +#[account] +pub struct Bid { + pub auction: Pubkey, + pub bidder: Pubkey, + pub amount: u64, + pub bidder_index: u8, + pub refunded: bool, + pub escrow: Pubkey, + pub bump: u8, +} + +impl Bid { + pub const LEN: usize = 32 + 32 + 8 + 1 + 1 + 32 + 1; +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, PartialEq, Eq)] +pub enum AuctionStatus { + Open, + Ended, + Settled, +} diff --git a/sealed-auction/anchor/tests/sealed-auction.ts b/sealed-auction/anchor/tests/sealed-auction.ts new file mode 100644 index 0000000..a076699 --- /dev/null +++ b/sealed-auction/anchor/tests/sealed-auction.ts @@ -0,0 +1,1094 @@ +import * as anchor from "@coral-xyz/anchor"; +import { BN, Program, web3 } from "@coral-xyz/anchor"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + TOKEN_PROGRAM_ID, + createAssociatedTokenAccount, + createMint, + getAccount, + getAssociatedTokenAddressSync, + mintTo, +} from "@solana/spl-token"; +import { + MAGIC_CONTEXT_ID, + MAGIC_PROGRAM_ID, + PERMISSION_PROGRAM_ID, + EPHEMERAL_VAULT_ID, + delegateSpl, + getAuthToken, + permissionPdaFromAccount, +} from "@magicblock-labs/ephemeral-rollups-sdk"; +import { expect } from "chai"; +import * as nacl from "tweetnacl"; + +import { SealedAuction } from "../target/types/sealed_auction"; + +type IdlInstruction = { + name: string; + args: { name: string }[]; + accounts: { name: string }[]; +}; + +const idl = require("../target/idl/sealed_auction.json") as { + instructions: IdlInstruction[]; + types: { + name: string; + type: { + kind: string; + fields?: { name: string }[]; + }; + }[]; +}; + +const AUCTION_SEED = Buffer.from("auction"); +const BID_SEED = Buffer.from("bid"); +const LOT_AMOUNT = new BN(100); +const BID_ONE = new BN(40); +const BID_TWO = new BN(55); +const SPONSOR_LAMPORTS = new BN(100_000_000); +const RUN_E2E = process.env.RUN_SEALED_AUCTION_E2E === "1"; +const RUN_LIVE = process.env.RUN_SEALED_AUCTION_LIVE === "1"; +const VALIDATOR = new web3.PublicKey( + process.env.VALIDATOR || "mAGicPQYBMvcYveUZA5F5UNNwyHvfYh5xkLS2Fr1mev", +); +const EPHEMERAL_SPL_TOKEN_PROGRAM_ID = new web3.PublicKey( + "SPLxh1LVZzEkX99H6rqYizhytLWPZVV296zyYDPagv2", +); +const DELEGATION_PROGRAM_ID = new web3.PublicKey( + "DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh", +); +const SCHEDULED_COMMIT_PREFIX = "ScheduledCommitSent signature: "; +const COMMIT_PREFIX = "ScheduledCommitSent signature[0]: "; + +function pda(seeds: Buffer[], programId: web3.PublicKey): web3.PublicKey { + return web3.PublicKey.findProgramAddressSync(seeds, programId)[0]; +} + +function u64(value: BN): Buffer { + return value.toArrayLike(Buffer, "le", 8); +} + +function auctionPda( + programId: web3.PublicKey, + auctioneer: web3.PublicKey, + auctionId: BN, +): web3.PublicKey { + return pda([AUCTION_SEED, auctioneer.toBuffer(), u64(auctionId)], programId); +} + +function bidPda( + programId: web3.PublicKey, + auction: web3.PublicKey, + bidder: web3.PublicKey, +): web3.PublicKey { + return pda([BID_SEED, auction.toBuffer(), bidder.toBuffer()], programId); +} + +function ephemeralAtaPda( + owner: web3.PublicKey, + mint: web3.PublicKey, +): web3.PublicKey { + return pda( + [owner.toBuffer(), mint.toBuffer()], + EPHEMERAL_SPL_TOKEN_PROGRAM_ID, + ); +} + +function eataBufferPda(ephemeralAta: web3.PublicKey): web3.PublicKey { + return pda( + [Buffer.from("buffer"), ephemeralAta.toBuffer()], + EPHEMERAL_SPL_TOKEN_PROGRAM_ID, + ); +} + +function delegationRecordPda(ephemeralAta: web3.PublicKey): web3.PublicKey { + return pda( + [Buffer.from("delegation"), ephemeralAta.toBuffer()], + DELEGATION_PROGRAM_ID, + ); +} + +function delegationMetadataPda(ephemeralAta: web3.PublicKey): web3.PublicKey { + return pda( + [Buffer.from("delegation-metadata"), ephemeralAta.toBuffer()], + DELEGATION_PROGRAM_ID, + ); +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function sleepUntilUnixTimestamp(timestamp: BN): Promise { + const waitMs = timestamp.toNumber() * 1_000 - Date.now() + 1_000; + if (waitMs > 0) { + await sleep(waitMs); + } +} + +function uniqueAuctionId(): BN { + return new BN(Date.now()).add(new BN(Math.floor(Math.random() * 1_000_000))); +} + +function statusName(status: Record): string { + return Object.keys(status)[0]; +} + +async function expectAnchorError( + promise: Promise, + expectedCode: string, +): Promise { + try { + await promise; + } catch (error) { + const anchorError = error as { + error?: { errorCode?: { code?: string } }; + }; + const code = anchorError.error?.errorCode?.code; + if (code) { + expect(code).to.equal(expectedCode); + return; + } + + expect(String(error)).to.include(expectedCode); + return; + } + + throw new Error(`Expected ${expectedCode} but instruction succeeded`); +} + +async function sendLocalTransaction( + connection: web3.Connection, + transaction: web3.Transaction, + feePayer: web3.Keypair, + signers: web3.Keypair[] = [], + label = "transaction", +): Promise { + const blockhash = await connection.getLatestBlockhash("confirmed"); + const signerMap = new Map(); + [feePayer, ...signers].forEach((signer) => + signerMap.set(signer.publicKey.toBase58(), signer), + ); + + transaction.feePayer = feePayer.publicKey; + transaction.recentBlockhash = blockhash.blockhash; + transaction.partialSign(...signerMap.values()); + + const signature = await connection.sendRawTransaction( + transaction.serialize(), + { skipPreflight: true }, + ); + const status = await connection.confirmTransaction( + { signature, ...blockhash }, + "confirmed", + ); + if (status.value.err) { + throw new Error( + `${label} ${signature} failed: ${JSON.stringify(status.value.err)}`, + ); + } + + return signature; +} + +function findLogValue(logMessages: string[], prefix: string): string | null { + const message = logMessages.find((log) => log.includes(prefix)); + return message ? message.split(prefix)[1] : null; +} + +async function getCommitmentSignature( + label: string, + transactionSignature: string, + ephemeralConnection: web3.Connection, +): Promise { + const schedulingTransaction = await ephemeralConnection.getTransaction( + transactionSignature, + { commitment: "confirmed", maxSupportedTransactionVersion: 0 }, + ); + if (!schedulingTransaction?.meta) { + throw new Error(`${label}: scheduling transaction not found`); + } + + const scheduledCommitSignature = findLogValue( + schedulingTransaction.meta.logMessages ?? [], + SCHEDULED_COMMIT_PREFIX, + ); + if (!scheduledCommitSignature) { + throw new Error(`${label}: scheduled commit signature not found`); + } + + for (let attempt = 0; attempt < 60; attempt += 1) { + const scheduledTransaction = await ephemeralConnection.getTransaction( + scheduledCommitSignature, + { commitment: "confirmed", maxSupportedTransactionVersion: 0 }, + ); + const commitmentSignature = findLogValue( + scheduledTransaction?.meta?.logMessages ?? [], + COMMIT_PREFIX, + ); + if (commitmentSignature) { + return commitmentSignature; + } + await sleep(1_000); + } + + throw new Error(`${label}: committed base transaction not found`); +} + +describe("sealed-auction", () => { + const provider = anchor.AnchorProvider.local( + process.env.PROVIDER_ENDPOINT || "http://localhost:8899", + ); + anchor.setProvider(provider); + + const program = anchor.workspace.SealedAuction as Program; + const erConnection = new web3.Connection( + process.env.EPHEMERAL_PROVIDER_ENDPOINT || "http://localhost:7799", + { + wsEndpoint: process.env.EPHEMERAL_WS_ENDPOINT || "ws://localhost:7800", + commitment: "confirmed", + }, + ); + const erProvider = new anchor.AnchorProvider(erConnection, provider.wallet); + const erProgram = new Program( + program.idl, + erProvider, + ) as Program; + const auctioneer = provider.wallet.payer; + const bidderOne = web3.Keypair.generate(); + const bidderTwo = web3.Keypair.generate(); + const auctionId = new BN(Date.now()); + const deadlineTs = new BN(Math.floor(Date.now() / 1000) + 3); + + const teeUrl = process.env.TEE_PROVIDER_ENDPOINT || "http://localhost:6699"; + const teeWsUrl = process.env.TEE_WS_ENDPOINT || "ws://localhost:6700"; + + let tokenA: web3.PublicKey; + let tokenB: web3.PublicKey; + let auction: web3.PublicKey; + let bidOne: web3.PublicKey; + let bidTwo: web3.PublicKey; + let localE2eAvailable = false; + let localE2eSkipReason = "local validator availability was not checked"; + + type BaseAuctionFixture = { + auctionId: BN; + deadlineTs: BN; + tokenA: web3.PublicKey; + tokenB: web3.PublicKey; + auction: web3.PublicKey; + auctionTokenA: web3.PublicKey; + auctionTokenB: web3.PublicKey; + auctionTokenBEphemeralAta: web3.PublicKey; + auctionTokenBEataBuffer: web3.PublicKey; + auctionTokenBEataRecord: web3.PublicKey; + auctionTokenBEataMetadata: web3.PublicKey; + sellerTokenA: web3.PublicKey; + lotAmount: BN; + }; + + before(async () => { + try { + await provider.connection.getLatestBlockhash("confirmed"); + const programInfo = await provider.connection.getAccountInfo( + program.programId, + "confirmed", + ); + if (!programInfo) { + localE2eSkipReason = `program ${program.programId.toBase58()} is not deployed`; + return; + } + localE2eAvailable = true; + localE2eSkipReason = ""; + } catch (error) { + localE2eSkipReason = `local validator unavailable: ${String(error)}`; + } + }); + + function requireLocalE2e(ctx: Mocha.Context): void { + if (localE2eAvailable) { + return; + } + if (RUN_E2E) { + throw new Error(localE2eSkipReason); + } + ctx.skip(); + } + + async function authenticatedErConnection( + authority: web3.Keypair, + ): Promise { + const teeBase = teeUrl.replace(/\/$/, ""); + const teeWsBase = teeWsUrl.replace(/\/$/, ""); + const authToken = await getAuthToken( + teeBase, + authority.publicKey, + (message: Uint8Array) => + Promise.resolve(nacl.sign.detached(message, authority.secretKey)), + ); + return new web3.Connection(`${teeBase}?token=${authToken.token}`, { + wsEndpoint: `${teeWsBase}?token=${authToken.token}`, + commitment: "confirmed", + }); + } + + async function createBaseAuctionFixture( + deadlineOffsetSeconds: number, + lotAmount = LOT_AMOUNT, + ): Promise { + const tokenAMint = await createMint( + provider.connection, + auctioneer, + auctioneer.publicKey, + null, + 0, + ); + const tokenBMint = await createMint( + provider.connection, + auctioneer, + auctioneer.publicKey, + null, + 0, + ); + const sellerTokenA = await createAssociatedTokenAccount( + provider.connection, + auctioneer, + tokenAMint, + auctioneer.publicKey, + ); + await mintTo( + provider.connection, + auctioneer, + tokenAMint, + sellerTokenA, + auctioneer, + BigInt(lotAmount.toString()), + ); + + const localAuctionId = uniqueAuctionId(); + const localAuction = auctionPda( + program.programId, + auctioneer.publicKey, + localAuctionId, + ); + const auctionTokenA = getAssociatedTokenAddressSync( + tokenAMint, + localAuction, + true, + ); + const auctionTokenB = getAssociatedTokenAddressSync( + tokenBMint, + localAuction, + true, + ); + const auctionTokenBEphemeralAta = ephemeralAtaPda(localAuction, tokenBMint); + + return { + auctionId: localAuctionId, + deadlineTs: new BN(Math.floor(Date.now() / 1000) + deadlineOffsetSeconds), + tokenA: tokenAMint, + tokenB: tokenBMint, + auction: localAuction, + auctionTokenA, + auctionTokenB, + auctionTokenBEphemeralAta, + auctionTokenBEataBuffer: eataBufferPda(auctionTokenBEphemeralAta), + auctionTokenBEataRecord: delegationRecordPda(auctionTokenBEphemeralAta), + auctionTokenBEataMetadata: delegationMetadataPda( + auctionTokenBEphemeralAta, + ), + sellerTokenA, + lotAmount, + }; + } + + async function initializeAuction( + fixture: BaseAuctionFixture, + deadlineTs = fixture.deadlineTs, + lotAmount = fixture.lotAmount, + ): Promise { + await program.methods + .initializeAuction( + fixture.auctionId, + lotAmount, + deadlineTs, + SPONSOR_LAMPORTS, + ) + .accountsPartial({ + auctioneer: auctioneer.publicKey, + tokenAMint: fixture.tokenA, + tokenBMint: fixture.tokenB, + auction: fixture.auction, + auctionTokenAAccount: fixture.auctionTokenA, + auctionTokenBAccount: fixture.auctionTokenB, + auctionTokenBEphemeralAta: fixture.auctionTokenBEphemeralAta, + auctionTokenBEataBuffer: fixture.auctionTokenBEataBuffer, + auctionTokenBEataRecord: fixture.auctionTokenBEataRecord, + auctionTokenBEataMetadata: fixture.auctionTokenBEataMetadata, + sellerTokenAAccount: fixture.sellerTokenA, + ephemeralTokenProgram: EPHEMERAL_SPL_TOKEN_PROGRAM_ID, + delegationProgram: DELEGATION_PROGRAM_ID, + validator: VALIDATOR, + tokenProgram: TOKEN_PROGRAM_ID, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + systemProgram: web3.SystemProgram.programId, + }) + .rpc(); + } + + it("keeps Token A on L1 and uses an auction Token-B ER escrow", () => { + tokenA = web3.Keypair.generate().publicKey; + tokenB = web3.Keypair.generate().publicKey; + auction = auctionPda(program.programId, auctioneer.publicKey, auctionId); + bidOne = bidPda(program.programId, auction, bidderOne.publicKey); + bidTwo = bidPda(program.programId, auction, bidderTwo.publicKey); + + const auctionTokenA = getAssociatedTokenAddressSync(tokenA, auction, true); + const auctionTokenB = getAssociatedTokenAddressSync(tokenB, auction, true); + const bidderOneTokenB = getAssociatedTokenAddressSync( + tokenB, + bidderOne.publicKey, + ); + const auctionTokenBEphemeralAta = ephemeralAtaPda(auction, tokenB); + + expect(auction.equals(web3.PublicKey.default)).to.equal(false); + expect(bidOne.equals(bidTwo)).to.equal(false); + expect(auctionTokenA.equals(auctionTokenB)).to.equal(false); + expect(auctionTokenB.equals(bidderOneTokenB)).to.equal(false); + expect(auctionTokenBEphemeralAta.equals(auctionTokenB)).to.equal(false); + expect( + eataBufferPda(auctionTokenBEphemeralAta).equals(web3.PublicKey.default), + ).to.equal(false); + + expect( + permissionPdaFromAccount(auction).equals(web3.PublicKey.default), + ).to.equal(false); + expect( + permissionPdaFromAccount(bidOne).equals(web3.PublicKey.default), + ).to.equal(false); + }); + + it("matches the fixed instruction surface", () => { + const instructionNames = idl.instructions + .map((instruction) => instruction.name) + .sort(); + + expect(instructionNames).to.deep.equal([ + "claim_refund", + "delegate_auction", + "end_auction", + "finalize", + "init_auction_permission", + "init_bid_permission", + "initialize_auction", + "place_bid", + "process_undelegation", + "reclaim_unsold_lot", + "settle_winning_bid", + "undelegate_auction", + ]); + expect(instructionNames).not.to.include("initialize_lot_escrow"); + expect(instructionNames).not.to.include("undelegate_lot_escrow"); + expect(instructionNames).not.to.include("undelegate_bid_escrow"); + expect(instructionNames).not.to.include("top_up_auction_sponsor"); + expect(instructionNames).not.to.include("delegate_auction_sponsor"); + expect(instructionNames).not.to.include("close_winning_bid"); + }); + + it("does not reintroduce Token A e-token custody accounts", () => { + const byName = new Map( + idl.instructions.map((instruction) => [instruction.name, instruction]), + ); + const initializeAccounts = + byName + .get("initialize_auction") + ?.accounts.map((account) => account.name) ?? []; + const placeBidAccounts = + byName.get("place_bid")?.accounts.map((account) => account.name) ?? []; + const finalizeAccounts = + byName.get("finalize")?.accounts.map((account) => account.name) ?? []; + const settleWinningBidAccounts = + byName + .get("settle_winning_bid") + ?.accounts.map((account) => account.name) ?? []; + const claimRefundAccounts = + byName.get("claim_refund")?.accounts.map((account) => account.name) ?? []; + + expect(initializeAccounts).to.include("auction_token_a_account"); + expect(initializeAccounts).to.include("auction_token_b_account"); + expect(initializeAccounts).to.include("auction_token_b_ephemeral_ata"); + expect(initializeAccounts).to.include("ephemeral_token_program"); + expect(initializeAccounts).not.to.include("auction_sponsor"); + expect(initializeAccounts).not.to.include("lot_ephemeral_ata"); + expect(placeBidAccounts).to.include("payer"); + expect(placeBidAccounts).to.include("auction"); + expect(placeBidAccounts).not.to.include("auction_sponsor"); + expect(placeBidAccounts).to.include("bid"); + expect(placeBidAccounts).to.include("bidder_token_b_account"); + expect(placeBidAccounts).to.include("auction_token_b_account"); + expect(placeBidAccounts).not.to.include("bid_token_b_account"); + expect(placeBidAccounts).not.to.include("token_b_vault"); + expect(finalizeAccounts).to.include("auction_token_a_account"); + expect(finalizeAccounts).not.to.include("winning_bid_token_b_account"); + expect(finalizeAccounts).not.to.include("seller_token_b_account"); + expect(settleWinningBidAccounts).to.include("auction_token_b_account"); + expect(settleWinningBidAccounts).not.to.include( + "winning_bid_token_b_account", + ); + expect(settleWinningBidAccounts).to.include("seller_token_b_account"); + expect(settleWinningBidAccounts).to.include("auction"); + expect(settleWinningBidAccounts).not.to.include("auction_sponsor"); + expect(claimRefundAccounts).to.include("auction"); + expect(claimRefundAccounts).to.include("auction_token_b_account"); + expect(claimRefundAccounts).not.to.include("bid_token_b_account"); + expect(claimRefundAccounts).not.to.include("auction_sponsor"); + expect(finalizeAccounts).not.to.include("lot_ephemeral_ata"); + expect(finalizeAccounts).not.to.include("token_a_vault"); + }); + + it("matches the auction-sponsored count-only bid lifecycle", () => { + const byName = new Map( + idl.instructions.map((instruction) => [instruction.name, instruction]), + ); + const initializeAuctionInstruction = byName.get("initialize_auction"); + const endAuctionAccounts = + byName.get("end_auction")?.accounts.map((account) => account.name) ?? []; + const settleWinningBidAccounts = + byName + .get("settle_winning_bid") + ?.accounts.map((account) => account.name) ?? []; + const claimRefundAccounts = + byName.get("claim_refund")?.accounts.map((account) => account.name) ?? []; + const undelegateAuctionAccounts = + byName + .get("undelegate_auction") + ?.accounts.map((account) => account.name) ?? []; + const auctionFields = + idl.types + .find((typeDef) => typeDef.name === "Auction") + ?.type.fields?.map((field) => field.name) ?? []; + const typeNames = idl.types.map((typeDef) => typeDef.name); + + expect( + initializeAuctionInstruction?.args.map((arg) => arg.name), + ).to.include("sponsor_lamports"); + expect(auctionFields).to.include("bid_count"); + expect(auctionFields).to.include("closed_bid_count"); + expect(auctionFields).not.to.include("bidders"); + expect(auctionFields).not.to.include("bidder_count"); + expect(typeNames).not.to.include("AuctionSponsor"); + expect(endAuctionAccounts).to.deep.equal(["auctioneer", "auction"]); + expect(settleWinningBidAccounts).to.include("auction"); + expect(settleWinningBidAccounts).to.include("winning_bid"); + expect(claimRefundAccounts).to.include("auction"); + expect(claimRefundAccounts).to.include("bid"); + expect(undelegateAuctionAccounts).to.include("magic_context"); + expect(undelegateAuctionAccounts).to.include("magic_program"); + }); + + it("initializes an auction and moves the Token A lot into L1 custody", async function () { + requireLocalE2e(this); + + const fixture = await createBaseAuctionFixture(60); + await initializeAuction(fixture); + + const auctionState = await program.account.auction.fetch(fixture.auction); + const sellerTokenA = await getAccount( + provider.connection, + fixture.sellerTokenA, + ); + const auctionTokenA = await getAccount( + provider.connection, + fixture.auctionTokenA, + ); + const auctionLamports = await provider.connection.getBalance( + fixture.auction, + ); + + expect(auctionState.auctioneer.equals(auctioneer.publicKey)).to.equal(true); + expect(auctionState.auctionId.eq(fixture.auctionId)).to.equal(true); + expect(auctionState.tokenAMint.equals(fixture.tokenA)).to.equal(true); + expect(auctionState.tokenBMint.equals(fixture.tokenB)).to.equal(true); + expect(auctionState.lotAmount.eq(fixture.lotAmount)).to.equal(true); + expect(auctionState.bidCount).to.equal(0); + expect(auctionState.closedBidCount).to.equal(0); + expect(statusName(auctionState.status)).to.equal("open"); + expect(auctionState.lotClaimed).to.equal(false); + expect(auctionLamports).to.be.at.least(SPONSOR_LAMPORTS.toNumber()); + expect(sellerTokenA.amount).to.equal(BigInt(0)); + expect(auctionTokenA.amount).to.equal(BigInt(fixture.lotAmount.toString())); + }); + + it("rejects invalid auction initialization parameters", async function () { + requireLocalE2e(this); + + const zeroLotFixture = await createBaseAuctionFixture(60); + await expectAnchorError( + initializeAuction(zeroLotFixture, zeroLotFixture.deadlineTs, new BN(0)), + "InvalidAmount", + ); + + const expiredFixture = await createBaseAuctionFixture(-1); + await expectAnchorError( + initializeAuction(expiredFixture), + "DeadlineInPast", + ); + }); + + it("rejects reclaim before end_auction", async function () { + requireLocalE2e(this); + + const fixture = await createBaseAuctionFixture(60); + await initializeAuction(fixture); + + await expectAnchorError( + program.methods + .reclaimUnsoldLot(fixture.auctionId) + .accountsPartial({ + auction: fixture.auction, + tokenAMint: fixture.tokenA, + auctionTokenAAccount: fixture.auctionTokenA, + sellerTokenAAccount: fixture.sellerTokenA, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .rpc(), + "AuctionNotEnded", + ); + }); + + it("runs live ER bid settlement, refund, undelegation, and L1 finalize", async function () { + if (!RUN_LIVE) { + this.skip(); + } + requireLocalE2e(this); + + const fixture = await createBaseAuctionFixture(90); + await initializeAuction(fixture); + + await sendLocalTransaction( + provider.connection, + new web3.Transaction().add( + web3.SystemProgram.transfer({ + fromPubkey: auctioneer.publicKey, + toPubkey: bidderOne.publicKey, + lamports: web3.LAMPORTS_PER_SOL, + }), + web3.SystemProgram.transfer({ + fromPubkey: auctioneer.publicKey, + toPubkey: bidderTwo.publicKey, + lamports: web3.LAMPORTS_PER_SOL, + }), + ), + auctioneer, + [], + "fund bidders", + ); + + const bidderOneTokenB = await createAssociatedTokenAccount( + provider.connection, + auctioneer, + fixture.tokenB, + bidderOne.publicKey, + ); + const bidderTwoTokenB = await createAssociatedTokenAccount( + provider.connection, + auctioneer, + fixture.tokenB, + bidderTwo.publicKey, + ); + const sellerTokenB = await createAssociatedTokenAccount( + provider.connection, + auctioneer, + fixture.tokenB, + auctioneer.publicKey, + ); + const winnerTokenA = await createAssociatedTokenAccount( + provider.connection, + auctioneer, + fixture.tokenA, + bidderTwo.publicKey, + ); + + await mintTo( + provider.connection, + auctioneer, + fixture.tokenB, + bidderOneTokenB, + auctioneer, + BigInt(BID_ONE.toString()), + ); + await mintTo( + provider.connection, + auctioneer, + fixture.tokenB, + bidderTwoTokenB, + auctioneer, + BigInt(BID_TWO.toString()), + ); + await mintTo( + provider.connection, + auctioneer, + fixture.tokenB, + sellerTokenB, + auctioneer, + BigInt(1), + ); + + const delegateAuctionTx = await program.methods + .delegateAuction(fixture.auctionId) + .accountsPartial({ + auctioneer: auctioneer.publicKey, + auction: fixture.auction, + validator: VALIDATOR, + }) + .transaction(); + await sendLocalTransaction( + provider.connection, + delegateAuctionTx, + auctioneer, + [], + "delegate auction", + ); + + await sleep(3_000); + + const privateErConnection = await authenticatedErConnection(auctioneer); + const privateErProvider = new anchor.AnchorProvider( + privateErConnection, + provider.wallet, + ); + const privateErProgram = new Program( + program.idl, + privateErProvider, + ) as Program; + + for (const [owner, amount, initVaultIfMissing, label] of [ + [bidderOne, BID_ONE, true, "delegate bidder one token B"], + [bidderTwo, BID_TWO, false, "delegate bidder two token B"], + [auctioneer, new BN(1), false, "delegate seller token B"], + ] as [web3.Keypair, BN, boolean, string][]) { + const delegateIxs = await delegateSpl( + owner.publicKey, + fixture.tokenB, + BigInt(amount.toString()), + { + validator: VALIDATOR, + idempotent: false, + initVaultIfMissing, + payer: auctioneer.publicKey, + }, + ); + await sendLocalTransaction( + provider.connection, + new web3.Transaction().add(...delegateIxs), + auctioneer, + owner.publicKey.equals(auctioneer.publicKey) ? [] : [owner], + label, + ); + } + + const liveBidOne = bidPda( + program.programId, + fixture.auction, + bidderOne.publicKey, + ); + const liveBidTwo = bidPda( + program.programId, + fixture.auction, + bidderTwo.publicKey, + ); + await sleep(1_000); + + for (const [bidder, amount, bid, bidderTokenB] of [ + [bidderOne, BID_ONE, liveBidOne, bidderOneTokenB], + [bidderTwo, BID_TWO, liveBidTwo, bidderTwoTokenB], + ] as [web3.Keypair, BN, web3.PublicKey, web3.PublicKey][]) { + const placeBidTx = await privateErProgram.methods + .placeBid(fixture.auctionId, amount) + .accountsPartial({ + payer: auctioneer.publicKey, + bidder: bidder.publicKey, + tokenBMint: fixture.tokenB, + auction: fixture.auction, + bid, + bidderTokenBAccount: bidderTokenB, + auctionTokenBAccount: fixture.auctionTokenB, + tokenProgram: TOKEN_PROGRAM_ID, + vault: EPHEMERAL_VAULT_ID, + }) + .transaction(); + await sendLocalTransaction( + privateErConnection, + placeBidTx, + auctioneer, + [bidder], + ["place bid", bidder.publicKey.toBase58()].join(" "), + ); + + const initBidPermissionTx = await privateErProgram.methods + .initBidPermission(fixture.auctionId) + .accountsPartial({ + auction: fixture.auction, + bid, + bidPermission: permissionPdaFromAccount(bid), + permissionProgram: PERMISSION_PROGRAM_ID, + ephemeralVault: EPHEMERAL_VAULT_ID, + magicProgram: MAGIC_PROGRAM_ID, + }) + .transaction(); + await sendLocalTransaction( + privateErConnection, + initBidPermissionTx, + auctioneer, + [], + ["init bid permission", bidder.publicKey.toBase58()].join(" "), + ); + } + + let auctionState = await privateErProgram.account.auction.fetch( + fixture.auction, + ); + expect(auctionState.bidCount).to.equal(2); + expect(auctionState.closedBidCount).to.equal(0); + expect( + (await getAccount(erConnection, fixture.auctionTokenB)).amount, + ).to.equal(BigInt(BID_ONE.add(BID_TWO).toString())); + + await sleepUntilUnixTimestamp(fixture.deadlineTs); + + const endAuctionTx = await privateErProgram.methods + .endAuction(fixture.auctionId) + .accountsPartial({ + auctioneer: auctioneer.publicKey, + auction: fixture.auction, + }) + .remainingAccounts([ + { pubkey: liveBidOne, isSigner: false, isWritable: true }, + { pubkey: liveBidTwo, isSigner: false, isWritable: true }, + ]) + .transaction(); + await sendLocalTransaction( + privateErConnection, + endAuctionTx, + auctioneer, + [], + "end auction", + ); + + auctionState = await privateErProgram.account.auction.fetch( + fixture.auction, + ); + expect(statusName(auctionState.status)).to.equal("ended"); + expect(auctionState.highestBid.eq(BID_TWO)).to.equal(true); + expect(auctionState.highestBidder.equals(bidderTwo.publicKey)).to.equal( + true, + ); + + const settleTx = await privateErProgram.methods + .settleWinningBid() + .accountsPartial({ + crank: auctioneer.publicKey, + auction: fixture.auction, + winningBid: liveBidTwo, + tokenBMint: fixture.tokenB, + auctionTokenBAccount: fixture.auctionTokenB, + sellerTokenBAccount: sellerTokenB, + bidPermission: permissionPdaFromAccount(liveBidTwo), + permissionProgram: PERMISSION_PROGRAM_ID, + magicProgram: MAGIC_PROGRAM_ID, + tokenProgram: TOKEN_PROGRAM_ID, + vault: EPHEMERAL_VAULT_ID, + }) + .transaction(); + await sendLocalTransaction( + privateErConnection, + settleTx, + auctioneer, + [], + "settle winning bid", + ); + + expect((await getAccount(erConnection, sellerTokenB)).amount).to.equal( + BigInt(BID_TWO.add(new BN(1)).toString()), + ); + expect(await privateErConnection.getAccountInfo(liveBidTwo)).to.equal(null); + + const refundTx = await privateErProgram.methods + .claimRefund() + .accountsPartial({ + bidder: bidderOne.publicKey, + auction: fixture.auction, + bid: liveBidOne, + tokenBMint: fixture.tokenB, + auctionTokenBAccount: fixture.auctionTokenB, + bidderTokenBAccount: bidderOneTokenB, + bidPermission: permissionPdaFromAccount(liveBidOne), + permissionProgram: PERMISSION_PROGRAM_ID, + magicProgram: MAGIC_PROGRAM_ID, + tokenProgram: TOKEN_PROGRAM_ID, + vault: EPHEMERAL_VAULT_ID, + }) + .transaction(); + await sendLocalTransaction( + privateErConnection, + refundTx, + auctioneer, + [], + "claim refund", + ); + + auctionState = await privateErProgram.account.auction.fetch( + fixture.auction, + ); + expect(auctionState.closedBidCount).to.equal(2); + expect((await getAccount(erConnection, bidderOneTokenB)).amount).to.equal( + BigInt(BID_ONE.toString()), + ); + expect(await privateErConnection.getAccountInfo(liveBidOne)).to.equal(null); + + const undelegateTx = await privateErProgram.methods + .undelegateAuction(fixture.auctionId) + .accountsPartial({ + payer: auctioneer.publicKey, + auction: fixture.auction, + magicContext: MAGIC_CONTEXT_ID, + magicProgram: MAGIC_PROGRAM_ID, + }) + .transaction(); + const undelegateSig = await sendLocalTransaction( + privateErConnection, + undelegateTx, + auctioneer, + [], + "undelegate auction", + ); + await provider.connection.confirmTransaction( + await getCommitmentSignature( + "auction undelegate", + undelegateSig, + privateErConnection, + ), + "confirmed", + ); + await sleep(1_000); + + await program.methods + .finalize(fixture.auctionId) + .accountsPartial({ + auction: fixture.auction, + tokenAMint: fixture.tokenA, + auctionTokenAAccount: fixture.auctionTokenA, + winnerTokenAAccount: winnerTokenA, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .rpc({ skipPreflight: true }); + + const finalizedAuction = await program.account.auction.fetch( + fixture.auction, + ); + expect(statusName(finalizedAuction.status)).to.equal("settled"); + expect(finalizedAuction.lotClaimed).to.equal(true); + expect( + (await getAccount(provider.connection, winnerTokenA)).amount, + ).to.equal(BigInt(fixture.lotAmount.toString())); + }); + + it("ends an empty auction and lets the seller reclaim the unsold lot", async function () { + if (!RUN_LIVE) { + this.skip(); + } + requireLocalE2e(this); + + const fixture = await createBaseAuctionFixture(1); + await initializeAuction(fixture); + await sleep(1_500); + + await program.methods + .endAuction(fixture.auctionId) + .accountsPartial({ + auctioneer: auctioneer.publicKey, + auction: fixture.auction, + }) + .rpc(); + + const endedAuction = await program.account.auction.fetch(fixture.auction); + expect(statusName(endedAuction.status)).to.equal("ended"); + expect(endedAuction.highestBid.toNumber()).to.equal(0); + expect(endedAuction.highestBidder.equals(web3.PublicKey.default)).to.equal( + true, + ); + + await program.methods + .reclaimUnsoldLot(fixture.auctionId) + .accountsPartial({ + auction: fixture.auction, + tokenAMint: fixture.tokenA, + auctionTokenAAccount: fixture.auctionTokenA, + sellerTokenAAccount: fixture.sellerTokenA, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .rpc(); + + const settledAuction = await program.account.auction.fetch(fixture.auction); + const sellerTokenA = await getAccount( + provider.connection, + fixture.sellerTokenA, + ); + const auctionTokenA = await getAccount( + provider.connection, + fixture.auctionTokenA, + ); + + expect(statusName(settledAuction.status)).to.equal("settled"); + expect(settledAuction.lotClaimed).to.equal(true); + expect(sellerTokenA.amount).to.equal(BigInt(fixture.lotAmount.toString())); + expect(auctionTokenA.amount).to.equal(BigInt(0)); + }); + + it("can create TEE-authenticated bidder connections for privacy probes", async function () { + if (!RUN_LIVE) { + this.skip(); + } + + const tokenOne = await getAuthToken( + teeUrl, + bidderOne.publicKey, + (message: Uint8Array) => + Promise.resolve(nacl.sign.detached(message, bidderOne.secretKey)), + ); + const tokenTwo = await getAuthToken( + teeUrl, + bidderTwo.publicKey, + (message: Uint8Array) => + Promise.resolve(nacl.sign.detached(message, bidderTwo.secretKey)), + ); + + const bidderOneConnection = new web3.Connection( + `${teeUrl}?token=${tokenOne.token}`, + { wsEndpoint: `${teeWsUrl}?token=${tokenOne.token}` }, + ); + const bidderTwoConnection = new web3.Connection( + `${teeUrl}?token=${tokenTwo.token}`, + { wsEndpoint: `${teeWsUrl}?token=${tokenTwo.token}` }, + ); + + expect(tokenOne.token.length).to.be.greaterThan(0); + expect(tokenTwo.token.length).to.be.greaterThan(0); + await Promise.all([ + bidderOneConnection.getLatestBlockhash("confirmed"), + bidderTwoConnection.getLatestBlockhash("confirmed"), + ]); + }); + + it("checks settlement constants", () => { + expect(BID_TWO.gt(BID_ONE)).to.equal(true); + expect(LOT_AMOUNT.gt(new BN(0))).to.equal(true); + expect(VALIDATOR.equals(web3.PublicKey.default)).to.equal(false); + expect(MAGIC_CONTEXT_ID.equals(MAGIC_PROGRAM_ID)).to.equal(false); + expect(PERMISSION_PROGRAM_ID.equals(ASSOCIATED_TOKEN_PROGRAM_ID)).to.equal( + false, + ); + expect(TOKEN_PROGRAM_ID.equals(program.programId)).to.equal(false); + expect(deadlineTs.gt(new BN(0))).to.equal(true); + }); +}); diff --git a/sealed-auction/anchor/tsconfig.json b/sealed-auction/anchor/tsconfig.json new file mode 100644 index 0000000..c464e2d --- /dev/null +++ b/sealed-auction/anchor/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha", "node"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} diff --git a/sealed-auction/anchor/yarn.lock b/sealed-auction/anchor/yarn.lock new file mode 100644 index 0000000..dd8c50d --- /dev/null +++ b/sealed-auction/anchor/yarn.lock @@ -0,0 +1,1399 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.25.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768" + integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== + +"@coral-xyz/anchor-errors@^0.31.1": + version "0.31.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.31.1.tgz#d635cbac2533973ae6bfb5d3ba1de89ce5aece2d" + integrity sha512-NhNEku4F3zzUSBtrYz84FzYWm48+9OvmT1Hhnwr6GnPQry2dsEqH/ti/7ASjjpoFTWRnPXrjAIT1qM6Isop+LQ== + +"@coral-xyz/anchor@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.32.1.tgz#a07440d9d267840f4f99f1493bd8ce7d7f128e57" + integrity sha512-zAyxFtfeje2FbMA1wzgcdVs7Hng/MijPKpRijoySPCicnvcTQs/+dnPZ/cR+LcXM9v9UYSyW81uRNYZtN5G4yg== + dependencies: + "@coral-xyz/anchor-errors" "^0.31.1" + "@coral-xyz/borsh" "^0.31.1" + "@noble/hashes" "^1.3.1" + "@solana/web3.js" "^1.69.0" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^6.3.0" + cross-fetch "^3.1.5" + eventemitter3 "^4.0.7" + pako "^2.0.3" + superstruct "^0.15.4" + toml "^3.0.0" + +"@coral-xyz/borsh@^0.31.1": + version "0.31.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.31.1.tgz#5328e1e0921b75d7f4a62dd3f61885a938bc7241" + integrity sha512-9N8AU9F0ubriKfNE3g1WF0/4dtlGXoBN/hd1PvbNBamBNwRgHxH4P+o3Zt7rSEloW1HUs6LfZEchlx9fW7POYw== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@magicblock-labs/ephemeral-rollups-sdk@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@magicblock-labs/ephemeral-rollups-sdk/-/ephemeral-rollups-sdk-0.14.3.tgz#536c215d1daefdbcfa82a79304b08f5014405c58" + integrity sha512-CoByiXHLLS+l7Ojl6XJuYypP/k08ymFkab8+Gh/HCv5Gn2oC4VkwszEQoTDnKo++8Oxbqr9YVGzAMUW4Km7cLA== + dependencies: + "@noble/curves" "^1.4.2" + "@noble/hashes" "^1.4.0" + "@phala/dcap-qvl" "^0.3.9" + "@solana/web3.js" "^1.98.0" + bs58 "^6.0.0" + rpc-websockets "^9.0.4" + tweetnacl "^1.0.3" + typescript "^5.3.0" + +"@noble/curves@^1.4.2": + version "1.9.7" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951" + integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== + dependencies: + "@noble/hashes" "1.8.0" + +"@noble/hashes@1.8.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" + integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== + +"@peculiar/asn1-schema@^2.3.13", "@peculiar/asn1-schema@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz#69699f84259b2161607cabfc34e512a4023dbef9" + integrity sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q== + dependencies: + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-x509@^2.3.13": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz#9958a9ef35dec8426aabad78ffe8798e318b06e2" + integrity sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/utils@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@peculiar/utils/-/utils-2.0.3.tgz#a27ca4c4b73652e110f19a7d16d664f458a5528e" + integrity sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ== + dependencies: + tslib "^2.8.1" + +"@phala/dcap-qvl@^0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@phala/dcap-qvl/-/dcap-qvl-0.3.9.tgz#34da2506c31954cd290afb5a46146cd52ae24481" + integrity sha512-s/4gAFVq1DRhYkuerDR9WAlX8tkCpFTHTVpWnWlrigj5la2X5OtQl9Y7PzwcqY4h0fc25yqZrcRH3AZpzB1qOw== + dependencies: + "@peculiar/asn1-schema" "^2.3.13" + "@peculiar/asn1-x509" "^2.3.13" + asn1.js "^5.4.1" + bn.js "^5.2.2" + buffer "^6.0.3" + elliptic "^6.6.1" + hash.js "^1.1.7" + node-fetch "^2.7.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@solana/buffer-layout-utils@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca" + integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/web3.js" "^1.32.0" + bigint-buffer "^1.1.5" + bignumber.js "^9.0.1" + +"@solana/buffer-layout@^4.0.0", "@solana/buffer-layout@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" + integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== + dependencies: + buffer "~6.0.3" + +"@solana/codecs-core@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz#1a2d76b9c7b9e7b7aeb3bd78be81c2ba21e3ce22" + integrity sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ== + dependencies: + "@solana/errors" "2.0.0-rc.1" + +"@solana/codecs-core@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@solana/codecs-core/-/codecs-core-2.3.0.tgz#6bf2bb565cb1ae880f8018635c92f751465d8695" + integrity sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw== + dependencies: + "@solana/errors" "2.3.0" + +"@solana/codecs-data-structures@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz#d47b2363d99fb3d643f5677c97d64a812982b888" + integrity sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/codecs-numbers" "2.0.0-rc.1" + "@solana/errors" "2.0.0-rc.1" + +"@solana/codecs-numbers@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz#f34978ddf7ea4016af3aaed5f7577c1d9869a614" + integrity sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/errors" "2.0.0-rc.1" + +"@solana/codecs-numbers@^2.1.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz#ac7e7f38aaf7fcd22ce2061fbdcd625e73828dc6" + integrity sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg== + dependencies: + "@solana/codecs-core" "2.3.0" + "@solana/errors" "2.3.0" + +"@solana/codecs-strings@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz#e1d9167075b8c5b0b60849f8add69c0f24307018" + integrity sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/codecs-numbers" "2.0.0-rc.1" + "@solana/errors" "2.0.0-rc.1" + +"@solana/codecs@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@solana/codecs/-/codecs-2.0.0-rc.1.tgz#146dc5db58bd3c28e04b4c805e6096c2d2a0a875" + integrity sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/codecs-data-structures" "2.0.0-rc.1" + "@solana/codecs-numbers" "2.0.0-rc.1" + "@solana/codecs-strings" "2.0.0-rc.1" + "@solana/options" "2.0.0-rc.1" + +"@solana/errors@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@solana/errors/-/errors-2.0.0-rc.1.tgz#3882120886eab98a37a595b85f81558861b29d62" + integrity sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ== + dependencies: + chalk "^5.3.0" + commander "^12.1.0" + +"@solana/errors@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@solana/errors/-/errors-2.3.0.tgz#4ac9380343dbeffb9dffbcb77c28d0e457c5fa31" + integrity sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ== + dependencies: + chalk "^5.4.1" + commander "^14.0.0" + +"@solana/options@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@solana/options/-/options-2.0.0-rc.1.tgz#06924ba316dc85791fc46726a51403144a85fc4d" + integrity sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA== + dependencies: + "@solana/codecs-core" "2.0.0-rc.1" + "@solana/codecs-data-structures" "2.0.0-rc.1" + "@solana/codecs-numbers" "2.0.0-rc.1" + "@solana/codecs-strings" "2.0.0-rc.1" + "@solana/errors" "2.0.0-rc.1" + +"@solana/spl-token-group@^0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@solana/spl-token-group/-/spl-token-group-0.0.7.tgz#83c00f0cd0bda33115468cd28b89d94f8ec1fee4" + integrity sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug== + dependencies: + "@solana/codecs" "2.0.0-rc.1" + +"@solana/spl-token-metadata@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@solana/spl-token-metadata/-/spl-token-metadata-0.1.6.tgz#d240947aed6e7318d637238022a7b0981b32ae80" + integrity sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA== + dependencies: + "@solana/codecs" "2.0.0-rc.1" + +"@solana/spl-token@^0.4.14": + version "0.4.14" + resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.4.14.tgz#b86bc8a17f50e9680137b585eca5f5eb9d55c025" + integrity sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/buffer-layout-utils" "^0.2.0" + "@solana/spl-token-group" "^0.0.7" + "@solana/spl-token-metadata" "^0.1.6" + buffer "^6.0.3" + +"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.69.0", "@solana/web3.js@^1.98.0": + version "1.98.4" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.98.4.tgz#df51d78be9d865181ec5138b4e699d48e6895bbe" + integrity sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw== + dependencies: + "@babel/runtime" "^7.25.0" + "@noble/curves" "^1.4.2" + "@noble/hashes" "^1.4.0" + "@solana/buffer-layout" "^4.0.1" + "@solana/codecs-numbers" "^2.1.0" + agentkeepalive "^4.5.0" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.1" + node-fetch "^2.7.0" + rpc-websockets "^9.0.2" + superstruct "^2.0.2" + +"@swc/helpers@^0.5.11": + version "0.5.23" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.23.tgz#19287d0d86d962b111376039a50c792902c9a86a" + integrity sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw== + dependencies: + tslib "^2.8.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" + integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/bn.js@^5.1.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.2.0.tgz#4349b9710e98f9ab3cdc50f1c5e4dcbd8ef29c80" + integrity sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q== + dependencies: + "@types/node" "*" + +"@types/chai@^5.2.2": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" + integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== + dependencies: + "@types/deep-eql" "*" + assertion-error "^2.0.1" + +"@types/connect@^3.4.33": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/mocha@^10.0.10": + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== + +"@types/node@*": + version "26.1.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-26.1.1.tgz#bad758d601e97d6cf457d204ee76a35fce7bd119" + integrity sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw== + dependencies: + undici-types "~8.3.0" + +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@types/ws@^8.2.2": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" + integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== + dependencies: + "@types/node" "*" + +acorn-walk@^8.1.1: + version "8.3.5" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.17.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.17.0.tgz#1785adb84faf8d8add10369b93826fc2bd08f1fe" + integrity sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg== + +agentkeepalive@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" + integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== + dependencies: + humanize-ms "^1.2.1" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1js@^3.0.10: + version "3.0.10" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.10.tgz#df26c874c8a8b41ca605efea47b2ad07551013dd" + integrity sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg== + dependencies: + pvtsutils "^1.3.6" + pvutils "^1.1.5" + tslib "^2.8.1" + +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.11" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.11.tgz#40d80e2a1aeacba29792ccc6c5354806421287ff" + integrity sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA== + dependencies: + safe-buffer "^5.0.1" + +base-x@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-5.0.1.tgz#16bf35254be1df8aca15e36b7c1dda74b2aa6b03" + integrity sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bigint-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" + integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== + dependencies: + bindings "^1.3.0" + +bignumber.js@^9.0.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== + +bindings@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bn.js@^4.0.0, bn.js@^4.11.9: + version "4.12.4" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.4.tgz#72627bb262f2385c51d313cd5e9596ca7cda77d6" + integrity sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1, bn.js@^5.2.2: + version "5.2.4" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.4.tgz#1208fc250bb193fc5f8f0b5fa59e642e706f7103" + integrity sha512-QL7sb18rJ1PbdsKsqPA0guxL563vIMwRHgzNrW/uzQuRGN1Cjqd/wonUBAVqHox9KwzHA6vCbM0lXx3k4iQMow== + +borsh@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" + integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +brace-expansion@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.2.tgz#0bba2271feb7d458b0d31ad13625aaa4754431e2" + integrity sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA== + dependencies: + balanced-match "^1.0.0" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-6.0.0.tgz#a2cda0130558535dd281a2f8697df79caaf425d8" + integrity sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw== + dependencies: + base-x "^5.0.0" + +buffer-layout@^1.2.0, buffer-layout@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" + integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== + +buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.1.0.tgz#a4623541dd23867626bb08a051ec0d2ec0b70294" + integrity sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw== + dependencies: + node-gyp-build "^4.3.0" + +camelcase@^6.0.0, camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chai@^5.2.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" + integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.3.0, chalk@^5.4.1: + version "5.6.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + +check-error@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.3.tgz#2427361117b70cca8dc89680ead32b157019caf5" + integrity sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA== + +chokidar@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + +commander@^14.0.0: + version "14.0.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.3.tgz#425d79b48f9af82fcd9e4fc1ea8af6c5ec07bbc2" + integrity sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw== + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@^3.1.5: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.2.0.tgz#34e9192f53bc757d6614304d9e5e6fb4edb782e3" + integrity sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q== + dependencies: + node-fetch "^2.7.0" + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.3.5: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +diff@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.4.tgz#7a6dbfda325f25f07517e9b518f897c08332e07d" + integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== + +diff@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" + integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +elliptic@^6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb" + integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== + +fast-stable-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" + integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob@^10.4.5: + version "10.5.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" + integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jayson@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.3.0.tgz#22eb8f3dcf37a5e893830e5451f32bde6d1bde4d" + integrity sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + stream-json "^1.9.1" + uuid "^8.3.2" + ws "^7.5.10" + +js-yaml@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.0.tgz#d1900572a7f7cf0b5f540c83673e60bad3436592" + integrity sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q== + dependencies: + argparse "^2.0.1" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" + integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== + dependencies: + brace-expansion "^2.0.2" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + +mocha@^11.2.2: + version "11.7.6" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.6.tgz#ebbe22989d04cbb9424a36307320476624c41a33" + integrity sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA== + dependencies: + browser-stdout "^1.3.1" + chokidar "^4.0.1" + debug "^4.3.5" + diff "^7.0.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^10.4.5" + he "^1.2.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^9.0.5" + ms "^2.1.3" + picocolors "^1.1.1" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^9.2.0" + yargs "^17.7.2" + yargs-parser "^21.1.1" + yargs-unparser "^2.0.0" + +ms@^2.0.0, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.3.0: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +pako@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.2.0.tgz#246b9d4c841a8d308e484c0d03786651b143e63a" + integrity sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +pathval@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" + integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +prettier@^3.5.3: + version "3.9.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.9.4.tgz#a9c477cf1614376bd1f6bbc593d8c0d414bcec87" + integrity sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg== + +pvtsutils@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001" + integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== + dependencies: + tslib "^2.8.1" + +pvutils@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.5.tgz#84b0dea4a5d670249aa9800511804ee0b7c2809c" + integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +rpc-websockets@^9.0.2, rpc-websockets@^9.0.4: + version "9.3.10" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.3.10.tgz#d6f9b08edfac40e873a059b358806f6d58572e80" + integrity sha512-QT5PQ6LiWhA5RCS93oWwgxU4XzQltkYm8C3aTmmKEgj0HolGRo3VbdzELw7CEV35l9T7Amha8Vnr4rCfSjVP+w== + dependencies: + "@swc/helpers" "^0.5.11" + "@types/ws" "^8.2.2" + buffer "^6.0.3" + eventemitter3 "^5.0.1" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^6.0.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +stream-chain@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/stream-chain/-/stream-chain-2.2.5.tgz#b30967e8f14ee033c5b9a19bbe8a2cba90ba0d09" + integrity sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA== + +stream-json@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.9.1.tgz#e3fec03e984a503718946c170db7d74556c2a187" + integrity sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw== + dependencies: + stream-chain "^2.2.5" + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== + dependencies: + ansi-regex "^6.2.2" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^0.15.4: + version "0.15.5" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" + integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== + +superstruct@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" + integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-mocha@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-11.1.0.tgz#d8336ec0146bd6f36cca2555f4cfc7df85bd1586" + integrity sha512-yT7FfzNRCu8ZKkYvAOiH01xNma/vLq6Vit7yINKYFNVP8e5UyrYXSOMIipERTpzVKJQ4Qcos5bQo1tNERNZevQ== + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^2.8.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +typescript@^5.3.0, typescript@^5.8.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +undici-types@~8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" + integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== + +utf-8-validate@^6.0.0: + version "6.0.6" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.6.tgz#8a842c9b15af3f6323a3d5ed5eb9e61d208d8c22" + integrity sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA== + dependencies: + node-gyp-build "^4.3.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@^9.2.0: + version "9.3.4" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.4.tgz#f6c92395b2141afd78e2a889e80cb338fe9fca41" + integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +ws@^7.5.10: + version "7.5.11" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.11.tgz#9460daf1812bb81a423c5b9eac746941a86310fa" + integrity sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA== + +ws@^8.5.0: + version "8.21.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.0.tgz#012e413fc07429945121b0c153158c4343086951" + integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^17.7.2: + version "17.7.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.3.tgz#779dffe6bcafec596a7172e983289a588647faaa" + integrity sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 28a0a9f87d57d40ae8aa2dad84cfadbad7484e89 Mon Sep 17 00:00:00 2001 From: dhruvja Date: Thu, 9 Jul 2026 13:02:46 +0530 Subject: [PATCH 2/2] fix: address sealed auction review feedback --- sealed-auction/anchor/Anchor.toml | 4 +- .../programs/sealed-auction/src/error.rs | 4 +- .../anchor/programs/sealed-auction/src/lib.rs | 10 ++-- .../programs/sealed-auction/src/state.rs | 3 +- sealed-auction/anchor/tests/fixtures/dlp.so | Bin 0 -> 325560 bytes .../tests/fixtures/ephemeral_token_program.so | Bin 0 -> 44472 bytes sealed-auction/anchor/tests/sealed-auction.ts | 53 ++++++++++++++---- 7 files changed, 51 insertions(+), 23 deletions(-) create mode 100755 sealed-auction/anchor/tests/fixtures/dlp.so create mode 100755 sealed-auction/anchor/tests/fixtures/ephemeral_token_program.so diff --git a/sealed-auction/anchor/Anchor.toml b/sealed-auction/anchor/Anchor.toml index 43d2d43..a181491 100644 --- a/sealed-auction/anchor/Anchor.toml +++ b/sealed-auction/anchor/Anchor.toml @@ -20,12 +20,12 @@ wallet = "~/.config/solana/id.json" [[test.genesis]] address = "DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh" -program = "../../binary-prediction/anchor/tests/fixtures/dlp.so" +program = "tests/fixtures/dlp.so" upgradeable = false [[test.genesis]] address = "SPLxh1LVZzEkX99H6rqYizhytLWPZVV296zyYDPagv2" -program = "../../binary-prediction/anchor/tests/fixtures/ephemeral_token_program.so" +program = "tests/fixtures/ephemeral_token_program.so" upgradeable = false [scripts] diff --git a/sealed-auction/anchor/programs/sealed-auction/src/error.rs b/sealed-auction/anchor/programs/sealed-auction/src/error.rs index 848e945..f66944b 100644 --- a/sealed-auction/anchor/programs/sealed-auction/src/error.rs +++ b/sealed-auction/anchor/programs/sealed-auction/src/error.rs @@ -6,6 +6,8 @@ pub enum ErrorCode { InvalidAmount, #[msg("deadline must be in the future")] DeadlineInPast, + #[msg("auction deadline has not passed")] + AuctionStillOpen, #[msg("auction is not open")] AuctionClosed, #[msg("auction is not ended")] @@ -18,8 +20,6 @@ pub enum ErrorCode { InvalidBid, #[msg("winning bidder cannot claim a refund")] WinnerCannotRefund, - #[msg("bid was already refunded")] - AlreadyRefunded, #[msg("token account is not owned by the expected authority")] InvalidTokenOwner, #[msg("token account mint mismatch")] diff --git a/sealed-auction/anchor/programs/sealed-auction/src/lib.rs b/sealed-auction/anchor/programs/sealed-auction/src/lib.rs index 6394c57..86c26f9 100644 --- a/sealed-auction/anchor/programs/sealed-auction/src/lib.rs +++ b/sealed-auction/anchor/programs/sealed-auction/src/lib.rs @@ -33,6 +33,8 @@ pub const BID_SEED: &[u8] = b"bid"; pub const EPHEMERAL_SPL_TOKEN_PROGRAM_ID: Pubkey = pubkey!("SPLxh1LVZzEkX99H6rqYizhytLWPZVV296zyYDPagv2"); pub const DELEGATION_PROGRAM_ID: Pubkey = pubkey!("DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh"); +const INIT_EPHEMERAL_ATA_DISCRIMINATOR: u8 = 0; +const DELEGATE_EPHEMERAL_ATA_DISCRIMINATOR: u8 = 4; #[ephemeral] #[program] @@ -211,7 +213,6 @@ pub mod sealed_auction { bidder, amount, bidder_index, - refunded: false, escrow: ctx.accounts.auction_token_b_account.key(), bump: ctx.bumps.bid, }; @@ -281,7 +282,7 @@ pub mod sealed_auction { ); require!( Clock::get()?.unix_timestamp >= ctx.accounts.auction.deadline_ts, - ErrorCode::DeadlineInPast + ErrorCode::AuctionStillOpen ); let auction_key = ctx.accounts.auction.key(); @@ -522,7 +523,6 @@ pub mod sealed_auction { bid.bidder != ctx.accounts.auction.highest_bidder, ErrorCode::WinnerCannotRefund ); - require!(!bid.refunded, ErrorCode::AlreadyRefunded); require_keys_eq!( bid.escrow, ctx.accounts.auction_token_b_account.key(), @@ -614,7 +614,7 @@ fn init_ephemeral_ata<'info>( AccountMeta::new_readonly(mint.key(), false), AccountMeta::new_readonly(system_program.key(), false), ], - data: vec![0], + data: vec![INIT_EPHEMERAL_ATA_DISCRIMINATOR], }; invoke( &instruction, @@ -642,7 +642,7 @@ fn delegate_ephemeral_ata<'info>( system_program: &Program<'info, System>, validator: Option, ) -> Result<()> { - let mut data = vec![4]; + let mut data = vec![DELEGATE_EPHEMERAL_ATA_DISCRIMINATOR]; if let Some(validator) = validator { data.extend_from_slice(validator.as_ref()); } diff --git a/sealed-auction/anchor/programs/sealed-auction/src/state.rs b/sealed-auction/anchor/programs/sealed-auction/src/state.rs index 22c02e4..cd5d510 100644 --- a/sealed-auction/anchor/programs/sealed-auction/src/state.rs +++ b/sealed-auction/anchor/programs/sealed-auction/src/state.rs @@ -29,13 +29,12 @@ pub struct Bid { pub bidder: Pubkey, pub amount: u64, pub bidder_index: u8, - pub refunded: bool, pub escrow: Pubkey, pub bump: u8, } impl Bid { - pub const LEN: usize = 32 + 32 + 8 + 1 + 1 + 32 + 1; + pub const LEN: usize = 32 + 32 + 8 + 1 + 32 + 1; } #[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, PartialEq, Eq)] diff --git a/sealed-auction/anchor/tests/fixtures/dlp.so b/sealed-auction/anchor/tests/fixtures/dlp.so new file mode 100755 index 0000000000000000000000000000000000000000..3119b947d48944b7968fe2f7995263339ec00720 GIT binary patch literal 325560 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

Y$fHz^B@_z1e`@ZYgL6G0&;8qFB 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 Ku`Q&0v;9BPd0_ki literal 0 HcmV?d00001 diff --git a/sealed-auction/anchor/tests/fixtures/ephemeral_token_program.so b/sealed-auction/anchor/tests/fixtures/ephemeral_token_program.so new file mode 100755 index 0000000000000000000000000000000000000000..9d42d8ca9fb5532dbb22c24068dca9164fdf5d49 GIT binary patch literal 44472 zcmd^o4Rlr4b>`L2Gcx%R#(uV}gyCVp$V#4(goFh76UG=p;vkG)q>yS!&*E7UKa!rF z1UlTLmL20LOgbamu}w(gNCF#}x(&1X1MTX}qn&nz{;Y)Q%(S#k8r(E3le8-&Z5q-^ zqS@d6x$nL!5!=mL)73S{=Iy)p+2?QXefHV++;guU+wy@2N=r&SOJ&{&mp` zM`8P7p&PVvr9?)1b<>g`g=dBA8LUv;t!(G3RM}15Lv-a<)-Ya0ow(_1|MV)5Kh4ZM zyKFOR_q=l?H;gUj-6A*|rsS^>c#d$0*7DuTI?h0SfA)v3J^iaS2CNIZxq-;?Sms#{w5}b>5GUGFR$1{r&pf++6-8#cBA2 z&gE4PdF@{nxxT7 z*%|3y?sn+_>PJpa$6<00#zk^~yw5?Xlw4Y1yksq3K#vo2mA^yi$)%`G_$L6>F2IL+ z@*%nO|B%Kf=0J8R6Qy{?cUd5PgrlqZX;7&i`iK5iP5`5E3!r|geGv2GL`&ZK zR?f-igdx92VC5=-*)0O&v2wN#v&*2L^*?0&#HeN@cfXGNJ}DO+cgz$0SKcl8u3uoh z;x-;|HZ23olvH^n3NK#rAk*U|KVa_~r(e)x-dmYoMZdpxTW;<#)V72 zUGdY3-=_F9QYvcN^8lwq=0 zHzWP*t^S6zJ0tz`+~2S;wt>=3B@NBA6I-r@nOY9|9*A9;=`JMN%4NgFDl-n_yxt`y`i7;jOS+< z^%l{1`hPq(=T~3lF+r{g=9BsBS6^XznEyQUUuHVwk@~FEg{s)hG-WF<&k3EFENalWawJ#`FENAIi{oC#z?y>D974GeK6r<_UE|9)fG3% zdPl|s{UIN|EB^#n=V4uGc~P$Mi+Yxlsk>8RSJ^BTpcF6Z;`;KBGwO8^`A1Y=yyW3h z*k!s`=0Uz*^7|-1L6=(zRuin!@gbK;UUKP!OaUGJ0v$CZS8Qjx`F(%)rJo?r-+e*h zS%uRIrxZ>o99Gz)uw7xR!a9Wsg-aBA3a^QNc3%WVU5Bng%t{~OZ&A~70Nt=ANohgyG#~h%xBme><0SI*U=9p=obPc|1G%A z=j0Phz~-SI=q)|K*&IpXY$%)eC0tz16l z)iML-#VwI}v66Da^8)iJnf)Pmz`ZQ%QZ_C9p>+dd3;e4)rR&g0JIG$D^joEE1YLHD zalcyqPj*sq^*`AO#nu00&411JKjKeB&yY`oO8V7mf7N1t&;vB!?-e@$A0|sq{b7;( zAg_~@NeS`JWs+Aou7tmXyiYMdVNFWDDhWsGgCFFbY^Qc*pUwxVB=ns-#eO>Ig z`dUEeepg>*yr`elFUKJ$m5*U(t1q#6E2lQA#F`gb$7zKDNyGpA+V zREwW=Gt-JsGIYA$xmjHYYyXn_*IWJP4EG(Eak&}c_pASk>25~q^Q*t5xcYM)Z*+WS zcVYSzt-pRXtIrG5Cz&qt3)3f!5fzew#gUq23Yd+xNxk&o8^<@MyIiHqODb?y&dd3D(euAc1&1!CS?kmb3@ z>lnh`mR6<`4@ulvqT@Bymdd_h!)=3USsog?9f9;(2Dzd-VvGKy|>E|EabQh1gar;+ZSg4=p zn{N6x>ig6;?>zR?`uRtX{5(&aXD3d**ZP?%ffpow(Yk;}Y_!7(~_G^B`y*$D8Q1EMF$L4PrQEz||^27e>D=4SyuH~b?UnRQ9+pn%-IUIPJ8l>be7Toy5anan| zcQ&K^&PpjyVwlUY7RbJ5q?|h;{f{XfiJ;|E+QPR6=J{)gv9xShJFKf!tx(ihf$yYInx&(V!fdZv!$lqz{U z$B`CKyT{w9b%~ELzL+O*krT7^+z70QSX9niXFL4 zjC$@qt!J~=bHCLyCFNQs1=dUmtQu!%{=ly|#(2zoj4ddAM(i>D@>fMZY0jqpe^v7v zdAzp267&9y>3w8R31U5@FfYwhxlzuCzMhTv)w_rva)iCaE56Q_VfssEFLT5HcKm7w zkMqXGe>wz1s8cB_6y;)|DMp4`~a zh<#yxPE$>&f8P!K%y($M|1>{y-wpiCnj$|VexcxJ1pjG%=6AI`?55ynq?|h;{SW(@ zRvHWZOoGNkeum>Cienju^`U-7@;8cqU%=0BKI{|R-oBT{^36IbAoqkq76Z3wAZcv;g<4ezc zmB$nFKEigMKJ#wwSIqk`<8CDx3MDr>!LY0GMX|S);*Z>@_@S=G&obTiRo$ut^SiMr zDYxYX&QFzb2toVy>fdhbbjCVEuAD%DH+P|$|>DOhxL5P%s z_HP+xylc}xa(=4pFBmVPuV5iU*G=Xs-K@RKbIz7|Mc7T0NL@GgCo0E0L_FF2`T#V--3@dpnn-}BANtOO0 z+dbwLa>DV-M@i*kMc}mkgEL$~`po@mhZSrXn6G~vS!ezol|g?Yf7B0)Nj@&m8-OEJ zN@mrLX8O6ltUd>bmoBATvJ>5Jaw9d2FS@^I z_#2rg=oBTFYh{S%XGQlHn_rdrQaZ-@F4&LAaa`w4jI%slLp$fEN{77!UAfr_rsqYR zyzhg4yH)rlI5y63*%s-5`9*sk;+{0V3FhnCqVxSp5(p(XHmP)-?`pU1h)C28Pf32e z&iC>z#@&+)JlE987q8iVQxEgaYrm;q={IP9-LT~Evi2Wj+}*0<8rAl1<}0!Z*tx@OR;I@GtJ9 z`ahC8`#-v^WB;dq&Ye{M*DCc?whPRzQ~#&>%I=YQn%jP!*M;!?J;zVmHSQ<=1Xba0 z*ZYK{vi_RgoFlPfLipQd|H_$P-6;DVeyzp>p>eT)tyMp&`%K|+ik~g^qnPioSc~Jr z{D{{Uy6dZvx%O~K#3nOY;iVevrr7~{#?;axm$d76Re-yw90 ziy#K}OYkRQfAbZ}5$lmMPyxjOjHJ(eK<2A5*giY0|6HG&vHNI=bKQ)|P3~*mjOg3s zV(X{L!|sQI{Re6s6$kS@O9G(eX662*YpKrntaQlDN;_RkBlB$}A>~d;zq(e6y+cpf zfk~Bb=6v9ghnv>tRi$E(snYj(FM(cK!+h-b!{-$m)ISlB{_4I?XF7W*9+N^ph6aV8*UQ~L-50wu~xtA_U z{=?>nRL{Mf?YZ)CzPMrB*Nah-e#$2RydduD)q2V&l^$t-kJ?RaO7gcz`|&awAf;S_ zK`^gu9vIzUEb~4*za_4kzfUQCV*Wm7XJp>@13w|{LLcG%ar0yF0}qfbq|f{u&&Tvk zCquiR&r2A>PoFV_L!>sqcNk^FTTc)ZdUxM zUn}D_f0`gNPql3(KZW$g-~-*_L+>X&)YM<^&UmMZys z-JkOh%l#+%_awPyyN?a;&*4%1PrGma2+CoSQnK=>ua)TVQ%J%7oId}2J^OQC)ACq{ z3-`^sKX*#{ZTocoahWf4f5Gwz%O7@Xew_B>IDdirWTyK^#V>@*%l@0L=QA>%MKrFS z$b8`EZ6Q5ky${cWt)$cROb^?Cs^my;e~gtcSP$(v+8${qf1kh(QX_3&@O?8VF}4Ph zx8`r9d`ywt-N>bV<`IGBFAM%v{8N}N{&kG~tLqi}#W@(LE+_7o_Wy*wY$aw3wOh}C z>k65{Z|M%>mMLFwIXWf0g1@0Y8P7#6L6#=w|CQzfSpU6t4;R;o;(C z19O0GwpH_6mA^&tmVjUM**gd5X4^HtUHRJ-ZwvTgH}SHrIY2ktqxn6`->Gm-^ zUe+-ONatlVe^~kZ74HxDvGT^tcFqCPeU#=;DF3+P;{iYBL%i($bAWDkO7o|be^T+u zfS=q1@o$*}bhFc%Kdt=76h9X5BjSmdy>AZC&7Rf#v&w&3@zVi6xj*9HFbC*nFKGS+ zOeE46afM7p+M)tE~Y>lAr zVZUMfgt-T#oUISGzm0nKQ^!xEk;Nr-&m;tIR{<|LaKoqVJC|Kjy2<#~m^s ziN7*ZKWvoFwJ85PbzXiz<|XkrN9wneO&49 z7UqMT*F@@({7pfAPozIGf8N9SxKByY)gguP(&nJtXG8X4aUJv_>sATdRm_u(eDq^i zq@T;ErkGb3)c1#xev03EXOREZP|ME=wyD3MarY* zmk`toj;Cv}rIowBZ zoRvs09p?%VmnLtzlW~9hRgPC&jnwPx`Oa3(_VNb>2IonRUK9Q&h3>?idCp1u%RWg0 zp=9^h!Twj9_HRI7*C%zKr47=heh&!j`s8)-yTV52@wHzA0=u^9{uhl4s*1~F6R%g- zuRu;GrJq@C7x!J0Bu6_R2^@0OxDKE5`)5 z9CCtust3tGdPU;G-Ip0=M@8>Ahg-yt#e$L>ZD$BMBKb!XESLPa;MfnSVS3d(dMDGD zFx}r?!4T(u+CV?d!=v*&*SR0L-L;&bJAMyC+tc{}W92_l`3x z=zmz~$NL%Pb{`kG{WA;;`adT4I+;IC!VAydv%>x^X0FNE-CxIYe#81-e}nnI{x#n;;X_xD}I*t*@eEqxkTOvot1jA-*=s!%i=r+xkj=djXz$Jbuk>bApR*lrz?~C zx3>%2*rx4uGIXo8-w*<&;5qy@#S`ksMC_hhBZ{zdMl5e~(fjs_d`$lP_D*p9=I{6I zonn07-eHE=r-TLj)iPgfUicd)C7i`x(dmCGHb*)xXTRTah3P^?i}? z?1~!3bJgbpe#p(9JBIhA`zfBG_a*{9#C?ACMaIK?zs!6Wn2vb&!t>k&|Im9}O!p68 z7r6ME!0lHB?iM|V>+7NV!p}j@13w{kLLOHLcPHDpynCsgA@uwT*@2ts5&CSW)Q_8Q zN*2fY)h*Y6TRdrc3Af*QjoNDkmprS-%Ihy~<#MaNU*r2ce`7o2^xT1=+bQSsvG2D1 zb6k{v{Eao7pDGbUfqXs~&aakyw^N>n`PFq&-!6G>X7eX|yR82O`{-mo=$roc&e1=> zVBP1|$qp9xFkh}ZE%nw(#=h!d#wm;w`&r!2c)T3DL{cAM{uF*m4#fC4$;F+PamP4X zlznx!zdPhT)|}p}6ysL>~pY3r_E)a5>xer1wb~ z$9))5_*_O0$<6#R{1j5m+rZF0&cMsYr6BGTSf3UTT70SgI~zwX={ctJlK7Eg-j~_l zF+ac&w&%O;y z5tF|?k28LIKa|edOF#6zP}5`J=T36-^4?X%-#}jZO_Gl|5B)Oz1?veBv7W>{8DCi5 zosjnmDR1}B?he7j@eu_6+aX2J1$OmI zedgcnKHpVH16@^mpF`C^RVlrH&pyD_@N-qZzqR`aVj?lkW%d5OJFR?F9{05!$VWXT z(!Re~>>zs(wUhkRPR&o5-wOPdu+jP=_L0>C9JWrTEUvM65X3t(Z1<=aDdv5Fard&! zM>iw>zBdi)p)-e%GYHlL`))&Fev6+#|1edPn;zr(!h9H^UoCzmUM|n^!ugOey)VuF z1@(|gQ#}Xg)stX8@mKNk5q@45uBV3c#jl|r%+2H`c@7Zft7AU#gYohKel8cz$9(du z#b2Txs3N&Zo&$vWTAA-O_d8zR!_VKs`E8tkHW(N5p4{}2dE;tlzVlj72R~;E*VD=Q z7lL}Q;v_dcG_Rf>=DVo%e2|}~!B6yquImNHgZ=pACV3739QuJD2E=;Y{vusy!u%a2 zh1l~fTX$`q`qdTJz>0e4f0El0#@$Yj;X?1-U5Ed8Ng6=?|3Gm_dgezwp7gBD!`{0k zzxQ^rLyJf938A}(q}^QYTHZ&oeYRBDao+I*4*fe_Kb*K7FDtK}(Q|vL(ch@goAn$Z z^_T0j_=MuOAEU*>c;sA*E1`)@iTtVLtG|LA5=?KCei4o-NO2V7h-c1zmI#_Ceqnm} z{sJ}AzJc_^{DZxZE8B)FZwM@>@#Z2LFUp1eY8}Znysl0HSGnW8=1Zgp=pCLj|1A9g z%CLg{%Q#z0Sie)jIQn0dGWhkYCz+1%3x1k$nnwYh$5nld@o+!UFT77O{-Tt{FYKb4 z`k0-ObvswxF|S+)l_S3r)SsYoe)TZp{@(t8F7oeTe7^iU13q+}{1D@IzQWF*INk3m z><7xY+>F|fj^95nbz548bv=Gs z%9%fOr_~?Lh`q(>xgwIC8;X}f+tmMU4EQ`7;u4GlFj)_)p?o|l7vwE>Y+yyvBN>b7BfFDZHTYtiox9I=@Jc z7?EE)F7?#PeZF7Yskqz+`?W2K*C?z~SfTK`)NALr_1xm?{Z7W}iYC$L2|54dre*%c zD^wq|B0t#I6wPnQ9d_;XyuE9ZeE%VZ_g&|Hfsa(c@jpWvEXJFxl6>2*=_4X6Ch9jT zmr8xm7s~ni+$!vE*1``dpDU^10+{Q#qW8ZUxAHNb{nT$=4^t(wjyqkqQYCU;+3drW zBHE+*UMly$@sh%GyDOo65VutL{DeTa6r-j7CImX|x1WI2sQp_Qc)ny)e+0+6Qv80p z_?bfgaaRI+xyoQ!T&Y$<)4x<;JG10kt(TUf}53iChsIay+-+{KWr~E zic_IiXdJlzUO^=E|5vE4-ovN4es}6R`(^*=wBR#h=e7?==d#3)uSjr(?k=&T@V*q* zF*^5p4Gi>tJHx!%K$!0s^~2w&_ouZIUs~Mh@0B<+EdM1~FE!3FKkiQGdUx^?_Y33s zEowJ?W(m*p_|5kI*>di0xV{S1r|Ut!m$O+O@WJUb6;^KiAdS^VDJ(jVI|!Ta58U;RS2vmqwW80V5- zBfe|Yf7c}Q+Wg(>Sc{jSqN$tZ{yk35e+OtBbWVsXw0#ZRCr|6Xd9T`cFFqJU3Hm_I zaXr6a=dQ3Gf&=T^qx3KNjPlbp+QB@l`T}Z@1pE0WvE)YuuhjL>JtDZ%_X>I&1<%X& zl~-x;JC&s-z2vj_rFNw`56?eANtL&P?5)0eGq)eKa~qRA+izjNLh};yoVrB&AW~n< z6F)%lDeEbFixiBPEawW~M=-9WexJeiC(X_)pOJRVPv&$z2+L~)vA{oULp{%uV1d)M z$;*q#D^FvyIKoF^O>2^#J>;i^%golROuyC(1VkK8-tVf83rYx{)^SoV!h+eYeryB)F|N z{vCpc{SM#9H^|sv2S{ee80XVu3n)*`dv;%+Dt#0C8{CI2xZba6MKxZq-mhs;> zrcQ8CKfRY$!#LW3pY7Fg!Z#!3KdeyL$lqT70VuYQjCqfm>AwFu=%@!#U;#klDW?cs}F$)$);Nq=;Wb}_!T$b4B#b*E=O&E?Z4rJk5~ zC&W(ulla3utMN$f1oQbD#~HehgNy7*?ZEW!PKwmy@h|d8A(T=^ zr*@IthIWSj(X%XPJFj0jUnTn|VR|Q(ptw`?qx&t06WT!ED0=m4#cp!Df0Oxgi+@Al z_VWzsJry3PTglBYpjVyODkt}^rq|!&4i@w({^yPB711u~;s3c_ud=+u`m3RS*m=A# zUG#dH`TgUU7#8$;QRuaD|DW6aJ;rm3zbkP2HHP%Q5$iR37Y~=empnkC%BA1PNzHqyoFU-}}a5;KEvq(+_ z`5fX7xKo;M=PqBTe6qtoT`t*S5x_io44WJ}WxQiiIkeBCiyYci4y_D>=c|WXguYkq zUve9Z&)MZ_dpMuoOTB>{J|uE@S@ZY2F+0ijyoMZlZXkyqlfxAEFQ19ZVR9Z_J*% z@4q~+-pjN;7v0C>zWyY4i=VrX6OR6oYJ>43PQtnlxgh?f_a|A;y-P(4HnL$cgnbT>-<<%#TB^qQjdLaJ^u;8Ev|LjH2-;pN5~;jT9(myK%It!gE;6p z$+zeE!TICoXh4+QL4jR%{uqM>{WeU?l1h}wyc$KTt|^i-%m)RaA<%=hQ{^5Rxb}lS9 zk9u6sqrN2l%i;#)rP6nFwB5_nuNmn-?%Se%t{?u3rU7PvJK4$nCa=K1k-XTy&B(lnc^?

S?A!La?fJN`=dNu&<@U;Xm3@0Z#`W2{k=y-IssAn=ufCt-AJutK zBlhVZof5tp;j{DL?k?$%UpvA1_Ix!}+Qb=twTzSQyEPwHMSf#k{D9em8S?KF#nP6+?@`IU%Wr&OeGB1o`?sbKpq1#kzj# zxoC@*^IIhUM(Zfz=~cvH`?KM7?xUoC`d$F{D@=!7*tupr4=LKO(C0P0UxRw}?;M2J z->98UtDRxo?xe^)urI1#>`U}w?{%Z!xG(NqK|hpiJ+blH-`|f zbzq;qH?Z&Mc%Ua(kbihWaJpuEvDmT6zjyJcIp66%fWP>d;t6iRUo84{IzJ117nD!! zR_(<0?fu1KF9o|5d%^hWf707kE+5v=r%v?976~BBRQ9F z4>S1NrGF?7JIN=c+*Sh6Qw~8OrC`2l9C3)&odnUBJ+~a$UV2>OvOX%5ApA=TF^`ZA zd|WER{uQMO{-vM%!*aDl_iuW)Na+Pv%#6?m#$F zO6R%RGscM{0jtaDqK5SPLOb)>cWB=8oOIA|cS7WYzt4r#LH6(i>WIn9&R5*Cz8$gK;MrGJ?6>tRh2sv zsrz&JRgzz+a?fuT{16R4L6?2hFF@0a^&?ZR-*qTo!si(?<@fMBvUNOO{t+rg&!Nh9 zu|BY$gD%EAaTKUWa51DzxxQ~+uJ4zm&El zc{ATX#LHWG%|JQO?fDPd6&#jL@0*wF`{v~h^1gZbyZ8-Wl#6q@70icng10iBDcASS z%a`-{N$}&oBgSvROaBDlsQmiAdHLJq{d?lSgZWXb@Cz=Ah?lS8ot1d`T7JHO`Vk_< zSPH@~_`O^{UY_9RWAXBL@cZWAU&{Ovh@t<2ld)5Z)41U$z$f235Ca6C;478yW`5s1 zUcQ*$yUwp>GWA2|JNVH;@I6n$;hMs7Ks&S#%>}^^6OZxeWgN(fv2+E;42!Wg1jjtJ z_oq=FCxF6oAQItnE(rNp0qpOM0f)zlaWAF5+ZY!=g!~f5Ax+806Eph`3i2Tt^FP4x zXr_0k$g8)W5K4g`R=*rxr?1jHvw4|f>mxs^&n^AiWx@x~-R#`Zb*73>T2d;zscvi$;!Yxe2>!$Ri;5#K;=$?J%dPRqJi zE$hF@!`??iI}=6i$a)Vxh$eXNXo2^YAV0ra;)k$Y5l`7Z2(7C2lR908JooYsOMR(Q)e~jo332*%@e7D|sViiUYOh@UmLNa> z2ordH0$-~1J|?(_d%P)e1;n~~jCiT`kSBpA1K%D!)x zr}=@DS3|-$&k!EmPx5F`|J}^zs>CjnHIjWd#L8j)Ob|W!41S^CYob4$-}an3e~hy| zJMVz;;V<)9JYwzGd^SJ%FOl05)Ko!k@QNh=C&gcw+-aYi`$^x^X7~%l13lXJ^B_M+ zHs3=(lx%(@-hK!DbEl+S!LELj>p?zJ{ATf!X18`O()^Hpmln?p(GHHGkXg^A%Edk_ zhq;=<_xd!>aMPl%nD;B(URKP?L)-|BB5nk<`_)Xv_vZ3cuf-SkcN)`6>$m~GR^~7C z2ukk?p=Xz(7SdEn7oPyc6dr9mQ`hSpEQl8vb znq4lU{$AHh3+R?9D(@{eWyyPB1+~DQn(?Z zWPT*@MsiOAzaYHKukV@vEbF+e$6`-!WF4O-y;!{R)7J4< z>Aw7pjPJs~vGM)h8yw%2e`Di2L*sibyM+D0KU*9LJMyMsp^|L>xnQT_hr)Jqh3!fF zZkR51_Qvh=^~RaMK;z5bA^pTUj}^UxekiP-vvZfraZ^Mox$2V)?LKe$7DoAg8=fS& z>j)EUzbOBZ<&=Luj_r$@`H>9e@{Bbcbl{q^{mh>4oOwq%>KvD zNmg!>{CH`cFY@hzcM#xlX#XoEY!3Qi@4sY6g&+GFSOLGJ5b+>XiRWN|8M+_NlU#r! z1^)Ub`Fr4n_)+##DtnlX;~tbp97M(EQl&A@I79%VsFZNTt3v!i37LQ~ZyWPvw=(eh zNL<`Mg|;4K7HRwwtkb&Q%5v-3^U6b14lJi=T<8bZYa)3&#-;x5eu0&30_{5%ww?s# zHI6$(kjtz5y7y@LC$+pjC-|4Quj}ttsqc-p4|yl3XxGxel=V^9G20h&rzJkH`xDqH z^pS6p_Lhq|2kWVST;yu;J@(7y=szUD?q(?mxsYhR?nc2YRX$ZDEcpVSz_m&TKTN>v zGv6xZ;-z9}HgDX^(tcdOf8Rlk{D@c)7o*?sFBb?VpI$+~Vz(Cv+I>cT7pOEo*>0it z*WSgrm9uf%dr^p|FA#^nTjbQI_Gt5h4&>YXikBvkP2-m5)|F2&8l1oGAhDu~ zK85ht;d$qJgg;N?MZ!Ggc|+GcZwRv8tDos!0xs%Lf&u#l=pXSc`ya9^B)lJi6!ZRp z$B%Zy_G9r?_flr_4iR8Giqy~jJReGAFrW7Gv3bZ-tr!S;rquq8c8$p?V+rEpX9GuB>3`SEBobo;3r0Ri4VR7T0(_k_N%vyzNsm$cAc714{@(SBoGKee3{SL5y5 zDbT(TiE^-Odv6Hm@3?TkfO@q<0Tfj`Ckw)aHVP$Bv}{#>Q**Q_q7;+=Bz z6A5z0JWDn~+JXbxzDT9&F^@q}s=Py>!-S*c4-14JLOqZls!l#E@A-YK9#pCi#zU!6 z{hY;7l`7Y4O7e3L3q*aW=fJJHPW1>q7nG0( zqD1}WTJ3)zPw7_R4@_P@CN8BwPIS$3Dwq4fkJ)?75jo{naWO6@@{n=bK0MZKI8?h& zHhGx-OkU@tnxel~Pj6hkFS+zq&cXh5Azj;?Tq+I)9HPn^=@NGRUV_Wj?_)ggBmA)h{ZO+0BN{?Km`FeH1BMfP z%-&<})^#5Kv5=_0x}k5+_3XQo$vrau;5nWaiqrEuB%6ob!scb@IVakU_UFI~oj+6t za$2@x5sH&s1kU5vb9#`U@QZYV=P6v8{2svs{ri$alZVMYUh;0rp?+%r4$bbV=OOfH${oE7@8j7uh3tM7nk1$4$?2t z*HOYXV4#Q1pvd=^F^+EKx4#o(`!|Ou6XP*D?68s&$^v$;#Ff}*IR06ybjS&D*pT|o zKEh$ICRfxC`?m7{%j*cCWaI6lK{XK`)(h;~+Fh>oVjh5Qeir_vkS=XDy6HXm4xm0~ zvG2v8y#y6ReSmh~g8L?>E6m?bnUoIE{74YA?@F#!`&kQv1HF|2$6*QJ6we{8)%ZDx zZ?i(T`^BWZRulZ4Ad9yVZzhN}-z@xZI8gp358n}PAMe+f#mO!^~vNLou~i5`x%>e=GXJ{k`&Br%&f^wEsJF9V%WwmUuh%NPXe>59f~%#~~q(Lc;p{ z?}=Xd3Bk?I>3lZJ!sOZAEBR)>aXqgd^Zp%YpnsSVQU7877V{nXxUZm3FU+}@WLy~v zFn&U`7@sB}{|2TYU3+XtToBtQqQ4ixgesbM1%1(as^jU_i4m5oYiDWATz2zAmos+G7^?ELT6Zn)C>NZuEkj6I^~- zAfM$@AOG49wG(?ABRedv?~y#yC**|sG2R40%o{*kPj`q~yrEGdQo_2GAc*x0@G)I? zjPEgv4>nOIC5!Xz-06;Xp-1Dm6l68VCB@t@CmDE++GQEsA@T-}sllnEg|9~D?Ps(4Z`F8&w=t=4G^c12O=}GC3BlNUHBjCl#x3)ZI?DeO5Z=4}}n85-G`*wouQG&VT8Y5zzjy~k}E92gx)?;kjv*)uS> zCo`TH8XHXvJ(_rgc=qHrCPw=+iT#>B7BOplI@WHdW9 zI8acjHmg}592(s+I5gJRujKb4sGLl2|}_Gg0T(&M{GTp!2`_Ko&$8Ska* zAWtQPe5;6R$n|d<;uf`8t(#hZ2x1)192hoXrUr9k!^1-(qcjeeJD48PBHQ*uvHN!% z8q65!!SuLRl!IJ1?cYDtn}!|a7VgwT8Iti(uU1HqIv-!1INb8$PyN{%M_i4Q}Arcuf3vvJ(6Pe^Fy0@06_{dN%&HJH| zg1ey7-Mw0z=6=+z^bQ?3Ffd9PkI=l#jQnhlC0cpNV~q|CB@Uzqop_@}&4KiIqP{8d z4slWMNz|{u2c<{da3-hS92*_jk87+pSgGzI-cfeZVnO7j>+0(2>l*6T)iu^N)vd2< zu4}2=P+wPHU*Ax_uD-FpseXNZbA3zwhK9O^`i6#vbq$RTO%3ZCnj2agHms{#SHG@- zmb%7uP3zXLYhKr~ZbM^TV|`;o#H?D75zkYr5`j+(@n(LbDn;V+fH8(alHLq`OZfs zuBEZ1sbzgjb4yFhh7Huk4b=Pws(J$z+dw3l9J$f-$f!;aTbU&1(V>wVUYVQ^jgmq}d;1f6GC6Vr>|G+P zwz756o`!}SO!^Om%Pz8fi}&ry*h+NydXc=VO`!y*Fuj{7RyIt(pXjK)CqzB(1)}RVjaM7u|8=5=`}enmTO0kvXZ`y}qQ8xBq*nU36c>~#Kj(QX<&uBH zeB(s1aWoL0><-KLZqYJf`h7%Oh>r1T=;ej^@wUK1{O=CY-y3T85u)1|PGD=3GSkLY|J1hKVOW$kMO%f{7a6@*?J>I^V7tyw{y&Lh;WlT2u~7jV+Q^i z!sYG;nCCr2{jq+_?tsMj$TOMr%mOR)^Adt$N*XTm*?-{wJU2H4co097Y@7VbG^4zy zi7VI>lIir)jNr1%?RlRPv}jyPdR+kHSxTdtqIebQtPU79DZa5`?p$?(nyo`AwAS$?}3w&4>I{89wJ$UE|d^22JdRz9HRgAV#vUtE8C z1RsvzQxW`P1iv1^tMoq6+G~m6oe_LIf**_E=Og!1VsSF9@@UrhvWi{L#Gd?JEh ze@}6J*WX)=SK;QEl8txrfnxmX)?)l@TQRQ3(t`5++luqs-(QS-JBsni2!1JoU)@>E zKfS9Mzoh#v*8j_?;(YHz#dsouw?*)45q!9_xO}_r|5$rh(#83SfnxmX-eUZEwixdj zDaJ2E@S4NL`I8a6!Y|J6kKk7$c-u#d`7cHAnvWIddrubQEfM@;1g|?%%zu&AZX}b} zYVT`eyi48xbi5xURpzQM6sxU&BwUpbSswdTV%#uD6C?sYLBkKk94I z_0saEb$vAanEFe@&%Tw5bN|Ze@=_=tU7dV)As=16d|xr%@<=gW)mMybqNti0X-7_|Ez*f5f{Z~b3SG#fiJ=uh1* N%0*k4NY~N!|1a#q_`m=F literal 0 HcmV?d00001 diff --git a/sealed-auction/anchor/tests/sealed-auction.ts b/sealed-auction/anchor/tests/sealed-auction.ts index a076699..25b9fac 100644 --- a/sealed-auction/anchor/tests/sealed-auction.ts +++ b/sealed-auction/anchor/tests/sealed-auction.ts @@ -119,10 +119,29 @@ function sleep(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); } -async function sleepUntilUnixTimestamp(timestamp: BN): Promise { - const waitMs = timestamp.toNumber() * 1_000 - Date.now() + 1_000; - if (waitMs > 0) { - await sleep(waitMs); +async function chainUnixTimestamp( + connection: web3.Connection, +): Promise { + const slot = await connection.getSlot("confirmed"); + const blockTime = await connection.getBlockTime(slot); + if (blockTime === null) { + throw new Error(`block time unavailable for slot ${slot}`); + } + return blockTime; +} + +async function sleepUntilUnixTimestamp( + connection: web3.Connection, + timestamp: BN, +): Promise { + const target = timestamp.toNumber(); + for (;;) { + const now = await chainUnixTimestamp(connection); + const remainingSeconds = target - now; + if (remainingSeconds <= 0) { + return; + } + await sleep(Math.min((remainingSeconds + 1) * 1_000, 2_000)); } } @@ -258,7 +277,6 @@ describe("sealed-auction", () => { const bidderOne = web3.Keypair.generate(); const bidderTwo = web3.Keypair.generate(); const auctionId = new BN(Date.now()); - const deadlineTs = new BN(Math.floor(Date.now() / 1000) + 3); const teeUrl = process.env.TEE_PROVIDER_ENDPOINT || "http://localhost:6699"; const teeWsUrl = process.env.TEE_WS_ENDPOINT || "ws://localhost:6700"; @@ -309,7 +327,7 @@ describe("sealed-auction", () => { if (localE2eAvailable) { return; } - if (RUN_E2E) { + if (RUN_E2E || RUN_LIVE) { throw new Error(localE2eSkipReason); } ctx.skip(); @@ -385,7 +403,9 @@ describe("sealed-auction", () => { return { auctionId: localAuctionId, - deadlineTs: new BN(Math.floor(Date.now() / 1000) + deadlineOffsetSeconds), + deadlineTs: new BN( + (await chainUnixTimestamp(provider.connection)) + deadlineOffsetSeconds, + ), tokenA: tokenAMint, tokenB: tokenBMint, auction: localAuction, @@ -803,7 +823,17 @@ describe("sealed-auction", () => { [bidderOne, BID_ONE, liveBidOne, bidderOneTokenB], [bidderTwo, BID_TWO, liveBidTwo, bidderTwoTokenB], ] as [web3.Keypair, BN, web3.PublicKey, web3.PublicKey][]) { - const placeBidTx = await privateErProgram.methods + const bidderErConnection = await authenticatedErConnection(bidder); + const bidderErProvider = new anchor.AnchorProvider( + bidderErConnection, + provider.wallet, + ); + const bidderErProgram = new Program( + program.idl, + bidderErProvider, + ) as Program; + + const placeBidTx = await bidderErProgram.methods .placeBid(fixture.auctionId, amount) .accountsPartial({ payer: auctioneer.publicKey, @@ -818,7 +848,7 @@ describe("sealed-auction", () => { }) .transaction(); await sendLocalTransaction( - privateErConnection, + bidderErConnection, placeBidTx, auctioneer, [bidder], @@ -854,7 +884,7 @@ describe("sealed-auction", () => { (await getAccount(erConnection, fixture.auctionTokenB)).amount, ).to.equal(BigInt(BID_ONE.add(BID_TWO).toString())); - await sleepUntilUnixTimestamp(fixture.deadlineTs); + await sleepUntilUnixTimestamp(privateErConnection, fixture.deadlineTs); const endAuctionTx = await privateErProgram.methods .endAuction(fixture.auctionId) @@ -1001,7 +1031,7 @@ describe("sealed-auction", () => { const fixture = await createBaseAuctionFixture(1); await initializeAuction(fixture); - await sleep(1_500); + await sleepUntilUnixTimestamp(provider.connection, fixture.deadlineTs); await program.methods .endAuction(fixture.auctionId) @@ -1089,6 +1119,5 @@ describe("sealed-auction", () => { false, ); expect(TOKEN_PROGRAM_ID.equals(program.programId)).to.equal(false); - expect(deadlineTs.gt(new BN(0))).to.equal(true); }); });