From 8ec57a267ee9298d209c71fc9e098695bbd21b03 Mon Sep 17 00:00:00 2001 From: hoak Date: Sat, 2 Mar 2024 04:13:31 +0000 Subject: [PATCH] Initial commit --- .gitignore | 8 + .prettierignore | 8 + Anchor.toml | 24 + Cargo.lock | 6134 +++++++++++++++++ Cargo.toml | 13 + README.md | 27 + cli/Cargo.toml | 31 + cli/src/main.rs | 768 +++ package.json | 25 + programs/ctw_token/Cargo.toml | 37 + programs/ctw_token/Xargo.toml | 2 + programs/ctw_token/src/lib.rs | 468 ++ programs/ctw_token/tests/e2e.rs | 687 ++ .../tests/fixtures/spl_token_2022.so | Bin 0 -> 674880 bytes ts/src/index.ts | 110 + ts/src/program.ts | 489 ++ tsconfig.json | 16 + yarn.lock | 472 ++ 18 files changed, 9319 insertions(+) create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 Anchor.toml create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 cli/Cargo.toml create mode 100644 cli/src/main.rs create mode 100644 package.json create mode 100644 programs/ctw_token/Cargo.toml create mode 100644 programs/ctw_token/Xargo.toml create mode 100644 programs/ctw_token/src/lib.rs create mode 100644 programs/ctw_token/tests/e2e.rs create mode 100755 programs/ctw_token/tests/fixtures/spl_token_2022.so create mode 100644 ts/src/index.ts create mode 100644 ts/src/program.ts create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d40116 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..c1a0b75 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/Anchor.toml b/Anchor.toml new file mode 100644 index 0000000..66b9922 --- /dev/null +++ b/Anchor.toml @@ -0,0 +1,24 @@ +[toolchain] + +[features] +seeds = false +skip-lint = false + +[programs.mainnet] +ctw_token = "cwTokjpVjxBeytEXomNe5B38EesYsNsXCm3JZC6tmvB" + +[programs.devnet] +ctw_token = "cwTokjpVjxBeytEXomNe5B38EesYsNsXCm3JZC6tmvB" + +[programs.testnet] +ctw_token = "cwTokjpVjxBeytEXomNe5B38EesYsNsXCm3JZC6tmvB" + +[programs.localnet] +ctw_token = "cwTokjpVjxBeytEXomNe5B38EesYsNsXCm3JZC6tmvB" + +[registry] +url = "https://api.apr.dev" + +[provider] +cluster = "devnet" +wallet = "~/.config/solana/id.json" diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c224d75 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,6134 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +dependencies = [ + "getrandom 0.2.12", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "getrandom 0.2.12", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "anchor-attribute-access-control" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5f619f1d04f53621925ba8a2e633ba5a6081f2ae14758cbb67f38fd823e0a3e" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-account" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f2a3e1df4685f18d12a943a9f2a7456305401af21a07c9fe076ef9ecd6e400" +dependencies = [ + "anchor-syn", + "bs58 0.5.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-constant" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9423945cb55627f0b30903288e78baf6f62c6c8ab28fb344b6b25f1ffee3dca7" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-error" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ed12720033cc3c3bf3cfa293349c2275cd5ab99936e33dd4bf283aaad3e241" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-event" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eef4dc0371eba2d8c8b54794b0b0eb786a234a559b77593d6f80825b6d2c77a2" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-program" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b18c4f191331e078d4a6a080954d1576241c29c56638783322a18d308ab27e4f" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-accounts" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de10d6e9620d3bcea56c56151cad83c5992f50d5960b3a9bebc4a50390ddc3c" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-serde" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e2e5be518ec6053d90a2a7f26843dbee607583c779e6c8395951b9739bdfbe" +dependencies = [ + "anchor-syn", + "borsh-derive-internal 0.10.3", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-space" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecc31d19fa54840e74b7a979d44bcea49d70459de846088a1d71e87ba53c419" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-lang" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35da4785497388af0553586d55ebdc08054a8b1724720ef2749d313494f2b8ad" +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", + "arrayref", + "base64 0.13.1", + "bincode", + "borsh 0.10.3", + "bytemuck", + "getrandom 0.2.12", + "solana-program", + "thiserror", +] + +[[package]] +name = "anchor-spl" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" +dependencies = [ + "anchor-lang", + "solana-program", + "spl-associated-token-account", + "spl-token", + "spl-token-2022 0.9.0", +] + +[[package]] +name = "anchor-syn" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9101b84702fed2ea57bd22992f75065da5648017135b844283a2f6d74f27825" +dependencies = [ + "anyhow", + "bs58 0.5.0", + "heck 0.3.3", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.8", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anstream" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint 0.4.4", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.4", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-compression" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" +dependencies = [ + "brotli", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-mutex" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-trait" +version = "0.1.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[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 = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +dependencies = [ + "serde", +] + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "blake3" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "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-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "borsh" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +dependencies = [ + "borsh-derive 0.9.3", + "hashbrown 0.11.2", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh-derive" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +dependencies = [ + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "brotli" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bs58" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytemuck" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "caps" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +dependencies = [ + "libc", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.4", +] + +[[package]] +name = "chrono-humanize" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" +dependencies = [ + "chrono", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_lex 0.2.4", + "indexmap 1.9.3", + "once_cell", + "strsim 0.10.0", + "termcolor", + "textwrap 0.16.1", +] + +[[package]] +name = "clap" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" +dependencies = [ + "anstream", + "anstyle", + "clap_lex 0.7.0", + "strsim 0.11.0", +] + +[[package]] +name = "clap_derive" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "clap_lex" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher", +] + +[[package]] +name = "ctw-token" +version = "0.1.0" +dependencies = [ + "ahash 0.8.6", + "anchor-lang", + "anchor-spl", + "ellipsis-macros", + "solana-logger", + "solana-program", + "solana-program-test", + "solana-sdk", + "spl-associated-token-account", + "spl-token-2022 1.0.0", +] + +[[package]] +name = "ctw-token-cli" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "arrayref", + "clap 4.5.1", + "ctw-token", + "solana-clap-utils", + "solana-client", + "solana-sdk", + "spl-associated-token-account", + "thiserror", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 2.0.48", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "dashmap" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" +dependencies = [ + "cfg-if", + "num_cpus", + "rayon", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.4", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dialoguer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" +dependencies = [ + "console", + "shell-words", + "tempfile", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "dir-diff" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ad16bf5f84253b50d6557681c58c3ab67c47c77d39fed9aeb56e947290bd10" +dependencies = [ + "walkdir", +] + +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek", + "hmac 0.12.1", + "sha2 0.10.8", +] + +[[package]] +name = "educe" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "ellipsis-macros" +version = "0.1.2" +source = "git+https://github.com/Ellipsis-Labs/ellipsis-macros.git#142c920ce91b0e41bb06c833dea46269cc868d14" +dependencies = [ + "bs58 0.4.0", + "proc-macro2", + "quote", + "rustversion", + "solana-program", + "syn 1.0.109", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "enum-ordinalize" +version = "3.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys 0.52.0", +] + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "serde", + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "goblin" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "h2" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.1.0", + "slab", + "tokio", + "tokio-util 0.7.10", + "tracing", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.7", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.7", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.6", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[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.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "histogram" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[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 = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "rayon", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "index_list" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70891286cb8e844fdfcf1178b47569699f9e20b5ecc4b45a6240a64771444638" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" + +[[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", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff", + "num-bigint 0.4.4", + "thiserror", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lz4" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +dependencies = [ + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "modular-bitfield" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +dependencies = [ + "modular-bitfield-impl", + "static_assertions", +] + +[[package]] +name = "modular-bitfield-impl" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive 0.7.2", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "opentelemetry" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" +dependencies = [ + "async-trait", + "crossbeam-channel", + "futures-channel", + "futures-executor", + "futures-util", + "js-sys", + "lazy_static", + "percent-encoding", + "pin-project", + "rand 0.8.5", + "thiserror", +] + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[package]] +name = "ouroboros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" +dependencies = [ + "aliasable", + "ouroboros_macro", +] + +[[package]] +name = "ouroboros_macro" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" +dependencies = [ + "Inflector", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pin-project" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der", + "spki", + "zeroize", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring 0.16.20", + "rustc-hash", + "rustls", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.12", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring 0.16.20", + "time", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "reqwest" +version = "0.11.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +dependencies = [ + "async-compression", + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tokio-util 0.7.10", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "winreg", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.12", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rpassword" +version = "7.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +dependencies = [ + "libc", + "rtoolbox", + "windows-sys 0.48.0", +] + +[[package]] +name = "rtoolbox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.38.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +dependencies = [ + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" + +[[package]] +name = "serde" +version = "1.0.196" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.196" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "serde_json" +version = "1.0.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d1bd37ce2324cf3bf85e5a25f96eb4baf0d5aa6eba43e7ae8958870c4ec48ed" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solana-account-decoder" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21ed570fba6f909f69c888b48b39c7e61b454e3594e448d0dad9d973f27f5668" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-config-program", + "solana-sdk", + "spl-token", + "spl-token-2022 1.0.0", + "spl-token-group-interface", + "spl-token-metadata-interface", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-accounts-db" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c457b335c3b13b0df99ffee59cf8b3d92e861abbddd0de93993367f449a76c" +dependencies = [ + "arrayref", + "bincode", + "blake3", + "bv", + "bytemuck", + "byteorder", + "bzip2", + "crossbeam-channel", + "dashmap", + "flate2", + "fnv", + "fs-err", + "im", + "index_list", + "itertools", + "lazy_static", + "log", + "lz4", + "memmap2", + "modular-bitfield", + "num-derive 0.3.3", + "num-traits", + "num_cpus", + "num_enum 0.6.1", + "ouroboros", + "percentage", + "qualifier_attr", + "rand 0.8.5", + "rayon", + "regex", + "rustc_version", + "serde", + "serde_derive", + "solana-bucket-map", + "solana-config-program", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", + "static_assertions", + "strum", + "strum_macros", + "tar", + "tempfile", + "thiserror", +] + +[[package]] +name = "solana-address-lookup-table-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dba35ca5c434b2479a2a55b831461bd8cfdf2c389ee3ae4a0fc51918fbe17d88" +dependencies = [ + "bincode", + "bytemuck", + "log", + "num-derive 0.3.3", + "num-traits", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-banks-client" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f22c7a0b5d1a81193875dded16ed189666fab0b753d46faec311c2798e0af34" +dependencies = [ + "borsh 0.10.3", + "futures", + "solana-banks-interface", + "solana-program", + "solana-sdk", + "tarpc", + "thiserror", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-banks-interface" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2652008dcd55d163e08e4d94c2b7592cb8562b33e168ac86462ddac4dca143" +dependencies = [ + "serde", + "solana-sdk", + "tarpc", +] + +[[package]] +name = "solana-banks-server" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a01440c39a08f90f8016013918491f8ffe16d066efe0508f9cb12e2863f6eaf" +dependencies = [ + "bincode", + "crossbeam-channel", + "futures", + "solana-accounts-db", + "solana-banks-interface", + "solana-client", + "solana-runtime", + "solana-sdk", + "solana-send-transaction-service", + "tarpc", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "571e8ef9d82bec9d32dd2d54b00e1572a85c967ed996cf737f3a52946d760623" +dependencies = [ + "bincode", + "byteorder", + "libsecp256k1", + "log", + "scopeguard", + "solana-measure", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-bucket-map" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109fdb52669846283bc6ef2ed87c832295af6f7e3c4e7888127b3d506054d651" +dependencies = [ + "bv", + "bytemuck", + "log", + "memmap2", + "modular-bitfield", + "num_enum 0.6.1", + "rand 0.8.5", + "solana-measure", + "solana-sdk", + "tempfile", +] + +[[package]] +name = "solana-clap-utils" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4729fec3c2ac37b7daaf24c1ef879bbedbff3495b1ac728d9b627282d878753" +dependencies = [ + "chrono", + "clap 2.34.0", + "rpassword", + "solana-remote-wallet", + "solana-sdk", + "thiserror", + "tiny-bip39", + "uriparse", + "url", +] + +[[package]] +name = "solana-client" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da13019a833940af2edebda969db4337ab11c6fb220eb0d4c02d79c83ae8034" +dependencies = [ + "async-trait", + "bincode", + "dashmap", + "futures", + "futures-util", + "indexmap 2.1.0", + "indicatif", + "log", + "quinn", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-quic-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", + "solana-sdk", + "solana-streamer", + "solana-thin-client", + "solana-tpu-client", + "solana-udp-client", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-compute-budget-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ba64641b22efb6332088dc5892369a2f2049f83e66459ea300a4fc74a7a9f84" +dependencies = [ + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-config-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04b91ca968a63946e7513a1de20188e6e917f09136339ee3bec247aa0e985d36" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-connection-cache" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a850c0122f094efb83df00ab080ab6ace0dcd8dbf91240f91832157ee6d460" +dependencies = [ + "async-trait", + "bincode", + "crossbeam-channel", + "futures-util", + "indexmap 2.1.0", + "log", + "rand 0.8.5", + "rayon", + "rcgen", + "solana-measure", + "solana-metrics", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-cost-model" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c6e08e5be41ab19c7906a6b6adf58172fd49ee042f8511a6c4e0155daa1b7c" +dependencies = [ + "lazy_static", + "log", + "rustc_version", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-config-program", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-loader-v4-program", + "solana-metrics", + "solana-program-runtime", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", +] + +[[package]] +name = "solana-frozen-abi" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2c5e5dde22cac045d29675b3fefa84817e1f63b0b911d094c599e80c0c07d9" +dependencies = [ + "ahash 0.8.6", + "blake3", + "block-buffer 0.10.4", + "bs58 0.4.0", + "bv", + "byteorder", + "cc", + "either", + "generic-array", + "im", + "lazy_static", + "log", + "memmap2", + "rustc_version", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.8", + "solana-frozen-abi-macro", + "subtle", + "thiserror", +] + +[[package]] +name = "solana-frozen-abi-macro" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "296e4cf0e2479e4c21afe4d17e32526f71f1bcd93b1c7c660900bc3e4233447a" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.48", +] + +[[package]] +name = "solana-loader-v4-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a902445f0bdf610e7eec94dab7f4a8e756d001c17651647730f1efcb9d7af6fe" +dependencies = [ + "log", + "solana-measure", + "solana-program-runtime", + "solana-sdk", + "solana_rbpf", +] + +[[package]] +name = "solana-logger" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d37a1b1a383a01039afbc6447a1712fb2a1a73a5ba8916762e693e8e492fabf3" +dependencies = [ + "env_logger", + "lazy_static", + "log", +] + +[[package]] +name = "solana-measure" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19831a93d760205f5c3e20d05a37b0e533caa1889e48041648ad0859e68ec336" +dependencies = [ + "log", + "solana-sdk", +] + +[[package]] +name = "solana-metrics" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63c23a8db755b2903262ad473e32cbf0093e2d3a0a7b8183d797a182c08326a" +dependencies = [ + "crossbeam-channel", + "gethostname", + "lazy_static", + "log", + "reqwest", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-net-utils" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ac1afc7feb590b45fd72bee0ca4c4f24b2386184d7e00d9f0d17913655bb4a" +dependencies = [ + "bincode", + "clap 3.2.25", + "crossbeam-channel", + "log", + "nix", + "rand 0.8.5", + "serde", + "serde_derive", + "socket2", + "solana-logger", + "solana-sdk", + "solana-version", + "tokio", + "url", +] + +[[package]] +name = "solana-perf" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdf5a429e018e8ba693f4c43f833192db421fe97b88dfaf97041aa258e4b191" +dependencies = [ + "ahash 0.8.6", + "bincode", + "bv", + "caps", + "curve25519-dalek", + "dlopen2", + "fnv", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "rayon", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3a3b9623f09e2c480b4e129c92d7a036f8614fd0fc7519791bd44e64061ce8" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.21.7", + "bincode", + "bitflags 2.4.2", + "blake3", + "borsh 0.10.3", + "borsh 0.9.3", + "bs58 0.4.0", + "bv", + "bytemuck", + "cc", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.12", + "itertools", + "js-sys", + "lazy_static", + "libc", + "libsecp256k1", + "light-poseidon", + "log", + "memoffset 0.9.0", + "num-bigint 0.4.4", + "num-derive 0.3.3", + "num-traits", + "parking_lot", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk-macro", + "thiserror", + "tiny-bip39", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-program-runtime" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5dbb56d36cc15b4cf5a71c0ce6262a263212f7a312b0dbc41b226654329c37" +dependencies = [ + "base64 0.21.7", + "bincode", + "eager", + "enum-iterator", + "itertools", + "libc", + "log", + "num-derive 0.3.3", + "num-traits", + "percentage", + "rand 0.8.5", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-program-test" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61bbf119c35d4393702953e586b72053c3b80a92c781931cd412d53d2036475e" +dependencies = [ + "assert_matches", + "async-trait", + "base64 0.21.7", + "bincode", + "chrono-humanize", + "crossbeam-channel", + "log", + "serde", + "solana-accounts-db", + "solana-banks-client", + "solana-banks-interface", + "solana-banks-server", + "solana-bpf-loader-program", + "solana-logger", + "solana-program-runtime", + "solana-runtime", + "solana-sdk", + "solana-vote-program", + "solana_rbpf", + "test-case", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-pubsub-client" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c22290c0d296a6a250a8d5b680797f12138a81af9c403a6ce62bd3ddad307e6" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f924d8722f9e910d790678a79c2a0bfed786dffe1aefa5d769f8548679794263" +dependencies = [ + "async-mutex", + "async-trait", + "futures", + "itertools", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "rcgen", + "rustls", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-rayon-threadlimit" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0a2e484e5b272690ac1431a6821f2b5180149d67c56934d9e007224ced15d0" +dependencies = [ + "lazy_static", + "num_cpus", +] + +[[package]] +name = "solana-remote-wallet" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb9a96d1c001d07a0abb08e05b92ff6528b2d9239d03c57f99f738527839eb12" +dependencies = [ + "console", + "dialoguer", + "log", + "num-derive 0.3.3", + "num-traits", + "parking_lot", + "qstring", + "semver", + "solana-sdk", + "thiserror", + "uriparse", +] + +[[package]] +name = "solana-rpc-client" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91503edfdb2ba9c5e0127048e7795f22e050cf2bcee1259361af113d533b4b26" +dependencies = [ + "async-trait", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "indicatif", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "131662e5eea4fa5fc88b01f07d9e430315c0976be848ba3994244249c5fb033a" +dependencies = [ + "base64 0.21.7", + "bs58 0.4.0", + "jsonrpc-core", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "spl-token-2022 1.0.0", + "thiserror", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67cdff955b9994ae240f6f287420c6727a581120c02ccc4f2fa535886732a1d" +dependencies = [ + "clap 2.34.0", + "solana-clap-utils", + "solana-rpc-client", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-runtime" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf63159e669f29065c9ff280c09f5b96139b00258502ee401338150fce78fed7" +dependencies = [ + "arrayref", + "base64 0.21.7", + "bincode", + "blake3", + "bv", + "bytemuck", + "byteorder", + "bzip2", + "crossbeam-channel", + "dashmap", + "dir-diff", + "flate2", + "fnv", + "fs-err", + "im", + "index_list", + "itertools", + "lazy_static", + "log", + "lru", + "lz4", + "memmap2", + "modular-bitfield", + "num-derive 0.3.3", + "num-traits", + "num_cpus", + "num_enum 0.6.1", + "ouroboros", + "percentage", + "qualifier_attr", + "rand 0.8.5", + "rayon", + "regex", + "rustc_version", + "serde", + "serde_derive", + "serde_json", + "siphasher", + "solana-accounts-db", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-bucket-map", + "solana-compute-budget-program", + "solana-config-program", + "solana-cost-model", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-loader-v4-program", + "solana-measure", + "solana-metrics", + "solana-perf", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-version", + "solana-vote", + "solana-vote-program", + "solana-zk-token-proof-program", + "solana-zk-token-sdk", + "static_assertions", + "strum", + "strum_macros", + "symlink", + "tar", + "tempfile", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-sdk" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb34583922c5e79004ad8d8d69f333d274d21b614f0e1a575f325fc29a104ec2" +dependencies = [ + "assert_matches", + "base64 0.21.7", + "bincode", + "bitflags 2.4.2", + "borsh 0.10.3", + "bs58 0.4.0", + "bytemuck", + "byteorder", + "chrono", + "derivation-path", + "digest 0.10.7", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "hmac 0.12.1", + "itertools", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memmap2", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "pbkdf2 0.11.0", + "qstring", + "qualifier_attr", + "rand 0.7.3", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-logger", + "solana-program", + "solana-sdk-macro", + "thiserror", + "uriparse", + "wasm-bindgen", +] + +[[package]] +name = "solana-sdk-macro" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60f58786e949f43b8c9b826fdfa5ad8586634b077ab04f989fb8e30535786712" +dependencies = [ + "bs58 0.4.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.48", +] + +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + +[[package]] +name = "solana-send-transaction-service" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9987eccfe96b38785d95840277da4238de4f01166d0c32ec9bbfc5a319f4a530" +dependencies = [ + "crossbeam-channel", + "log", + "solana-client", + "solana-measure", + "solana-metrics", + "solana-runtime", + "solana-sdk", + "solana-tpu-client", +] + +[[package]] +name = "solana-stake-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab247c866dab350bf610df8e1fab97ae0a0519cb81914348d382eac9e80940d" +dependencies = [ + "bincode", + "log", + "rustc_version", + "solana-config-program", + "solana-program-runtime", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-streamer" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efe4c33e0f68ea7a3701650badf6753b85fef2100cac6bc187c8e443e61c53da" +dependencies = [ + "async-channel", + "bytes", + "crossbeam-channel", + "futures-util", + "histogram", + "indexmap 2.1.0", + "itertools", + "libc", + "log", + "nix", + "pem", + "percentage", + "pkcs8", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rcgen", + "rustls", + "solana-metrics", + "solana-perf", + "solana-sdk", + "thiserror", + "tokio", + "x509-parser", +] + +[[package]] +name = "solana-system-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24147d17f13bef6548d15a7fc63eb8a3271523f7ffc91f13032944b0dc34f974" +dependencies = [ + "bincode", + "log", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-thin-client" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e782aabf9443a36d65e74d70ce732cc844707a5fec5a498bcbd81d3de7598c" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", +] + +[[package]] +name = "solana-tpu-client" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980bee30cbfe3c51f973da7fdcccb9df2c2d9b9175c06066b293499e02108fd4" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap 2.1.0", + "indicatif", + "log", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-transaction-status" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c180013e406418d593ce7b51da7007a638ace18261de14901b090e53a1d7025" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bs58 0.4.0", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "spl-associated-token-account", + "spl-memo", + "spl-token", + "spl-token-2022 1.0.0", + "thiserror", +] + +[[package]] +name = "solana-udp-client" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab995970a424c89b7966a01aec90cdf1685c49aacf38a5f463200fc273a7d86b" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-version" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32cc394aa7132ab7f270801b98bf47fa585ab93f1038e5be27e480d7b5b2dca" +dependencies = [ + "log", + "rustc_version", + "semver", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", +] + +[[package]] +name = "solana-vote" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6092058284f0e02274177c45a22032eb7288aa4f6f8003ed469b1a562cac3bd" +dependencies = [ + "crossbeam-channel", + "itertools", + "log", + "rustc_version", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", + "solana-vote-program", + "thiserror", +] + +[[package]] +name = "solana-vote-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589cad4dccb4392e23f5ae4ccdd1f0aaa10f2823b264b27c4feb6382f40f4fd4" +dependencies = [ + "bincode", + "log", + "num-derive 0.3.3", + "num-traits", + "rustc_version", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-zk-token-proof-program" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6b02ddeb2ab414b513b523aa678fac81109214f08d5c080165c15483a22cce" +dependencies = [ + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "1.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d932d7b13a223a6c1068d7061df7e9d2de14bfc0a874350eef19d59086b04a" +dependencies = [ + "aes-gcm-siv", + "base64 0.21.7", + "bincode", + "bytemuck", + "byteorder", + "curve25519-dalek", + "getrandom 0.1.16", + "itertools", + "lazy_static", + "merlin", + "num-derive 0.3.3", + "num-traits", + "rand 0.7.3", + "serde", + "serde_json", + "sha3 0.9.1", + "solana-program", + "solana-sdk", + "subtle", + "thiserror", + "zeroize", +] + +[[package]] +name = "solana_rbpf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d457cc2ba742c120492a64b7fa60e22c575e891f6b55039f4d736568fb112a3" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "spl-associated-token-account" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "992d9c64c2564cc8f63a4b508bf3ebcdf2254b0429b13cd1d31adb6162432a5f" +dependencies = [ + "assert_matches", + "borsh 0.10.3", + "num-derive 0.4.1", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022 1.0.0", + "thiserror", +] + +[[package]] +name = "spl-discriminator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadbefec4f3c678215ca72bd71862697bb06b41fd77c0088902dd3203354387b" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.48", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e5f2044ca42c8938d54d1255ce599c79a1ffd86b677dfab695caa20f9ffc3f2" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.48", + "thiserror", +] + +[[package]] +name = "spl-memo" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +dependencies = [ + "borsh 0.10.3", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" +dependencies = [ + "num-derive 0.4.1", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5269c8e868da17b6552ef35a51355a017bd8e0eae269c201fef830d35fa52c" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.48", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-token" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "solana-program", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.1", + "num-traits", + "num_enum 0.7.2", + "solana-program", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token", + "spl-token-metadata-interface", + "spl-transfer-hook-interface 0.3.0", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.1", + "num-traits", + "num_enum 0.7.2", + "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface 0.4.1", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.3", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution 0.4.0", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution 0.5.1", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + +[[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.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tar" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tarpc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38a012bed6fb9681d3bf71ffaa4f88f3b4b9ed3198cda6e4c8462d24d4bb80" +dependencies = [ + "anyhow", + "fnv", + "futures", + "humantime", + "opentelemetry", + "pin-project", + "rand 0.8.5", + "serde", + "static_assertions", + "tarpc-plugins", + "thiserror", + "tokio", + "tokio-serde", + "tokio-util 0.6.10", + "tracing", + "tracing-opentelemetry", +] + +[[package]] +name = "tarpc-plugins" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "test-case" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" +dependencies = [ + "test-case-macros", +] + +[[package]] +name = "test-case-core" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "test-case-macros" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "test-case-core", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + +[[package]] +name = "thiserror" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-bip39" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +dependencies = [ + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", + "rand 0.7.3", + "rustc-hash", + "sha2 0.9.9", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" +dependencies = [ + "bincode", + "bytes", + "educe", + "futures-core", + "futures-sink", + "pin-project", + "serde", + "serde_json", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.25.4", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" +dependencies = [ + "once_cell", + "opentelemetry", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "sha1", + "thiserror", + "url", + "utf-8", + "webpki-roots 0.24.0", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" + +[[package]] +name = "web-sys" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" +dependencies = [ + "rustls-webpki", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + +[[package]] +name = "winnow" +version = "0.5.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1931d78a9c73861da0134f453bb1f790ce49b2e30eba8410b4b79bac72b46a2d" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs", + "base64 0.13.1", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.9+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0f3ede4 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[workspace] +members = ["cli", "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/README.md b/README.md new file mode 100644 index 0000000..ea806c5 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Confidential Transfer Wrapped Token Program (CTW Token) + +This repository contains a Solana program built with the new SPL Token Extensions, the goal is to give users the ability to perform Confidential Transfers on so-called SPL Token Mints, along with a CLI and a small TS SDK to help potential integrations. + +## Program + +The program features only three instructions: + +- Initialize + - This permissionless instruction allows creating a CTW Mint for any given SPL Token Mint + - All CTW Token Mints have the same number of decimals as their SPL Token Mint counterpart + - The freeze authority of the existing SPL Token Mint is COPIED over to the CTW Mint, meaning if it is set it will also be set on the new Mint +- Wrap + - This instruction allows wrapping a given amount of an Legacy Mint for the corresponding amount of the equivalent CTW Mint + - An initialized and configured Confidential Transfer Account (CTA) must be passed in + - The given amount of SPL Token is transferred from the user's Legacy Token Account into the program's vault and an equivalent amount of the CTW Token is minted into the public component of the CTA and instantly deposited + - Integrators still need to execute `ApplyPendingBalance` after calling this instruction +- Unwrap + - This instruction allows unwrapping a given amount of a CTW Mint for the corresponding amount of the equivalent SPL Token Mint + - A CTA with enough balance in it's public component must be passed in + - The given amount of CTW Token is burned by the program and an equivalent amount of the SPL Token Mint is transferred from the program's vault into the user's Legacy Token Account + - Integrators may need to execute `Withdraw` and `VerifyWithdraw` beforehand to guarantee the previous point + +## Notes + +- The program is currently unable to be used in any of the clusters due to `zk-token-proof` not being present. +- In order to successfully test the program using `solana-program-test`, the SPL Token Extensions Program had to be built locally with the `zk-ops` feature enabled and the output was used to override the `spl_token_2022` program available. \ No newline at end of file diff --git a/cli/Cargo.toml b/cli/Cargo.toml new file mode 100644 index 0000000..8a6f088 --- /dev/null +++ b/cli/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "ctw-token-cli" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[[bin]] +name = "ctw-token-cli" +path = "src/main.rs" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] + +[dependencies] +anchor-lang = "0.29.0" +anchor-spl = "0.29.0" +arrayref = "0.3.7" + +clap = { version = "4.5.1", features = ["derive"] } +ctw-token = { path = "../programs/ctw_token", features = ["client"] } + +solana-clap-utils = "~1.17" +solana-client = "~1.17" +solana-sdk = "~1.17" +spl-associated-token-account = "2.3.0" + +thiserror = "1.0.57" diff --git a/cli/src/main.rs b/cli/src/main.rs new file mode 100644 index 0000000..bb97d66 --- /dev/null +++ b/cli/src/main.rs @@ -0,0 +1,768 @@ +use { + anchor_lang::{InstructionData, ToAccountMetas}, + anchor_spl::{ + associated_token::{ + self, get_associated_token_address, get_associated_token_address_with_program_id, + }, + token::{ + spl_token::{ + self, + instruction::{close_account, initialize_account}, + native_mint, + }, + TokenAccount, + }, + token_2022, + token_interface::spl_token_2022::{ + extension::{ + confidential_transfer::{ + instruction::{apply_pending_balance, inner_configure_account, inner_withdraw}, + ConfidentialTransferAccount, + }, + BaseStateWithExtensions, ExtensionType, StateWithExtensions, + }, + instruction::reallocate, + proof::ProofLocation, + solana_zk_token_sdk::{ + encryption::{ + auth_encryption::AeKey, + elgamal::{ElGamalCiphertext, ElGamalKeypair}, + }, + zk_token_proof_instruction::{ + verify_pubkey_validity, verify_withdraw, PubkeyValidityData, WithdrawData, + }, + }, + state::{Account, Mint}, + }, + }, + clap::{Parser, Subcommand}, + ctw_token::{ + accounts::{Initialize, Unwrap, Wrap}, + derive_confidential_mint, + }, + solana_client::rpc_client::RpcClient, + solana_sdk::{ + instruction::Instruction, + pubkey::{ParsePubkeyError, Pubkey}, + signature::{read_keypair_file, Keypair, Signature}, + signer::Signer, + system_instruction::create_account, + system_program, + transaction::Transaction, + }, + spl_associated_token_account::instruction::create_associated_token_account, + std::{num::NonZeroI8, path::PathBuf, str::FromStr}, + thiserror::Error, +}; + +#[derive(Debug, Error)] +enum Error { + #[error(transparent)] + Client(#[from] solana_client::client_error::ClientError), + #[error("Loading keypair. {:?}", self)] + LoadingKeypair(Box), +} + +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +struct Args { + #[arg(short, long)] + rpc_client: String, + + #[arg(short, long)] + keypair_path: PathBuf, + + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand, Debug, Clone)] +enum Commands { + /// Initialize a Confidential Wrapped Token Mint for an existing SPL Token Mint. + Initialize { + /// The SPL Token Mint for which to create a Confidential Wrapped Token. + #[arg(short, long)] + token_mint: String, + }, + /// Wrap a given token amount into the corresponding Confidential Wrapped Token. + Wrap { + /// The SPL Token Mint to wrap into a Confidential Wrapped Token. + #[arg(short, long)] + token_mint: String, + /// The amount to wrap. + #[arg(short, long)] + amount: u64, + }, + /// Unwrap a given token amount of Confidential Wrapped Token into the corresponding SPL Token. + Unwrap { + /// The SPL Token Mint to unwrap from a Confidential Wrapped Token. + #[arg(short, long)] + token_mint: String, + /// The amount to unwrap. + #[arg(short, long)] + amount: u64, + }, +} + +fn parse_pubkey(value: &str) -> Result { + Pubkey::from_str(value) +} + +fn load_keypair(path: PathBuf) -> Result { + match read_keypair_file(path) { + Ok(k) => Ok(k), + Err(e) => Err(Error::LoadingKeypair(e)), + } +} + +fn main() { + let cli = Args::parse(); + + let rpc_client = RpcClient::new(cli.rpc_client); + + let signer = match load_keypair(cli.keypair_path) { + Ok(k) => k, + Err(e) => { + println!("Could not load the given keypair.\nError: {:?}", e); + return; + } + }; + + match cli.command { + Commands::Initialize { token_mint } => { + println!("Initializing Confidential Wrapped Token Mint.."); + + let token_mint = match parse_pubkey(&token_mint) { + Ok(p) => p, + Err(e) => { + println!("Failed to parse token mint pubkey.\nError: {:?}", e); + return; + } + }; + + println!("SPL Token Mint: {}", token_mint); + + match initialize(&rpc_client, &signer, &token_mint) { + Ok(s) => { + println!("Successfully initialized confidential wrapped token..\nTransaction signature: https://solana.fm/tx/{}", s); + } + Err(e) => { + println!( + "Failed to initialize confidential wrapped token.\nError: {:?}", + e + ); + return; + } + }; + } + Commands::Wrap { token_mint, amount } => { + println!( + "Wrapping {} of {} into the equivalent Confidential Wrapped Token Mint..", + amount, token_mint + ); + + let token_mint = match parse_pubkey(&token_mint) { + Ok(p) => p, + Err(e) => { + println!("Failed to parse token mint pubkey.\nError: {:?}", e); + return; + } + }; + + println!("SPL Token Mint: {}", token_mint); + + match create_and_configure_confidential_token_account(&rpc_client, &signer, &token_mint) + { + Ok(s) => { + println!("Successfully created and configured token account for confidential token usage..\nTransaction signature: https://solana.fm/tx/{}", s); + } + Err(e) => { + println!("Failed to create and configure token account for confidential token.\nError: {:?}",e); + return; + } + }; + + match wrap(&rpc_client, &signer, &token_mint, amount) { + Ok(s) => { + println!( + "Successfully wrapped...\nTransaction signature: https://solana.fm/tx/{}", + s + ); + } + Err(e) => { + println!("Failed to wrap.\nError: {:?}", e); + return; + } + }; + + match post_wrap(&rpc_client, &signer, &token_mint, amount) { + Ok(s) => { + println!( + "Wrapped amount is now available for confidential transfers!\nTransaction signature: https://solana.fm/tx/{}", + s + ); + } + Err(e) => { + println!( + "Failed to deposit and apply pending balance.\nError: {:?}", + e + ); + return; + } + }; + } + Commands::Unwrap { token_mint, amount } => { + println!( + "Unwrapping {} into {} into SPL Token Mint..", + amount, token_mint + ); + + let token_mint = match parse_pubkey(&token_mint) { + Ok(p) => p, + Err(e) => { + println!("Failed to parse token mint pubkey.\nError: {:?}", e); + return; + } + }; + + println!("SPL Token Mint: {}", token_mint); + + match withdraw_and_verify(&rpc_client, &signer, &token_mint, amount) { + Ok(s) => { + println!( + "Successfully processed withdrawawl from confidential balance..\nTransaction signature: https://solana.fm/tx/{}", + s + ); + } + Err(e) => { + println!("Failed to wrap.\nError: {:?}", e); + return; + } + }; + + match unwrap(&rpc_client, &signer, &token_mint, amount) { + Ok(s) => { + println!( + "Successfully unwrapped!\nTransaction signature: https://solana.fm/tx/{}", + s + ); + } + Err(e) => { + println!("Failed to unwrap.\nError: {:?}", e); + return; + } + }; + } + } +} + +fn initialize( + rpc_client: &RpcClient, + signer: &Keypair, + token_mint: &Pubkey, +) -> Result { + let elgamal_keypair = ElGamalKeypair::new_from_signer(signer, "auditor".as_ref()).unwrap(); + + let (confidential_mint, _) = derive_confidential_mint(token_mint); + + println!("Confidnetial Wrapped Token Mint: {}", confidential_mint); + + let token_vault = get_associated_token_address(&ctw_token::authority::ID, token_mint); + + let ix = Instruction { + accounts: Initialize { + token_mint: *token_mint, + program_authority: ctw_token::authority::ID, + confidential_mint, + token_vault, + payer: signer.pubkey(), + token_program: spl_token::ID, + associated_token_program: associated_token::ID, + token_extensions_program: token_2022::ID, + system_program: system_program::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Initialize { + auditor_pubkey: elgamal_keypair.pubkey().to_bytes(), + } + .data(), + }; + let latest_blockhash = match rpc_client.get_latest_blockhash() { + Ok(lb) => lb, + Err(e) => { + return Err(Error::Client(e)); + } + }; + let tx = Transaction::new_signed_with_payer( + &vec![ix], + Some(&signer.pubkey()), + &[signer], + latest_blockhash, + ); + + match rpc_client.send_and_confirm_transaction_with_spinner(&tx) { + Ok(s) => Ok(s), + Err(e) => Err(Error::Client(e)), + } +} + +fn wrap( + rpc_client: &RpcClient, + signer: &Keypair, + token_mint: &Pubkey, + amount: u64, +) -> Result { + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let token_vault = get_associated_token_address(&ctw_token::authority::ID, token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + let (token_account, ixs) = if token_mint == &native_mint::id() { + let keypair = Keypair::new(); + let token_account = keypair.pubkey(); + let lamports = rpc_client + .get_minimum_balance_for_rent_exemption(TokenAccount::LEN) + .unwrap(); + ( + Some(keypair), + vec![ + create_account( + &signer.pubkey(), + &token_account, + lamports + amount, + TokenAccount::LEN as u64, + &spl_token::id(), + ), + initialize_account( + &spl_token::id(), + &token_account, + token_mint, + &signer.pubkey(), + ) + .unwrap(), + Instruction { + accounts: Wrap { + token_mint: *token_mint, + token_account, + program_authority: ctw_token::authority::ID, + confidential_mint, + confidential_token_account, + token_vault, + authority: signer.pubkey(), + payer: signer.pubkey(), + token_program: spl_token::ID, + token_extensions_program: token_2022::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Wrap { amount }.data(), + }, + close_account( + &spl_token::id(), + &token_account, + &signer.pubkey(), + &signer.pubkey(), + &[], + ) + .unwrap(), + ], + ) + } else { + let token_account = get_associated_token_address(&signer.pubkey(), token_mint); + ( + None, + vec![Instruction { + accounts: Wrap { + token_mint: *token_mint, + token_account, + program_authority: ctw_token::authority::ID, + confidential_mint, + confidential_token_account, + token_vault, + authority: signer.pubkey(), + payer: signer.pubkey(), + token_program: spl_token::ID, + token_extensions_program: token_2022::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Wrap { amount }.data(), + }], + ) + }; + + let latest_blockhash = match rpc_client.get_latest_blockhash() { + Ok(lb) => lb, + Err(e) => { + return Err(Error::Client(e)); + } + }; + + let mut tx = Transaction::new_with_payer(&ixs, Some(&signer.pubkey())); + tx.partial_sign(&[signer], latest_blockhash); + + if let Some(signer) = token_account { + tx.partial_sign(&[&signer], latest_blockhash); + } + + match rpc_client.send_and_confirm_transaction_with_spinner(&tx) { + Ok(s) => Ok(s), + Err(e) => Err(Error::Client(e)), + } +} + +fn unwrap( + rpc_client: &RpcClient, + signer: &Keypair, + token_mint: &Pubkey, + amount: u64, +) -> Result { + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let token_vault = get_associated_token_address(&ctw_token::authority::ID, token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + let (token_account, ixs) = if token_mint == &native_mint::id() { + let keypair = Keypair::new(); + let token_account = keypair.pubkey(); + let lamports = rpc_client + .get_minimum_balance_for_rent_exemption(TokenAccount::LEN) + .unwrap(); + ( + Some(keypair), + vec![ + create_account( + &signer.pubkey(), + &token_account, + lamports, + TokenAccount::LEN as u64, + &spl_token::id(), + ), + initialize_account( + &spl_token::id(), + &token_account, + token_mint, + &signer.pubkey(), + ) + .unwrap(), + Instruction { + accounts: Unwrap { + token_mint: *token_mint, + token_account, + program_authority: ctw_token::authority::ID, + confidential_mint, + confidential_token_account, + token_vault, + authority: signer.pubkey(), + payer: signer.pubkey(), + token_program: spl_token::ID, + token_extensions_program: token_2022::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Unwrap { amount }.data(), + }, + close_account( + &spl_token::id(), + &token_account, + &signer.pubkey(), + &signer.pubkey(), + &[], + ) + .unwrap(), + ], + ) + } else { + let token_account = get_associated_token_address(&signer.pubkey(), token_mint); + ( + None, + vec![Instruction { + accounts: Unwrap { + token_mint: *token_mint, + token_account, + program_authority: ctw_token::authority::ID, + confidential_mint, + confidential_token_account, + token_vault, + authority: signer.pubkey(), + payer: signer.pubkey(), + token_program: spl_token::ID, + token_extensions_program: token_2022::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Unwrap { amount }.data(), + }], + ) + }; + + let latest_blockhash = match rpc_client.get_latest_blockhash() { + Ok(lb) => lb, + Err(e) => { + return Err(Error::Client(e)); + } + }; + + let mut tx = Transaction::new_with_payer(&ixs, Some(&signer.pubkey())); + tx.partial_sign(&[signer], latest_blockhash); + + if let Some(signer) = token_account { + tx.partial_sign(&[&signer], latest_blockhash); + } + + match rpc_client.send_and_confirm_transaction_with_spinner(&tx) { + Ok(s) => Ok(s), + Err(e) => Err(Error::Client(e)), + } +} + +fn create_and_configure_confidential_token_account( + rpc_client: &RpcClient, + signer: &Keypair, + token_mint: &Pubkey, +) -> Result { + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + let mut ixs = vec![ + create_associated_token_account( + &signer.pubkey(), + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ), + reallocate( + &token_2022::ID, + &confidential_token_account, + &signer.pubkey(), + &signer.pubkey(), + &[], + &[ExtensionType::ConfidentialTransferAccount], + ) + .unwrap(), + ]; + + let elgamal_keypair = ElGamalKeypair::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + let proof_data = PubkeyValidityData::new(&elgamal_keypair).unwrap(); + + println!( + "Using ElGamal keypair with public key: {}", + elgamal_keypair.pubkey() + ); + + println!("Building validity proofs.."); + + let proof_data_location = + ProofLocation::InstructionOffset(NonZeroI8::new(1).unwrap(), &proof_data); + + let ae_key = AeKey::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + let decryptable_zero_balance = ae_key.encrypt(0); + + ixs.extend(vec![ + inner_configure_account( + &token_2022::ID, + &confidential_token_account, + &confidential_mint, + decryptable_zero_balance, + u64::MAX, + &signer.pubkey(), + &[], + proof_data_location, + ) + .unwrap(), + verify_pubkey_validity(None, &proof_data), + ]); + + println!("Submitting transaction..."); + + let latest_blockhash = match rpc_client.get_latest_blockhash() { + Ok(lb) => lb, + Err(e) => { + return Err(Error::Client(e)); + } + }; + let tx = Transaction::new_signed_with_payer( + &ixs, + Some(&signer.pubkey()), + &[signer], + latest_blockhash, + ); + + match rpc_client.send_and_confirm_transaction_with_spinner(&tx) { + Ok(s) => Ok(s), + Err(e) => Err(Error::Client(e)), + } +} + +fn withdraw_and_verify( + rpc_client: &RpcClient, + signer: &Keypair, + token_mint: &Pubkey, + amount: u64, +) -> Result { + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + let elgamal_keypair = ElGamalKeypair::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + println!( + "Using ElGamal keypair with public key: {}", + elgamal_keypair.pubkey() + ); + + let account = match rpc_client.get_account(&confidential_token_account) { + Ok(a) => a, + Err(e) => { + return Err(Error::Client(e)); + } + }; + + println!("Building validity proofs.."); + + let token_account = StateWithExtensions::::unpack(&account.data).unwrap(); + + let confidential_transfer_account = token_account + .get_extension::() + .unwrap(); + + let current_balance = confidential_transfer_account + .available_balance + .decrypt(elgamal_keypair.secret()) + .unwrap(); + println!("Current balance: {}", current_balance); + + let current_ciphertext = + ElGamalCiphertext::from_bytes(&confidential_transfer_account.available_balance.0).unwrap(); + + let proof_data = WithdrawData::new( + amount, + &elgamal_keypair, + current_balance, + ¤t_ciphertext, + ) + .unwrap(); + + let proof_data_location = + ProofLocation::InstructionOffset(NonZeroI8::new(1).unwrap(), &proof_data); + + let ae_key = AeKey::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + + let new_decryptable_zero_balance = ae_key.encrypt(current_balance - amount); + + let account = match rpc_client.get_account(&confidential_token_account) { + Ok(a) => a, + Err(e) => { + return Err(Error::Client(e)); + } + }; + + let confidential_mint_account = StateWithExtensions::::unpack(&account.data).unwrap(); + + println!("Proofs generated, building transaction.."); + + let ixs = vec![ + inner_withdraw( + &token_2022::ID, + &confidential_token_account, + &confidential_mint, + amount, + confidential_mint_account.base.decimals, + new_decryptable_zero_balance.into(), + &signer.pubkey(), + &[], + proof_data_location, + ) + .unwrap(), + verify_withdraw(None, &proof_data), + ]; + + println!("Submitting transaction..."); + + let latest_blockhash = match rpc_client.get_latest_blockhash() { + Ok(lb) => lb, + Err(e) => { + return Err(Error::Client(e)); + } + }; + let tx = Transaction::new_signed_with_payer( + &ixs, + Some(&signer.pubkey()), + &[signer], + latest_blockhash, + ); + + match rpc_client.send_and_confirm_transaction_with_spinner(&tx) { + Ok(s) => Ok(s), + Err(e) => Err(Error::Client(e)), + } +} + +fn post_wrap( + rpc_client: &RpcClient, + signer: &Keypair, + token_mint: &Pubkey, + amount: u64, +) -> Result { + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + let elgamal_keypair = ElGamalKeypair::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + println!( + "Using ElGamal keypair with public key: {}", + elgamal_keypair.pubkey() + ); + + println!("Building validity proofs.."); + + let ae_key = AeKey::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + let current_balance = 0; + let new_decryptable_zero_balance = ae_key.encrypt(current_balance + amount); + + println!("Proofs generated, building transaction.."); + + let ixs = vec![apply_pending_balance( + &token_2022::ID, + &confidential_token_account, + 1, + new_decryptable_zero_balance, + &signer.pubkey(), + &[], + ) + .unwrap()]; + + let latest_blockhash = match rpc_client.get_latest_blockhash() { + Ok(lb) => lb, + Err(e) => { + return Err(Error::Client(e)); + } + }; + let tx = Transaction::new_signed_with_payer( + &ixs, + Some(&signer.pubkey()), + &[signer], + latest_blockhash, + ); + + match rpc_client.send_and_confirm_transaction_with_spinner(&tx) { + Ok(s) => Ok(s), + Err(e) => Err(Error::Client(e)), + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9945f09 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "ctw-token", + "version": "1.0.0", + "description": "TypeScript SDK for the Confidential Transfer Wrapped Token Program.", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "files": [ + "lib/**/*" + ], + "repository": "https://github.com/hoakbuilds/ctw-token", + "author": "hoak", + "license": "MIT", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@coral-xyz/anchor": "^0.29.0", + "@solana/web3.js": "^1.90.0" + }, + "devDependencies": { + "prettier": "^2.6.2", + "typescript": "^4.3.5" + } +} \ No newline at end of file diff --git a/programs/ctw_token/Cargo.toml b/programs/ctw_token/Cargo.toml new file mode 100644 index 0000000..fc030f4 --- /dev/null +++ b/programs/ctw_token/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "ctw-token" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "ctw_token" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] +client = [] + +[dependencies] +# Without pinning `ahash` there is an issue with dependency versions +ahash = "=0.8.6" + +anchor-lang = "0.29.0" +anchor-spl = "0.29.0" + +ellipsis-macros = { git = "https://github.com/Ellipsis-Labs/ellipsis-macros.git" } + +solana-program = "~1.17" + +spl-token-2022 = { version = "1.0.0", features = ["zk-ops"] } + +[dev-dependencies] +solana-sdk = "~1.17" +solana-logger = "~1.17" +solana-program-test = "~1.17" + +spl-associated-token-account = "2.3.0" diff --git a/programs/ctw_token/Xargo.toml b/programs/ctw_token/Xargo.toml new file mode 100644 index 0000000..475fb71 --- /dev/null +++ b/programs/ctw_token/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/programs/ctw_token/src/lib.rs b/programs/ctw_token/src/lib.rs new file mode 100644 index 0000000..7cfad8d --- /dev/null +++ b/programs/ctw_token/src/lib.rs @@ -0,0 +1,468 @@ +use { + anchor_lang::{ + __private::bytemuck::{self, Pod}, + prelude::*, + }, + anchor_spl::{ + associated_token::AssociatedToken, + token::{Token}, + token_2022::{mint_to, MintTo}, + token_interface::{initialize_mint2, Mint, TokenAccount, transfer_checked, TransferChecked}, + }, + solana_program::{instruction::Instruction, program::invoke}, + spl_token_2022::{ + check_program_account, + extension::{ + confidential_transfer::instruction::{ + ConfidentialTransferInstruction, InitializeMintData, + }, + ExtensionType, + }, + instruction::{burn, TokenInstruction}, + solana_zk_token_sdk::zk_token_elgamal::pod::ElGamalPubkey, + state::{Mint as MintWithExtensions}, + }, +}; + +/// Utility function for encoding instruction data +pub(crate) fn encode_instruction, D: Pod>( + token_program_id: &Pubkey, + accounts: Vec, + token_instruction_type: TokenInstruction, + instruction_type: T, + instruction_data: &D, +) -> Instruction { + let mut data = token_instruction_type.pack(); + data.push(T::into(instruction_type)); + data.extend_from_slice(bytemuck::bytes_of(instruction_data)); + Instruction { + program_id: *token_program_id, + accounts, + data, + } +} + +/// Create a `InitializeMint` instruction +/// This fn within spl-token-2022 is marked with target not os = solana, +/// which makes it impossible for programs to initialize confidential transfers via cpi. +pub fn initialize_confidential_transfer( + token_program_id: &Pubkey, + mint: &Pubkey, + authority: Option, + auto_approve_new_accounts: bool, + auditor_elgamal_pubkey: Option, +) -> Result { + check_program_account(token_program_id)?; + let accounts = vec![AccountMeta::new(*mint, false)]; + + Ok(encode_instruction( + token_program_id, + accounts, + TokenInstruction::ConfidentialTransferExtension, + ConfidentialTransferInstruction::InitializeMint, + &InitializeMintData { + authority: authority.try_into()?, + auto_approve_new_accounts: auto_approve_new_accounts.into(), + auditor_elgamal_pubkey: auditor_elgamal_pubkey.try_into()?, + }, + )) +} + +declare_id!("cwTokjpVjxBeytEXomNe5B38EesYsNsXCm3JZC6tmvB"); + +/// The authority of the Confidential Transfer Wrapped Token Program. +pub mod authority { + use ellipsis_macros::declare_pda; + use solana_program::pubkey::Pubkey; + + declare_pda!( + "5txHjtUXKw716ZY4M5uCU7MG51htjMewqWr91uR8jyBz", + "cwTokjpVjxBeytEXomNe5B38EesYsNsXCm3JZC6tmvB", + "AUTHORITY" + ); +} + +#[derive(Clone)] +pub struct TokenExtensions; + +impl Id for TokenExtensions { + fn id() -> Pubkey { + spl_token_2022::id() + } +} + +pub const AUTHORITY_SEED: &'static str = "AUTHORITY"; +pub const MINT_SEED: &'static str = "MINT"; + +#[program] +pub mod ctw_token { + use solana_program::program_option::COption; + use spl_token_2022::extension::confidential_transfer::instruction::deposit; + + use super::*; + + /// Initialize a Confidential Transfer enabled Token Extensions Mint for an existing SPL Token Mint. + /// This Confidential Transfer enabled Token Extensions Mint, or Confidential Wrapped Token Mint, + /// effectively represents the same underlying SPL Token but with the ability to use Token Extensions' + /// zk-powered confidential transfers which mask the amount being transferred. + /// + /// # Notes + /// + /// This implementation does not require any new CT-enabled Token Accounts to be approved and + /// are 1:1 equivalents of the SPL Token. + pub fn initialize( + ctx: Context, + auditor_pubkey: [u8; 32], // solana_zk_token_sdk::zk_token_elgamal::pod::ElGamalPubkey length is 32 but it doesn't impl Borsh + ) -> Result<()> { + // Calculate space for the new mint with extensions + let space = ExtensionType::try_calculate_account_len::(&[ + ExtensionType::ConfidentialTransferMint, + ]) + .unwrap(); + let rent = Rent::get()?.minimum_balance(space); + + // Create the account for the new mint with extensions + anchor_lang::system_program::create_account( + CpiContext::new_with_signer( + ctx.accounts.system_program.to_account_info(), + anchor_lang::system_program::CreateAccount { + from: ctx.accounts.payer.to_account_info(), + to: ctx.accounts.confidential_mint.to_account_info(), + }, + &[&[ + ctx.accounts.token_mint.key().as_ref(), + MINT_SEED.as_ref(), + &[ctx.bumps.confidential_mint], + ]], + ), + rent, + space as u64, + ctx.accounts.token_extensions_program.key, + )?; + + // Initialize the confidential transfer extension + anchor_lang::solana_program::program::invoke( + &initialize_confidential_transfer( + &ctx.accounts.token_extensions_program.key(), + &ctx.accounts.confidential_mint.key(), + Some(ctx.accounts.program_authority.key()), + true, // By default we do not require approval of new token accounts + Some( + spl_token_2022::solana_zk_token_sdk::zk_token_elgamal::pod::ElGamalPubkey( + auditor_pubkey, + ), + ), + )?, + &[ + ctx.accounts.token_extensions_program.to_account_info(), + ctx.accounts.confidential_mint.to_account_info(), + ], + )?; + + let freeze_authority = if let COption::Some(fa) = ctx.accounts.token_mint.freeze_authority { + Some(fa) + } else { + None + }; + + // Initialize the new mint + initialize_mint2( + CpiContext::new_with_signer( + ctx.accounts.token_extensions_program.to_account_info(), + anchor_spl::token_interface::InitializeMint2 { + mint: ctx.accounts.confidential_mint.to_account_info(), + }, + &[&[ + ctx.accounts.token_mint.key().as_ref(), + MINT_SEED.as_ref(), + &[ctx.bumps.confidential_mint], + ]], + ), + ctx.accounts.token_mint.decimals, + &ctx.accounts.program_authority.key(), + freeze_authority.as_ref(), + )?; + Ok(()) + } + + /// Wrap the given token amount of an SPL Token into an equivalent amount of a Confidential Wrapped Token Mint. + /// + /// # Notes + /// + /// The integrator is responsible for passing in a TokenAccount for the `confidential_token_account` param + /// that has already been initialized and for which the [`ConfigureAccount`] as well as, if necessary, + /// the [`ApproveAccount`] instructions have been executed. + /// + /// After this instruction is called, the integrator is then free to call [`Deposit`] and [`ApplyPendingBalance`] + /// in order to roll the token amount into the available balance of the Confidential Token Account. + pub fn wrap(ctx: Context, amount: u64) -> Result<()> { + // Transfer tokens from the source to the program's vault + transfer_checked( + CpiContext::new( + ctx.accounts.token_program.to_account_info(), + TransferChecked { + from: ctx.accounts.token_account.to_account_info(), + mint: ctx.accounts.token_mint.to_account_info(), + to: ctx.accounts.token_vault.to_account_info(), + authority: ctx.accounts.authority.to_account_info(), + }, + ), + amount, + ctx.accounts.token_mint.decimals, + )?; + + // Mint equivalent amount of tokens to the confidential wrapper token account + mint_to( + CpiContext::new_with_signer( + ctx.accounts.token_extensions_program.to_account_info(), + MintTo { + mint: ctx.accounts.confidential_mint.to_account_info(), + to: ctx.accounts.confidential_token_account.to_account_info(), + authority: ctx.accounts.program_authority.to_account_info(), + }, + &[&[AUTHORITY_SEED.as_ref(), &[authority::bump()]]], + ), + amount, + )?; + + // Deposit the minted tokens into the confidential balance of the account + // OBS: This will still require integrations to call [`ApplyPendingBalance`] afterwards. + invoke( + &deposit( + &ctx.accounts.token_extensions_program.key(), + &ctx.accounts.confidential_token_account.key(), + &ctx.accounts.confidential_mint.key(), + amount, + ctx.accounts.confidential_mint.decimals, + &ctx.accounts.authority.key(), + &[], + ) + .unwrap(), + &[ + ctx.accounts.confidential_token_account.to_account_info(), + ctx.accounts.confidential_mint.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], + )?; + + Ok(()) + } + + /// Unwrap the given token amount of a Confidential Wrapped Token back into it's corresponding + /// SPL Token Mint. + /// + /// # Notes + /// + /// The integrator is responsible for assuring that the user has enough non-confidential + /// balance in order to unwrap and redeem for the underlying token. + /// This can be achieved by having the [`Withdraw`] instruction being successfully executed beforehand. + pub fn unwrap(ctx: Context, amount: u64) -> Result<()> { + // Burn the desired amount of tokens from the user's confidential token account + invoke( + &burn( + &ctx.accounts.token_extensions_program.key(), + &ctx.accounts.confidential_token_account.key(), + &ctx.accounts.confidential_mint.key(), + &ctx.accounts.authority.key(), + &[], + amount, + ) + .unwrap(), + &[ + ctx.accounts.confidential_token_account.to_account_info(), + ctx.accounts.confidential_mint.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], + )?; + + // Transfer tokens from the program's vault to the destination account + transfer_checked( + CpiContext::new_with_signer( + ctx.accounts.token_program.to_account_info(), + TransferChecked { + from: ctx.accounts.token_vault.to_account_info(), + mint: ctx.accounts.token_mint.to_account_info(), + to: ctx.accounts.token_account.to_account_info(), + authority: ctx.accounts.program_authority.to_account_info(), + }, + &[&[AUTHORITY_SEED.as_ref(), &[authority::bump()]]], + ), + amount, + ctx.accounts.token_mint.decimals, + )?; + + Ok(()) + } +} + +#[derive(Accounts)] +pub struct Initialize<'info> { + /// The SPL Token Mint for which we want to create a Confidential Transfers Mint Wrapper. + pub token_mint: Box>, + + #[account( + mut, + seeds = [ + token_mint.key().as_ref(), + MINT_SEED.as_ref() + ], + bump + )] + /// The SPL Token Extensions Mint. + /// CHECK: Seeds are checked. + pub confidential_mint: AccountInfo<'info>, + + #[account( + seeds = [ + AUTHORITY_SEED.as_ref() + ], + bump + )] + /// The authority of the Confidential Wrapper Token Program. + /// CHECK: Seeds are checked. + pub program_authority: AccountInfo<'info>, + + /// The token vault. + #[account( + init, + associated_token::mint = token_mint, + associated_token::authority = program_authority, + payer = payer, + )] + pub token_vault: Box>, + + /// The fee and rent payer. + #[account(mut)] + pub payer: Signer<'info>, + + /// The Token Program. + pub token_program: Program<'info, Token>, + + /// The Associated Token Program. + pub associated_token_program: Program<'info, AssociatedToken>, + + /// The Token Extensions Program. + pub token_extensions_program: Program<'info, TokenExtensions>, + + /// The System Program. + pub system_program: Program<'info, System>, +} + +#[derive(Accounts)] +pub struct Wrap<'info> { + /// The mint of the token being wrapped. + pub token_mint: Box>, + + #[account( + mut, + token::authority = authority, + token::mint = token_mint + )] + pub token_account: Box>, + + #[account( + mut, + token::authority = program_authority, + token::mint = token_mint + )] + pub token_vault: Box>, + + #[account( + mut, + seeds = [ + token_mint.key().as_ref(), + MINT_SEED.as_ref() + ], + bump, + )] + /// The mint of the token being wrapped. + pub confidential_mint: Box>, + + #[account(mut)] + pub confidential_token_account: Box>, + + #[account( + seeds = [ + AUTHORITY_SEED.as_ref() + ], + bump + )] + /// The authority of the Confidential Wrapper Token Program. + /// CHECK: Seeds are checked. + pub program_authority: AccountInfo<'info>, + + /// The authority of the source token account. + pub authority: Signer<'info>, + + /// The fee and rent payer. + #[account(mut)] + pub payer: Signer<'info>, + + /// The Token Interface. + pub token_program: Program<'info, Token>, + + /// The Token Interface. + pub token_extensions_program: Program<'info, TokenExtensions>, +} + +#[derive(Accounts)] +pub struct Unwrap<'info> { + /// The mint of the token being wrapped. + pub token_mint: Box>, + + #[account( + mut, + token::authority = authority, + token::mint = token_mint + )] + pub token_account: Box>, + + #[account( + mut, + token::authority = program_authority, + token::mint = token_mint + )] + pub token_vault: Box>, + + #[account( + mut, + seeds = [ + token_mint.key().as_ref(), + MINT_SEED.as_ref() + ], + bump + )] + /// The mint of the token being wrapped. + pub confidential_mint: Box>, + + #[account(mut)] + pub confidential_token_account: Box>, + + #[account( + seeds = [ + AUTHORITY_SEED.as_ref() + ], + bump + )] + /// The authority of the Confidential Wrapper Token Program. + /// CHECK: Seeds are checked. + pub program_authority: AccountInfo<'info>, + + /// The authority of the source token account. + pub authority: Signer<'info>, + + /// The fee and rent payer. + #[account(mut)] + pub payer: Signer<'info>, + + /// The Token Interface. + pub token_program: Program<'info, Token>, + + /// The Token Interface. + pub token_extensions_program: Program<'info, TokenExtensions>, +} + +#[cfg(feature = "client")] +pub fn derive_confidential_mint(token_mint: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[token_mint.as_ref(), MINT_SEED.as_ref()], &crate::id()) +} diff --git a/programs/ctw_token/tests/e2e.rs b/programs/ctw_token/tests/e2e.rs new file mode 100644 index 0000000..dce90b5 --- /dev/null +++ b/programs/ctw_token/tests/e2e.rs @@ -0,0 +1,687 @@ +use { + anchor_lang::{InstructionData, ToAccountMetas}, + anchor_spl::{ + associated_token::{ + self, get_associated_token_address, get_associated_token_address_with_program_id, + }, + token::{ + spl_token::{ + self, + instruction::{close_account, initialize_account}, + native_mint, + }, + TokenAccount, + }, + token_2022, + token_interface::spl_token_2022::{ + extension::confidential_transfer::instruction::{ + apply_pending_balance, inner_configure_account, inner_withdraw, + }, + proof::ProofLocation, + solana_zk_token_sdk::{ + encryption::{ + auth_encryption::AeKey, + elgamal::{ElGamalCiphertext, ElGamalKeypair}, + }, + zk_token_proof_instruction::{ + verify_pubkey_validity, verify_withdraw, PubkeyValidityData, WithdrawData, + }, + }, + }, + }, + ctw_token::{ + accounts::{Initialize, Unwrap, Wrap}, + derive_confidential_mint, + }, + solana_program::{ + instruction::Instruction, native_token::sol_to_lamports, program_option::COption, + program_pack::Pack, pubkey::Pubkey, system_instruction::create_account, system_program, + }, + solana_program_test::{tokio, BanksClient, BanksClientError, ProgramTest, ProgramTestContext}, + solana_sdk::{signature::Keypair, signer::Signer, transaction::Transaction}, + spl_associated_token_account::instruction::create_associated_token_account, + spl_token_2022::{ + extension::{ + confidential_transfer::ConfidentialTransferAccount, BaseStateWithExtensions, + ExtensionType, StateWithExtensions, + }, + instruction::reallocate, + state::{Account, Mint}, + }, + std::num::NonZeroI8, +}; + +pub async fn start_new_program_test() -> ProgramTestContext { + // Supress some of the logs + solana_logger::setup_with_default( + "solana_rbpf::vm=info,\ + solana_runtime::message_processor=trace, + solana_runtime::system_instruction_processor=info,\ + solana_program_test=info", + ); + + let mut test = ProgramTest::new("ctw_token", ctw_token::id(), None); + + test.add_program("spl_token_2022", spl_token_2022::id(), None); + + let mut account = solana_sdk::account::Account::new( + u32::MAX as u64, + spl_token::state::Mint::LEN, + &spl_token::id(), + ); + + spl_token::state::Mint { + is_initialized: true, + mint_authority: COption::None, + decimals: 9, + ..spl_token::state::Mint::default() + } + .pack_into_slice(&mut account.data); + test.add_account(native_mint::id(), account); + + let context = test.start_with_context().await; + context +} + +#[tokio::test] +async fn end_to_end() { + let mut test = start_new_program_test().await; + + initialize(&mut test.banks_client, &test.payer, &native_mint::id()) + .await + .unwrap(); + + println!("OK"); + + create_and_configure_confidential_token_account( + &mut test.banks_client, + &test.payer, + &native_mint::id(), + ) + .await + .unwrap(); + + println!("OK"); + + let amount = sol_to_lamports(1.0); + + wrap( + &mut test.banks_client, + &test.payer, + &native_mint::id(), + amount, + ) + .await + .unwrap(); + + println!("OK"); + + post_wrap( + &mut test.banks_client, + &test.payer, + &native_mint::id(), + amount, + ) + .await + .unwrap(); + + println!("OK"); + + withdraw_and_verify( + &mut test.banks_client, + &test.payer, + &native_mint::id(), + amount, + ) + .await + .unwrap(); + + println!("OK"); + + unwrap( + &mut test.banks_client, + &test.payer, + &native_mint::id(), + amount, + ) + .await + .unwrap(); +} + +async fn initialize( + banks_client: &mut BanksClient, + signer: &Keypair, + token_mint: &Pubkey, +) -> Result<(), BanksClientError> { + let elgamal_keypair = ElGamalKeypair::new_from_signer(signer, "auditor".as_ref()).unwrap(); + + let (confidential_mint, _) = derive_confidential_mint(token_mint); + + println!( + "Creating Confidential Wrapped Token Mint: {}", + confidential_mint + ); + + let token_vault = get_associated_token_address(&ctw_token::authority::ID, token_mint); + + let ix = Instruction { + accounts: Initialize { + token_mint: *token_mint, + program_authority: ctw_token::authority::ID, + confidential_mint, + token_vault, + payer: signer.pubkey(), + token_program: spl_token::ID, + associated_token_program: associated_token::ID, + token_extensions_program: token_2022::ID, + system_program: system_program::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Initialize { + auditor_pubkey: elgamal_keypair.pubkey().to_bytes(), + } + .data(), + }; + + println!("Submitting transaction..."); + + let latest_blockhash = match banks_client.get_latest_blockhash().await { + Ok(lb) => lb, + Err(e) => { + return Err(e); + } + }; + let tx = Transaction::new_signed_with_payer( + &vec![ix], + Some(&signer.pubkey()), + &[signer], + latest_blockhash, + ); + + match banks_client.process_transaction(tx).await { + Ok(_) => Ok(()), + Err(e) => Err(e), + } +} + +async fn wrap( + banks_client: &mut BanksClient, + signer: &Keypair, + token_mint: &Pubkey, + amount: u64, +) -> Result<(), BanksClientError> { + println!("\nWrapping into Confidential Transfer Wrapped Token.."); + + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let token_vault = get_associated_token_address(&ctw_token::authority::ID, token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + let rent = banks_client.get_rent().await.unwrap(); + + println!("Building transaction.."); + + let (token_account, ixs) = if token_mint == &native_mint::id() { + let keypair = Keypair::new(); + let token_account = keypair.pubkey(); + let lamports = rent.minimum_balance(TokenAccount::LEN); + ( + Some(keypair), + vec![ + create_account( + &signer.pubkey(), + &token_account, + lamports + amount, + TokenAccount::LEN as u64, + &spl_token::id(), + ), + initialize_account( + &spl_token::id(), + &token_account, + token_mint, + &signer.pubkey(), + ) + .unwrap(), + Instruction { + accounts: Wrap { + token_mint: *token_mint, + token_account, + program_authority: ctw_token::authority::ID, + confidential_mint, + confidential_token_account, + token_vault, + authority: signer.pubkey(), + payer: signer.pubkey(), + token_program: spl_token::ID, + token_extensions_program: token_2022::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Wrap { amount }.data(), + }, + close_account( + &spl_token::id(), + &token_account, + &signer.pubkey(), + &signer.pubkey(), + &[], + ) + .unwrap(), + ], + ) + } else { + let token_account = get_associated_token_address(&signer.pubkey(), token_mint); + ( + None, + vec![Instruction { + accounts: Wrap { + token_mint: *token_mint, + token_account, + program_authority: ctw_token::authority::ID, + confidential_mint, + confidential_token_account, + token_vault, + authority: signer.pubkey(), + payer: signer.pubkey(), + token_program: spl_token::ID, + token_extensions_program: token_2022::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Wrap { amount }.data(), + }], + ) + }; + + println!("Submitting transaction..."); + + let latest_blockhash = match banks_client.get_latest_blockhash().await { + Ok(lb) => lb, + Err(e) => { + return Err(e); + } + }; + + let mut tx = Transaction::new_with_payer(&ixs, Some(&signer.pubkey())); + tx.partial_sign(&[signer], latest_blockhash); + + if let Some(signer) = token_account { + tx.partial_sign(&[&signer], latest_blockhash); + } + + match banks_client.process_transaction(tx).await { + Ok(_) => Ok(()), + Err(e) => Err(e), + } +} + +async fn unwrap( + banks_client: &mut BanksClient, + signer: &Keypair, + token_mint: &Pubkey, + amount: u64, +) -> Result<(), BanksClientError> { + println!("\nUnwrapping from Confidential Transfer Wrapped Token.."); + + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let token_vault = get_associated_token_address(&ctw_token::authority::ID, token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + println!("Building transaction.."); + + let rent = banks_client.get_rent().await.unwrap(); + + let (token_account, ixs) = if token_mint == &native_mint::id() { + let keypair = Keypair::new(); + let token_account = keypair.pubkey(); + let lamports = rent.minimum_balance(TokenAccount::LEN); + ( + Some(keypair), + vec![ + create_account( + &signer.pubkey(), + &token_account, + lamports, + TokenAccount::LEN as u64, + &spl_token::id(), + ), + initialize_account( + &spl_token::id(), + &token_account, + token_mint, + &signer.pubkey(), + ) + .unwrap(), + Instruction { + accounts: Unwrap { + token_mint: *token_mint, + token_account, + program_authority: ctw_token::authority::ID, + confidential_mint, + confidential_token_account, + token_vault, + authority: signer.pubkey(), + payer: signer.pubkey(), + token_program: spl_token::ID, + token_extensions_program: token_2022::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Unwrap { amount }.data(), + }, + close_account( + &spl_token::id(), + &token_account, + &signer.pubkey(), + &signer.pubkey(), + &[], + ) + .unwrap(), + ], + ) + } else { + let token_account = get_associated_token_address(&signer.pubkey(), token_mint); + ( + None, + vec![Instruction { + accounts: Unwrap { + token_mint: *token_mint, + token_account, + program_authority: ctw_token::authority::ID, + confidential_mint, + confidential_token_account, + token_vault, + authority: signer.pubkey(), + payer: signer.pubkey(), + token_program: spl_token::ID, + token_extensions_program: token_2022::ID, + } + .to_account_metas(None), + program_id: ctw_token::ID, + data: ctw_token::instruction::Unwrap { amount }.data(), + }], + ) + }; + + println!("Submitting transaction..."); + + let latest_blockhash = match banks_client.get_latest_blockhash().await { + Ok(lb) => lb, + Err(e) => { + return Err(e); + } + }; + let mut tx = Transaction::new_with_payer(&ixs, Some(&signer.pubkey())); + tx.partial_sign(&[signer], latest_blockhash); + + if let Some(signer) = token_account { + tx.partial_sign(&[&signer], latest_blockhash); + } + + match banks_client.process_transaction(tx).await { + Ok(_) => Ok(()), + Err(e) => Err(e), + } +} + +async fn create_and_configure_confidential_token_account( + banks_client: &mut BanksClient, + signer: &Keypair, + token_mint: &Pubkey, +) -> Result<(), BanksClientError> { + println!("\nCreating and configuring Token Account with Confidential Transfers extension.."); + + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + let mut ixs = vec![ + create_associated_token_account( + &signer.pubkey(), + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ), + reallocate( + &token_2022::ID, + &confidential_token_account, + &signer.pubkey(), + &signer.pubkey(), + &[], + &[ExtensionType::ConfidentialTransferAccount], + ) + .unwrap(), + ]; + + let elgamal_keypair = ElGamalKeypair::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + let proof_data = PubkeyValidityData::new(&elgamal_keypair).unwrap(); + + println!( + "Using ElGamal keypair with public key: {}", + elgamal_keypair.pubkey() + ); + + println!("Building validity proofs.."); + + let proof_data_location = + ProofLocation::InstructionOffset(NonZeroI8::new(1).unwrap(), &proof_data); + + let ae_key = AeKey::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + let decryptable_zero_balance = ae_key.encrypt(0); + + ixs.extend(vec![ + inner_configure_account( + &token_2022::ID, + &confidential_token_account, + &confidential_mint, + decryptable_zero_balance, + u64::MAX, + &signer.pubkey(), + &[], + proof_data_location, + ) + .unwrap(), + verify_pubkey_validity(None, &proof_data), + ]); + + println!("Submitting transaction..."); + + let latest_blockhash = match banks_client.get_latest_blockhash().await { + Ok(lb) => lb, + Err(e) => { + return Err(e); + } + }; + let tx = Transaction::new_signed_with_payer( + &ixs, + Some(&signer.pubkey()), + &[signer], + latest_blockhash, + ); + + match banks_client.process_transaction(tx).await { + Ok(_) => Ok(()), + Err(e) => Err(e), + } +} + +async fn withdraw_and_verify( + banks_client: &mut BanksClient, + signer: &Keypair, + token_mint: &Pubkey, + amount: u64, +) -> Result<(), BanksClientError> { + println!("\nWithdrawing from encrypted balance and verifying.."); + + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + let elgamal_keypair = ElGamalKeypair::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + println!( + "Using ElGamal keypair with public key: {}", + elgamal_keypair.pubkey() + ); + + let account = match banks_client.get_account(confidential_token_account).await { + Ok(a) => a, + Err(e) => { + return Err(e); + } + }; + + let account = account.unwrap(); + + println!("Account data length: {}", account.data.len()); + + println!("Building validity proofs.."); + + let token_account = StateWithExtensions::::unpack(&account.data).unwrap(); + + let confidential_transfer_account = token_account + .get_extension::() + .unwrap(); + + let current_balance = confidential_transfer_account + .available_balance + .decrypt(elgamal_keypair.secret()) + .unwrap(); + println!("Current balance: {}", current_balance); + + let current_ciphertext = + ElGamalCiphertext::from_bytes(&confidential_transfer_account.available_balance.0).unwrap(); + + let proof_data = WithdrawData::new( + amount, + &elgamal_keypair, + current_balance, + ¤t_ciphertext, + ) + .unwrap(); + + let proof_data_location = + ProofLocation::InstructionOffset(NonZeroI8::new(1).unwrap(), &proof_data); + + let ae_key = AeKey::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + let new_decryptable_zero_balance = ae_key.encrypt(current_balance - amount); + + let account = banks_client + .get_account(confidential_mint) + .await + .unwrap() + .unwrap(); + + let confidential_mint_account = StateWithExtensions::::unpack(&account.data).unwrap(); + + println!("Proofs generated, building transaction.."); + + let ixs = vec![ + inner_withdraw( + &token_2022::ID, + &confidential_token_account, + &confidential_mint, + amount, + confidential_mint_account.base.decimals, + new_decryptable_zero_balance.into(), + &signer.pubkey(), + &[], + proof_data_location, + ) + .unwrap(), + verify_withdraw(None, &proof_data), + ]; + + println!("Submitting transaction..."); + + let latest_blockhash = match banks_client.get_latest_blockhash().await { + Ok(lb) => lb, + Err(e) => { + return Err(e); + } + }; + let tx = Transaction::new_signed_with_payer( + &ixs, + Some(&signer.pubkey()), + &[signer], + latest_blockhash, + ); + + match banks_client.process_transaction(tx).await { + Ok(_) => Ok(()), + Err(e) => Err(e), + } +} + +async fn post_wrap( + banks_client: &mut BanksClient, + signer: &Keypair, + token_mint: &Pubkey, + amount: u64, +) -> Result<(), BanksClientError> { + println!("\nApplying pending balance.."); + + let (confidential_mint, _) = derive_confidential_mint(token_mint); + let confidential_token_account = get_associated_token_address_with_program_id( + &signer.pubkey(), + &confidential_mint, + &token_2022::ID, + ); + + let elgamal_keypair = ElGamalKeypair::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + println!( + "Using ElGamal keypair with public key: {}", + elgamal_keypair.pubkey() + ); + + println!("Building validity proofs.."); + + let ae_key = AeKey::new_from_signer(signer, "cwtoken".as_ref()).unwrap(); + let current_balance = 0; + let new_decryptable_zero_balance = ae_key.encrypt(current_balance + amount); + + println!("Proofs generated, building transaction.."); + + let ixs = vec![apply_pending_balance( + &token_2022::ID, + &confidential_token_account, + 1, + new_decryptable_zero_balance, + &signer.pubkey(), + &[], + ) + .unwrap()]; + + println!("Submitting transaction..."); + + let latest_blockhash = match banks_client.get_latest_blockhash().await { + Ok(lb) => lb, + Err(e) => { + return Err(e); + } + }; + let tx = Transaction::new_signed_with_payer( + &ixs, + Some(&signer.pubkey()), + &[signer], + latest_blockhash, + ); + + match banks_client.process_transaction(tx).await { + Ok(_) => Ok(()), + Err(e) => Err(e), + } +} diff --git a/programs/ctw_token/tests/fixtures/spl_token_2022.so b/programs/ctw_token/tests/fixtures/spl_token_2022.so new file mode 100755 index 0000000000000000000000000000000000000000..87da1e372bcd1d91a281fb63e1ff57193f22e7b5 GIT binary patch literal 674880 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 z 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

@a{5a4htU&qs`Z(^59Rdf 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≻}Sd0jk$KtJZbLvXVx;`GI#tGUwh^Bn5OH8 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 L0{cO^?Y93H { + PublicKey.findProgramAddressSync( + [tokenMint.toBuffer(), Buffer.from(MINT_SEED, "utf-8")], + PROGRAM_ID + ); +}; + +const program = new Program(IDL, PROGRAM_ID); + +export const initialize = async ( + tokenMint: PublicKey, + confidentialMint: PublicKey, + programAuthority: PublicKey, + tokenVault: PublicKey, + payer: PublicKey, + tokenProgram: PublicKey, + associatedTokenProgram: PublicKey, + tokenExtensionsProgram: PublicKey, + systemProgram: PublicKey, + auditorPublicKey: Buffer | Uint8Array +) => { + await program.methods + .initialize([...auditorPublicKey]) + .accountsStrict({ + tokenMint, + confidentialMint, + programAuthority, + tokenVault, + payer, + tokenProgram, + associatedTokenProgram, + tokenExtensionsProgram, + systemProgram, + }) + .instruction(); +}; + +export const wrap = async ( + tokenMint: PublicKey, + tokenAccount: PublicKey, + tokenVault: PublicKey, + confidentialMint: PublicKey, + confidentialTokenAccount: PublicKey, + programAuthority: PublicKey, + authority: PublicKey, + payer: PublicKey, + tokenProgram: PublicKey, + tokenExtensionsProgram: PublicKey, + amount: number +) => { + await program.methods + .wrap(amount) + .accountsStrict({ + tokenMint, + tokenAccount, + tokenVault, + confidentialMint, + confidentialTokenAccount, + programAuthority, + authority, + payer, + tokenProgram, + tokenExtensionsProgram, + }) + .instruction(); +}; + +export const unwrap = async ( + tokenMint: PublicKey, + tokenAccount: PublicKey, + tokenVault: PublicKey, + confidentialMint: PublicKey, + confidentialTokenAccount: PublicKey, + programAuthority: PublicKey, + authority: PublicKey, + payer: PublicKey, + tokenProgram: PublicKey, + tokenExtensionsProgram: PublicKey, + amount: number +) => { + await program.methods + .unwrap(amount) + .accountsStrict({ + tokenMint, + tokenAccount, + tokenVault, + confidentialMint, + confidentialTokenAccount, + programAuthority, + authority, + payer, + tokenProgram, + tokenExtensionsProgram, + }) + .instruction(); +}; diff --git a/ts/src/program.ts b/ts/src/program.ts new file mode 100644 index 0000000..198e68e --- /dev/null +++ b/ts/src/program.ts @@ -0,0 +1,489 @@ +export type CtwToken = { + version: "0.1.0"; + name: "ctw_token"; + instructions: [ + { + name: "initialize"; + docs: [ + "Initialize a Confidential Transfer enabled Token Extensions Mint for an existing SPL Token Mint.", + "This Confidential Transfer enabled Token Extensions Mint, or Confidential Wrapped Token Mint,", + "effectively represents the same underlying SPL Token but with the ability to use Token Extensions'", + "zk-powered confidential transfers which mask the amount being transferred.", + "", + "# Notes", + "", + "This implementation does not require any new CT-enabled Token Accounts to be approved and", + "are 1:1 equivalents of the SPL Token." + ]; + accounts: [ + { + name: "tokenMint"; + isMut: false; + isSigner: false; + docs: [ + "The SPL Token Mint for which we want to create a Confidential Transfers Mint Wrapper." + ]; + }, + { + name: "confidentialMint"; + isMut: true; + isSigner: false; + docs: ["The SPL Token Extensions Mint."]; + }, + { + name: "programAuthority"; + isMut: false; + isSigner: false; + docs: ["The authority of the Confidential Wrapper Token Program."]; + }, + { + name: "tokenVault"; + isMut: true; + isSigner: false; + docs: ["The token vault."]; + }, + { + name: "payer"; + isMut: true; + isSigner: true; + docs: ["The fee and rent payer."]; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + docs: ["The Token Program."]; + }, + { + name: "associatedTokenProgram"; + isMut: false; + isSigner: false; + docs: ["The Associated Token Program."]; + }, + { + name: "tokenExtensionsProgram"; + isMut: false; + isSigner: false; + docs: ["The Token Extensions Program."]; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + docs: ["The System Program."]; + } + ]; + args: [ + { + name: "auditorPubkey"; + type: { + array: ["u8", 32]; + }; + } + ]; + }, + { + name: "wrap"; + docs: [ + "Wrap the given token amount of an SPL Token into an equivalent amount of a Confidential Wrapped Token Mint.", + "", + "# Notes", + "", + "The integrator is responsible for passing in a TokenAccount for the `confidential_token_account` param", + "that has already been initialized and for which the [`ConfigureAccount`] as well as, if necessary,", + "the [`ApproveAccount`] instructions have been executed.", + "", + "After this instruction is called, the integrator is then free to call [`Deposit`] and [`ApplyPendingBalance`]", + "in order to roll the token amount into the available balance of the Confidential Token Account." + ]; + accounts: [ + { + name: "tokenMint"; + isMut: false; + isSigner: false; + docs: ["The mint of the token being wrapped."]; + }, + { + name: "tokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVault"; + isMut: true; + isSigner: false; + }, + { + name: "confidentialMint"; + isMut: true; + isSigner: false; + docs: ["The mint of the token being wrapped."]; + }, + { + name: "confidentialTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "programAuthority"; + isMut: false; + isSigner: false; + docs: ["The authority of the Confidential Wrapper Token Program."]; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + docs: ["The authority of the source token account."]; + }, + { + name: "payer"; + isMut: true; + isSigner: true; + docs: ["The fee and rent payer."]; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + docs: ["The Token Interface."]; + }, + { + name: "tokenExtensionsProgram"; + isMut: false; + isSigner: false; + docs: ["The Token Interface."]; + } + ]; + args: [ + { + name: "amount"; + type: "u64"; + } + ]; + }, + { + name: "unwrap"; + docs: [ + "Unwrap the given token amount of a Confidential Wrapped Token back into it's corresponding", + "SPL Token Mint.", + "", + "# Notes", + "", + "The integrator is responsible for assuring that the user has enough non-confidential", + "balance in order to unwrap and redeem for the underlying token.", + "This can be achieved by having the [`Withdraw`] instruction being successfully executed beforehand." + ]; + accounts: [ + { + name: "tokenMint"; + isMut: false; + isSigner: false; + docs: ["The mint of the token being wrapped."]; + }, + { + name: "tokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVault"; + isMut: true; + isSigner: false; + }, + { + name: "confidentialMint"; + isMut: true; + isSigner: false; + docs: ["The mint of the token being wrapped."]; + }, + { + name: "confidentialTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "programAuthority"; + isMut: false; + isSigner: false; + docs: ["The authority of the Confidential Wrapper Token Program."]; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + docs: ["The authority of the source token account."]; + }, + { + name: "payer"; + isMut: true; + isSigner: true; + docs: ["The fee and rent payer."]; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + docs: ["The Token Interface."]; + }, + { + name: "tokenExtensionsProgram"; + isMut: false; + isSigner: false; + docs: ["The Token Interface."]; + } + ]; + args: [ + { + name: "amount"; + type: "u64"; + } + ]; + } + ]; +}; + +export const IDL: CtwToken = { + version: "0.1.0", + name: "ctw_token", + instructions: [ + { + name: "initialize", + docs: [ + "Initialize a Confidential Transfer enabled Token Extensions Mint for an existing SPL Token Mint.", + "This Confidential Transfer enabled Token Extensions Mint, or Confidential Wrapped Token Mint,", + "effectively represents the same underlying SPL Token but with the ability to use Token Extensions'", + "zk-powered confidential transfers which mask the amount being transferred.", + "", + "# Notes", + "", + "This implementation does not require any new CT-enabled Token Accounts to be approved and", + "are 1:1 equivalents of the SPL Token.", + ], + accounts: [ + { + name: "tokenMint", + isMut: false, + isSigner: false, + docs: [ + "The SPL Token Mint for which we want to create a Confidential Transfers Mint Wrapper.", + ], + }, + { + name: "confidentialMint", + isMut: true, + isSigner: false, + docs: ["The SPL Token Extensions Mint."], + }, + { + name: "programAuthority", + isMut: false, + isSigner: false, + docs: ["The authority of the Confidential Wrapper Token Program."], + }, + { + name: "tokenVault", + isMut: true, + isSigner: false, + docs: ["The token vault."], + }, + { + name: "payer", + isMut: true, + isSigner: true, + docs: ["The fee and rent payer."], + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + docs: ["The Token Program."], + }, + { + name: "associatedTokenProgram", + isMut: false, + isSigner: false, + docs: ["The Associated Token Program."], + }, + { + name: "tokenExtensionsProgram", + isMut: false, + isSigner: false, + docs: ["The Token Extensions Program."], + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + docs: ["The System Program."], + }, + ], + args: [ + { + name: "auditorPubkey", + type: { + array: ["u8", 32], + }, + }, + ], + }, + { + name: "wrap", + docs: [ + "Wrap the given token amount of an SPL Token into an equivalent amount of a Confidential Wrapped Token Mint.", + "", + "# Notes", + "", + "The integrator is responsible for passing in a TokenAccount for the `confidential_token_account` param", + "that has already been initialized and for which the [`ConfigureAccount`] as well as, if necessary,", + "the [`ApproveAccount`] instructions have been executed.", + "", + "After this instruction is called, the integrator is then free to call [`Deposit`] and [`ApplyPendingBalance`]", + "in order to roll the token amount into the available balance of the Confidential Token Account.", + ], + accounts: [ + { + name: "tokenMint", + isMut: false, + isSigner: false, + docs: ["The mint of the token being wrapped."], + }, + { + name: "tokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "tokenVault", + isMut: true, + isSigner: false, + }, + { + name: "confidentialMint", + isMut: true, + isSigner: false, + docs: ["The mint of the token being wrapped."], + }, + { + name: "confidentialTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "programAuthority", + isMut: false, + isSigner: false, + docs: ["The authority of the Confidential Wrapper Token Program."], + }, + { + name: "authority", + isMut: false, + isSigner: true, + docs: ["The authority of the source token account."], + }, + { + name: "payer", + isMut: true, + isSigner: true, + docs: ["The fee and rent payer."], + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + docs: ["The Token Interface."], + }, + { + name: "tokenExtensionsProgram", + isMut: false, + isSigner: false, + docs: ["The Token Interface."], + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + }, + { + name: "unwrap", + docs: [ + "Unwrap the given token amount of a Confidential Wrapped Token back into it's corresponding", + "SPL Token Mint.", + "", + "# Notes", + "", + "The integrator is responsible for assuring that the user has enough non-confidential", + "balance in order to unwrap and redeem for the underlying token.", + "This can be achieved by having the [`Withdraw`] instruction being successfully executed beforehand.", + ], + accounts: [ + { + name: "tokenMint", + isMut: false, + isSigner: false, + docs: ["The mint of the token being wrapped."], + }, + { + name: "tokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "tokenVault", + isMut: true, + isSigner: false, + }, + { + name: "confidentialMint", + isMut: true, + isSigner: false, + docs: ["The mint of the token being wrapped."], + }, + { + name: "confidentialTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "programAuthority", + isMut: false, + isSigner: false, + docs: ["The authority of the Confidential Wrapper Token Program."], + }, + { + name: "authority", + isMut: false, + isSigner: true, + docs: ["The authority of the source token account."], + }, + { + name: "payer", + isMut: true, + isSigner: true, + docs: ["The fee and rent payer."], + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + docs: ["The Token Interface."], + }, + { + name: "tokenExtensionsProgram", + isMut: false, + isSigner: false, + docs: ["The Token Interface."], + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + ], + }, + ], +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..dbae305 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "lib": ["es2022", "DOM"], + "module": "CommonJS", + "target": "es2020", + "outDir": "lib", + "esModuleInterop": true, + "declaration": true, + "sourceMap": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "baseUrl": "." + }, + "include": ["ts/src/**/*"], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..1c2ff7e --- /dev/null +++ b/yarn.lock @@ -0,0 +1,472 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.17.2", "@babel/runtime@^7.23.4": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + dependencies: + regenerator-runtime "^0.14.0" + +"@coral-xyz/anchor@^0.29.0": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.29.0.tgz#bd0be95bedfb30a381c3e676e5926124c310ff12" + integrity sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA== + dependencies: + "@coral-xyz/borsh" "^0.29.0" + "@noble/hashes" "^1.3.1" + "@solana/web3.js" "^1.68.0" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^6.3.0" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + pako "^2.0.3" + snake-case "^3.0.4" + superstruct "^0.15.4" + toml "^3.0.0" + +"@coral-xyz/borsh@^0.29.0": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.29.0.tgz#79f7045df2ef66da8006d47f5399c7190363e71f" + integrity sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@noble/curves@^1.2.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== + dependencies: + "@noble/hashes" "1.3.3" + +"@noble/hashes@1.3.3", "@noble/hashes@^1.3.1", "@noble/hashes@^1.3.2": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + +"@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/web3.js@^1.68.0": + version "1.89.1" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.89.1.tgz#52df6820f2d088c4558aa359af40580a03d10ec9" + integrity sha512-t9TTLtPQxtQB3SAf/5E8xPXfVDsC6WGOsgKY02l2cbe0HLymT7ynE8Hu48Lk5qynHCquj6nhISfEHcjMkYpu/A== + dependencies: + "@babel/runtime" "^7.23.4" + "@noble/curves" "^1.2.0" + "@noble/hashes" "^1.3.2" + "@solana/buffer-layout" "^4.0.1" + agentkeepalive "^4.5.0" + bigint-buffer "^1.1.5" + 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.0" + node-fetch "^2.7.0" + rpc-websockets "^7.5.1" + superstruct "^0.14.2" + +"@solana/web3.js@^1.90.0": + version "1.90.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.90.0.tgz#a0f1364b4235d32a43649b74c52d9fb8bc9436a3" + integrity sha512-p0cb/COXb8NNVSMkGMPwqQ6NvObZgUitN80uOedMB+jbYWOKOeJBuPnzhenkIV9RX0krGwyuY1Ltn5O8MGFsEw== + dependencies: + "@babel/runtime" "^7.23.4" + "@noble/curves" "^1.2.0" + "@noble/hashes" "^1.3.2" + "@solana/buffer-layout" "^4.0.1" + agentkeepalive "^4.5.0" + bigint-buffer "^1.1.5" + 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.0" + node-fetch "^2.7.0" + rpc-websockets "^7.5.1" + superstruct "^0.14.2" + +"@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/node@*": + version "20.11.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.7.tgz#cb49aedd758c978c30806d0c38b520ed2a3df6e0" + integrity sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A== + dependencies: + undici-types "~5.26.4" + +"@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" "*" + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +agentkeepalive@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +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" + +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@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +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" + +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" + +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: + 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.0.8" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + dependencies: + node-gyp-build "^4.3.0" + +camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +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== + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +crypto-hash@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" + integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== + +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== + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +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" + +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +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== + +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== + +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== + +jayson@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" + integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + uuid "^8.3.2" + ws "^7.4.5" + +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== + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-fetch@^2.6.12, 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.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== + +pako@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + +prettier@^2.6.2: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +rpc-websockets@^7.5.1: + version "7.9.0" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.9.0.tgz#a3938e16d6f134a3999fdfac422a503731bf8973" + integrity sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw== + dependencies: + "@babel/runtime" "^7.17.2" + eventemitter3 "^4.0.7" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +superstruct@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== + +superstruct@^0.15.4: + version "0.15.5" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" + integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== + +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== + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +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== + +tslib@^2.0.3: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +typescript@^4.3.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + 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== + +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" + +ws@^7.4.5: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.5.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==