From 89d06d317b6cdfee5071823ca98996906be1b3207c370e94db46d8d9d0d1f295 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Sat, 6 Jun 2026 16:58:57 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20shine=5Fpayments=20=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B8=D1=82=D1=8C=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B9=20UI=20=D1=81=20=D0=B8=D0=B7=D0=B2?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BD=D1=8B=D0=BC=20=D0=B1=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D0=BC=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dev_Docs/deploy/README.md | 21 +- .../45.136.124.227_legacy_unavailable.md | 23 - .../deploy/servers/93.170.12.154_rapsberry.md | 2 +- Dev_Docs/deploy/servers/shineup.me_main.md | 35 + VERSION.properties | 4 +- shine-solana/shine/AGENTS.md | 11 + shine-solana/shine/Cargo.lock | 5771 +---------------- shine-solana/shine/build.gradle | 16 +- shine-solana/shine/doc/FUNDS_FLOW.md | 8 + .../shine/doc/programs/shine_payments.md | 36 +- .../shine/programs/shine_payments/Cargo.toml | 10 +- .../shine/programs/shine_payments/src/lib.rs | 1976 +++--- .../programs/shine_payments/src/settings.rs | 17 +- .../shine_payments/web/admin_tools.html | 59 +- .../shine_payments/web/buy_ticket.html | 27 +- .../shine_payments/web/dao_tools.html | 22 +- .../shine_payments/web/manager_tools.html | 38 +- .../shine_payments/web/track_ticket.html | 52 +- 18 files changed, 1550 insertions(+), 6578 deletions(-) delete mode 100644 Dev_Docs/deploy/servers/45.136.124.227_legacy_unavailable.md create mode 100644 Dev_Docs/deploy/servers/shineup.me_main.md diff --git a/Dev_Docs/deploy/README.md b/Dev_Docs/deploy/README.md index 1cb07d2..165d1ef 100644 --- a/Dev_Docs/deploy/README.md +++ b/Dev_Docs/deploy/README.md @@ -4,10 +4,15 @@ ## Базовый сервер -- SSH: `player@45.136.124.227` +- SSH: `player@shineup.me` - Домен: `shineup.me` - Базовый путь: `/home/player` +Для всех рабочих инструкций и скриптов использовать доменное имя `shineup.me`, а не фиксированный IP: + +- актуальный IP должен браться через DNS-резолв на момент подключения; +- ручное дублирование IP в документации и deploy-скриптах не поддерживать. + ## Локальные команды - Деплой сервера: `./gradlew deployServer` @@ -26,6 +31,20 @@ - `EXPECTED_CADDY_UI_ROOT=/нужный/путь ./gradlew deployUI` - `EXPECTED_CADDY_SITE=example.com ./gradlew deployUI` +## Временные тестовые сайты Solana tickets + +- Для HTML UI программы `shine_payments` используется отдельный временный тестовый сайт. +- Основной каталог публикации: + - `/home/player/sites/test-solana-tickets.shineup.me` +- Рабочие домены: + - `https://test-solana-tickets.shineup.me` + - `https://test-solana-tickets.shiningpeople.ru` +- Назначение: + - ручная проверка сценариев покупки билетов; + - проверка DAO-инструментов и лимитов менеджеров; + - проверка ручного добавления билетов и `step_payout`. +- Эти сайты не считать основным UI SHiNE; это отдельная тестовая публикация под Solana-часть. + ### Важно для локального UI (history-router / Ctrl+F5) - Локальный UI **обязательно** поднимать только через `./gradlew startLocal`. diff --git a/Dev_Docs/deploy/servers/45.136.124.227_legacy_unavailable.md b/Dev_Docs/deploy/servers/45.136.124.227_legacy_unavailable.md deleted file mode 100644 index 4d23f1c..0000000 --- a/Dev_Docs/deploy/servers/45.136.124.227_legacy_unavailable.md +++ /dev/null @@ -1,23 +0,0 @@ -# Сервер `45.136.124.227` (`shineup.me`) — основной - -- Пользователь: `player` -- Базовый путь: `/home/player` -- Каталог SHiNE: `/home/player/SHiNE` -- UI публикация: `/home/player/SHiNE/shine-ui` -- Сервер: `/home/player/SHiNE/shine-server/shine-server.jar` -- Данные: `/home/player/SHiNE/shine-server/data/` -- Логи сервера: `/home/player/SHiNE/shine-server/logs/app.log` - -## Сервисы - -- `shine-server.service` (systemd) -- `caddy.service` (systemd) - -## Caddy - -- Активный конфиг (через systemd `ExecStart`): `/home/player/SHiNE/caddy/Caddyfile` -- Для UI: - - `root * /home/player/SHiNE/shine-ui` - - `try_files {path} /index.html` (SPA fallback) - - no-cache заголовки - - `reverse_proxy /ws* -> 127.0.0.1:7070` diff --git a/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md b/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md index 2f44128..cf424ce 100644 --- a/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md +++ b/Dev_Docs/deploy/servers/93.170.12.154_rapsberry.md @@ -18,7 +18,7 @@ ## Статус - Резервный сервер для SHiNE. -- Основной прод-сервер: `45.136.124.227` (`shineup.me`). +- Основной прод-сервер: `shineup.me` (подключение через `player@shineup.me`, IP определяется через DNS). ## Caddy diff --git a/Dev_Docs/deploy/servers/shineup.me_main.md b/Dev_Docs/deploy/servers/shineup.me_main.md new file mode 100644 index 0000000..891929c --- /dev/null +++ b/Dev_Docs/deploy/servers/shineup.me_main.md @@ -0,0 +1,35 @@ +# Сервер `shineup.me` — основной + +- SSH: `player@shineup.me` +- Определение IP: через DNS-резолв домена `shineup.me` на момент подключения +- Пользователь: `player` +- Базовый путь: `/home/player` +- Каталог SHiNE: `/home/player/SHiNE` +- UI публикация: `/home/player/SHiNE/shine-ui` +- Сервер: `/home/player/SHiNE/shine-server/shine-server.jar` +- Данные: `/home/player/SHiNE/shine-server/data/` +- Логи сервера: `/home/player/SHiNE/shine-server/logs/app.log` + +## Сервисы + +- `shine-server.service` (systemd) +- `caddy.service` (systemd) + +## Caddy + +- Активный конфиг (через systemd `ExecStart`): `/home/player/SHiNE/caddy/Caddyfile` +- Для UI: + - `root * /home/player/SHiNE/shine-ui` + - `try_files {path} /index.html` (SPA fallback) + - no-cache заголовки + - `reverse_proxy /ws* -> 127.0.0.1:7070` + +## Дополнительно + +- Для отдельной админки `shine_payments` используется каталог: + - `/home/player/sites/test-solana-tickets.shineup.me` +- Эта публикация используется как временный тестовый сайт для сценариев покупки билетов и выплат `shine_payments`. +- Домены этой публикации: + - `https://test-solana-tickets.shineup.me` + - `https://test-solana-tickets.shiningpeople.ru` +- Для всех deploy-скриптов и инструкций использовать именно `player@shineup.me`, без жёсткой фиксации IP. diff --git a/VERSION.properties b/VERSION.properties index e7cac24..3476427 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.130 -server.version=1.2.122 +client.version=1.2.131 +server.version=1.2.123 diff --git a/shine-solana/shine/AGENTS.md b/shine-solana/shine/AGENTS.md index 0cc0386..dbd4c4a 100644 --- a/shine-solana/shine/AGENTS.md +++ b/shine-solana/shine/AGENTS.md @@ -62,6 +62,11 @@ Push выполнять через `http.extraHeader` (Authorization) без в - комментарии в `build.gradle` (в корне `shine/`). +Назначение этого UI: + +- это временные тестовые сайты для `shine_payments`; +- использовать их для ручной проверки сценариев покупки билетов, менеджерских лимитов и пошаговых выплат. + ## Известное предупреждение сборки При `cargo build` / `anchor build` для Solana-программ может регулярно появляться предупреждение вида: @@ -76,6 +81,12 @@ Push выполнять через `http.extraHeader` (Authorization) без в то это предупреждение считать допустимым и не блокирующим само изменение. +Дополнительное правило для рабочих отчётов: + +1. предупреждение именно про `driftsort_main` / `overwrites values in the frame` считать уже зафиксированным; +2. при обычных успешных сборках и проверках не выносить его отдельно пользователю как новую проблему; +3. упоминать его только если пользователь сам спрашивает про него отдельно или если есть признаки, что изменился характер предупреждения. + ## Rule: Dictionary Growth Reporting Если пользователь просит увеличить количество слов в словарях `shine_login_guard`: diff --git a/shine-solana/shine/Cargo.lock b/shine-solana/shine/Cargo.lock index fc6fa47..25725e3 100644 --- a/shine-solana/shine/Cargo.lock +++ b/shine-solana/shine/Cargo.lock @@ -2,37 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "agave-feature-set" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a2c365c0245cbb8959de725fc2b44c754b673fdf34c9a7f9d4a25c35a7bf1" -dependencies = [ - "ahash 0.8.12", - "solana-epoch-schedule 2.2.1", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.2.1", - "solana-svm-feature-set", -] - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.16", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.12" @@ -40,36 +9,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", ] -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.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.31.1" @@ -139,7 +83,7 @@ dependencies = [ "anchor-syn", "anyhow", "bs58", - "heck 0.3.3", + "heck", "proc-macro2", "quote", "serde_json", @@ -164,7 +108,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abc6ee78acb7bfe0c2dd2abc677aaa4789c0281a0c0ef01dbf6fe85e0fd9e6e4" dependencies = [ "anchor-syn", - "borsh-derive-internal 0.10.4", + "borsh-derive-internal", "proc-macro2", "quote", "syn 1.0.109", @@ -196,12 +140,11 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-lang-idl", "base64 0.21.7", "bincode", "borsh 0.10.4", "bytemuck", - "solana-program 2.2.1", + "solana-program", "thiserror 1.0.69", ] @@ -213,8 +156,7 @@ checksum = "32e8599d21995f68e296265aa5ab0c3cef582fd58afec014d01bd0bce18a4418" dependencies = [ "anchor-lang-idl-spec", "anyhow", - "heck 0.3.3", - "regex", + "heck", "serde", "serde_json", "sha2 0.10.9", @@ -238,8 +180,7 @@ checksum = "5dc7a6d90cc643df0ed2744862cdf180587d1e5d28936538c18fc8908489ed67" dependencies = [ "anyhow", "bs58", - "cargo_toml", - "heck 0.3.3", + "heck", "proc-macro2", "quote", "serde", @@ -267,120 +208,18 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[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 1.0.69", - "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 0.12.6", -] - -[[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 = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-compression" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" -dependencies = [ - "compression-codecs", - "compression-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "async-lock" -version = "3.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener 5.4.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - [[package]] name = "autocfg" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - [[package]] name = "base64" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.7" @@ -393,12 +232,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - [[package]] name = "bincode" version = "1.3.3" @@ -408,29 +241,11 @@ dependencies = [ "serde", ] -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "bitflags" version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" -dependencies = [ - "serde", -] [[package]] name = "blake3" @@ -464,16 +279,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "borsh" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" -dependencies = [ - "borsh-derive 0.9.3", - "hashbrown 0.11.2", -] - [[package]] name = "borsh" version = "0.10.4" @@ -494,27 +299,14 @@ dependencies = [ "cfg_aliases", ] -[[package]] -name = "borsh-derive" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" -dependencies = [ - "borsh-derive-internal 0.9.3", - "borsh-schema-derive-internal 0.9.3", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - [[package]] name = "borsh-derive" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" dependencies = [ - "borsh-derive-internal 0.10.4", - "borsh-schema-derive-internal 0.10.4", + "borsh-derive-internal", + "borsh-schema-derive-internal", "proc-macro-crate 0.1.5", "proc-macro2", "syn 1.0.109", @@ -533,17 +325,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "borsh-derive-internal" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "borsh-derive-internal" version = "0.10.4" @@ -555,17 +336,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "borsh-schema-derive-internal" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "borsh-schema-derive-internal" version = "0.10.4" @@ -577,27 +347,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "brotli" -version = "8.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - [[package]] name = "bs58" version = "0.5.1" @@ -607,17 +356,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "bstr" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" -dependencies = [ - "memchr", - "regex-automata", - "serde", -] - [[package]] name = "bumpalo" version = "3.17.0" @@ -639,9 +377,6 @@ name = "bytemuck" version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" -dependencies = [ - "bytemuck_derive", -] [[package]] name = "bytemuck_derive" @@ -654,57 +389,15 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" -dependencies = [ - "serde", -] - -[[package]] -name = "caps" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" -dependencies = [ - "libc", -] - -[[package]] -name = "cargo_toml" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" -dependencies = [ - "serde", - "toml 0.8.22", -] - [[package]] name = "cc" version = "1.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" dependencies = [ - "jobserver", - "libc", "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfg-if" version = "1.0.0" @@ -717,27 +410,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "cfg_eval" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - [[package]] name = "common" version = "0.1.0" @@ -745,46 +417,6 @@ dependencies = [ "anchor-lang", ] -[[package]] -name = "compression-codecs" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" -dependencies = [ - "brotli", - "compression-core", - "flate2", - "memchr", -] - -[[package]] -name = "compression-core" -version = "0.4.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console" -version = "0.15.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width", - "windows-sys 0.59.0", -] - [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -805,34 +437,12 @@ dependencies = [ "web-sys", ] -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - [[package]] name = "constant_time_eq" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - [[package]] name = "cpufeatures" version = "0.2.17" @@ -842,67 +452,12 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - [[package]] name = "crunchy" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-common" version = "0.1.6" @@ -913,29 +468,6 @@ dependencies = [ "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 = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -964,99 +496,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.117", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint 0.4.6", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derivation-path" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" - [[package]] name = "digest" version = "0.9.0" @@ -1073,262 +512,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid", "crypto-common", "subtle", ] -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[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.117", -] - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature 2.2.0", - "spki", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature 2.2.0", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519 1.5.3", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519 2.2.3", - "rand_core 0.6.4", - "serde", - "sha2 0.10.9", - "subtle", - "zeroize", -] - -[[package]] -name = "ed25519-dalek-bip32" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b49a684b133c4980d7ee783936af771516011c8cd15f429dbda77245e282f03" -dependencies = [ - "derivation-path", - "ed25519-dalek 2.2.0", - "hmac 0.12.1", - "sha2 0.10.9", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "env_filter" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" -dependencies = [ - "env_filter", - "log", -] - [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener 5.4.1", - "pin-project-lite", -] - -[[package]] -name = "fast-math" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2465292146cdfc2011350fe3b1c616ac83cf0faeedb33463ba1c332ed8948d66" -dependencies = [ - "ieee754", -] - -[[package]] -name = "fastbloom" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" -dependencies = [ - "getrandom 0.3.4", - "libm", - "rand 0.9.4", - "siphasher 1.0.3", -] - -[[package]] -name = "fastrand" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" - [[package]] name = "feature-probe" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "fiat-crypto" version = "0.2.9" @@ -1344,15 +543,6 @@ dependencies = [ "five8_core", ] -[[package]] -name = "five8" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" -dependencies = [ - "five8_core", -] - [[package]] name = "five8_const" version = "0.1.4" @@ -1362,146 +552,12 @@ dependencies = [ "five8_core", ] -[[package]] -name = "five8_const" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" -dependencies = [ - "five8_core", -] - [[package]] name = "five8_core" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -1510,17 +566,6 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", - "zeroize", -] - -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", ] [[package]] @@ -1547,97 +592,20 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi 5.3.0", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" -dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", - "rand_core 0.10.1", - "wasip2", - "wasip3", -] - -[[package]] -name = "governor" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" -dependencies = [ - "cfg-if", - "dashmap", - "futures", - "futures-timer", - "no-std-compat", - "nonzero_ext", - "parking_lot", - "portable-atomic", - "quanta", - "rand 0.8.5", - "smallvec", - "spinning_top", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash 0.7.8", -] - [[package]] name = "hashbrown" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.12", + "ahash", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "foldhash", -] [[package]] name = "heck" @@ -1648,298 +616,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[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.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.4.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http 1.4.0", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hyper" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "http 1.4.0", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" -dependencies = [ - "http 1.4.0", - "hyper", - "hyper-util", - "rustls 0.23.40", - "tokio", - "tokio-rustls 0.26.4", - "tower-service", - "webpki-roots 1.0.7", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-util", - "http 1.4.0", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2 0.6.3", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "ieee754" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9007da9cacbd3e6343da136e98b0d2df013f553d35bdec8b518f07bea768e19c" - [[package]] name = "indexmap" version = "2.9.0" @@ -1948,35 +624,6 @@ checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown 0.15.2", - "serde", -] - -[[package]] -name = "indicatif" -version = "0.17.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" -dependencies = [ - "console", - "number_prefix", - "portable-atomic", - "unicode-width", - "web-time", -] - -[[package]] -name = "ipnet" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", ] [[package]] @@ -1985,60 +632,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - [[package]] name = "js-sys" version = "0.3.77" @@ -2049,35 +642,6 @@ 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 = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2 0.10.9", - "signature 2.2.0", -] - [[package]] name = "keccak" version = "0.1.5" @@ -2093,24 +657,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - [[package]] name = "libsecp256k1" version = "0.6.0" @@ -2120,33 +672,14 @@ dependencies = [ "arrayref", "base64 0.12.3", "digest 0.9.0", - "libsecp256k1-core 0.2.2", - "libsecp256k1-gen-ecmult 0.2.1", - "libsecp256k1-gen-genmult 0.2.1", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", "rand 0.7.3", "serde", "sha2 0.9.9", ] -[[package]] -name = "libsecp256k1" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139" -dependencies = [ - "arrayref", - "base64 0.22.1", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core 0.3.0", - "libsecp256k1-gen-ecmult 0.3.0", - "libsecp256k1-gen-genmult 0.3.0", - "rand 0.8.5", - "serde", - "sha2 0.9.9", - "typenum", -] - [[package]] name = "libsecp256k1-core" version = "0.2.2" @@ -2158,33 +691,13 @@ dependencies = [ "subtle", ] -[[package]] -name = "libsecp256k1-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" -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 0.2.2", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" -dependencies = [ - "libsecp256k1-core 0.3.0", + "libsecp256k1-core", ] [[package]] @@ -2193,30 +706,9 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" dependencies = [ - "libsecp256k1-core 0.2.2", + "libsecp256k1-core", ] -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" -dependencies = [ - "libsecp256k1-core 0.3.0", -] - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - [[package]] name = "lock_api" version = "0.4.12" @@ -2233,12 +725,6 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - [[package]] name = "memchr" version = "2.7.4" @@ -2254,107 +740,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "no-std-compat" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" - -[[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 = "nonzero_ext" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" - -[[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 0.2.4", - "num-integer", - "num-iter", - "num-rational 0.2.4", - "num-traits", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint 0.4.6", - "num-complex 0.4.6", - "num-integer", - "num-iter", - "num-rational 0.4.2", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -2365,31 +750,6 @@ dependencies = [ "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-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "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.4.2" @@ -2410,40 +770,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" -dependencies = [ - "autocfg", - "num-bigint 0.2.6", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint 0.4.6", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -2453,53 +779,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" -dependencies = [ - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - -[[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.21.3" @@ -2512,18 +791,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.3" @@ -2544,85 +811,9 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "percentage" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" -dependencies = [ - "num 0.2.1", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[package]] -name = "portable-atomic" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -2632,23 +823,13 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.117", -] - [[package]] name = "proc-macro-crate" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml 0.5.11", + "toml", ] [[package]] @@ -2669,178 +850,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proptest" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "num-traits", - "rand 0.9.4", - "rand_chacha 0.9.0", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "pyth-sdk" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5c805ba3dfb5b7ed6a8ffa62ec38391f485a79c7cf6b3b11d3bd44fb0325824" -dependencies = [ - "borsh 0.9.3", - "borsh-derive 0.9.3", - "hex", - "schemars", - "serde", -] - -[[package]] -name = "pyth-solana-receiver-sdk" -version = "0.6.0" -dependencies = [ - "anchor-lang", - "bytemuck_derive", - "hex", - "pythnet-sdk", -] - -[[package]] -name = "pythnet-sdk" -version = "2.3.1" -dependencies = [ - "anchor-lang", - "base64 0.21.7", - "bincode", - "borsh 0.10.4", - "bytemuck", - "byteorder", - "fast-math", - "hex", - "libsecp256k1 0.7.2", - "proptest", - "pyth-sdk", - "quickcheck", - "rand 0.7.3", - "rand 0.8.5", - "rustc_version", - "serde", - "serde_json", - "serde_wormhole", - "sha3", - "slow_primes", - "solana-client", - "solana-program 2.2.1", - "solana-sdk", - "strum", - "thiserror 1.0.69", - "wormhole-vaas-serde", -] - -[[package]] -name = "qstring" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "quanta" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi 0.11.0+wasi-snapshot-preview1", - "web-sys", - "winapi", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quickcheck" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95c589f335db0f6aaa168a7cd27b1fc6920f5e1470c804f814d9cd6e62a0f70b" -dependencies = [ - "env_logger", - "log", - "rand 0.10.1", -] - -[[package]] -name = "quinn" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls 0.23.40", - "socket2 0.6.3", - "thiserror 2.0.12", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" -dependencies = [ - "bytes", - "fastbloom", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.4", - "ring", - "rustc-hash", - "rustls 0.23.40", - "rustls-pki-types", - "rustls-platform-verifier", - "slab", - "thiserror 2.0.12", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.6.3", - "tracing", - "windows-sys 0.60.2", -] - [[package]] name = "quote" version = "1.0.40" @@ -2850,18 +859,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - [[package]] name = "rand" version = "0.7.3" @@ -2886,26 +883,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" -dependencies = [ - "getrandom 0.4.2", - "rand_core 0.10.1", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -2926,16 +903,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -2954,21 +921,6 @@ dependencies = [ "getrandom 0.2.16", ] -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_core" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" - [[package]] name = "rand_hc" version = "0.2.0" @@ -2978,44 +930,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_xorshift" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" -dependencies = [ - "rand_core 0.9.5", -] - -[[package]] -name = "raw-cpuid" -version = "11.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" -dependencies = [ - "bitflags", -] - -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "redox_syscall" version = "0.5.12" @@ -3025,120 +939,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 1.4.0", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls 0.23.40", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls 0.26.4", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 1.0.7", -] - -[[package]] -name = "reqwest-middleware" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" -dependencies = [ - "anyhow", - "async-trait", - "http 1.4.0", - "reqwest", - "serde", - "thiserror 1.0.69", - "tower-service", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac 0.12.1", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - [[package]] name = "rustc_version" version = "0.4.1" @@ -3148,243 +948,24 @@ dependencies = [ "semver", ] -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.23.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki 0.103.13", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-platform-verifier" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" -dependencies = [ - "core-foundation", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls 0.23.40", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki 0.103.13", - "security-framework", - "security-framework-sys", - "webpki-root-certs", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - [[package]] name = "rustversion" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" -[[package]] -name = "rusty-fork" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - [[package]] name = "ryu" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "schemars" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" -dependencies = [ - "dyn-clone", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.117", -] - [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "3.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "1.0.26" @@ -3400,15 +981,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-big-array" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" -dependencies = [ - "serde", -] - [[package]] name = "serde_bytes" version = "0.11.17" @@ -3429,17 +1001,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "serde_json" version = "1.0.140" @@ -3452,74 +1013,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" -dependencies = [ - "serde", - "serde_derive", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "3.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_wormhole" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b022bf813578a06341fd453c3fd6e64945d9975191193d5d45e8dbd97d1d84" -dependencies = [ - "base64 0.13.1", - "itoa", - "serde", - "serde_bytes", - "thiserror 1.0.69", -] - -[[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" @@ -3544,12 +1037,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha2-const-stable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" - [[package]] name = "sha3" version = "0.10.8" @@ -3564,23 +1051,21 @@ dependencies = [ name = "shine_login_guard" version = "0.1.0" dependencies = [ - "solana-program 2.2.1", + "solana-program", ] [[package]] name = "shine_payments" version = "0.2.0" dependencies = [ - "anchor-lang", - "common", - "pyth-solana-receiver-sdk", + "solana-program", ] [[package]] name = "shine_users" version = "0.1.0" dependencies = [ - "solana-program 2.2.1", + "solana-program", ] [[package]] @@ -3589,141 +1074,23 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "slow_primes" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58267dd2fbaa6dceecba9e3e106d2d90a2b02497c0e8b01b8759beccf5113938" -dependencies = [ - "num 0.4.3", -] - [[package]] name = "smallvec" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "solana-account" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f949fe4edaeaea78c844023bfc1c898e0b1f5a100f8a8d2d0f85d0a7b090258" dependencies = [ - "bincode", - "serde", - "serde_bytes", - "serde_derive", - "solana-account-info 2.2.1", - "solana-clock 2.2.2", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-sysvar 2.2.2", -] - -[[package]] -name = "solana-account" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f885ce7f937871ecb56aadbeaaec963b234a580b7d6ebbdb8fa4249a36f92433" -dependencies = [ - "bincode", - "serde", - "serde_bytes", - "serde_derive", - "solana-account-info 3.0.0", - "solana-clock 3.0.0", - "solana-instruction-error", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-sysvar 3.0.0", -] - -[[package]] -name = "solana-account-decoder-client-types" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5519e8343325b707f17fbed54fcefb325131b692506d0af9e08a539d15e4f8cf" -dependencies = [ - "base64 0.22.1", - "bs58", - "serde", - "serde_derive", - "serde_json", - "solana-account 2.2.1", - "solana-pubkey 2.4.0", - "zstd", + "solana-account-info", + "solana-clock", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", ] [[package]] @@ -3734,60 +1101,9 @@ checksum = "e0c17d606a298a205fae325489fbed88ee6dc4463c111672172327e741c8905d" dependencies = [ "bincode", "serde", - "solana-program-error 2.2.2", - "solana-program-memory 2.2.1", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-account-info" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82f4691b69b172c687d218dd2f1f23fc7ea5e9aa79df9ac26dab3d8dd829ce48" -dependencies = [ - "bincode", - "serde", - "solana-program-error 3.0.0", - "solana-program-memory 3.1.0", - "solana-pubkey 3.0.0", -] - -[[package]] -name = "solana-address" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7a457086457ea9db9a5199d719dc8734dc2d0342fad0d8f77633c31eb62f19" -dependencies = [ - "borsh 1.5.7", - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 4.1.3", - "five8 0.2.1", - "five8_const 0.1.4", - "rand 0.8.5", - "serde", - "serde_derive", - "solana-atomic-u64 3.0.1", - "solana-define-syscall 3.0.0", - "solana-program-error 3.0.0", - "solana-sanitize 3.0.1", - "solana-sha256-hasher 3.1.0", -] - -[[package]] -name = "solana-address" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1384b52c435a750cc9c538760fc7bb472fd78e65a9900a2d07312c5bb335b72" -dependencies = [ - "curve25519-dalek 4.1.3", - "five8 1.0.0", - "five8_const 1.0.0", - "sha2-const-stable", - "solana-define-syscall 5.1.0", - "solana-program-error 3.0.0", - "solana-sanitize 3.0.1", - "solana-sha256-hasher 3.1.0", + "solana-program-error", + "solana-program-memory", + "solana-pubkey", ] [[package]] @@ -3800,23 +1116,11 @@ dependencies = [ "bytemuck", "serde", "serde_derive", - "solana-clock 2.2.2", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-slot-hashes 2.2.1", -] - -[[package]] -name = "solana-address-lookup-table-interface" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115b4f773acc4f3f3cb986b0d335e9845c0368c82b0940410935bc11ae065578" -dependencies = [ - "solana-clock 3.0.0", - "solana-pubkey 4.2.0", - "solana-sdk-ids 3.1.0", - "solana-slot-hashes 3.0.0", + "solana-clock", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-slot-hashes", ] [[package]] @@ -3828,35 +1132,15 @@ dependencies = [ "parking_lot", ] -[[package]] -name = "solana-atomic-u64" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" -dependencies = [ - "parking_lot", -] - [[package]] name = "solana-big-mod-exp" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" dependencies = [ - "num-bigint 0.4.6", + "num-bigint", "num-traits", - "solana-define-syscall 2.3.0", -] - -[[package]] -name = "solana-big-mod-exp" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "solana-define-syscall 3.0.0", + "solana-define-syscall", ] [[package]] @@ -3867,7 +1151,7 @@ checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" dependencies = [ "bincode", "serde", - "solana-instruction 2.3.0", + "solana-instruction", ] [[package]] @@ -3877,20 +1161,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a0801e25a1b31a14494fc80882a036be0ffd290efc4c2d640bfcca120a4672" dependencies = [ "blake3", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-blake3-hasher" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" -dependencies = [ - "blake3", - "solana-define-syscall 4.0.1", - "solana-hash 4.3.0", + "solana-define-syscall", + "solana-hash", + "solana-sanitize", ] [[package]] @@ -3903,82 +1176,6 @@ dependencies = [ "borsh 1.5.7", ] -[[package]] -name = "solana-borsh" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" -dependencies = [ - "borsh 1.5.7", -] - -[[package]] -name = "solana-client" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc55d1f263e0be4127daf33378d313ea0977f9ffd3fba50fa544ca26722fc695" -dependencies = [ - "async-trait", - "bincode", - "dashmap", - "futures", - "futures-util", - "indexmap", - "indicatif", - "log", - "quinn", - "rayon", - "solana-account 2.2.1", - "solana-client-traits", - "solana-commitment-config", - "solana-connection-cache", - "solana-epoch-info 2.2.1", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-keypair 2.2.3", - "solana-measure", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", - "solana-pubsub-client", - "solana-quic-client", - "solana-quic-definitions", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-rpc-client-nonce-utils", - "solana-signature 2.3.0", - "solana-signer 2.2.1", - "solana-streamer", - "solana-thin-client", - "solana-time-utils 2.2.1", - "solana-tpu-client", - "solana-transaction 2.2.3", - "solana-transaction-error 2.2.1", - "solana-udp-client", - "thiserror 2.0.12", - "tokio", -] - -[[package]] -name = "solana-client-traits" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83f0071874e629f29e0eb3dab8a863e98502ac7aba55b7e0df1803fc5cac72a7" -dependencies = [ - "solana-account 2.2.1", - "solana-commitment-config", - "solana-epoch-info 2.2.1", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-keypair 2.2.3", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", - "solana-signature 2.3.0", - "solana-signer 2.2.1", - "solana-system-interface 1.0.0", - "solana-transaction 2.2.3", - "solana-transaction-error 2.2.1", -] - [[package]] name = "solana-clock" version = "2.2.2" @@ -3987,64 +1184,9 @@ checksum = "1bb482ab70fced82ad3d7d3d87be33d466a3498eb8aa856434ff3c0dfc2e2e31" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-clock" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb62e9381182459a4520b5fe7fb22d423cae736239a6427fc398a88743d0ed59" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-cluster-type" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ace9fea2daa28354d107ea879cff107181d85cd4e0f78a2bedb10e1a428c97e" -dependencies = [ - "solana-hash 2.3.0", -] - -[[package]] -name = "solana-commitment-config" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac49c4dde3edfa832de1697e9bcdb7c3b3f7cb7a1981b7c62526c8bb6700fb73" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-connection-cache" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c1cff5ebb26aefff52f1a8e476de70ec1683f8cc6e4a8c86b615842d91f436" -dependencies = [ - "async-trait", - "bincode", - "crossbeam-channel", - "futures-util", - "indexmap", - "log", - "rand 0.8.5", - "rayon", - "solana-keypair 2.2.3", - "solana-measure", - "solana-metrics", - "solana-time-utils 2.2.1", - "solana-transaction-error 2.2.1", - "thiserror 2.0.12", - "tokio", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -4053,26 +1195,12 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" dependencies = [ - "solana-account-info 2.2.1", - "solana-define-syscall 2.3.0", - "solana-instruction 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-stable-layout 2.2.1", -] - -[[package]] -name = "solana-cpi" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dea26709d867aada85d0d3617db0944215c8bb28d3745b912de7db13a23280c" -dependencies = [ - "solana-account-info 3.0.0", - "solana-define-syscall 4.0.1", - "solana-instruction 3.0.0", - "solana-program-error 3.0.0", - "solana-pubkey 4.2.0", - "solana-stable-layout 3.0.0", + "solana-account-info", + "solana-define-syscall", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-stable-layout", ] [[package]] @@ -4090,55 +1218,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" -[[package]] -name = "solana-define-syscall" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9697086a4e102d28a156b8d6b521730335d6951bd39a5e766512bbe09007cee" - -[[package]] -name = "solana-define-syscall" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57e5b1c0bc1d4a4d10c88a4100499d954c09d3fecfae4912c1a074dff68b1738" - -[[package]] -name = "solana-define-syscall" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e14a4f604117f379840956a8fc8695e4c84f5b0ebed192f31f60d9b85d581d" - -[[package]] -name = "solana-derivation-path" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff71743072690fdbdfcdc37700ae1cb77485aaad49019473a81aee099b1e0b8c" -dependencies = [ - "derivation-path", - "qstring", - "uriparse", -] - -[[package]] -name = "solana-epoch-info" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ef6f0b449290b0b9f32973eefd95af35b01c5c0c34c569f936c34c5b20d77b" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-epoch-info" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a6b69bd71386f61344f2bcf0f527f5fd6dd3b22add5880e2e1bf1dd1fa8059" -dependencies = [ - "serde", - "serde_derive", -] - [[package]] name = "solana-epoch-rewards" version = "2.2.1" @@ -4147,35 +1226,10 @@ checksum = "86b575d3dd323b9ea10bb6fe89bf6bf93e249b215ba8ed7f68f1a3633f384db7" dependencies = [ "serde", "serde_derive", - "solana-hash 2.3.0", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-epoch-rewards" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b319a4ed70390af911090c020571f0ff1f4ec432522d05ab89f5c08080381995" -dependencies = [ - "serde", - "serde_derive", - "solana-hash 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-epoch-rewards-hasher" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee8beac9bff4db9225e57d532d169b0be5e447f1e6601a2f50f27a01bf5518f" -dependencies = [ - "siphasher 0.3.11", - "solana-address 2.6.0", - "solana-hash 4.3.0", + "solana-hash", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -4186,32 +1240,9 @@ checksum = "3fce071fbddecc55d727b1d7ed16a629afe4f6e4c217bc8d00af3b785f6f67ed" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-epoch-schedule" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5481e72cc4d52c169db73e4c0cd16de8bc943078aac587ec4817a75cc6388f" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-epoch-stake" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027e6d0b9e7daac5b2ac7c3f9ca1b727861121d9ef05084cf435ff736051e7c2" -dependencies = [ - "solana-define-syscall 5.1.0", - "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -4222,37 +1253,16 @@ checksum = "84461d56cbb8bb8d539347151e0525b53910102e4bced875d49d5139708e39d3" dependencies = [ "serde", "serde_derive", - "solana-address-lookup-table-interface 2.2.2", - "solana-clock 2.2.2", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-keccak-hasher 2.2.1", - "solana-message 2.4.0", - "solana-nonce 2.2.1", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", - "thiserror 2.0.12", -] - -[[package]] -name = "solana-example-mocks" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978855d164845c1b0235d4b4d101cadc55373fffaf0b5b6cfa2194d25b2ed658" -dependencies = [ - "serde", - "serde_derive", - "solana-address-lookup-table-interface 3.1.0", - "solana-clock 3.0.0", - "solana-hash 3.0.0", - "solana-instruction 3.0.0", - "solana-keccak-hasher 3.1.0", - "solana-message 3.0.1", - "solana-nonce 3.0.0", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-system-interface 2.0.0", + "solana-address-lookup-table-interface", + "solana-clock", + "solana-hash", + "solana-instruction", + "solana-keccak-hasher", + "solana-message", + "solana-nonce", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", "thiserror 2.0.12", ] @@ -4265,14 +1275,14 @@ dependencies = [ "bincode", "serde", "serde_derive", - "solana-account 2.2.1", - "solana-account-info 2.2.1", - "solana-instruction 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", + "solana-account", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-system-interface", ] [[package]] @@ -4286,33 +1296,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "solana-fee-calculator" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a73cc03ca4bed871ca174558108835f8323e85917bb38b9c81c7af2ab853efe" -dependencies = [ - "log", - "serde", - "serde_derive", -] - -[[package]] -name = "solana-fee-structure" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2abdb1223eea8ec64136f39cb1ffcf257e00f915c957c35c0dd9e3f4e700b0" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-hard-forks" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52fd9cc610fd0782f09482527cb7b4f41ec22071303742718b7b57fc43bb236b" - [[package]] name = "solana-hash" version = "2.3.0" @@ -4322,56 +1305,15 @@ dependencies = [ "borsh 1.5.7", "bytemuck", "bytemuck_derive", - "five8 0.2.1", + "five8", "js-sys", "serde", "serde_derive", - "solana-atomic-u64 2.2.1", - "solana-sanitize 2.2.1", + "solana-atomic-u64", + "solana-sanitize", "wasm-bindgen", ] -[[package]] -name = "solana-hash" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a063723b9e84c14d8c0d2cdf0268207dc7adecf546e31251f9e07c7b00b566c" -dependencies = [ - "borsh 1.5.7", - "bytemuck", - "bytemuck_derive", - "five8 0.2.1", - "serde", - "serde_derive", - "solana-atomic-u64 3.0.1", - "solana-sanitize 3.0.1", -] - -[[package]] -name = "solana-hash" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b113239362cee7093bfb250467138f079a2a03673181dc15bff6ccd677912d" -dependencies = [ - "five8 1.0.0", -] - -[[package]] -name = "solana-inflation" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23eef6a09eb8e568ce6839573e4966850e85e9ce71e6ae1a6c930c1c43947de3" - -[[package]] -name = "solana-inflation" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e92f37a14e7c660628752833250dd3dcd8e95309876aee751d7f8769a27947c6" -dependencies = [ - "serde", - "serde_derive", -] - [[package]] name = "solana-instruction" version = "2.3.0" @@ -4385,38 +1327,11 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-define-syscall 2.3.0", - "solana-pubkey 2.4.0", + "solana-define-syscall", + "solana-pubkey", "wasm-bindgen", ] -[[package]] -name = "solana-instruction" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df4e8fcba01d7efa647ed20a081c234475df5e11a93acb4393cc2c9a7b99bab" -dependencies = [ - "bincode", - "borsh 1.5.7", - "serde", - "serde_derive", - "solana-define-syscall 3.0.0", - "solana-instruction-error", - "solana-pubkey 3.0.0", -] - -[[package]] -name = "solana-instruction-error" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f0d483b8ae387178d9210e0575b666b05cdd4bd0f2f188128249f6e454d39d" -dependencies = [ - "num-traits", - "serde", - "serde_derive", - "solana-program-error 3.0.0", -] - [[package]] name = "solana-instructions-sysvar" version = "2.2.2" @@ -4424,32 +1339,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" dependencies = [ "bitflags", - "solana-account-info 2.2.1", - "solana-instruction 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-serialize-utils 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-instructions-sysvar" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddf67876c541aa1e21ee1acae35c95c6fbc61119814bfef70579317a5e26955" -dependencies = [ - "bitflags", - "solana-account-info 3.0.0", - "solana-instruction 3.0.0", - "solana-instruction-error", - "solana-program-error 3.0.0", - "solana-pubkey 3.0.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-serialize-utils 3.1.0", - "solana-sysvar-id 3.1.0", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-sanitize", + "solana-sdk-ids", + "solana-serialize-utils", + "solana-sysvar-id", ] [[package]] @@ -4459,54 +1356,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" dependencies = [ "sha3", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-keccak-hasher" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed1c0d16d6fdeba12291a1f068cdf0d479d9bff1141bf44afd7aa9d485f65ef8" -dependencies = [ - "sha3", - "solana-define-syscall 4.0.1", - "solana-hash 4.3.0", -] - -[[package]] -name = "solana-keypair" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd3f04aa1a05c535e93e121a95f66e7dcccf57e007282e8255535d24bf1e98bb" -dependencies = [ - "ed25519-dalek 1.0.1", - "five8 0.2.1", - "rand 0.7.3", - "solana-pubkey 2.4.0", - "solana-seed-phrase 2.2.1", - "solana-signature 2.3.0", - "solana-signer 2.2.1", - "wasm-bindgen", -] - -[[package]] -name = "solana-keypair" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac8be597c9e231b0cab2928ce3bc3e4ee77d9c0ad92977b9d901f3879f25a7a" -dependencies = [ - "ed25519-dalek 2.2.0", - "ed25519-dalek-bip32", - "five8 1.0.0", - "rand 0.8.5", - "solana-address 2.6.0", - "solana-derivation-path", - "solana-seed-derivable", - "solana-seed-phrase 3.0.0", - "solana-signature 3.1.0", - "solana-signer 3.0.0", + "solana-define-syscall", + "solana-hash", + "solana-sanitize", ] [[package]] @@ -4517,22 +1369,9 @@ checksum = "4a6360ac2fdc72e7463565cd256eedcf10d7ef0c28a1249d261ec168c1b55cdd" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-last-restart-slot" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcda154ec827f5fc1e4da0af3417951b7e9b8157540f81f936c4a8b1156134d0" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.1.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -4544,24 +1383,24 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", ] [[package]] name = "solana-loader-v3-interface" -version = "3.0.0" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4be76cfa9afd84ca2f35ebc09f0da0f0092935ccdac0595d98447f259538c2" +checksum = "6f7162a05b8b0773156b443bccd674ea78bb9aa406325b467ea78c06c99a63a2" dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", ] [[package]] @@ -4573,18 +1412,12 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", - "solana-system-interface 1.0.0", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", ] -[[package]] -name = "solana-measure" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11dcd67cd2ae6065e494b64e861e0498d046d95a61cbbf1ae3d58be1ea0f42ed" - [[package]] name = "solana-message" version = "2.4.0" @@ -4597,69 +1430,24 @@ dependencies = [ "serde", "serde_derive", "solana-bincode", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-short-vec 2.2.1", - "solana-system-interface 1.0.0", - "solana-transaction-error 2.2.1", + "solana-hash", + "solana-instruction", + "solana-pubkey", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-system-interface", + "solana-transaction-error", "wasm-bindgen", ] -[[package]] -name = "solana-message" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85666605c9fd727f865ed381665db0a8fc29f984a030ecc1e40f43bfb2541623" -dependencies = [ - "bincode", - "blake3", - "lazy_static", - "serde", - "serde_derive", - "solana-address 1.0.0", - "solana-hash 3.0.0", - "solana-instruction 3.0.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-short-vec 3.0.0", - "solana-transaction-error 3.0.0", -] - -[[package]] -name = "solana-metrics" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0375159d8460f423d39e5103dcff6e07796a5ec1850ee1fcfacfd2482a8f34b5" -dependencies = [ - "crossbeam-channel", - "gethostname", - "log", - "reqwest", - "solana-cluster-type", - "solana-sha256-hasher 2.2.1", - "solana-time-utils 2.2.1", - "thiserror 2.0.12", -] - [[package]] name = "solana-msg" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36a1a14399afaabc2781a1db09cb14ee4cc4ee5c7a5a3cfcc601811379a8092" dependencies = [ - "solana-define-syscall 2.3.0", -] - -[[package]] -name = "solana-msg" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726b7cbbc6be6f1c6f29146ac824343b9415133eee8cce156452ad1db93f8008" -dependencies = [ - "solana-define-syscall 5.1.0", + "solana-define-syscall", ] [[package]] @@ -4668,33 +1456,6 @@ version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "307fb2f78060995979e9b4f68f833623565ed4e55d3725f100454ce78a99a1a3" -[[package]] -name = "solana-native-token" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" - -[[package]] -name = "solana-net-utils" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a9e831d0f09bd92135d48c5bc79071bb59c0537b9459f1b4dec17ecc0558fa" -dependencies = [ - "anyhow", - "bincode", - "bytes", - "itertools", - "log", - "nix", - "rand 0.8.5", - "serde", - "serde_derive", - "socket2 0.5.10", - "solana-serde 2.2.1", - "tokio", - "url", -] - [[package]] name = "solana-nonce" version = "2.2.1" @@ -4703,111 +1464,17 @@ checksum = "703e22eb185537e06204a5bd9d509b948f0066f2d1d814a6f475dafb3ddf1325" dependencies = [ "serde", "serde_derive", - "solana-fee-calculator 2.2.1", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.2.1", -] - -[[package]] -name = "solana-nonce" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abbdc6c8caf1c08db9f36a50967539d0f72b9f1d4aea04fec5430f532e5afadc" -dependencies = [ - "solana-fee-calculator 3.0.0", - "solana-hash 3.0.0", - "solana-pubkey 3.0.0", - "solana-sha256-hasher 3.1.0", -] - -[[package]] -name = "solana-offchain-message" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e2a1141a673f72a05cf406b99e4b2b8a457792b7c01afa07b3f00d4e2de393" -dependencies = [ - "num_enum", - "solana-hash 3.0.0", - "solana-packet 3.0.0", - "solana-pubkey 3.0.0", - "solana-sanitize 3.0.1", - "solana-sha256-hasher 3.1.0", - "solana-signature 3.1.0", - "solana-signer 3.0.0", -] - -[[package]] -name = "solana-packet" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "004f2d2daf407b3ec1a1ca5ec34b3ccdfd6866dd2d3c7d0715004a96e4b6d127" -dependencies = [ - "bincode", - "bitflags", - "cfg_eval", - "serde", - "serde_derive", - "serde_with", -] - -[[package]] -name = "solana-packet" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edf2f25743c95229ac0fdc32f8f5893ef738dbf332c669e9861d33ddb0f469d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "solana-perf" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37192c0be5c222ca49dbc5667288c5a8bb14837051dd98e541ee4dad160a5da9" -dependencies = [ - "ahash 0.8.12", - "bincode", - "bv", - "bytes", - "caps", - "curve25519-dalek 4.1.3", - "dlopen2", - "fnv", - "libc", - "log", - "nix", - "rand 0.8.5", - "rayon", - "serde", - "solana-hash 2.3.0", - "solana-message 2.4.0", - "solana-metrics", - "solana-packet 2.2.1", - "solana-pubkey 2.4.0", - "solana-rayon-threadlimit", - "solana-sdk-ids 2.2.1", - "solana-short-vec 2.2.1", - "solana-signature 2.3.0", - "solana-time-utils 2.2.1", -] - -[[package]] -name = "solana-presigner" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f704eaf825be3180832445b9e4983b875340696e8e7239bf2d535b0f86c14a2" -dependencies = [ - "solana-pubkey 3.0.0", - "solana-signature 3.1.0", - "solana-signer 3.0.0", + "solana-fee-calculator", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", ] [[package]] name = "solana-program" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "586469467e93ceb79048f8d8e3a619bf61d05396ee7de95cb40280301a589d05" +checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" dependencies = [ "bincode", "blake3", @@ -4821,137 +1488,78 @@ dependencies = [ "lazy_static", "log", "memoffset", - "num-bigint 0.4.6", + "num-bigint", "num-derive", "num-traits", "rand 0.8.5", "serde", "serde_bytes", "serde_derive", - "solana-account-info 2.2.1", - "solana-address-lookup-table-interface 2.2.2", - "solana-atomic-u64 2.2.1", - "solana-big-mod-exp 2.2.1", + "solana-account-info", + "solana-address-lookup-table-interface", + "solana-atomic-u64", + "solana-big-mod-exp", "solana-bincode", - "solana-blake3-hasher 2.2.1", - "solana-borsh 2.2.1", - "solana-clock 2.2.2", - "solana-cpi 2.2.1", + "solana-blake3-hasher", + "solana-borsh", + "solana-clock", + "solana-cpi", "solana-decode-error", - "solana-define-syscall 2.3.0", - "solana-epoch-rewards 2.2.1", - "solana-epoch-schedule 2.2.1", - "solana-example-mocks 2.2.1", + "solana-define-syscall", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-example-mocks", "solana-feature-gate-interface", - "solana-fee-calculator 2.2.1", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-instructions-sysvar 2.2.2", - "solana-keccak-hasher 2.2.1", - "solana-last-restart-slot 2.2.1", + "solana-fee-calculator", + "solana-hash", + "solana-instruction", + "solana-instructions-sysvar", + "solana-keccak-hasher", + "solana-last-restart-slot", "solana-loader-v2-interface", "solana-loader-v3-interface", "solana-loader-v4-interface", - "solana-message 2.4.0", - "solana-msg 2.2.1", - "solana-native-token 2.2.2", - "solana-nonce 2.2.1", - "solana-program-entrypoint 2.2.1", - "solana-program-error 2.2.2", - "solana-program-memory 2.2.1", - "solana-program-option 2.2.1", - "solana-program-pack 2.2.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-secp256k1-recover 2.2.1", - "solana-serde-varint 2.2.2", - "solana-serialize-utils 2.2.1", - "solana-sha256-hasher 2.2.1", - "solana-short-vec 2.2.1", - "solana-slot-hashes 2.2.1", - "solana-slot-history 2.2.1", - "solana-stable-layout 2.2.1", + "solana-message", + "solana-msg", + "solana-native-token", + "solana-nonce", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sanitize", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", "solana-stake-interface", - "solana-system-interface 1.0.0", - "solana-sysvar 2.2.2", - "solana-sysvar-id 2.2.1", + "solana-system-interface", + "solana-sysvar", + "solana-sysvar-id", "solana-vote-interface", "thiserror 2.0.12", "wasm-bindgen", ] -[[package]] -name = "solana-program" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91b12305dd81045d705f427acd0435a2e46444b65367d7179d7bdcfc3bc5f5eb" -dependencies = [ - "memoffset", - "solana-account-info 3.0.0", - "solana-big-mod-exp 3.0.0", - "solana-blake3-hasher 3.1.0", - "solana-borsh 3.0.2", - "solana-clock 3.0.0", - "solana-cpi 3.1.0", - "solana-define-syscall 3.0.0", - "solana-epoch-rewards 3.0.0", - "solana-epoch-schedule 3.0.0", - "solana-epoch-stake", - "solana-example-mocks 3.0.0", - "solana-fee-calculator 3.0.0", - "solana-hash 3.0.0", - "solana-instruction 3.0.0", - "solana-instruction-error", - "solana-instructions-sysvar 3.0.0", - "solana-keccak-hasher 3.1.0", - "solana-last-restart-slot 3.0.0", - "solana-msg 3.1.0", - "solana-native-token 3.0.0", - "solana-program-entrypoint 3.1.1", - "solana-program-error 3.0.0", - "solana-program-memory 3.1.0", - "solana-program-option 3.1.0", - "solana-program-pack 3.1.0", - "solana-pubkey 3.0.0", - "solana-rent 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-secp256k1-recover 3.1.0", - "solana-serde-varint 3.0.0", - "solana-serialize-utils 3.1.0", - "solana-sha256-hasher 3.1.0", - "solana-short-vec 3.0.0", - "solana-slot-hashes 3.0.0", - "solana-slot-history 3.0.0", - "solana-stable-layout 3.0.0", - "solana-sysvar 3.0.0", - "solana-sysvar-id 3.1.0", -] - [[package]] name = "solana-program-entrypoint" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "473ffe73c68d93e9f2aa726ad2985fe52760052709aaab188100a42c618060ec" dependencies = [ - "solana-account-info 2.2.1", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-program-entrypoint" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c9b0a1ff494e05f503a08b3d51150b73aa639544631e510279d6375f290997" -dependencies = [ - "solana-account-info 3.0.0", - "solana-define-syscall 4.0.1", - "solana-program-error 3.0.0", - "solana-pubkey 4.2.0", + "solana-account-info", + "solana-msg", + "solana-program-error", + "solana-pubkey", ] [[package]] @@ -4965,20 +1573,9 @@ dependencies = [ "serde", "serde_derive", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-msg 2.2.1", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-program-error" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1af32c995a7b692a915bb7414d5f8e838450cf7c70414e763d8abcae7b51f28" -dependencies = [ - "borsh 1.5.7", - "serde", - "serde_derive", + "solana-instruction", + "solana-msg", + "solana-pubkey", ] [[package]] @@ -4988,16 +1585,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b0268f6c89825fb634a34bd0c3b8fdaeaecfc3728be1d622a8ee6dd577b60d4" dependencies = [ "num-traits", - "solana-define-syscall 2.3.0", -] - -[[package]] -name = "solana-program-memory" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4068648649653c2c50546e9a7fb761791b5ab0cda054c771bb5808d3a4b9eb52" -dependencies = [ - "solana-define-syscall 4.0.1", + "solana-define-syscall", ] [[package]] @@ -5006,28 +1594,13 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc677a2e9bc616eda6dbdab834d463372b92848b2bfe4a1ed4e4b4adba3397d0" -[[package]] -name = "solana-program-option" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a88006a9b8594088cec9027ab77caaaa258a2aaa2083d3f086c44b42e50aeab" - [[package]] name = "solana-program-pack" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "319f0ef15e6e12dc37c597faccb7d62525a509fec5f6975ecb9419efddeb277b" dependencies = [ - "solana-program-error 2.2.2", -] - -[[package]] -name = "solana-program-pack" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7701cb15b90667ae1c89ef4ac35a59c61e66ce58ddee13d729472af7f41d59" -dependencies = [ - "solana-program-error 3.0.0", + "solana-program-error", ] [[package]] @@ -5040,116 +1613,22 @@ dependencies = [ "borsh 1.5.7", "bytemuck", "bytemuck_derive", - "curve25519-dalek 4.1.3", - "five8 0.2.1", - "five8_const 0.1.4", + "curve25519-dalek", + "five8", + "five8_const", "getrandom 0.2.16", "js-sys", "num-traits", "serde", "serde_derive", - "solana-atomic-u64 2.2.1", + "solana-atomic-u64", "solana-decode-error", - "solana-define-syscall 2.3.0", - "solana-sanitize 2.2.1", - "solana-sha256-hasher 2.2.1", + "solana-define-syscall", + "solana-sanitize", + "solana-sha256-hasher", "wasm-bindgen", ] -[[package]] -name = "solana-pubkey" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" -dependencies = [ - "rand 0.8.5", - "solana-address 1.0.0", -] - -[[package]] -name = "solana-pubkey" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" -dependencies = [ - "solana-address 2.6.0", -] - -[[package]] -name = "solana-pubsub-client" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18a7476e1d2e8df5093816afd8fffee94fbb6e442d9be8e6bd3e85f88ce8d5c" -dependencies = [ - "crossbeam-channel", - "futures-util", - "http 0.2.12", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder-client-types", - "solana-clock 2.2.2", - "solana-pubkey 2.4.0", - "solana-rpc-client-types", - "solana-signature 2.3.0", - "thiserror 2.0.12", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url", -] - -[[package]] -name = "solana-quic-client" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44feb5f4a97494459c435aa56de810500cc24e22d0afc632990a8e54a07c05a4" -dependencies = [ - "async-lock", - "async-trait", - "futures", - "itertools", - "log", - "quinn", - "quinn-proto", - "rustls 0.23.40", - "solana-connection-cache", - "solana-keypair 2.2.3", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-pubkey 2.4.0", - "solana-quic-definitions", - "solana-rpc-client-api", - "solana-signer 2.2.1", - "solana-streamer", - "solana-tls-utils", - "solana-transaction-error 2.2.1", - "thiserror 2.0.12", - "tokio", -] - -[[package]] -name = "solana-quic-definitions" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf0d4d5b049eb1d0c35f7b18f305a27c8986fc5c0c9b383e97adaa35334379e" -dependencies = [ - "solana-keypair 2.2.3", -] - -[[package]] -name = "solana-rayon-threadlimit" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cc2a4cae3ef7bb6346b35a60756d2622c297d5fa204f96731db9194c0dc75b" -dependencies = [ - "num_cpus", -] - [[package]] name = "solana-rent" version = "2.2.1" @@ -5158,137 +1637,9 @@ checksum = "d1aea8fdea9de98ca6e8c2da5827707fb3842833521b528a713810ca685d2480" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-rent" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b702d8c43711e3c8a9284a4f1bbc6a3de2553deb25b0c8142f9a44ef0ce5ddc1" -dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.0", - "solana-sysvar-id 3.1.0", -] - -[[package]] -name = "solana-reward-info" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18205b69139b1ae0ab8f6e11cdcb627328c0814422ad2482000fa2ca54ae4a2f" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-rpc-client" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d3161ac0918178e674c1f7f1bfac40de3e7ed0383bd65747d63113c156eaeb" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bincode", - "bs58", - "futures", - "indicatif", - "log", - "reqwest", - "reqwest-middleware", - "semver", - "serde", - "serde_derive", - "serde_json", - "solana-account 2.2.1", - "solana-account-decoder-client-types", - "solana-clock 2.2.2", - "solana-commitment-config", - "solana-epoch-info 2.2.1", - "solana-epoch-schedule 2.2.1", - "solana-feature-gate-interface", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", - "solana-rpc-client-api", - "solana-signature 2.3.0", - "solana-transaction 2.2.3", - "solana-transaction-error 2.2.1", - "solana-transaction-status-client-types", - "solana-version", - "solana-vote-interface", - "tokio", -] - -[[package]] -name = "solana-rpc-client-api" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dbc138685c79d88a766a8fd825057a74ea7a21e1dd7f8de275ada899540fff7" -dependencies = [ - "anyhow", - "jsonrpc-core", - "reqwest", - "reqwest-middleware", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder-client-types", - "solana-clock 2.2.2", - "solana-rpc-client-types", - "solana-signer 2.2.1", - "solana-transaction-error 2.2.1", - "solana-transaction-status-client-types", - "thiserror 2.0.12", -] - -[[package]] -name = "solana-rpc-client-nonce-utils" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f0ee41b9894ff36adebe546a110b899b0d0294b07845d8acdc73822e6af4b0" -dependencies = [ - "solana-account 2.2.1", - "solana-commitment-config", - "solana-hash 2.3.0", - "solana-message 2.4.0", - "solana-nonce 2.2.1", - "solana-pubkey 2.4.0", - "solana-rpc-client", - "solana-sdk-ids 2.2.1", - "thiserror 2.0.12", -] - -[[package]] -name = "solana-rpc-client-types" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea428a81729255d895ea47fba9b30fd4dacbfe571a080448121bd0592751676" -dependencies = [ - "base64 0.22.1", - "bs58", - "semver", - "serde", - "serde_derive", - "serde_json", - "solana-account 2.2.1", - "solana-account-decoder-client-types", - "solana-clock 2.2.2", - "solana-commitment-config", - "solana-fee-calculator 2.2.1", - "solana-inflation 2.2.1", - "solana-pubkey 2.4.0", - "solana-transaction-error 2.2.1", - "solana-transaction-status-client-types", - "solana-version", - "spl-generic-token", - "thiserror 2.0.12", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -5297,66 +1648,13 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" -[[package]] -name = "solana-sanitize" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" - -[[package]] -name = "solana-sdk" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f03df7969f5e723ad31b6c9eadccc209037ac4caa34d8dc259316b05c11e82b" -dependencies = [ - "bincode", - "bs58", - "serde", - "solana-account 3.0.0", - "solana-epoch-info 3.0.0", - "solana-epoch-rewards-hasher", - "solana-fee-structure", - "solana-inflation 3.0.0", - "solana-keypair 3.1.0", - "solana-message 3.0.1", - "solana-offchain-message", - "solana-presigner", - "solana-program 3.0.0", - "solana-program-memory 3.1.0", - "solana-pubkey 3.0.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.0", - "solana-seed-derivable", - "solana-seed-phrase 3.0.0", - "solana-serde 3.0.0", - "solana-serde-varint 3.0.0", - "solana-short-vec 3.0.0", - "solana-shred-version", - "solana-signature 3.1.0", - "solana-signer 3.0.0", - "solana-time-utils 3.0.0", - "solana-transaction 3.0.1", - "solana-transaction-error 3.0.0", - "thiserror 2.0.12", -] - [[package]] name = "solana-sdk-ids" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c5d8b9cc68d5c88b062a33e23a6466722467dde0035152d8fb1afbcdf350a5f" dependencies = [ - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-sdk-ids" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" -dependencies = [ - "solana-address 2.6.0", + "solana-pubkey", ] [[package]] @@ -5371,89 +1669,17 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "solana-sdk-macro" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6430000e97083460b71d9fbadc52a2ab2f88f53b3a4c5e58c5ae3640a0e8c00" -dependencies = [ - "bs58", - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "solana-secp256k1-recover" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496" dependencies = [ - "libsecp256k1 0.6.0", - "solana-define-syscall 2.3.0", + "libsecp256k1", + "solana-define-syscall", "thiserror 2.0.12", ] -[[package]] -name = "solana-secp256k1-recover" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de18cfdab99eeb940fbedd8c981fa130c0d76252da75d05446f22fae8b51932" -dependencies = [ - "k256", - "solana-define-syscall 4.0.1", - "thiserror 2.0.12", -] - -[[package]] -name = "solana-seed-derivable" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff7bdb72758e3bec33ed0e2658a920f1f35dfb9ed576b951d20d63cb61ecd95c" -dependencies = [ - "solana-derivation-path", -] - -[[package]] -name = "solana-seed-phrase" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36187af2324f079f65a675ec22b31c24919cb4ac22c79472e85d819db9bbbc15" -dependencies = [ - "hmac 0.12.1", - "pbkdf2", - "sha2 0.10.9", -] - -[[package]] -name = "solana-seed-phrase" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" -dependencies = [ - "hmac 0.12.1", - "pbkdf2", - "sha2 0.10.9", -] - -[[package]] -name = "solana-serde" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1931484a408af466e14171556a47adaa215953c7f48b24e5f6b0282763818b04" -dependencies = [ - "serde", -] - -[[package]] -name = "solana-serde" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709a93cab694c70f40b279d497639788fc2ccbcf9b4aa32273d4b361322c02dd" -dependencies = [ - "serde", -] - [[package]] name = "solana-serde-varint" version = "2.2.2" @@ -5463,35 +1689,15 @@ dependencies = [ "serde", ] -[[package]] -name = "solana-serde-varint" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5174c57d5ff3c1995f274d17156964664566e2cde18a07bba1586d35a70d3b" -dependencies = [ - "serde", -] - [[package]] name = "solana-serialize-utils" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e" dependencies = [ - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-serialize-utils" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e41dd8feea239516c623a02f0a81c2367f4b604d7965237fed0751aeec33ed" -dependencies = [ - "solana-instruction-error", - "solana-pubkey 3.0.0", - "solana-sanitize 3.0.1", + "solana-instruction", + "solana-pubkey", + "solana-sanitize", ] [[package]] @@ -5501,19 +1707,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0037386961c0d633421f53560ad7c80675c0447cba4d1bb66d60974dd486c7ea" dependencies = [ "sha2 0.10.9", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", -] - -[[package]] -name = "solana-sha256-hasher" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" -dependencies = [ - "sha2 0.10.9", - "solana-define-syscall 4.0.1", - "solana-hash 4.3.0", + "solana-define-syscall", + "solana-hash", ] [[package]] @@ -5525,77 +1720,6 @@ dependencies = [ "serde", ] -[[package]] -name = "solana-short-vec" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b69d029da5428fc1c57f7d49101b2077c61f049d4112cd5fb8456567cc7d2638" -dependencies = [ - "serde", -] - -[[package]] -name = "solana-shred-version" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c79722e299d957958bf33695f7cd1ef6724ff55563c60fd9e3e24487cccde2" -dependencies = [ - "solana-hard-forks", - "solana-hash 4.3.0", - "solana-sha256-hasher 3.1.0", -] - -[[package]] -name = "solana-signature" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c" -dependencies = [ - "ed25519-dalek 1.0.1", - "five8 0.2.1", - "serde", - "serde-big-array", - "serde_derive", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-signature" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb8057cc0e9f7b5e89883d49de6f407df655bb6f3a71d0b7baf9986a2218fd9" -dependencies = [ - "ed25519-dalek 2.2.0", - "five8 0.2.1", - "rand 0.8.5", - "serde", - "serde-big-array", - "serde_derive", - "solana-sanitize 3.0.1", -] - -[[package]] -name = "solana-signer" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c41991508a4b02f021c1342ba00bcfa098630b213726ceadc7cb032e051975b" -dependencies = [ - "solana-pubkey 2.4.0", - "solana-signature 2.3.0", - "solana-transaction-error 2.2.1", -] - -[[package]] -name = "solana-signer" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bfea97951fee8bae0d6038f39a5efcb6230ecdfe33425ac75196d1a1e3e3235" -dependencies = [ - "solana-pubkey 3.0.0", - "solana-signature 3.1.0", - "solana-transaction-error 3.0.0", -] - [[package]] name = "solana-slot-hashes" version = "2.2.1" @@ -5604,22 +1728,9 @@ checksum = "0c8691982114513763e88d04094c9caa0376b867a29577939011331134c301ce" dependencies = [ "serde", "serde_derive", - "solana-hash 2.3.0", - "solana-sdk-ids 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-slot-hashes" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80a293f952293281443c04f4d96afd9d547721923d596e92b4377ed2360f1746" -dependencies = [ - "serde", - "serde_derive", - "solana-hash 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-sysvar-id 3.1.0", + "solana-hash", + "solana-sdk-ids", + "solana-sysvar-id", ] [[package]] @@ -5631,21 +1742,8 @@ dependencies = [ "bv", "serde", "serde_derive", - "solana-sdk-ids 2.2.1", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-slot-history" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f914f6b108f5bba14a280b458d023e3621c9973f27f015a4d755b50e88d89e97" -dependencies = [ - "bv", - "serde", - "serde_derive", - "solana-sdk-ids 3.1.0", - "solana-sysvar-id 3.1.0", + "solana-sdk-ids", + "solana-sysvar-id", ] [[package]] @@ -5654,18 +1752,8 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54" dependencies = [ - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-stable-layout" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1da74507795b6e8fb60b7c7306c0c36e2c315805d16eaaf479452661234685ac" -dependencies = [ - "solana-instruction 3.0.0", - "solana-pubkey 3.0.0", + "solana-instruction", + "solana-pubkey", ] [[package]] @@ -5679,69 +1767,16 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-clock 2.2.2", - "solana-cpi 2.2.1", + "solana-clock", + "solana-cpi", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-system-interface 1.0.0", - "solana-sysvar-id 2.2.1", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-system-interface", + "solana-sysvar-id", ] -[[package]] -name = "solana-streamer" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5643516e5206b89dd4bdf67c39815606d835a51a13260e43349abdb92d241b1d" -dependencies = [ - "async-channel", - "bytes", - "crossbeam-channel", - "dashmap", - "futures", - "futures-util", - "governor", - "histogram", - "indexmap", - "itertools", - "libc", - "log", - "nix", - "pem", - "percentage", - "quinn", - "quinn-proto", - "rand 0.8.5", - "rustls 0.23.40", - "smallvec", - "socket2 0.5.10", - "solana-keypair 2.2.3", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-packet 2.2.1", - "solana-perf", - "solana-pubkey 2.4.0", - "solana-quic-definitions", - "solana-signature 2.3.0", - "solana-signer 2.2.1", - "solana-time-utils 2.2.1", - "solana-tls-utils", - "solana-transaction-error 2.2.1", - "solana-transaction-metrics-tracker", - "thiserror 2.0.12", - "tokio", - "tokio-util", - "x509-parser", -] - -[[package]] -name = "solana-svm-feature-set" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f24b836eb4d74ec255217bdbe0f24f64a07adeac31aca61f334f91cd4a3b1d5" - [[package]] name = "solana-system-interface" version = "1.0.0" @@ -5753,23 +1788,11 @@ dependencies = [ "serde", "serde_derive", "solana-decode-error", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", + "solana-instruction", + "solana-pubkey", "wasm-bindgen", ] -[[package]] -name = "solana-system-interface" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" -dependencies = [ - "num-traits", - "solana-msg 3.1.0", - "solana-program-error 3.0.0", - "solana-pubkey 3.0.0", -] - [[package]] name = "solana-sysvar" version = "2.2.2" @@ -5783,62 +1806,28 @@ dependencies = [ "lazy_static", "serde", "serde_derive", - "solana-account-info 2.2.1", - "solana-clock 2.2.2", - "solana-define-syscall 2.3.0", - "solana-epoch-rewards 2.2.1", - "solana-epoch-schedule 2.2.1", - "solana-fee-calculator 2.2.1", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-instructions-sysvar 2.2.2", - "solana-last-restart-slot 2.2.1", - "solana-program-entrypoint 2.2.1", - "solana-program-error 2.2.2", - "solana-program-memory 2.2.1", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-sdk-macro 2.2.1", - "solana-slot-hashes 2.2.1", - "solana-slot-history 2.2.1", + "solana-account-info", + "solana-clock", + "solana-define-syscall", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash", + "solana-instruction", + "solana-instructions-sysvar", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey", + "solana-rent", + "solana-sanitize", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", "solana-stake-interface", - "solana-sysvar-id 2.2.1", -] - -[[package]] -name = "solana-sysvar" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63205e68d680bcc315337dec311b616ab32fea0a612db3b883ce4de02e0953f9" -dependencies = [ - "base64 0.22.1", - "bincode", - "bytemuck", - "bytemuck_derive", - "lazy_static", - "serde", - "serde_derive", - "solana-account-info 3.0.0", - "solana-clock 3.0.0", - "solana-define-syscall 3.0.0", - "solana-epoch-rewards 3.0.0", - "solana-epoch-schedule 3.0.0", - "solana-fee-calculator 3.0.0", - "solana-hash 3.0.0", - "solana-instruction 3.0.0", - "solana-last-restart-slot 3.0.0", - "solana-program-entrypoint 3.1.1", - "solana-program-error 3.0.0", - "solana-program-memory 3.1.0", - "solana-pubkey 3.0.0", - "solana-rent 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.0", - "solana-slot-hashes 3.0.0", - "solana-slot-history 3.0.0", - "solana-sysvar-id 3.1.0", + "solana-sysvar-id", ] [[package]] @@ -5847,170 +1836,8 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1" dependencies = [ - "solana-pubkey 2.4.0", - "solana-sdk-ids 2.2.1", -] - -[[package]] -name = "solana-sysvar-id" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" -dependencies = [ - "solana-address 2.6.0", - "solana-sdk-ids 3.1.0", -] - -[[package]] -name = "solana-thin-client" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1025715a113e0e2e379b30a6bfe4455770dc0759dabf93f7dbd16646d5acbe" -dependencies = [ - "bincode", - "log", - "rayon", - "solana-account 2.2.1", - "solana-client-traits", - "solana-clock 2.2.2", - "solana-commitment-config", - "solana-connection-cache", - "solana-epoch-info 2.2.1", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-keypair 2.2.3", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-signature 2.3.0", - "solana-signer 2.2.1", - "solana-system-interface 1.0.0", - "solana-transaction 2.2.3", - "solana-transaction-error 2.2.1", -] - -[[package]] -name = "solana-time-utils" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af261afb0e8c39252a04d026e3ea9c405342b08c871a2ad8aa5448e068c784c" - -[[package]] -name = "solana-time-utils" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced92c60aa76ec4780a9d93f3bd64dfa916e1b998eacc6f1c110f3f444f02c9" - -[[package]] -name = "solana-tls-utils" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14494aa87a75a883d1abcfee00f1278a28ecc594a2f030084879eb40570728f6" -dependencies = [ - "rustls 0.23.40", - "solana-keypair 2.2.3", - "solana-pubkey 2.4.0", - "solana-signer 2.2.1", - "x509-parser", -] - -[[package]] -name = "solana-tpu-client" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17895ce70fd1dd93add3fbac87d599954ded93c63fa1c66f702d278d96a6da14" -dependencies = [ - "async-trait", - "bincode", - "futures-util", - "indexmap", - "indicatif", - "log", - "rayon", - "solana-client-traits", - "solana-clock 2.2.2", - "solana-commitment-config", - "solana-connection-cache", - "solana-epoch-schedule 2.2.1", - "solana-measure", - "solana-message 2.4.0", - "solana-net-utils", - "solana-pubkey 2.4.0", - "solana-pubsub-client", - "solana-quic-definitions", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-signature 2.3.0", - "solana-signer 2.2.1", - "solana-transaction 2.2.3", - "solana-transaction-error 2.2.1", - "thiserror 2.0.12", - "tokio", -] - -[[package]] -name = "solana-transaction" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80657d6088f721148f5d889c828ca60c7daeedac9a8679f9ec215e0c42bcbf41" -dependencies = [ - "bincode", - "serde", - "serde_derive", - "solana-bincode", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-keypair 2.2.3", - "solana-message 2.4.0", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-short-vec 2.2.1", - "solana-signature 2.3.0", - "solana-signer 2.2.1", - "solana-system-interface 1.0.0", - "solana-transaction-error 2.2.1", - "wasm-bindgen", -] - -[[package]] -name = "solana-transaction" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64928e6af3058dcddd6da6680cbe08324b4e071ad73115738235bbaa9e9f72a5" -dependencies = [ - "bincode", - "serde", - "serde_derive", - "solana-address 1.0.0", - "solana-hash 3.0.0", - "solana-instruction 3.0.0", - "solana-instruction-error", - "solana-message 3.0.1", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-short-vec 3.0.0", - "solana-signature 3.1.0", - "solana-signer 3.0.0", - "solana-transaction-error 3.0.0", -] - -[[package]] -name = "solana-transaction-context" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a312304361987a85b2ef2293920558e6612876a639dd1309daf6d0d59ef2fe" -dependencies = [ - "bincode", - "serde", - "serde_derive", - "solana-account 2.2.1", - "solana-instruction 2.3.0", - "solana-instructions-sysvar 2.2.2", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", + "solana-pubkey", + "solana-sdk-ids", ] [[package]] @@ -6019,92 +1846,8 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "222a9dc8fdb61c6088baab34fc3a8b8473a03a7a5fd404ed8dd502fa79b67cb1" dependencies = [ - "serde", - "serde_derive", - "solana-instruction 2.3.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-transaction-error" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4222065402340d7e6aec9dc3e54d22992ddcf923d91edcd815443c2bfca3144a" -dependencies = [ - "serde", - "serde_derive", - "solana-instruction-error", - "solana-sanitize 3.0.1", -] - -[[package]] -name = "solana-transaction-metrics-tracker" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fc4e1b6252dc724f5ee69db6229feb43070b7318651580d2174da8baefb993" -dependencies = [ - "base64 0.22.1", - "bincode", - "log", - "rand 0.8.5", - "solana-packet 2.2.1", - "solana-perf", - "solana-short-vec 2.2.1", - "solana-signature 2.3.0", -] - -[[package]] -name = "solana-transaction-status-client-types" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f1d7c2387c35850848212244d2b225847666cb52d3bd59a5c409d2c300303d" -dependencies = [ - "base64 0.22.1", - "bincode", - "bs58", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder-client-types", - "solana-commitment-config", - "solana-message 2.4.0", - "solana-reward-info", - "solana-signature 2.3.0", - "solana-transaction 2.2.3", - "solana-transaction-context", - "solana-transaction-error 2.2.1", - "thiserror 2.0.12", -] - -[[package]] -name = "solana-udp-client" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd36227dd3035ac09a89d4239551d2e3d7d9b177b61ccc7c6d393c3974d0efa" -dependencies = [ - "async-trait", - "solana-connection-cache", - "solana-keypair 2.2.3", - "solana-net-utils", - "solana-streamer", - "solana-transaction-error 2.2.1", - "thiserror 2.0.12", - "tokio", -] - -[[package]] -name = "solana-version" -version = "2.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3324d46c7f7b7f5d34bf7dc71a2883bdc072c7b28ca81d0b2167ecec4cf8da9f" -dependencies = [ - "agave-feature-set", - "rand 0.8.5", - "semver", - "serde", - "serde_derive", - "solana-sanitize 2.2.1", - "solana-serde-varint 2.2.2", + "solana-instruction", + "solana-sanitize", ] [[package]] @@ -6118,80 +1861,17 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-clock 2.2.2", + "solana-clock", "solana-decode-error", - "solana-hash 2.3.0", - "solana-instruction 2.3.0", - "solana-pubkey 2.4.0", - "solana-rent 2.2.1", - "solana-sdk-ids 2.2.1", - "solana-serde-varint 2.2.2", - "solana-serialize-utils 2.2.1", - "solana-short-vec 2.2.1", - "solana-system-interface 1.0.0", -] - -[[package]] -name = "spinning_top" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "spl-generic-token" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741a62a566d97c58d33f9ed32337ceedd4e35109a686e31b1866c5dfa56abddc" -dependencies = [ - "bytemuck", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "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", + "solana-hash", + "solana-instruction", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface", ] [[package]] @@ -6222,51 +1902,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.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 = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -6307,47 +1942,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "time" -version = "0.3.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" - -[[package]] -name = "time-macros" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tinyvec" version = "1.9.0" @@ -6363,93 +1957,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" -[[package]] -name = "tokio" -version = "1.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.6.3", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls 0.23.40", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", - "tungstenite", - "webpki-roots 0.25.4", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - [[package]] name = "toml" version = "0.5.11" @@ -6459,26 +1966,11 @@ dependencies = [ "serde", ] -[[package]] -name = "toml" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - [[package]] name = "toml_datetime" version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" -dependencies = [ - "serde", -] [[package]] name = "toml_edit" @@ -6487,128 +1979,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", - "serde", - "serde_spanned", "toml_datetime", - "toml_write", "winnow", ] -[[package]] -name = "toml_write" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" -dependencies = [ - "async-compression", - "bitflags", - "bytes", - "futures-core", - "futures-util", - "http 1.4.0", - "http-body", - "http-body-util", - "pin-project-lite", - "tokio", - "tokio-util", - "tower", - "tower-layer", - "tower-service", - "url", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "log", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 0.2.12", - "httparse", - "log", - "rand 0.8.5", - "rustls 0.21.12", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", - "webpki-roots 0.24.0", -] - [[package]] name = "typenum" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - [[package]] name = "unicode-ident" version = "1.0.18" @@ -6621,92 +2001,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - -[[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" @@ -6719,24 +2019,6 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" -[[package]] -name = "wasip2" -version = "1.0.3+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" -dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", -] - [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -6763,19 +2045,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.100" @@ -6808,40 +2077,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.2", - "indexmap", - "semver", -] - [[package]] name = "web-sys" version = "0.3.77" @@ -6852,317 +2087,70 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webpki-roots" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" -dependencies = [ - "rustls-webpki 0.101.7", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" version = "0.7.10" @@ -7172,173 +2160,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck 0.5.0", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck 0.5.0", - "indexmap", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - -[[package]] -name = "wormhole-supported-chains" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f42a80a24212937cc7d7b0ab8115bb87d82f949a1a42f75d500807072c94ba4" -dependencies = [ - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "wormhole-vaas-serde" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240c5a6136dc66ecc65097bb6d159e849b5df4ecbbbb220868d0edbdcc568ed3" -dependencies = [ - "anyhow", - "bstr", - "schemars", - "serde", - "serde_wormhole", - "sha3", - "thiserror 1.0.69", - "wormhole-supported-chains", -] - -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - -[[package]] -name = "x509-parser" -version = "0.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 1.0.69", - "time", -] - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "synstructure 0.13.2", -] - [[package]] name = "zerocopy" version = "0.8.25" @@ -7359,104 +2180,8 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "zerofrom" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "synstructure 0.13.2", -] - [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/shine-solana/shine/build.gradle b/shine-solana/shine/build.gradle index dc9c030..1f6c34b 100644 --- a/shine-solana/shine/build.gradle +++ b/shine-solana/shine/build.gradle @@ -9,12 +9,18 @@ * * По каким URL должен работать UI: * https://test-solana-tickets.shineup.me - * https://sol.shiningpeople.ru + * https://test-solana-tickets.shiningpeople.ru + * + * Это временные тестовые сайты для сценариев `shine_payments`: + * покупка билетов, выдача лимитов менеджеру, ручное добавление билетов и пошаговые выплаты. + * + * Для SSH/deploy использовать доменное имя `shineup.me`, а не фиксированный IP: + * целевой адрес должен разрешаться через DNS на момент деплоя. */ tasks.register("deployUi", Exec) { group = "deploy" - description = "Деплой HTML UI Shine Payments на 45.136.124.227 в /home/player/sites/test-solana-tickets.shineup.me (URL: test-solana-tickets.shineup.me, sol.shiningpeople.ru)" + description = "Деплой HTML UI Shine Payments на player@shineup.me в /home/player/sites/test-solana-tickets.shineup.me (URL: test-solana-tickets.shineup.me, test-solana-tickets.shiningpeople.ru)" // Источник локальных UI-страниц: // shine/programs/shine_payments/web/ @@ -22,7 +28,7 @@ tasks.register("deployUi", Exec) { // Целевая директория на сервере: // /home/player/sites/test-solana-tickets.shineup.me - def remoteTarget = "player@45.136.124.227:/home/player/sites/test-solana-tickets.shineup.me/" + def remoteTarget = "player@shineup.me:/home/player/sites/test-solana-tickets.shineup.me/" commandLine "rsync", "-av", "--delete", localUiDir, remoteTarget } @@ -31,13 +37,13 @@ tasks.register("checkUiRemote", Exec) { group = "deploy" description = "Проверка на сервере: Caddy-конфиг и наличие новых Program ID в UI" - commandLine "ssh", "-o", "StrictHostKeyChecking=no", "player@45.136.124.227", + commandLine "ssh", "-o", "StrictHostKeyChecking=no", "player@shineup.me", "set -e; " + "echo 'Caddy file:'; " + "ls -la /home/player/SHiNE/caddy/Caddyfile; " + "echo; " + "echo 'Домены в Caddy:'; " + - "grep -n 'test-solana-tickets.shineup.me\\|sol.shiningpeople.ru' /home/player/SHiNE/caddy/Caddyfile; " + + "grep -n 'test-solana-tickets.shineup.me\\|test-solana-tickets.shiningpeople.ru' /home/player/SHiNE/caddy/Caddyfile; " + "echo; " + "echo 'Program ID в загруженных html:'; " + "grep -R -n 'm48pWRGWrMj3TEHjuU4zsp5Gju4e7ZaPovk8RcVt7kR' /home/player/sites/test-solana-tickets.shineup.me/*.html" diff --git a/shine-solana/shine/doc/FUNDS_FLOW.md b/shine-solana/shine/doc/FUNDS_FLOW.md index 5352066..744a7fa 100644 --- a/shine-solana/shine/doc/FUNDS_FLOW.md +++ b/shine-solana/shine/doc/FUNDS_FLOW.md @@ -31,9 +31,17 @@ Источник выплат: `inflow_vault` (`ConfigState.inflow_vault`). +Порядок очередей: +1. сначала `Q1`; +2. потом `Q2`; +3. потом `Q3`. + При шаге выплаты: 1. Из `inflow_vault` переводится `ticket` получателю тикета. 2. Из `inflow_vault` переводится DAO-часть в `dao_wallet`. + - для `Q1` это `1x payout_usd`; + - для `Q2` это `2x payout_usd`; + - для `Q3` это `3x payout_usd`; 3. Из `inflow_vault` переводится `call_reward_lamports` вызывающему шаг. Если очереди пусты: diff --git a/shine-solana/shine/doc/programs/shine_payments.md b/shine-solana/shine/doc/programs/shine_payments.md index 0f5977d..d8a15d1 100644 --- a/shine-solana/shine/doc/programs/shine_payments.md +++ b/shine-solana/shine/doc/programs/shine_payments.md @@ -2,11 +2,17 @@ Документ описывает текущее целевое поведение программы `shine_payments`. +Текущая целевая реализация программы: + +- без Anchor; +- без использования вспомогательной зависимости из `programs/common`; +- на чистом `solana_program` с ручным разбором инструкций, PDA и состояний. + Назначение программы: - хранить общие настройки экономической модели платежей и выплат; - принимать покупку тикетов очереди выплат; -- хранить очереди и отдельные ticket PDA; +- хранить три очереди и отдельные ticket PDA; - выдавать лимиты менеджерам на ручное добавление тикетов; - выполнять пошаговые выплаты из inflow-вольта. @@ -44,6 +50,7 @@ - queue 1 seed prefix: `shine_payments_q1_ticket` - queue 2 seed prefix: `shine_payments_q2_ticket` +- queue 3 seed prefix: `shine_payments_q3_ticket` - второй seed: `ticket_index` в little-endian `u64` ### 3.3. Manager allowance PDA @@ -88,6 +95,10 @@ - `q2_tickets_paid` - `q2_sum_total_usd_cents` - `q2_sum_paid_usd_cents` +- `q3_tickets_total` +- `q3_tickets_paid` +- `q3_sum_total_usd_cents` +- `q3_sum_paid_usd_cents` ### 4.4. `TicketState` @@ -109,6 +120,7 @@ - `manager_wallet: Pubkey` - `q1_available_usd_cents: u64` - `q2_available_usd_cents: u64` +- `q3_available_usd_cents: u64` ### 4.6. `VaultState` @@ -184,7 +196,7 @@ ### Поведение - создаёт `manager_allowance_pda`, если её ещё нет; -- увеличивает доступные лимиты Q1/Q2 для указанного менеджера; +- увеличивает доступные лимиты Q1/Q2/Q3 для указанного менеджера; - не добавляет тикеты сама. ## 9. Инструкции покупки тикета @@ -226,7 +238,7 @@ ### Назначение -Дать менеджеру возможность вручную создать ticket в `Q1` или `Q2`. +Дать менеджеру возможность вручную создать ticket в `Q1`, `Q2` или `Q3`. ### Авторизация @@ -234,7 +246,7 @@ Signer должен совпадать с `manager_wallet` в `manager_allowance ### Проверки -- `queue_id` только `1` или `2`; +- `queue_id` только `1`, `2` или `3`; - `payout_usd_cents > 0`; - доступный allowance по очереди не меньше суммы тикета; - ticket PDA ещё не существует. @@ -254,7 +266,8 @@ Signer должен совпадать с `manager_wallet` в `manager_allowance ### Выбор очереди - если в `Q1` есть pending ticket, сначала обслуживается `Q1`; -- если `Q1` пустая, обслуживается `Q2`. +- если `Q1` пустая, обслуживается `Q2`; +- если `Q1` и `Q2` пустые, обслуживается `Q3`. ### Что считается pending @@ -291,11 +304,13 @@ next_index = tickets_paid + 1 - для `Q1` = `1` - для `Q2` = `2` +- для `Q3` = `3` То есть DAO получает: - `1x payout_usd` для Q1; -- `2x payout_usd` для Q2. +- `2x payout_usd` для Q2; +- `3x payout_usd` для Q3. ### Источник денег @@ -303,7 +318,7 @@ next_index = tickets_paid + 1 ### Если pending нет -Если обе очереди пусты: +Если все три очереди пусты: - весь доступный остаток inflow vault переводится в DAO wallet. @@ -324,7 +339,8 @@ next_index = tickets_paid + 1 Логика: - если в `Q1` есть pending — следующий ticket определяется в `Q1`; -- иначе берётся следующий ticket в `Q2`; +- иначе если в `Q2` есть pending — следующий ticket берётся в `Q2`; +- иначе следующий ticket берётся в `Q3`; - если текущий ticket и есть этот ближайший ticket, смена recipient запрещена. ## 13. Pyth oracle и конвертация @@ -369,8 +385,8 @@ next_index = tickets_paid + 1 - те же PDA seed-правила; - те же состояния и поля; -- ту же модель очередей Q1/Q2; -- ту же приоритетность `Q1` над `Q2` в `step_payout`; +- ту же модель очередей Q1/Q2/Q3; +- ту же приоритетность `Q1 -> Q2 -> Q3` в `step_payout`; - ту же логику allowance менеджера; - те же oracle-ограничения и округления; - ту же текущую модель денежных потоков, если она не меняется отдельным решением. diff --git a/shine-solana/shine/programs/shine_payments/Cargo.toml b/shine-solana/shine/programs/shine_payments/Cargo.toml index 0d37912..90ab3c4 100644 --- a/shine-solana/shine/programs/shine_payments/Cargo.toml +++ b/shine-solana/shine/programs/shine_payments/Cargo.toml @@ -12,17 +12,9 @@ doctest = false bench = false [dependencies] -anchor-lang = "0.31.1" -common = { path = "../common" } -pyth-solana-receiver-sdk = { path = "../../.vendor/pyth-crosschain/target_chains/solana/pyth_solana_receiver_sdk" } +solana-program = "2.1.21" [features] default = [] -no-entrypoint = [] -no-idl = [] -no-log-ix-name = [] -anchor-debug = [] custom-heap = [] custom-panic = [] -cpi = [] -idl-build = ["anchor-lang/idl-build"] diff --git a/shine-solana/shine/programs/shine_payments/src/lib.rs b/shine-solana/shine/programs/shine_payments/src/lib.rs index 17abf33..db9dfd3 100644 --- a/shine-solana/shine/programs/shine_payments/src/lib.rs +++ b/shine-solana/shine/programs/shine_payments/src/lib.rs @@ -1,742 +1,150 @@ -use anchor_lang::prelude::*; -use anchor_lang::solana_program::{program::invoke, system_instruction}; -use common::utils::{create_pda, safe_read_pda, write_to_pda, ErrCode}; -use pyth_solana_receiver_sdk::error::GetPriceError; -use pyth_solana_receiver_sdk::price_update::{get_feed_id_from_hex, Price, PriceUpdateV2}; +use solana_program::{ + account_info::{next_account_info, AccountInfo}, + clock::Clock, + entrypoint, + entrypoint::ProgramResult, + program::{invoke, invoke_signed}, + program_error::ProgramError, + pubkey::Pubkey, + rent::Rent, + system_instruction, system_program, + sysvar::Sysvar, +}; use std::str::FromStr; pub mod settings; -declare_id!("m48pWRGWrMj3TEHjuU4zsp5Gju4e7ZaPovk8RcVt7kR"); +solana_program::declare_id!("m48pWRGWrMj3TEHjuU4zsp5Gju4e7ZaPovk8RcVt7kR"); +entrypoint!(process_instruction); -#[program] -pub mod shine_payments { - use super::*; +const IX_INIT: u8 = 1; +const IX_UPDATE_COEF_LIMIT: u8 = 2; +const IX_GRANT_MANAGER_LIMITS: u8 = 3; +const IX_BUY_TICKET: u8 = 4; +const IX_BUY_TICKET_USD: u8 = 5; +const IX_BUY_TICKET_SOL: u8 = 6; +const IX_MANAGER_ADD_TICKET: u8 = 7; +const IX_STEP_PAYOUT: u8 = 8; +const IX_CHANGE_TICKET_RECIPIENT: u8 = 9; - pub fn init(ctx: Context) -> Result<()> { - ensure_expected_pdas(ctx.program_id, &ctx.accounts)?; - require!( - ctx.accounts.config_pda.owner == &Pubkey::default(), - ErrCode::SystemAlreadyInitialized - ); - require!( - ctx.accounts.coef_limit_pda.owner == &Pubkey::default(), - ErrCode::SystemAlreadyInitialized - ); - require!( - ctx.accounts.queues_pda.owner == &Pubkey::default(), - ErrCode::SystemAlreadyInitialized - ); - require!( - ctx.accounts.inflow_vault_pda.owner == &Pubkey::default(), - ErrCode::SystemAlreadyInitialized - ); +#[repr(u32)] +#[derive(Clone, Copy, Debug)] +enum PaymentsError { + InvalidInstruction = 1, + InvalidSigner = 2, + InvalidPdaAddress = 3, + EmptyState = 4, + InvalidAccountData = 5, + InvalidSettingsWallet = 6, + InvalidInflowVault = 7, + InvalidDaoWallet = 8, + UnauthorizedManager = 9, + UnauthorizedDao = 10, + InvalidCoefficient = 11, + InvalidLimit = 12, + InvalidCallReward = 13, + InvalidAmount = 14, + QueueTemporarilyPaused = 15, + InvalidPayoutAmount = 16, + NotEnoughInflowForStep = 17, + TicketAlreadyPaid = 18, + InvalidTicketRecipient = 19, + InvalidTicketIndex = 20, + InvalidTicketQueue = 21, + InvalidManagerWallet = 22, + ManagerLimitExceeded = 23, + UnauthorizedTicketOwner = 24, + CannotChangeRecipientForNextPayoutTicket = 25, + InvalidOracleAccount = 26, + InvalidOracleFeed = 27, + InvalidOracleFeedConfig = 28, + OraclePriceTooOld = 29, + InvalidOraclePrice = 30, + SlippageExceeded = 31, + MathOverflow = 32, + SystemAlreadyInitialized = 33, + MissingRequiredSignature = 34, + InvalidSystemProgram = 35, + PdaAlreadyExists = 36, +} - let dao_wallet = Pubkey::from_str(settings::DAO_WALLET) - .map_err(|_| error!(PaymentsError::InvalidSettingsWallet))?; - let system_program_ai = ctx.accounts.system_program.to_account_info(); - - let config = ConfigState { - version: 1, - dao_wallet, - inflow_vault: ctx.accounts.inflow_vault_pda.key(), - }; - create_and_store_state( - ctx.program_id, - &ctx.accounts.payer, - &system_program_ai, - &ctx.accounts.config_pda, - settings::CONFIG_SEED, - settings::CONFIG_SPACE, - &config, - )?; - - let coef_limit = CoefLimitState { - version: 1, - coef_ppm: settings::START_COEF_PPM, - limit_usd_cents: settings::START_LIMIT_USD_CENTS, - call_reward_lamports: settings::START_CALL_REWARD_LAMPORTS, - }; - create_and_store_state( - ctx.program_id, - &ctx.accounts.payer, - &system_program_ai, - &ctx.accounts.coef_limit_pda, - settings::COEF_LIMIT_SEED, - settings::COEF_LIMIT_SPACE, - &coef_limit, - )?; - - let queues = QueuesState { - version: 1, - q1_tickets_total: 0, - q1_tickets_paid: 0, - q1_sum_total_usd_cents: 0, - q1_sum_paid_usd_cents: 0, - q2_tickets_total: 0, - q2_tickets_paid: 0, - q2_sum_total_usd_cents: 0, - q2_sum_paid_usd_cents: 0, - }; - create_and_store_state( - ctx.program_id, - &ctx.accounts.payer, - &system_program_ai, - &ctx.accounts.queues_pda, - settings::QUEUES_SEED, - settings::QUEUES_SPACE, - &queues, - )?; - - let vault = VaultState { version: 1 }; - create_and_store_state( - ctx.program_id, - &ctx.accounts.payer, - &system_program_ai, - &ctx.accounts.inflow_vault_pda, - settings::INFLOW_VAULT_SEED, - settings::INFLOW_VAULT_SPACE, - &vault, - )?; - - Ok(()) +impl From for ProgramError { + fn from(value: PaymentsError) -> Self { + ProgramError::Custom(value as u32) } +} - pub fn update_coef_limit( - ctx: Context, - args: UpdateCoefLimitArgs, - ) -> Result<()> { - let config = read_state::(&ctx.accounts.config_pda)?; - require_keys_eq!( - config.dao_wallet, - ctx.accounts.signer.key(), - PaymentsError::UnauthorizedDao - ); - require!(args.coef_ppm > 0, PaymentsError::InvalidCoefficient); - require!(args.limit_usd_cents > 0, PaymentsError::InvalidLimit); - require!( - args.call_reward_lamports <= settings::MAX_CALL_REWARD_LAMPORTS, - PaymentsError::InvalidCallReward - ); - - let mut coef_limit = read_state::(&ctx.accounts.coef_limit_pda)?; - coef_limit.coef_ppm = args.coef_ppm; - coef_limit.limit_usd_cents = args.limit_usd_cents; - coef_limit.call_reward_lamports = args.call_reward_lamports; - write_state(&ctx.accounts.coef_limit_pda, &coef_limit)?; - Ok(()) - } - - pub fn grant_manager_limits( - ctx: Context, - args: GrantManagerLimitsArgs, - ) -> Result<()> { - let config = read_state::(&ctx.accounts.config_pda)?; - require_keys_eq!( - config.dao_wallet, - ctx.accounts.signer.key(), - PaymentsError::UnauthorizedDao - ); - require!( - args.add_q1_usd_cents > 0 || args.add_q2_usd_cents > 0, - PaymentsError::InvalidAmount - ); - - let (expected_pda, bump) = find_manager_allowance_pda(ctx.program_id, &args.manager_wallet); - require_keys_eq!( - expected_pda, - ctx.accounts.manager_allowance_pda.key(), - ErrCode::InvalidPdaAddress - ); - - let system_program_ai = ctx.accounts.system_program.to_account_info(); - let mut state = if ctx.accounts.manager_allowance_pda.owner == &Pubkey::default() { - let initial = ManagerAllowanceState { - version: 1, - manager_wallet: args.manager_wallet, - q1_available_usd_cents: 0, - q2_available_usd_cents: 0, - }; - create_state_with_seeds( - ctx.program_id, - &ctx.accounts.signer, - &system_program_ai, - &ctx.accounts.manager_allowance_pda, - &[ - settings::MANAGER_ALLOWANCE_SEED, - args.manager_wallet.as_ref(), - &[bump], - ], - settings::MANAGER_ALLOWANCE_SPACE, - &initial, - )?; - initial - } else { - read_state::(&ctx.accounts.manager_allowance_pda)? - }; - require_keys_eq!( - state.manager_wallet, - args.manager_wallet, - PaymentsError::InvalidManagerWallet - ); - - state.q1_available_usd_cents = state - .q1_available_usd_cents - .checked_add(args.add_q1_usd_cents) - .ok_or(error!(ErrCode::MathOverflow))?; - state.q2_available_usd_cents = state - .q2_available_usd_cents - .checked_add(args.add_q2_usd_cents) - .ok_or(error!(ErrCode::MathOverflow))?; - write_state(&ctx.accounts.manager_allowance_pda, &state)?; - Ok(()) - } - - pub fn buy_ticket(ctx: Context, args: BuyTicketArgs) -> Result<()> { - let sol_usd = read_sol_usd_price( - &ctx.accounts.sol_usd_price_update, - &ctx.accounts.sol_usd_price_update.key(), - )?; - let purchase_usd_cents = lamports_to_usd_cents_floor(args.amount_lamports, &sol_usd)?; - require!(purchase_usd_cents > 0, PaymentsError::InvalidAmount); - buy_ticket_by_purchase_usd( - &ctx, - purchase_usd_cents, - args.amount_lamports, - args.recipient_wallet, - ) - } - - pub fn buy_ticket_usd(ctx: Context, args: BuyTicketUsdArgs) -> Result<()> { - require!(args.amount_usd_cents > 0, PaymentsError::InvalidAmount); - require!(args.max_pay_lamports > 0, PaymentsError::InvalidAmount); - - let sol_usd = read_sol_usd_price( - &ctx.accounts.sol_usd_price_update, - &ctx.accounts.sol_usd_price_update.key(), - )?; - let pay_lamports = usd_cents_to_lamports_ceil(args.amount_usd_cents, &sol_usd)?; - require!(pay_lamports > 0, PaymentsError::InvalidAmount); - require!( - pay_lamports <= args.max_pay_lamports, - PaymentsError::SlippageExceeded - ); - - buy_ticket_by_purchase_usd(&ctx, args.amount_usd_cents, pay_lamports, args.recipient_wallet) - } - - pub fn buy_ticket_sol(ctx: Context, args: BuyTicketSolArgs) -> Result<()> { - require!(args.amount_lamports > 0, PaymentsError::InvalidAmount); - - let sol_usd = read_sol_usd_price( - &ctx.accounts.sol_usd_price_update, - &ctx.accounts.sol_usd_price_update.key(), - )?; - let purchase_usd_cents = lamports_to_usd_cents_floor(args.amount_lamports, &sol_usd)?; - require!(purchase_usd_cents > 0, PaymentsError::InvalidAmount); - require!( - purchase_usd_cents >= args.min_expected_usd_cents, - PaymentsError::SlippageExceeded - ); - - buy_ticket_by_purchase_usd( - &ctx, - purchase_usd_cents, - args.amount_lamports, - args.recipient_wallet, - ) - } - - pub fn manager_add_ticket( - ctx: Context, - args: ManagerAddTicketArgs, - ) -> Result<()> { - require!(args.payout_usd_cents > 0, PaymentsError::InvalidPayoutAmount); - require!( - args.queue_id == 1 || args.queue_id == 2, - PaymentsError::InvalidTicketQueue - ); - - let (expected_manager_pda, _) = - find_manager_allowance_pda(ctx.program_id, ctx.accounts.signer.key); - require_keys_eq!( - expected_manager_pda, - ctx.accounts.manager_allowance_pda.key(), - ErrCode::InvalidPdaAddress - ); - let mut allowance = - read_state::(&ctx.accounts.manager_allowance_pda)?; - require_keys_eq!( - allowance.manager_wallet, - ctx.accounts.signer.key(), - PaymentsError::InvalidManagerWallet - ); - - let mut queues = read_state::(&ctx.accounts.queues_pda)?; - let debt_before_total = if args.queue_id == 1 { - queues.q1_sum_total_usd_cents - } else { - queues.q2_sum_total_usd_cents - }; - - if args.queue_id == 1 { - require!( - allowance.q1_available_usd_cents >= args.payout_usd_cents, - PaymentsError::ManagerLimitExceeded - ); - } else { - require!( - allowance.q2_available_usd_cents >= args.payout_usd_cents, - PaymentsError::ManagerLimitExceeded - ); +macro_rules! require { + ($cond:expr, $err:expr) => { + if !($cond) { + return Err(ProgramError::from($err)); } + }; +} - let ticket_index = if args.queue_id == 1 { - queues - .q1_tickets_total - .checked_add(1) - .ok_or(error!(ErrCode::MathOverflow))? - } else { - queues - .q2_tickets_total - .checked_add(1) - .ok_or(error!(ErrCode::MathOverflow))? - }; - let (expected_ticket_pda, ticket_bump) = - find_ticket_pda(ctx.program_id, args.queue_id, ticket_index); - require_keys_eq!( - expected_ticket_pda, - ctx.accounts.ticket_pda.key(), - ErrCode::InvalidPdaAddress - ); - require!( - ctx.accounts.ticket_pda.owner == &Pubkey::default(), - ErrCode::PdaAlreadyExists - ); - - let ticket = TicketState { - version: 1, - queue_id: args.queue_id, - index: ticket_index, - is_paid: false, - recipient_wallet: args.recipient_wallet, - payout_usd_cents: args.payout_usd_cents, - debt_before_usd_cents: debt_before_total, - }; - let seed_prefix = if args.queue_id == 1 { - settings::Q1_TICKET_SEED - } else { - settings::Q2_TICKET_SEED - }; - create_state_with_seeds( - ctx.program_id, - &ctx.accounts.signer, - &ctx.accounts.system_program.to_account_info(), - &ctx.accounts.ticket_pda, - &[seed_prefix, &ticket_index.to_le_bytes(), &[ticket_bump]], - settings::TICKET_SPACE, - &ticket, - )?; - - if args.queue_id == 1 { - allowance.q1_available_usd_cents = allowance - .q1_available_usd_cents - .checked_sub(args.payout_usd_cents) - .ok_or(error!(ErrCode::MathOverflow))?; - queues.q1_tickets_total = ticket_index; - queues.q1_sum_total_usd_cents = queues - .q1_sum_total_usd_cents - .checked_add(args.payout_usd_cents) - .ok_or(error!(ErrCode::MathOverflow))?; - } else { - allowance.q2_available_usd_cents = allowance - .q2_available_usd_cents - .checked_sub(args.payout_usd_cents) - .ok_or(error!(ErrCode::MathOverflow))?; - queues.q2_tickets_total = ticket_index; - queues.q2_sum_total_usd_cents = queues - .q2_sum_total_usd_cents - .checked_add(args.payout_usd_cents) - .ok_or(error!(ErrCode::MathOverflow))?; +macro_rules! require_keys_eq { + ($left:expr, $right:expr, $err:expr) => { + if $left != $right { + return Err(ProgramError::from($err)); } - write_state(&ctx.accounts.manager_allowance_pda, &allowance)?; - write_state(&ctx.accounts.queues_pda, &queues)?; - Ok(()) - } - - pub fn step_payout(ctx: Context) -> Result<()> { - let config = read_state::(&ctx.accounts.config_pda)?; - let coef_limit = read_state::(&ctx.accounts.coef_limit_pda)?; - let mut queues = read_state::(&ctx.accounts.queues_pda)?; - let _vault_state = read_state::(&ctx.accounts.inflow_vault_pda)?; - - require_keys_eq!( - ctx.accounts.dao_wallet.key(), - config.dao_wallet, - PaymentsError::InvalidDaoWallet - ); - require_keys_eq!( - ctx.accounts.inflow_vault_pda.key(), - config.inflow_vault, - PaymentsError::InvalidInflowVault - ); - - let q1_pending = queues - .q1_tickets_total - .checked_sub(queues.q1_tickets_paid) - .ok_or(error!(ErrCode::MathOverflow))?; - let q2_pending = queues - .q2_tickets_total - .checked_sub(queues.q2_tickets_paid) - .ok_or(error!(ErrCode::MathOverflow))?; - - if q1_pending == 0 && q2_pending == 0 { - transfer_all_available_to_dao( - &ctx.accounts.inflow_vault_pda, - &ctx.accounts.dao_wallet, - )?; - return Ok(()); - } - - let target_queue = if q1_pending > 0 { 1 } else { 2 }; - let next_index = if target_queue == 1 { - queues - .q1_tickets_paid - .checked_add(1) - .ok_or(error!(ErrCode::MathOverflow))? - } else { - queues - .q2_tickets_paid - .checked_add(1) - .ok_or(error!(ErrCode::MathOverflow))? - }; - let (expected_ticket_pda, _) = find_ticket_pda(ctx.program_id, target_queue, next_index); - require_keys_eq!( - expected_ticket_pda, - ctx.accounts.next_ticket_pda.key(), - ErrCode::InvalidPdaAddress - ); - - let mut ticket = read_state::(&ctx.accounts.next_ticket_pda)?; - require!( - ticket.queue_id == target_queue, - PaymentsError::InvalidTicketQueue - ); - require!( - ticket.index == next_index, - PaymentsError::InvalidTicketIndex - ); - require!(!ticket.is_paid, PaymentsError::TicketAlreadyPaid); - require_keys_eq!( - ctx.accounts.ticket_recipient_wallet.key(), - ticket.recipient_wallet, - PaymentsError::InvalidTicketRecipient - ); - - let sol_usd = read_sol_usd_price( - &ctx.accounts.sol_usd_price_update, - &ctx.accounts.sol_usd_price_update.key(), - )?; - let ticket_lamports = usd_cents_to_lamports_ceil(ticket.payout_usd_cents, &sol_usd)?; - let dao_multiplier: u64 = if target_queue == 1 { 1 } else { 2 }; - let dao_usd_cents = ticket - .payout_usd_cents - .checked_mul(dao_multiplier) - .ok_or(error!(ErrCode::MathOverflow))?; - let dao_lamports = usd_cents_to_lamports_ceil(dao_usd_cents, &sol_usd)?; - - let needed = ticket_lamports - .checked_add(dao_lamports) - .and_then(|v| v.checked_add(coef_limit.call_reward_lamports)) - .ok_or(error!(ErrCode::MathOverflow))?; - require!( - available_vault_lamports(&ctx.accounts.inflow_vault_pda)? >= needed, - PaymentsError::NotEnoughInflowForStep - ); - - transfer_from_vault( - &ctx.accounts.inflow_vault_pda, - &ctx.accounts.ticket_recipient_wallet, - ticket_lamports, - )?; - transfer_from_vault( - &ctx.accounts.inflow_vault_pda, - &ctx.accounts.dao_wallet, - dao_lamports, - )?; - transfer_from_vault( - &ctx.accounts.inflow_vault_pda, - &ctx.accounts.signer, - coef_limit.call_reward_lamports, - )?; - - ticket.is_paid = true; - write_state(&ctx.accounts.next_ticket_pda, &ticket)?; - - if target_queue == 1 { - queues.q1_tickets_paid = queues - .q1_tickets_paid - .checked_add(1) - .ok_or(error!(ErrCode::MathOverflow))?; - queues.q1_sum_paid_usd_cents = queues - .q1_sum_paid_usd_cents - .checked_add(ticket.payout_usd_cents) - .ok_or(error!(ErrCode::MathOverflow))?; - } else { - queues.q2_tickets_paid = queues - .q2_tickets_paid - .checked_add(1) - .ok_or(error!(ErrCode::MathOverflow))?; - queues.q2_sum_paid_usd_cents = queues - .q2_sum_paid_usd_cents - .checked_add(ticket.payout_usd_cents) - .ok_or(error!(ErrCode::MathOverflow))?; - } - write_state(&ctx.accounts.queues_pda, &queues)?; - - Ok(()) - } - - pub fn change_ticket_recipient( - ctx: Context, - args: ChangeTicketRecipientArgs, - ) -> Result<()> { - let queues = read_state::(&ctx.accounts.queues_pda)?; - let mut ticket = read_state::(&ctx.accounts.ticket_pda)?; - - require!(!ticket.is_paid, PaymentsError::TicketAlreadyPaid); - require_keys_eq!( - ctx.accounts.signer.key(), - ticket.recipient_wallet, - PaymentsError::UnauthorizedTicketOwner - ); - - let (expected_ticket_pda, _) = find_ticket_pda(ctx.program_id, ticket.queue_id, ticket.index); - require_keys_eq!( - expected_ticket_pda, - ctx.accounts.ticket_pda.key(), - ErrCode::InvalidPdaAddress - ); - - let q1_pending = queues - .q1_tickets_total - .checked_sub(queues.q1_tickets_paid) - .ok_or(error!(ErrCode::MathOverflow))?; - let q2_pending = queues - .q2_tickets_total - .checked_sub(queues.q2_tickets_paid) - .ok_or(error!(ErrCode::MathOverflow))?; - - if q1_pending > 0 || q2_pending > 0 { - let target_queue = if q1_pending > 0 { 1 } else { 2 }; - let next_index = if target_queue == 1 { - queues - .q1_tickets_paid - .checked_add(1) - .ok_or(error!(ErrCode::MathOverflow))? - } else { - queues - .q2_tickets_paid - .checked_add(1) - .ok_or(error!(ErrCode::MathOverflow))? - }; - - require!( - !(ticket.queue_id == target_queue && ticket.index == next_index), - PaymentsError::CannotChangeRecipientForNextPayoutTicket - ); - } - - ticket.recipient_wallet = args.new_recipient_wallet; - write_state(&ctx.accounts.ticket_pda, &ticket)?; - Ok(()) - } + }; } -#[derive(Accounts)] -pub struct Init<'info> { - /// CHECK: подписант и плательщик, проверяется атрибутом `signer`. - #[account(mut, signer)] - pub payer: AccountInfo<'info>, - /// CHECK: PDA конфига, адрес проверяется вручную в `ensure_expected_pdas`. - #[account(mut)] - pub config_pda: AccountInfo<'info>, - /// CHECK: PDA коэффициента/лимита, адрес проверяется вручную в `ensure_expected_pdas`. - #[account(mut)] - pub coef_limit_pda: AccountInfo<'info>, - /// CHECK: PDA состояния очередей, адрес проверяется вручную в `ensure_expected_pdas`. - #[account(mut)] - pub queues_pda: AccountInfo<'info>, - /// CHECK: PDA inflow-вольта, адрес проверяется вручную в `ensure_expected_pdas`. - #[account(mut)] - pub inflow_vault_pda: AccountInfo<'info>, - pub system_program: Program<'info, System>, -} - -#[derive(Accounts)] -pub struct UpdateCoefLimit<'info> { - /// CHECK: подписант-DAO, проверяется атрибутом `signer` и сверкой адреса в коде. - #[account(mut, signer)] - pub signer: AccountInfo<'info>, - /// CHECK: PDA конфига, читается и валидируется вручную. - #[account(mut)] - pub config_pda: AccountInfo<'info>, - /// CHECK: PDA коэффициента/лимита, читается и валидируется вручную. - #[account(mut)] - pub coef_limit_pda: AccountInfo<'info>, -} - -#[derive(Accounts)] -pub struct GrantManagerLimits<'info> { - /// CHECK: подписант DAO, проверяется атрибутом `signer` и сверкой с config.dao_wallet. - #[account(mut, signer)] - pub signer: AccountInfo<'info>, - /// CHECK: PDA конфига, читается и валидируется вручную. - #[account(mut)] - pub config_pda: AccountInfo<'info>, - /// CHECK: PDA лимитов менеджера, адрес проверяется вручную по manager pubkey. - #[account(mut)] - pub manager_allowance_pda: AccountInfo<'info>, - pub system_program: Program<'info, System>, -} - -#[derive(Accounts)] -pub struct BuyTicket<'info> { - /// CHECK: подписант-покупатель, проверяется атрибутом `signer`. - #[account(mut, signer)] - pub signer: AccountInfo<'info>, - /// CHECK: PDA конфига, читается и валидируется вручную. - #[account(mut)] - pub config_pda: AccountInfo<'info>, - /// CHECK: PDA коэффициента/лимита, читается и валидируется вручную. - #[account(mut)] - pub coef_limit_pda: AccountInfo<'info>, - /// CHECK: PDA очередей, читается и валидируется вручную. - #[account(mut)] - pub queues_pda: AccountInfo<'info>, - /// CHECK: PDA тикета, адрес и состояние (должен быть пустым) проверяются вручную. - #[account(mut)] - pub ticket_pda: AccountInfo<'info>, - /// CHECK: DAO-кошелек, адрес сверяется с конфигом вручную. - #[account(mut)] - pub dao_wallet: AccountInfo<'info>, - pub sol_usd_price_update: Account<'info, PriceUpdateV2>, - pub system_program: Program<'info, System>, -} - -#[derive(Accounts)] -pub struct ManagerAddTicket<'info> { - /// CHECK: подписант-менеджер, проверяется атрибутом `signer`. - #[account(mut, signer)] - pub signer: AccountInfo<'info>, - /// CHECK: PDA лимитов менеджера, адрес сверяется вручную по signer. - #[account(mut)] - pub manager_allowance_pda: AccountInfo<'info>, - /// CHECK: PDA очередей, читается и валидируется вручную. - #[account(mut)] - pub queues_pda: AccountInfo<'info>, - /// CHECK: PDA тикета, адрес и состояние (должен быть пустым) проверяются вручную. - #[account(mut)] - pub ticket_pda: AccountInfo<'info>, - pub system_program: Program<'info, System>, -} - -#[derive(Accounts)] -pub struct StepPayout<'info> { - /// CHECK: подписант-вызвавший шаг выплат, проверяется атрибутом `signer`. - #[account(mut, signer)] - pub signer: AccountInfo<'info>, - /// CHECK: PDA конфига, читается и валидируется вручную. - #[account(mut)] - pub config_pda: AccountInfo<'info>, - /// CHECK: PDA очередей, читается и валидируется вручную. - #[account(mut)] - pub queues_pda: AccountInfo<'info>, - /// CHECK: PDA коэффициента/лимита/награды, читается и валидируется вручную. - #[account(mut)] - pub coef_limit_pda: AccountInfo<'info>, - /// CHECK: PDA inflow-вольта, адрес сверяется с конфигом вручную. - #[account(mut)] - pub inflow_vault_pda: AccountInfo<'info>, - /// CHECK: PDA следующего тикета, адрес и содержимое валидируются вручную. - #[account(mut)] - pub next_ticket_pda: AccountInfo<'info>, - /// CHECK: кошелек получателя тикета, адрес сверяется с полем тикета вручную. - #[account(mut)] - pub ticket_recipient_wallet: AccountInfo<'info>, - /// CHECK: DAO-кошелек, адрес сверяется с конфигом вручную. - #[account(mut)] - pub dao_wallet: AccountInfo<'info>, - pub sol_usd_price_update: Account<'info, PriceUpdateV2>, -} - -#[derive(Accounts)] -pub struct ChangeTicketRecipient<'info> { - /// CHECK: подписант-владелец текущего recipient тикета. - #[account(mut, signer)] - pub signer: AccountInfo<'info>, - /// CHECK: PDA очередей, читается вручную. - #[account(mut)] - pub queues_pda: AccountInfo<'info>, - /// CHECK: PDA тикета, читается и валидируется вручную. - #[account(mut)] - pub ticket_pda: AccountInfo<'info>, -} - -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct UpdateCoefLimitArgs { pub coef_ppm: u64, pub limit_usd_cents: u64, pub call_reward_lamports: u64, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct GrantManagerLimitsArgs { pub manager_wallet: Pubkey, pub add_q1_usd_cents: u64, pub add_q2_usd_cents: u64, + pub add_q3_usd_cents: u64, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct BuyTicketArgs { pub amount_lamports: u64, pub recipient_wallet: Pubkey, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct BuyTicketUsdArgs { pub amount_usd_cents: u64, pub max_pay_lamports: u64, pub recipient_wallet: Pubkey, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct BuyTicketSolArgs { pub amount_lamports: u64, pub min_expected_usd_cents: u64, pub recipient_wallet: Pubkey, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct ManagerAddTicketArgs { pub queue_id: u8, pub recipient_wallet: Pubkey, pub payout_usd_cents: u64, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct ChangeTicketRecipientArgs { pub new_recipient_wallet: Pubkey, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct ConfigState { pub version: u8, pub dao_wallet: Pubkey, pub inflow_vault: Pubkey, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct CoefLimitState { pub version: u8, pub coef_ppm: u64, @@ -744,7 +152,7 @@ pub struct CoefLimitState { pub call_reward_lamports: u64, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct QueuesState { pub version: u8, pub q1_tickets_total: u64, @@ -755,9 +163,13 @@ pub struct QueuesState { pub q2_tickets_paid: u64, pub q2_sum_total_usd_cents: u64, pub q2_sum_paid_usd_cents: u64, + pub q3_tickets_total: u64, + pub q3_tickets_paid: u64, + pub q3_sum_total_usd_cents: u64, + pub q3_sum_paid_usd_cents: u64, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct TicketState { pub version: u8, pub queue_id: u8, @@ -768,15 +180,16 @@ pub struct TicketState { pub debt_before_usd_cents: u64, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct ManagerAllowanceState { pub version: u8, pub manager_wallet: Pubkey, pub q1_available_usd_cents: u64, pub q2_available_usd_cents: u64, + pub q3_available_usd_cents: u64, } -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +#[derive(Clone, Debug)] pub struct VaultState { pub version: u8, } @@ -786,89 +199,723 @@ struct SolUsdPrice { price_den: u128, } -#[error_code] -pub enum PaymentsError { - #[msg("Ошибка в адресах кошельков из настроек программы")] - InvalidSettingsWallet, - #[msg("Недостаточно данных PDA")] - EmptyState, - #[msg("Неверный inflow vault")] - InvalidInflowVault, - #[msg("Неверный DAO кошелек")] - InvalidDaoWallet, - #[msg("Управляющий кошелек не авторизован")] - UnauthorizedManager, - #[msg("DAO кошелек не авторизован для этой операции")] - UnauthorizedDao, - #[msg("Некорректный коэффициент")] - InvalidCoefficient, - #[msg("Некорректный лимит")] - InvalidLimit, - #[msg("Некорректная награда за шаг выплаты")] - InvalidCallReward, - #[msg("Некорректная сумма")] - InvalidAmount, - #[msg("Очередь временно приостановлена: достигнут лимит")] - QueueTemporarilyPaused, - #[msg("Некорректная сумма выплаты")] - InvalidPayoutAmount, - #[msg("Недостаточно средств на inflow vault для шага выплаты")] - NotEnoughInflowForStep, - #[msg("Тикет уже выплачен")] - TicketAlreadyPaid, - #[msg("Неверный получатель тикета")] - InvalidTicketRecipient, - #[msg("Неверный номер тикета")] - InvalidTicketIndex, - #[msg("Неверный тип очереди у тикета")] - InvalidTicketQueue, - #[msg("Неверный кошелек менеджера")] - InvalidManagerWallet, - #[msg("Лимит менеджера по выбранной очереди превышен")] - ManagerLimitExceeded, - #[msg("Только текущий получатель тикета может изменить получателя")] - UnauthorizedTicketOwner, - #[msg("Нельзя менять получателя у следующего тикета на выплату")] - CannotChangeRecipientForNextPayoutTicket, - #[msg("Оракул передан неверный")] - InvalidOracleAccount, - #[msg("Некорректный feed id оракула")] - InvalidOracleFeed, - #[msg("Конфигурация оракула в settings некорректна")] - InvalidOracleFeedConfig, - #[msg("Цена оракула устарела")] - OraclePriceTooOld, - #[msg("Цена оракула некорректна")] - InvalidOraclePrice, - #[msg("Защита от проскальзывания: лимит пользователя не проходит")] - SlippageExceeded, +struct Reader<'a> { + data: &'a [u8], + cursor: usize, + error: ProgramError, } -fn ensure_expected_pdas(program_id: &Pubkey, accounts: &Init) -> Result<()> { +impl<'a> Reader<'a> { + fn new(data: &'a [u8], error: ProgramError) -> Self { + Self { data, cursor: 0, error } + } + + fn read_u8(&mut self) -> Result { + let value = *self + .data + .get(self.cursor) + .ok_or(self.error.clone())?; + self.cursor += 1; + Ok(value) + } + + fn read_u64(&mut self) -> Result { + let end = self.cursor.checked_add(8).ok_or(self.error.clone())?; + let slice = self + .data + .get(self.cursor..end) + .ok_or(self.error.clone())?; + self.cursor = end; + Ok(u64::from_le_bytes( + slice.try_into().map_err(|_| self.error.clone())?, + )) + } + + fn read_pubkey(&mut self) -> Result { + let end = self.cursor.checked_add(32).ok_or(self.error.clone())?; + let slice = self + .data + .get(self.cursor..end) + .ok_or(self.error.clone())?; + self.cursor = end; + Ok(Pubkey::new_from_array( + slice.try_into().map_err(|_| self.error.clone())?, + )) + } + + fn finish(self) -> Result<(), ProgramError> { + require!(self.cursor == self.data.len(), PaymentsError::InvalidInstruction); + Ok(()) + } +} + +trait StateCodec: Sized { + fn encode(&self) -> Vec; + fn decode(data: &[u8]) -> Result; +} + +impl StateCodec for ConfigState { + fn encode(&self) -> Vec { + let mut out = Vec::with_capacity(65); + out.push(self.version); + out.extend_from_slice(self.dao_wallet.as_ref()); + out.extend_from_slice(self.inflow_vault.as_ref()); + out + } + + fn decode(data: &[u8]) -> Result { + let mut reader = Reader::new(data, PaymentsError::InvalidAccountData.into()); + let version = reader.read_u8()?; + let dao_wallet = reader.read_pubkey()?; + let inflow_vault = reader.read_pubkey()?; + require!(reader.cursor == data.len(), PaymentsError::InvalidAccountData); + Ok(Self { version, dao_wallet, inflow_vault }) + } +} + +impl StateCodec for CoefLimitState { + fn encode(&self) -> Vec { + let mut out = Vec::with_capacity(25); + out.push(self.version); + out.extend_from_slice(&self.coef_ppm.to_le_bytes()); + out.extend_from_slice(&self.limit_usd_cents.to_le_bytes()); + out.extend_from_slice(&self.call_reward_lamports.to_le_bytes()); + out + } + + fn decode(data: &[u8]) -> Result { + let mut reader = Reader::new(data, PaymentsError::InvalidAccountData.into()); + let version = reader.read_u8()?; + let coef_ppm = reader.read_u64()?; + let limit_usd_cents = reader.read_u64()?; + let call_reward_lamports = reader.read_u64()?; + require!(reader.cursor == data.len(), PaymentsError::InvalidAccountData); + Ok(Self { version, coef_ppm, limit_usd_cents, call_reward_lamports }) + } +} + +impl StateCodec for QueuesState { + fn encode(&self) -> Vec { + let mut out = Vec::with_capacity(97); + out.push(self.version); + for value in [ + self.q1_tickets_total, + self.q1_tickets_paid, + self.q1_sum_total_usd_cents, + self.q1_sum_paid_usd_cents, + self.q2_tickets_total, + self.q2_tickets_paid, + self.q2_sum_total_usd_cents, + self.q2_sum_paid_usd_cents, + self.q3_tickets_total, + self.q3_tickets_paid, + self.q3_sum_total_usd_cents, + self.q3_sum_paid_usd_cents, + ] { + out.extend_from_slice(&value.to_le_bytes()); + } + out + } + + fn decode(data: &[u8]) -> Result { + let mut reader = Reader::new(data, PaymentsError::InvalidAccountData.into()); + let version = reader.read_u8()?; + Ok(Self { + version, + q1_tickets_total: reader.read_u64()?, + q1_tickets_paid: reader.read_u64()?, + q1_sum_total_usd_cents: reader.read_u64()?, + q1_sum_paid_usd_cents: reader.read_u64()?, + q2_tickets_total: reader.read_u64()?, + q2_tickets_paid: reader.read_u64()?, + q2_sum_total_usd_cents: reader.read_u64()?, + q2_sum_paid_usd_cents: reader.read_u64()?, + q3_tickets_total: reader.read_u64()?, + q3_tickets_paid: reader.read_u64()?, + q3_sum_total_usd_cents: reader.read_u64()?, + q3_sum_paid_usd_cents: reader.read_u64()?, + }) + } +} + +impl StateCodec for TicketState { + fn encode(&self) -> Vec { + let mut out = Vec::with_capacity(59); + out.push(self.version); + out.push(self.queue_id); + out.extend_from_slice(&self.index.to_le_bytes()); + out.push(u8::from(self.is_paid)); + out.extend_from_slice(self.recipient_wallet.as_ref()); + out.extend_from_slice(&self.payout_usd_cents.to_le_bytes()); + out.extend_from_slice(&self.debt_before_usd_cents.to_le_bytes()); + out + } + + fn decode(data: &[u8]) -> Result { + let mut reader = Reader::new(data, PaymentsError::InvalidAccountData.into()); + let version = reader.read_u8()?; + let queue_id = reader.read_u8()?; + let index = reader.read_u64()?; + let is_paid = match reader.read_u8()? { + 0 => false, + 1 => true, + _ => return Err(PaymentsError::InvalidAccountData.into()), + }; + let recipient_wallet = reader.read_pubkey()?; + let payout_usd_cents = reader.read_u64()?; + let debt_before_usd_cents = reader.read_u64()?; + require!(reader.cursor == data.len(), PaymentsError::InvalidAccountData); + Ok(Self { version, queue_id, index, is_paid, recipient_wallet, payout_usd_cents, debt_before_usd_cents }) + } +} + +impl StateCodec for ManagerAllowanceState { + fn encode(&self) -> Vec { + let mut out = Vec::with_capacity(57); + out.push(self.version); + out.extend_from_slice(self.manager_wallet.as_ref()); + out.extend_from_slice(&self.q1_available_usd_cents.to_le_bytes()); + out.extend_from_slice(&self.q2_available_usd_cents.to_le_bytes()); + out.extend_from_slice(&self.q3_available_usd_cents.to_le_bytes()); + out + } + + fn decode(data: &[u8]) -> Result { + let mut reader = Reader::new(data, PaymentsError::InvalidAccountData.into()); + let version = reader.read_u8()?; + let manager_wallet = reader.read_pubkey()?; + let q1_available_usd_cents = reader.read_u64()?; + let q2_available_usd_cents = reader.read_u64()?; + let q3_available_usd_cents = reader.read_u64()?; + require!(reader.cursor == data.len(), PaymentsError::InvalidAccountData); + Ok(Self { version, manager_wallet, q1_available_usd_cents, q2_available_usd_cents, q3_available_usd_cents }) + } +} + +impl StateCodec for VaultState { + fn encode(&self) -> Vec { + vec![self.version] + } + + fn decode(data: &[u8]) -> Result { + require!(data.len() == 1, PaymentsError::InvalidAccountData); + Ok(Self { version: data[0] }) + } +} + +#[derive(Clone, Debug)] +enum Instruction { + Init, + UpdateCoefLimit(UpdateCoefLimitArgs), + GrantManagerLimits(GrantManagerLimitsArgs), + BuyTicket(BuyTicketArgs), + BuyTicketUsd(BuyTicketUsdArgs), + BuyTicketSol(BuyTicketSolArgs), + ManagerAddTicket(ManagerAddTicketArgs), + StepPayout, + ChangeTicketRecipient(ChangeTicketRecipientArgs), +} + +pub fn process_instruction( + program_id: &Pubkey, + accounts: &[AccountInfo], + instruction_data: &[u8], +) -> ProgramResult { + match parse_instruction(instruction_data)? { + Instruction::Init => process_init(program_id, accounts), + Instruction::UpdateCoefLimit(args) => process_update_coef_limit(program_id, accounts, args), + Instruction::GrantManagerLimits(args) => process_grant_manager_limits(program_id, accounts, args), + Instruction::BuyTicket(args) => process_buy_ticket(program_id, accounts, args), + Instruction::BuyTicketUsd(args) => process_buy_ticket_usd(program_id, accounts, args), + Instruction::BuyTicketSol(args) => process_buy_ticket_sol(program_id, accounts, args), + Instruction::ManagerAddTicket(args) => process_manager_add_ticket(program_id, accounts, args), + Instruction::StepPayout => process_step_payout(program_id, accounts), + Instruction::ChangeTicketRecipient(args) => process_change_ticket_recipient(program_id, accounts, args), + } +} + +fn parse_instruction(data: &[u8]) -> Result { + let (&tag, rest) = data + .split_first() + .ok_or(ProgramError::InvalidInstructionData)?; + let mut reader = Reader::new(rest, ProgramError::InvalidInstructionData); + let instruction = match tag { + IX_INIT => Instruction::Init, + IX_UPDATE_COEF_LIMIT => Instruction::UpdateCoefLimit(UpdateCoefLimitArgs { + coef_ppm: reader.read_u64()?, + limit_usd_cents: reader.read_u64()?, + call_reward_lamports: reader.read_u64()?, + }), + IX_GRANT_MANAGER_LIMITS => Instruction::GrantManagerLimits(GrantManagerLimitsArgs { + manager_wallet: reader.read_pubkey()?, + add_q1_usd_cents: reader.read_u64()?, + add_q2_usd_cents: reader.read_u64()?, + add_q3_usd_cents: reader.read_u64()?, + }), + IX_BUY_TICKET => Instruction::BuyTicket(BuyTicketArgs { + amount_lamports: reader.read_u64()?, + recipient_wallet: reader.read_pubkey()?, + }), + IX_BUY_TICKET_USD => Instruction::BuyTicketUsd(BuyTicketUsdArgs { + amount_usd_cents: reader.read_u64()?, + max_pay_lamports: reader.read_u64()?, + recipient_wallet: reader.read_pubkey()?, + }), + IX_BUY_TICKET_SOL => Instruction::BuyTicketSol(BuyTicketSolArgs { + amount_lamports: reader.read_u64()?, + min_expected_usd_cents: reader.read_u64()?, + recipient_wallet: reader.read_pubkey()?, + }), + IX_MANAGER_ADD_TICKET => Instruction::ManagerAddTicket(ManagerAddTicketArgs { + queue_id: reader.read_u8()?, + recipient_wallet: reader.read_pubkey()?, + payout_usd_cents: reader.read_u64()?, + }), + IX_STEP_PAYOUT => Instruction::StepPayout, + IX_CHANGE_TICKET_RECIPIENT => Instruction::ChangeTicketRecipient(ChangeTicketRecipientArgs { + new_recipient_wallet: reader.read_pubkey()?, + }), + _ => return Err(ProgramError::InvalidInstructionData), + }; + reader.finish()?; + Ok(instruction) +} + +fn process_init(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult { + let account_iter = &mut accounts.iter(); + let payer = next_signer_account(account_iter)?; + let config_pda = next_account_info(account_iter)?; + let coef_limit_pda = next_account_info(account_iter)?; + let queues_pda = next_account_info(account_iter)?; + let inflow_vault_pda = next_account_info(account_iter)?; + let system_program_ai = next_account_info(account_iter)?; + require!(account_iter.next().is_none(), PaymentsError::InvalidInstruction); + require_system_program(system_program_ai)?; + ensure_expected_pdas(program_id, config_pda, coef_limit_pda, queues_pda, inflow_vault_pda)?; + require!(is_uninitialized_account(config_pda), PaymentsError::SystemAlreadyInitialized); + require!(is_uninitialized_account(coef_limit_pda), PaymentsError::SystemAlreadyInitialized); + require!(is_uninitialized_account(queues_pda), PaymentsError::SystemAlreadyInitialized); + require!(is_uninitialized_account(inflow_vault_pda), PaymentsError::SystemAlreadyInitialized); + + let dao_wallet = Pubkey::from_str(settings::DAO_WALLET) + .map_err(|_| ProgramError::from(PaymentsError::InvalidSettingsWallet))?; + + let config = ConfigState { + version: 1, + dao_wallet, + inflow_vault: *inflow_vault_pda.key, + }; + create_and_store_state( + program_id, + payer, + system_program_ai, + config_pda, + settings::CONFIG_SEED, + settings::CONFIG_SPACE, + &config, + )?; + + let coef_limit = CoefLimitState { + version: 1, + coef_ppm: settings::START_COEF_PPM, + limit_usd_cents: settings::START_LIMIT_USD_CENTS, + call_reward_lamports: settings::START_CALL_REWARD_LAMPORTS, + }; + create_and_store_state( + program_id, + payer, + system_program_ai, + coef_limit_pda, + settings::COEF_LIMIT_SEED, + settings::COEF_LIMIT_SPACE, + &coef_limit, + )?; + + let queues = QueuesState { + version: 1, + q1_tickets_total: 0, + q1_tickets_paid: 0, + q1_sum_total_usd_cents: 0, + q1_sum_paid_usd_cents: 0, + q2_tickets_total: 0, + q2_tickets_paid: 0, + q2_sum_total_usd_cents: 0, + q2_sum_paid_usd_cents: 0, + q3_tickets_total: 0, + q3_tickets_paid: 0, + q3_sum_total_usd_cents: 0, + q3_sum_paid_usd_cents: 0, + }; + create_and_store_state( + program_id, + payer, + system_program_ai, + queues_pda, + settings::QUEUES_SEED, + settings::QUEUES_SPACE, + &queues, + )?; + + let vault = VaultState { version: 1 }; + create_and_store_state( + program_id, + payer, + system_program_ai, + inflow_vault_pda, + settings::INFLOW_VAULT_SEED, + settings::INFLOW_VAULT_SPACE, + &vault, + )?; + + Ok(()) +} + +fn process_update_coef_limit( + _program_id: &Pubkey, + accounts: &[AccountInfo], + args: UpdateCoefLimitArgs, +) -> ProgramResult { + let account_iter = &mut accounts.iter(); + let signer = next_signer_account(account_iter)?; + let config_pda = next_account_info(account_iter)?; + let coef_limit_pda = next_account_info(account_iter)?; + require!(account_iter.next().is_none(), PaymentsError::InvalidInstruction); + + let config = read_state::(config_pda)?; + require_keys_eq!(config.dao_wallet, *signer.key, PaymentsError::UnauthorizedDao); + require!(args.coef_ppm > 0, PaymentsError::InvalidCoefficient); + require!(args.limit_usd_cents > 0, PaymentsError::InvalidLimit); + require!( + args.call_reward_lamports <= settings::MAX_CALL_REWARD_LAMPORTS, + PaymentsError::InvalidCallReward + ); + + let mut coef_limit = read_state::(coef_limit_pda)?; + coef_limit.coef_ppm = args.coef_ppm; + coef_limit.limit_usd_cents = args.limit_usd_cents; + coef_limit.call_reward_lamports = args.call_reward_lamports; + write_state(coef_limit_pda, &coef_limit) +} + +fn process_grant_manager_limits( + program_id: &Pubkey, + accounts: &[AccountInfo], + args: GrantManagerLimitsArgs, +) -> ProgramResult { + let account_iter = &mut accounts.iter(); + let signer = next_signer_account(account_iter)?; + let config_pda = next_account_info(account_iter)?; + let manager_allowance_pda = next_account_info(account_iter)?; + let system_program_ai = next_account_info(account_iter)?; + require!(account_iter.next().is_none(), PaymentsError::InvalidInstruction); + require_system_program(system_program_ai)?; + + let config = read_state::(config_pda)?; + require_keys_eq!(config.dao_wallet, *signer.key, PaymentsError::UnauthorizedDao); + require!( + args.add_q1_usd_cents > 0 || args.add_q2_usd_cents > 0 || args.add_q3_usd_cents > 0, + PaymentsError::InvalidAmount + ); + + let (expected_pda, bump) = find_manager_allowance_pda(program_id, &args.manager_wallet); + require_keys_eq!(expected_pda, *manager_allowance_pda.key, PaymentsError::InvalidPdaAddress); + + let mut state = if is_uninitialized_account(manager_allowance_pda) { + let initial = ManagerAllowanceState { + version: 1, + manager_wallet: args.manager_wallet, + q1_available_usd_cents: 0, + q2_available_usd_cents: 0, + q3_available_usd_cents: 0, + }; + create_state_with_seeds( + program_id, + signer, + system_program_ai, + manager_allowance_pda, + &[ + settings::MANAGER_ALLOWANCE_SEED, + args.manager_wallet.as_ref(), + &[bump], + ], + settings::MANAGER_ALLOWANCE_SPACE, + &initial, + )?; + initial + } else { + read_state::(manager_allowance_pda)? + }; + require_keys_eq!(state.manager_wallet, args.manager_wallet, PaymentsError::InvalidManagerWallet); + + state.q1_available_usd_cents = checked_add(state.q1_available_usd_cents, args.add_q1_usd_cents)?; + state.q2_available_usd_cents = checked_add(state.q2_available_usd_cents, args.add_q2_usd_cents)?; + state.q3_available_usd_cents = checked_add(state.q3_available_usd_cents, args.add_q3_usd_cents)?; + write_state(manager_allowance_pda, &state) +} + +fn process_buy_ticket( + program_id: &Pubkey, + accounts: &[AccountInfo], + args: BuyTicketArgs, +) -> ProgramResult { + let ctx = BuyTicketAccounts::parse(accounts)?; + let sol_usd = read_sol_usd_price(ctx.sol_usd_price_update, ctx.sol_usd_price_update.key)?; + let purchase_usd_cents = lamports_to_usd_cents_floor(args.amount_lamports, &sol_usd)?; + require!(purchase_usd_cents > 0, PaymentsError::InvalidAmount); + buy_ticket_by_purchase_usd(program_id, &ctx, purchase_usd_cents, args.amount_lamports, args.recipient_wallet) +} + +fn process_buy_ticket_usd( + program_id: &Pubkey, + accounts: &[AccountInfo], + args: BuyTicketUsdArgs, +) -> ProgramResult { + let ctx = BuyTicketAccounts::parse(accounts)?; + require!(args.amount_usd_cents > 0, PaymentsError::InvalidAmount); + require!(args.max_pay_lamports > 0, PaymentsError::InvalidAmount); + let sol_usd = read_sol_usd_price(ctx.sol_usd_price_update, ctx.sol_usd_price_update.key)?; + let pay_lamports = usd_cents_to_lamports_ceil(args.amount_usd_cents, &sol_usd)?; + require!(pay_lamports > 0, PaymentsError::InvalidAmount); + require!(pay_lamports <= args.max_pay_lamports, PaymentsError::SlippageExceeded); + buy_ticket_by_purchase_usd(program_id, &ctx, args.amount_usd_cents, pay_lamports, args.recipient_wallet) +} + +fn process_buy_ticket_sol( + program_id: &Pubkey, + accounts: &[AccountInfo], + args: BuyTicketSolArgs, +) -> ProgramResult { + let ctx = BuyTicketAccounts::parse(accounts)?; + require!(args.amount_lamports > 0, PaymentsError::InvalidAmount); + let sol_usd = read_sol_usd_price(ctx.sol_usd_price_update, ctx.sol_usd_price_update.key)?; + let purchase_usd_cents = lamports_to_usd_cents_floor(args.amount_lamports, &sol_usd)?; + require!(purchase_usd_cents > 0, PaymentsError::InvalidAmount); + require!(purchase_usd_cents >= args.min_expected_usd_cents, PaymentsError::SlippageExceeded); + buy_ticket_by_purchase_usd(program_id, &ctx, purchase_usd_cents, args.amount_lamports, args.recipient_wallet) +} + +fn process_manager_add_ticket( + program_id: &Pubkey, + accounts: &[AccountInfo], + args: ManagerAddTicketArgs, +) -> ProgramResult { + let account_iter = &mut accounts.iter(); + let signer = next_signer_account(account_iter)?; + let manager_allowance_pda = next_account_info(account_iter)?; + let queues_pda = next_account_info(account_iter)?; + let ticket_pda = next_account_info(account_iter)?; + let system_program_ai = next_account_info(account_iter)?; + require!(account_iter.next().is_none(), PaymentsError::InvalidInstruction); + require_system_program(system_program_ai)?; + + require!(args.payout_usd_cents > 0, PaymentsError::InvalidPayoutAmount); + require!(is_valid_queue_id(args.queue_id), PaymentsError::InvalidTicketQueue); + + let (expected_manager_pda, _) = find_manager_allowance_pda(program_id, signer.key); + require_keys_eq!(expected_manager_pda, *manager_allowance_pda.key, PaymentsError::InvalidPdaAddress); + let mut allowance = read_state::(manager_allowance_pda)?; + require_keys_eq!(allowance.manager_wallet, *signer.key, PaymentsError::InvalidManagerWallet); + + let mut queues = read_state::(queues_pda)?; + let debt_before_total = queue_sum_total(&queues, args.queue_id); + require!(queue_allowance(&allowance, args.queue_id) >= args.payout_usd_cents, PaymentsError::ManagerLimitExceeded); + + let ticket_index = checked_add(queue_total(&queues, args.queue_id), 1)?; + let (expected_ticket_pda, ticket_bump) = find_ticket_pda(program_id, args.queue_id, ticket_index); + require_keys_eq!(expected_ticket_pda, *ticket_pda.key, PaymentsError::InvalidPdaAddress); + require!(is_uninitialized_account(ticket_pda), PaymentsError::PdaAlreadyExists); + + let ticket = TicketState { + version: 1, + queue_id: args.queue_id, + index: ticket_index, + is_paid: false, + recipient_wallet: args.recipient_wallet, + payout_usd_cents: args.payout_usd_cents, + debt_before_usd_cents: debt_before_total, + }; + create_state_with_seeds( + program_id, + signer, + system_program_ai, + ticket_pda, + &[ + queue_seed(args.queue_id), + &ticket_index.to_le_bytes(), + &[ticket_bump], + ], + settings::TICKET_SPACE, + &ticket, + )?; + + sub_queue_allowance(&mut allowance, args.queue_id, args.payout_usd_cents)?; + set_queue_total(&mut queues, args.queue_id, ticket_index); + add_queue_sum_total(&mut queues, args.queue_id, args.payout_usd_cents)?; + write_state(manager_allowance_pda, &allowance)?; + write_state(queues_pda, &queues) +} + +fn process_step_payout(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult { + let account_iter = &mut accounts.iter(); + let signer = next_signer_account(account_iter)?; + let config_pda = next_account_info(account_iter)?; + let queues_pda = next_account_info(account_iter)?; + let coef_limit_pda = next_account_info(account_iter)?; + let inflow_vault_pda = next_account_info(account_iter)?; + let next_ticket_pda = next_account_info(account_iter)?; + let ticket_recipient_wallet = next_account_info(account_iter)?; + let dao_wallet = next_account_info(account_iter)?; + let sol_usd_price_update = next_account_info(account_iter)?; + require!(account_iter.next().is_none(), PaymentsError::InvalidInstruction); + + let config = read_state::(config_pda)?; + let coef_limit = read_state::(coef_limit_pda)?; + let mut queues = read_state::(queues_pda)?; + let _vault_state = read_state::(inflow_vault_pda)?; + + require_keys_eq!(*dao_wallet.key, config.dao_wallet, PaymentsError::InvalidDaoWallet); + require_keys_eq!(*inflow_vault_pda.key, config.inflow_vault, PaymentsError::InvalidInflowVault); + + let q1_pending = checked_sub(queues.q1_tickets_total, queues.q1_tickets_paid)?; + let q2_pending = checked_sub(queues.q2_tickets_total, queues.q2_tickets_paid)?; + let q3_pending = checked_sub(queues.q3_tickets_total, queues.q3_tickets_paid)?; + + if q1_pending == 0 && q2_pending == 0 && q3_pending == 0 { + transfer_all_available_to_dao(inflow_vault_pda, dao_wallet)?; + return Ok(()); + } + + let (target_queue, next_index) = if q1_pending > 0 { + (1, checked_add(queues.q1_tickets_paid, 1)?) + } else if q2_pending > 0 { + (2, checked_add(queues.q2_tickets_paid, 1)?) + } else { + (3, checked_add(queues.q3_tickets_paid, 1)?) + }; + + let (expected_ticket_pda, _) = find_ticket_pda(program_id, target_queue, next_index); + require_keys_eq!(expected_ticket_pda, *next_ticket_pda.key, PaymentsError::InvalidPdaAddress); + + let mut ticket = read_state::(next_ticket_pda)?; + require!(ticket.queue_id == target_queue, PaymentsError::InvalidTicketQueue); + require!(ticket.index == next_index, PaymentsError::InvalidTicketIndex); + require!(!ticket.is_paid, PaymentsError::TicketAlreadyPaid); + require_keys_eq!(*ticket_recipient_wallet.key, ticket.recipient_wallet, PaymentsError::InvalidTicketRecipient); + + let sol_usd = read_sol_usd_price(sol_usd_price_update, sol_usd_price_update.key)?; + let ticket_lamports = usd_cents_to_lamports_ceil(ticket.payout_usd_cents, &sol_usd)?; + let dao_multiplier = target_queue as u64; + let dao_usd_cents = checked_mul(ticket.payout_usd_cents, dao_multiplier)?; + let dao_lamports = usd_cents_to_lamports_ceil(dao_usd_cents, &sol_usd)?; + let needed = checked_add(checked_add(ticket_lamports, dao_lamports)?, coef_limit.call_reward_lamports)?; + require!(available_vault_lamports(inflow_vault_pda)? >= needed, PaymentsError::NotEnoughInflowForStep); + + transfer_from_vault(inflow_vault_pda, ticket_recipient_wallet, ticket_lamports)?; + transfer_from_vault(inflow_vault_pda, dao_wallet, dao_lamports)?; + transfer_from_vault(inflow_vault_pda, signer, coef_limit.call_reward_lamports)?; + + ticket.is_paid = true; + write_state(next_ticket_pda, &ticket)?; + mark_queue_paid(&mut queues, target_queue, ticket.payout_usd_cents)?; + write_state(queues_pda, &queues) +} + +fn process_change_ticket_recipient( + program_id: &Pubkey, + accounts: &[AccountInfo], + args: ChangeTicketRecipientArgs, +) -> ProgramResult { + let account_iter = &mut accounts.iter(); + let signer = next_signer_account(account_iter)?; + let queues_pda = next_account_info(account_iter)?; + let ticket_pda = next_account_info(account_iter)?; + require!(account_iter.next().is_none(), PaymentsError::InvalidInstruction); + + let queues = read_state::(queues_pda)?; + let mut ticket = read_state::(ticket_pda)?; + require!(!ticket.is_paid, PaymentsError::TicketAlreadyPaid); + require_keys_eq!(*signer.key, ticket.recipient_wallet, PaymentsError::UnauthorizedTicketOwner); + + let (expected_ticket_pda, _) = find_ticket_pda(program_id, ticket.queue_id, ticket.index); + require_keys_eq!(expected_ticket_pda, *ticket_pda.key, PaymentsError::InvalidPdaAddress); + + let q1_pending = checked_sub(queues.q1_tickets_total, queues.q1_tickets_paid)?; + let q2_pending = checked_sub(queues.q2_tickets_total, queues.q2_tickets_paid)?; + let q3_pending = checked_sub(queues.q3_tickets_total, queues.q3_tickets_paid)?; + + let next = if q1_pending > 0 { + Some((1, checked_add(queues.q1_tickets_paid, 1)?)) + } else if q2_pending > 0 { + Some((2, checked_add(queues.q2_tickets_paid, 1)?)) + } else if q3_pending > 0 { + Some((3, checked_add(queues.q3_tickets_paid, 1)?)) + } else { + None + }; + + if let Some((queue_id, next_index)) = next { + require!( + !(ticket.queue_id == queue_id && ticket.index == next_index), + PaymentsError::CannotChangeRecipientForNextPayoutTicket + ); + } + + ticket.recipient_wallet = args.new_recipient_wallet; + write_state(ticket_pda, &ticket) +} + +struct BuyTicketAccounts<'a, 'info> { + signer: &'a AccountInfo<'info>, + config_pda: &'a AccountInfo<'info>, + coef_limit_pda: &'a AccountInfo<'info>, + queues_pda: &'a AccountInfo<'info>, + ticket_pda: &'a AccountInfo<'info>, + dao_wallet: &'a AccountInfo<'info>, + sol_usd_price_update: &'a AccountInfo<'info>, + system_program_ai: &'a AccountInfo<'info>, +} + +impl<'a, 'info> BuyTicketAccounts<'a, 'info> { + fn parse(accounts: &'a [AccountInfo<'info>]) -> Result { + let account_iter = &mut accounts.iter(); + let signer = next_signer_account(account_iter)?; + let config_pda = next_account_info(account_iter)?; + let coef_limit_pda = next_account_info(account_iter)?; + let queues_pda = next_account_info(account_iter)?; + let ticket_pda = next_account_info(account_iter)?; + let dao_wallet = next_account_info(account_iter)?; + let sol_usd_price_update = next_account_info(account_iter)?; + let system_program_ai = next_account_info(account_iter)?; + require!(account_iter.next().is_none(), PaymentsError::InvalidInstruction); + require_system_program(system_program_ai)?; + Ok(Self { + signer, + config_pda, + coef_limit_pda, + queues_pda, + ticket_pda, + dao_wallet, + sol_usd_price_update, + system_program_ai, + }) + } +} + +fn ensure_expected_pdas( + program_id: &Pubkey, + config_pda: &AccountInfo, + coef_limit_pda: &AccountInfo, + queues_pda: &AccountInfo, + inflow_vault_pda: &AccountInfo, +) -> ProgramResult { let (config, _) = find_single_pda(program_id, settings::CONFIG_SEED); let (coef, _) = find_single_pda(program_id, settings::COEF_LIMIT_SEED); let (queues, _) = find_single_pda(program_id, settings::QUEUES_SEED); let (inflow, _) = find_single_pda(program_id, settings::INFLOW_VAULT_SEED); - require_keys_eq!( - config, - accounts.config_pda.key(), - ErrCode::InvalidPdaAddress - ); - require_keys_eq!( - coef, - accounts.coef_limit_pda.key(), - ErrCode::InvalidPdaAddress - ); - require_keys_eq!( - queues, - accounts.queues_pda.key(), - ErrCode::InvalidPdaAddress - ); - require_keys_eq!( - inflow, - accounts.inflow_vault_pda.key(), - ErrCode::InvalidPdaAddress - ); + require_keys_eq!(config, *config_pda.key, PaymentsError::InvalidPdaAddress); + require_keys_eq!(coef, *coef_limit_pda.key, PaymentsError::InvalidPdaAddress); + require_keys_eq!(queues, *queues_pda.key, PaymentsError::InvalidPdaAddress); + require_keys_eq!(inflow, *inflow_vault_pda.key, PaymentsError::InvalidPdaAddress); Ok(()) } @@ -877,13 +924,7 @@ fn find_single_pda(program_id: &Pubkey, seed: &[u8]) -> (Pubkey, u8) { } fn find_ticket_pda(program_id: &Pubkey, queue_id: u8, index: u64) -> (Pubkey, u8) { - let idx = index.to_le_bytes(); - let seed = if queue_id == 1 { - settings::Q1_TICKET_SEED - } else { - settings::Q2_TICKET_SEED - }; - Pubkey::find_program_address(&[seed, &idx], program_id) + Pubkey::find_program_address(&[queue_seed(queue_id), &index.to_le_bytes()], program_id) } fn find_manager_allowance_pda(program_id: &Pubkey, manager_wallet: &Pubkey) -> (Pubkey, u8) { @@ -893,55 +934,43 @@ fn find_manager_allowance_pda(program_id: &Pubkey, manager_wallet: &Pubkey) -> ( ) } +fn queue_seed(queue_id: u8) -> &'static [u8] { + match queue_id { + 1 => settings::Q1_TICKET_SEED, + 2 => settings::Q2_TICKET_SEED, + 3 => settings::Q3_TICKET_SEED, + _ => settings::Q1_TICKET_SEED, + } +} + +fn is_valid_queue_id(queue_id: u8) -> bool { + matches!(queue_id, 1 | 2 | 3) +} + fn buy_ticket_by_purchase_usd( - ctx: &Context, + program_id: &Pubkey, + ctx: &BuyTicketAccounts<'_, '_>, purchase_usd_cents: u64, transfer_lamports: u64, recipient_wallet: Pubkey, -) -> Result<()> { - let config = read_state::(&ctx.accounts.config_pda)?; - let coef_limit = read_state::(&ctx.accounts.coef_limit_pda)?; - let mut queues = read_state::(&ctx.accounts.queues_pda)?; - - require_keys_eq!( - ctx.accounts.dao_wallet.key(), - config.dao_wallet, - PaymentsError::InvalidDaoWallet - ); +) -> ProgramResult { + let config = read_state::(ctx.config_pda)?; + let coef_limit = read_state::(ctx.coef_limit_pda)?; + let mut queues = read_state::(ctx.queues_pda)?; + require_keys_eq!(*ctx.dao_wallet.key, config.dao_wallet, PaymentsError::InvalidDaoWallet); let queue1_sum_total_before = queues.q1_sum_total_usd_cents; - require!( - queue1_sum_total_before < coef_limit.limit_usd_cents, - PaymentsError::QueueTemporarilyPaused - ); + require!(queue1_sum_total_before < coef_limit.limit_usd_cents, PaymentsError::QueueTemporarilyPaused); - let ticket_index = queues - .q1_tickets_total - .checked_add(1) - .ok_or(error!(ErrCode::MathOverflow))?; - let (expected_ticket_pda, ticket_bump) = find_ticket_pda(ctx.program_id, 1, ticket_index); - require_keys_eq!( - expected_ticket_pda, - ctx.accounts.ticket_pda.key(), - ErrCode::InvalidPdaAddress - ); - require!( - ctx.accounts.ticket_pda.owner == &Pubkey::default(), - ErrCode::PdaAlreadyExists - ); + let ticket_index = checked_add(queues.q1_tickets_total, 1)?; + let (expected_ticket_pda, ticket_bump) = find_ticket_pda(program_id, 1, ticket_index); + require_keys_eq!(expected_ticket_pda, *ctx.ticket_pda.key, PaymentsError::InvalidPdaAddress); + require!(is_uninitialized_account(ctx.ticket_pda), PaymentsError::PdaAlreadyExists); - let payout_usd_cents = purchase_usd_cents - .checked_mul(coef_limit.coef_ppm) - .ok_or(error!(ErrCode::MathOverflow))? - / settings::COEF_SCALE_PPM; + let payout_usd_cents = checked_mul(purchase_usd_cents, coef_limit.coef_ppm)? / settings::COEF_SCALE_PPM; require!(payout_usd_cents > 0, PaymentsError::InvalidPayoutAmount); - transfer_from_signer_to_target( - &ctx.accounts.signer, - &ctx.accounts.dao_wallet, - &ctx.accounts.system_program.to_account_info(), - transfer_lamports, - )?; + transfer_from_signer_to_target(ctx.signer, ctx.dao_wallet, ctx.system_program_ai, transfer_lamports)?; let ticket = TicketState { version: 1, @@ -953,10 +982,10 @@ fn buy_ticket_by_purchase_usd( debt_before_usd_cents: queue1_sum_total_before, }; create_state_with_seeds( - ctx.program_id, - &ctx.accounts.signer, - &ctx.accounts.system_program.to_account_info(), - &ctx.accounts.ticket_pda, + program_id, + ctx.signer, + ctx.system_program_ai, + ctx.ticket_pda, &[ settings::Q1_TICKET_SEED, &ticket_index.to_le_bytes(), @@ -967,121 +996,121 @@ fn buy_ticket_by_purchase_usd( )?; queues.q1_tickets_total = ticket_index; - queues.q1_sum_total_usd_cents = queues - .q1_sum_total_usd_cents - .checked_add(payout_usd_cents) - .ok_or(error!(ErrCode::MathOverflow))?; - write_state(&ctx.accounts.queues_pda, &queues)?; - Ok(()) + queues.q1_sum_total_usd_cents = checked_add(queues.q1_sum_total_usd_cents, payout_usd_cents)?; + write_state(ctx.queues_pda, &queues) } fn transfer_from_signer_to_target<'info>( signer: &AccountInfo<'info>, target: &AccountInfo<'info>, - system_program: &AccountInfo<'info>, + system_program_ai: &AccountInfo<'info>, amount: u64, -) -> Result<()> { +) -> ProgramResult { let ix = system_instruction::transfer(signer.key, target.key, amount); - invoke( - &ix, - &[signer.clone(), target.clone(), system_program.clone()], - )?; - Ok(()) + invoke(&ix, &[signer.clone(), target.clone(), system_program_ai.clone()]) } -fn read_sol_usd_price(price_update: &Account, key: &Pubkey) -> Result { +fn read_sol_usd_price(price_update: &AccountInfo, key: &Pubkey) -> Result { let expected_oracle = Pubkey::from_str(settings::PYTH_SOL_USD_ACCOUNT) - .map_err(|_| error!(PaymentsError::InvalidOracleFeedConfig))?; + .map_err(|_| ProgramError::from(PaymentsError::InvalidOracleFeedConfig))?; require_keys_eq!(expected_oracle, *key, PaymentsError::InvalidOracleAccount); - let feed_id = get_feed_id_from_hex(settings::PYTH_SOL_USD_FEED_ID) - .map_err(|_| error!(PaymentsError::InvalidOracleFeedConfig))?; + let data = price_update.try_borrow_data()?; let clock = Clock::get()?; - let price = price_update - .get_price_no_older_than(&clock, settings::ORACLE_MAX_AGE_SECS, &feed_id) - .map_err(map_oracle_error)?; - price_to_ratio(price) + parse_pyth_price_update_v2(&data, &clock) } -fn map_oracle_error(err: GetPriceError) -> anchor_lang::error::Error { - match err { - GetPriceError::PriceTooOld => error!(PaymentsError::OraclePriceTooOld), - GetPriceError::MismatchedFeedId => error!(PaymentsError::InvalidOracleFeed), - GetPriceError::InsufficientVerificationLevel => error!(PaymentsError::InvalidOraclePrice), - GetPriceError::FeedIdMustBe32Bytes | GetPriceError::FeedIdNonHexCharacter => { - error!(PaymentsError::InvalidOracleFeedConfig) - } - _ => error!(PaymentsError::InvalidOraclePrice), - } -} - -fn price_to_ratio(price: Price) -> Result { - require!(price.price > 0, PaymentsError::InvalidOraclePrice); - let mut num = (price.price as u128) - .checked_mul(settings::USD_CENTS_SCALE as u128) - .ok_or(error!(ErrCode::MathOverflow))?; +fn parse_pyth_price_update_v2(data: &[u8], clock: &Clock) -> Result { + require!(data.len() > 100, PaymentsError::InvalidOraclePrice); + let price = read_i64_at(data, 73)?; + let exponent = read_i32_at(data, 89)?; + let publish_time = read_i64_at(data, 93)?; + require!( + publish_time.saturating_add(settings::ORACLE_MAX_AGE_SECS as i64) >= clock.unix_timestamp, + PaymentsError::OraclePriceTooOld + ); + require!(price > 0, PaymentsError::InvalidOraclePrice); + let mut num = checked_mul_u128(price as u128, settings::USD_CENTS_SCALE as u128)?; let mut den: u128 = 1; - if price.exponent >= 0 { + if exponent >= 0 { let pow = 10u128 - .checked_pow(price.exponent as u32) - .ok_or(error!(ErrCode::MathOverflow))?; - num = num.checked_mul(pow).ok_or(error!(ErrCode::MathOverflow))?; + .checked_pow(exponent as u32) + .ok_or(ProgramError::from(PaymentsError::MathOverflow))?; + num = checked_mul_u128(num, pow)?; } else { let pow = 10u128 - .checked_pow((-price.exponent) as u32) - .ok_or(error!(ErrCode::MathOverflow))?; - den = den.checked_mul(pow).ok_or(error!(ErrCode::MathOverflow))?; + .checked_pow((-exponent) as u32) + .ok_or(ProgramError::from(PaymentsError::MathOverflow))?; + den = checked_mul_u128(den, pow)?; } require!(num > 0 && den > 0, PaymentsError::InvalidOraclePrice); - Ok(SolUsdPrice { - price_num: num, - price_den: den, - }) + Ok(SolUsdPrice { price_num: num, price_den: den }) } -fn lamports_to_usd_cents_floor(lamports: u64, price: &SolUsdPrice) -> Result { - let numerator = (lamports as u128) - .checked_mul(price.price_num) - .ok_or(error!(ErrCode::MathOverflow))?; - let denominator = (settings::LAMPORTS_PER_SOL as u128) - .checked_mul(price.price_den) - .ok_or(error!(ErrCode::MathOverflow))?; +fn read_i32_at(data: &[u8], offset: usize) -> Result { + let end = offset + .checked_add(4) + .ok_or(ProgramError::from(PaymentsError::InvalidOraclePrice))?; + let slice = data + .get(offset..end) + .ok_or(ProgramError::from(PaymentsError::InvalidOraclePrice))?; + Ok(i32::from_le_bytes( + slice + .try_into() + .map_err(|_| ProgramError::from(PaymentsError::InvalidOraclePrice))?, + )) +} + +fn read_i64_at(data: &[u8], offset: usize) -> Result { + let end = offset + .checked_add(8) + .ok_or(ProgramError::from(PaymentsError::InvalidOraclePrice))?; + let slice = data + .get(offset..end) + .ok_or(ProgramError::from(PaymentsError::InvalidOraclePrice))?; + Ok(i64::from_le_bytes( + slice + .try_into() + .map_err(|_| ProgramError::from(PaymentsError::InvalidOraclePrice))?, + )) +} + +fn lamports_to_usd_cents_floor(lamports: u64, price: &SolUsdPrice) -> Result { + let numerator = checked_mul_u128(lamports as u128, price.price_num)?; + let denominator = checked_mul_u128(settings::LAMPORTS_PER_SOL as u128, price.price_den)?; require!(denominator > 0, PaymentsError::InvalidOraclePrice); - let value = numerator / denominator; - u64::try_from(value).map_err(|_| error!(ErrCode::MathOverflow)) + u64::try_from(numerator / denominator).map_err(|_| PaymentsError::MathOverflow.into()) } -fn usd_cents_to_lamports_ceil(usd_cents: u64, price: &SolUsdPrice) -> Result { +fn usd_cents_to_lamports_ceil(usd_cents: u64, price: &SolUsdPrice) -> Result { require!(usd_cents > 0, PaymentsError::InvalidAmount); require!(price.price_num > 0, PaymentsError::InvalidOraclePrice); - - let numerator = (usd_cents as u128) - .checked_mul(settings::LAMPORTS_PER_SOL as u128) - .and_then(|v| v.checked_mul(price.price_den)) - .ok_or(error!(ErrCode::MathOverflow))?; + let numerator = checked_mul_u128( + checked_mul_u128(usd_cents as u128, settings::LAMPORTS_PER_SOL as u128)?, + price.price_den, + )?; let adjusted = numerator .checked_add(price.price_num - 1) - .ok_or(error!(ErrCode::MathOverflow))?; - let value = adjusted / price.price_num; - u64::try_from(value).map_err(|_| error!(ErrCode::MathOverflow)) + .ok_or(ProgramError::from(PaymentsError::MathOverflow))?; + u64::try_from(adjusted / price.price_num).map_err(|_| PaymentsError::MathOverflow.into()) } -fn create_and_store_state<'info, T: AnchorSerialize>( +fn create_and_store_state<'info, T: StateCodec>( program_id: &Pubkey, payer: &AccountInfo<'info>, - system_program: &AccountInfo<'info>, + system_program_ai: &AccountInfo<'info>, pda: &AccountInfo<'info>, seed: &[u8], space: usize, state: &T, -) -> Result<()> { +) -> ProgramResult { let (_, bump) = find_single_pda(program_id, seed); create_state_with_seeds( program_id, payer, - system_program, + system_program_ai, pda, &[seed, &[bump]], space, @@ -1089,59 +1118,188 @@ fn create_and_store_state<'info, T: AnchorSerialize>( ) } -fn create_state_with_seeds<'info, T: AnchorSerialize>( +fn create_state_with_seeds<'info, T: StateCodec>( program_id: &Pubkey, payer: &AccountInfo<'info>, - system_program: &AccountInfo<'info>, + system_program_ai: &AccountInfo<'info>, pda: &AccountInfo<'info>, seeds: &[&[u8]], space: usize, state: &T, -) -> Result<()> { - create_pda(pda, payer, system_program, program_id, seeds, space as u64)?; +) -> ProgramResult { + create_pda_account(pda, payer, system_program_ai, program_id, seeds, space as u64)?; write_state(pda, state) } -fn write_state(pda: &AccountInfo, state: &T) -> Result<()> { - let bytes = state - .try_to_vec() - .map_err(|_| error!(ErrCode::DeserializationError))?; - write_to_pda(pda, &bytes) +fn create_pda_account<'info>( + pda: &AccountInfo<'info>, + payer: &AccountInfo<'info>, + system_program_ai: &AccountInfo<'info>, + program_id: &Pubkey, + seeds: &[&[u8]], + space: u64, +) -> ProgramResult { + require!(is_uninitialized_account(pda), PaymentsError::PdaAlreadyExists); + let lamports = Rent::get()?.minimum_balance(space as usize); + let create_ix = system_instruction::create_account(payer.key, pda.key, lamports, space, program_id); + invoke_signed( + &create_ix, + &[payer.clone(), pda.clone(), system_program_ai.clone()], + &[seeds], + ) } -fn read_state(pda: &AccountInfo) -> Result { - let raw = safe_read_pda(pda); - require!(!raw.is_empty(), PaymentsError::EmptyState); - let mut slice: &[u8] = &raw; - T::deserialize(&mut slice).map_err(|_| error!(ErrCode::DeserializationError)) +fn write_state(pda: &AccountInfo, state: &T) -> ProgramResult { + let bytes = state.encode(); + let mut data = pda.try_borrow_mut_data()?; + require!(bytes.len() <= data.len(), PaymentsError::InvalidAccountData); + data.fill(0); + data[..bytes.len()].copy_from_slice(&bytes); + Ok(()) } -fn available_vault_lamports(vault: &AccountInfo) -> Result { +fn read_state(pda: &AccountInfo) -> Result { + require!(!is_uninitialized_account(pda), PaymentsError::EmptyState); + require_keys_eq!(*pda.owner, id(), PaymentsError::InvalidPdaAddress); + let data = pda.try_borrow_data()?; + let used_len = data.iter().rposition(|b| *b != 0).map(|idx| idx + 1).unwrap_or(0); + require!(used_len > 0, PaymentsError::EmptyState); + T::decode(&data[..used_len]) +} + +fn is_uninitialized_account(account: &AccountInfo) -> bool { + account.lamports() == 0 + && account.data_len() == 0 + && (*account.owner == system_program::ID || *account.owner == Pubkey::default()) +} + +fn available_vault_lamports(vault: &AccountInfo) -> Result { let total = vault.lamports(); let rent_min = Rent::get()?.minimum_balance(vault.data_len()); Ok(total.saturating_sub(rent_min)) } -fn transfer_from_vault(vault: &AccountInfo, recipient: &AccountInfo, amount: u64) -> Result<()> { +fn transfer_from_vault(vault: &AccountInfo, recipient: &AccountInfo, amount: u64) -> ProgramResult { if amount == 0 { return Ok(()); } let mut vault_lamports = vault.try_borrow_mut_lamports()?; let mut recipient_lamports = recipient.try_borrow_mut_lamports()?; - require!( - **vault_lamports >= amount, - PaymentsError::NotEnoughInflowForStep - ); - **vault_lamports = vault_lamports - .checked_sub(amount) - .ok_or(error!(ErrCode::MathOverflow))?; - **recipient_lamports = recipient_lamports - .checked_add(amount) - .ok_or(error!(ErrCode::MathOverflow))?; + require!(**vault_lamports >= amount, PaymentsError::NotEnoughInflowForStep); + **vault_lamports = checked_sub(**vault_lamports, amount)?; + **recipient_lamports = checked_add(**recipient_lamports, amount)?; Ok(()) } -fn transfer_all_available_to_dao(vault: &AccountInfo, dao_wallet: &AccountInfo) -> Result<()> { +fn transfer_all_available_to_dao(vault: &AccountInfo, dao_wallet: &AccountInfo) -> ProgramResult { let available = available_vault_lamports(vault)?; transfer_from_vault(vault, dao_wallet, available) } + +fn next_signer_account<'a, 'info>( + account_iter: &mut std::slice::Iter<'a, AccountInfo<'info>>, +) -> Result<&'a AccountInfo<'info>, ProgramError> { + let signer = next_account_info(account_iter)?; + require!(signer.is_signer, PaymentsError::MissingRequiredSignature); + Ok(signer) +} + +fn require_system_program(system_program_ai: &AccountInfo) -> ProgramResult { + require_keys_eq!(*system_program_ai.key, system_program::ID, PaymentsError::InvalidSystemProgram); + Ok(()) +} + +fn queue_total(queues: &QueuesState, queue_id: u8) -> u64 { + match queue_id { + 1 => queues.q1_tickets_total, + 2 => queues.q2_tickets_total, + 3 => queues.q3_tickets_total, + _ => 0, + } +} + +fn queue_sum_total(queues: &QueuesState, queue_id: u8) -> u64 { + match queue_id { + 1 => queues.q1_sum_total_usd_cents, + 2 => queues.q2_sum_total_usd_cents, + 3 => queues.q3_sum_total_usd_cents, + _ => 0, + } +} + +fn queue_allowance(allowance: &ManagerAllowanceState, queue_id: u8) -> u64 { + match queue_id { + 1 => allowance.q1_available_usd_cents, + 2 => allowance.q2_available_usd_cents, + 3 => allowance.q3_available_usd_cents, + _ => 0, + } +} + +fn sub_queue_allowance( + allowance: &mut ManagerAllowanceState, + queue_id: u8, + amount: u64, +) -> ProgramResult { + match queue_id { + 1 => allowance.q1_available_usd_cents = checked_sub(allowance.q1_available_usd_cents, amount)?, + 2 => allowance.q2_available_usd_cents = checked_sub(allowance.q2_available_usd_cents, amount)?, + 3 => allowance.q3_available_usd_cents = checked_sub(allowance.q3_available_usd_cents, amount)?, + _ => return Err(PaymentsError::InvalidTicketQueue.into()), + } + Ok(()) +} + +fn set_queue_total(queues: &mut QueuesState, queue_id: u8, value: u64) { + match queue_id { + 1 => queues.q1_tickets_total = value, + 2 => queues.q2_tickets_total = value, + 3 => queues.q3_tickets_total = value, + _ => {} + } +} + +fn add_queue_sum_total(queues: &mut QueuesState, queue_id: u8, value: u64) -> ProgramResult { + match queue_id { + 1 => queues.q1_sum_total_usd_cents = checked_add(queues.q1_sum_total_usd_cents, value)?, + 2 => queues.q2_sum_total_usd_cents = checked_add(queues.q2_sum_total_usd_cents, value)?, + 3 => queues.q3_sum_total_usd_cents = checked_add(queues.q3_sum_total_usd_cents, value)?, + _ => return Err(PaymentsError::InvalidTicketQueue.into()), + } + Ok(()) +} + +fn mark_queue_paid(queues: &mut QueuesState, queue_id: u8, payout_usd_cents: u64) -> ProgramResult { + match queue_id { + 1 => { + queues.q1_tickets_paid = checked_add(queues.q1_tickets_paid, 1)?; + queues.q1_sum_paid_usd_cents = checked_add(queues.q1_sum_paid_usd_cents, payout_usd_cents)?; + } + 2 => { + queues.q2_tickets_paid = checked_add(queues.q2_tickets_paid, 1)?; + queues.q2_sum_paid_usd_cents = checked_add(queues.q2_sum_paid_usd_cents, payout_usd_cents)?; + } + 3 => { + queues.q3_tickets_paid = checked_add(queues.q3_tickets_paid, 1)?; + queues.q3_sum_paid_usd_cents = checked_add(queues.q3_sum_paid_usd_cents, payout_usd_cents)?; + } + _ => return Err(PaymentsError::InvalidTicketQueue.into()), + } + Ok(()) +} + +fn checked_add(left: u64, right: u64) -> Result { + left.checked_add(right).ok_or(PaymentsError::MathOverflow.into()) +} + +fn checked_sub(left: u64, right: u64) -> Result { + left.checked_sub(right).ok_or(PaymentsError::MathOverflow.into()) +} + +fn checked_mul(left: u64, right: u64) -> Result { + left.checked_mul(right).ok_or(PaymentsError::MathOverflow.into()) +} + +fn checked_mul_u128(left: u128, right: u128) -> Result { + left.checked_mul(right).ok_or(PaymentsError::MathOverflow.into()) +} diff --git a/shine-solana/shine/programs/shine_payments/src/settings.rs b/shine-solana/shine/programs/shine_payments/src/settings.rs index 8a9391b..2e25faf 100644 --- a/shine-solana/shine/programs/shine_payments/src/settings.rs +++ b/shine-solana/shine/programs/shine_payments/src/settings.rs @@ -1,5 +1,3 @@ -use common::deploy_config; - /// `CONFIG_SEED` — seed PDA основного конфига `shine_payments`. pub const CONFIG_SEED: &[u8] = b"shine_payments_config"; /// `COEF_LIMIT_SEED` — seed PDA коэффициента, лимита и награды шага выплат. @@ -12,6 +10,8 @@ pub const INFLOW_VAULT_SEED: &[u8] = b"shine_payments_inflow_vault"; pub const Q1_TICKET_SEED: &[u8] = b"shine_payments_q1_ticket"; /// `Q2_TICKET_SEED` — seed PDA тикетов очереди 2. pub const Q2_TICKET_SEED: &[u8] = b"shine_payments_q2_ticket"; +/// `Q3_TICKET_SEED` — seed PDA тикетов очереди 3. +pub const Q3_TICKET_SEED: &[u8] = b"shine_payments_q3_ticket"; /// `MANAGER_ALLOWANCE_SEED` — seed PDA лимитов менеджера. pub const MANAGER_ALLOWANCE_SEED: &[u8] = b"shine_p_manager_allow"; @@ -45,10 +45,11 @@ pub const LAMPORTS_PER_SOL: u64 = 1_000_000_000; /// `ORACLE_MAX_AGE_SECS` — максимальный возраст oracle-цены (в секундах), допустимый для расчетов. pub const ORACLE_MAX_AGE_SECS: u64 = 120; -/// `PYTH_SOL_USD_FEED_ID` — feed id Pyth для пары SOL/USD (берется из общего deploy-конфига). -pub const PYTH_SOL_USD_FEED_ID: &str = deploy_config::PYTH_SOL_USD_FEED_ID; -/// `PYTH_SOL_USD_ACCOUNT` — адрес аккаунта Pyth price update для SOL/USD (берется из общего deploy-конфига). -pub const PYTH_SOL_USD_ACCOUNT: &str = deploy_config::PYTH_SOL_USD_ACCOUNT; +/// `PYTH_SOL_USD_FEED_ID` — feed id Pyth для пары SOL/USD. +pub const PYTH_SOL_USD_FEED_ID: &str = + "0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d"; +/// `PYTH_SOL_USD_ACCOUNT` — адрес аккаунта Pyth price update для SOL/USD. +pub const PYTH_SOL_USD_ACCOUNT: &str = "7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE"; -/// `DAO_WALLET` — адрес кошелька DAO-казны для `shine_payments` (берется из общего deploy-конфига). -pub const DAO_WALLET: &str = deploy_config::DAO_TREASURY_WALLET; +/// `DAO_WALLET` — адрес кошелька DAO-казны для `shine_payments`. +pub const DAO_WALLET: &str = "FUc28vNixp7F3nnkpGVt6nuJbgvJ4429v4B5wS52Df6P"; diff --git a/shine-solana/shine/programs/shine_payments/web/admin_tools.html b/shine-solana/shine/programs/shine_payments/web/admin_tools.html index cfb59b0..cb72d5b 100644 --- a/shine-solana/shine/programs/shine_payments/web/admin_tools.html +++ b/shine-solana/shine/programs/shine_payments/web/admin_tools.html @@ -66,7 +66,7 @@
Лимит покупки Q1 = max(limit_usd_cents - q1_sum_total_usd_cents, 0)
-
Шаг выплаты Q1 = ticket + dao(1x) + reward; Q2 = ticket + dao(2x) + reward
+
Шаг выплаты Q1 = ticket + dao(1x) + reward; Q2 = ticket + dao(2x) + reward; Q3 = ticket + dao(3x) + reward
@@ -100,6 +100,12 @@
+ +
+

Очередь 3 (все билеты)

+
+
+
@@ -109,13 +115,16 @@ const RPC_URL = "https://api.devnet.solana.com"; const connection = new solanaWeb3.Connection(RPC_URL, "confirmed"); const SEEDS = { - config: "shine_payments_v3_config", - coef: "shine_payments_v3_coef_limit", - queues: "shine_payments_v3_queues", - inflow: "shine_payments_v3_inflow_vault", - ticketQ1: "shine_payments_v3_q1_ticket", - ticketQ2: "shine_payments_v3_q2_ticket", + config: "shine_payments_config", + coef: "shine_payments_coef_limit", + queues: "shine_payments_queues", + inflow: "shine_payments_inflow_vault", + ticketQ1: "shine_payments_q1_ticket", + ticketQ2: "shine_payments_q2_ticket", + ticketQ3: "shine_payments_q3_ticket", }; + const IX = { init: 1, updateCoefLimit: 2 }; + const USERS_IX = { initUsersEconomyConfig: 1, updateUsersEconomyConfig: 2 }; const USERS_SEEDS = { economyConfig: "shine_users_v1_economy_config", }; @@ -162,10 +171,8 @@ if (!Number.isFinite(v) || v <= 0) throw new Error("Некорректная сумма USD"); return BigInt(Math.round(v * 100)); } - async function ixDiscriminator(name) { - const msg = utf8("global:" + name); - const hash = await crypto.subtle.digest("SHA-256", msg); - return new Uint8Array(hash).slice(0, 8); + function ixData(tag, ...parts) { + return concat(new Uint8Array([tag]), ...parts); } function isUnauthorizedDao(msg) { const s = String(msg || "").toLowerCase(); @@ -202,7 +209,11 @@ const q2Paid = readU64(data, o); o += 8; const q2SumTotal = readU64(data, o); o += 8; const q2SumPaid = readU64(data, o); o += 8; - return { version, q1Total, q1Paid, q1SumTotal, q1SumPaid, q2Total, q2Paid, q2SumTotal, q2SumPaid }; + const q3Total = readU64(data, o); o += 8; + const q3Paid = readU64(data, o); o += 8; + const q3SumTotal = readU64(data, o); o += 8; + const q3SumPaid = readU64(data, o); o += 8; + return { version, q1Total, q1Paid, q1SumTotal, q1SumPaid, q2Total, q2Paid, q2SumTotal, q2SumPaid, q3Total, q3Paid, q3SumTotal, q3SumPaid }; } function parseTicket(data) { let o = 0; @@ -263,7 +274,7 @@ return { usersEconomyConfigPda }; } function ticketPda(queueId, index) { - const seed = queueId === 1 ? SEEDS.ticketQ1 : SEEDS.ticketQ2; + const seed = queueId === 1 ? SEEDS.ticketQ1 : (queueId === 2 ? SEEDS.ticketQ2 : SEEDS.ticketQ3); const [pda] = solanaWeb3.PublicKey.findProgramAddressSync([utf8(seed), u64ToBytes(index)], PROGRAM_ID); return pda; } @@ -320,6 +331,7 @@
Доступно в inflow (сверх ренты): ${lamportsToSolStr(core.inflowAvailable)} SOL
Q1: total=${core.queues.q1Total}, paid=${core.queues.q1Paid}, sum_total=${centsToUsdStr(core.queues.q1SumTotal)} USD, sum_paid=${centsToUsdStr(core.queues.q1SumPaid)} USD
Q2: total=${core.queues.q2Total}, paid=${core.queues.q2Paid}, sum_total=${centsToUsdStr(core.queues.q2SumTotal)} USD, sum_paid=${centsToUsdStr(core.queues.q2SumPaid)} USD
+
Q3: total=${core.queues.q3Total}, paid=${core.queues.q3Paid}, sum_total=${centsToUsdStr(core.queues.q3SumTotal)} USD, sum_paid=${centsToUsdStr(core.queues.q3SumPaid)} USD
`; } catch (e) { el.innerHTML = `${String(e.message || e)}`; @@ -362,7 +374,6 @@ else if (!provider.isConnected) await provider.connect(); const pdas = derivePdas(); - const disc = await ixDiscriminator("init"); const keys = [ { pubkey: walletPubkey, isSigner: true, isWritable: true }, { pubkey: pdas.configPda, isSigner: false, isWritable: true }, @@ -371,7 +382,7 @@ { pubkey: pdas.inflowPda, isSigner: false, isWritable: true }, { pubkey: solanaWeb3.SystemProgram.programId, isSigner: false, isWritable: false }, ]; - const ix = new solanaWeb3.TransactionInstruction({ programId: PROGRAM_ID, keys, data: disc }); + const ix = new solanaWeb3.TransactionInstruction({ programId: PROGRAM_ID, keys, data: ixData(IX.init) }); const sig = await sendInstruction(ix); out.innerHTML = `Init выполнен. Tx: ${sig}`; await refreshAll(); @@ -397,8 +408,7 @@ const rewardLamports = solToLamports(document.getElementById("rewardInput").value.trim()); if (rewardLamports > MAX_REWARD_LAMPORTS) throw new Error("Награда не должна быть больше 0.01 SOL"); - const disc = await ixDiscriminator("update_coef_limit"); - const data = concat(disc, u64ToBytes(coefPpm), u64ToBytes(limitUsdCents), u64ToBytes(rewardLamports)); + const data = ixData(IX.updateCoefLimit, u64ToBytes(coefPpm), u64ToBytes(limitUsdCents), u64ToBytes(rewardLamports)); const keys = [ { pubkey: walletPubkey, isSigner: true, isWritable: true }, { pubkey: core.pdas.configPda, isSigner: false, isWritable: true }, @@ -427,13 +437,12 @@ if (!walletPubkey) await connectWallet(); else if (!provider.isConnected) await provider.connect(); const usersPdas = deriveUsersPdas(); - const disc = await ixDiscriminator("init_users_economy_config"); const keys = [ { pubkey: walletPubkey, isSigner: true, isWritable: true }, { pubkey: usersPdas.usersEconomyConfigPda, isSigner: false, isWritable: true }, { pubkey: solanaWeb3.SystemProgram.programId, isSigner: false, isWritable: false }, ]; - const ix = new solanaWeb3.TransactionInstruction({ programId: USERS_PROGRAM_ID, keys, data: disc }); + const ix = new solanaWeb3.TransactionInstruction({ programId: USERS_PROGRAM_ID, keys, data: ixData(USERS_IX.initUsersEconomyConfig) }); const sig = await sendInstruction(ix); out.innerHTML = `Users Economy init выполнен. Tx: ${sig}`; await refreshUsersEconomy(); @@ -455,9 +464,8 @@ const startBonusLimit = BigInt(document.getElementById("usersBonusInput").value.trim()); if (startBonusLimit < 0n) throw new Error("Стартовый бонус не может быть отрицательным"); - const disc = await ixDiscriminator("update_users_economy_config"); - const data = concat( - disc, + const data = ixData( + USERS_IX.updateUsersEconomyConfig, u64ToBytes(registrationFeeLamports), u64ToBytes(lamportsPerLimitStep), u64ToBytes(startBonusLimit) @@ -483,17 +491,17 @@ function currentDebtBeforeTicket(ticket, queues) { if (ticket.isPaid) return 0n; - const paidSum = ticket.queueId === 1 ? queues.q1SumPaid : queues.q2SumPaid; + const paidSum = ticket.queueId === 1 ? queues.q1SumPaid : (ticket.queueId === 2 ? queues.q2SumPaid : queues.q3SumPaid); return ticket.debtBefore > paidSum ? (ticket.debtBefore - paidSum) : 0n; } async function showQueue(queueId) { - const out = document.getElementById(queueId === 1 ? "queue1Table" : "queue2Table"); + const out = document.getElementById(queueId === 1 ? "queue1Table" : (queueId === 2 ? "queue2Table" : "queue3Table")); out.textContent = "Загрузка..."; try { const core = await loadCore(); if (core.notInited) throw new Error("Сначала выполните init"); - const total = queueId === 1 ? core.queues.q1Total : core.queues.q2Total; + const total = queueId === 1 ? core.queues.q1Total : (queueId === 2 ? core.queues.q2Total : core.queues.q3Total); if (total === 0n) { out.innerHTML = `Очередь ${queueId} пока пустая.`; return; @@ -555,6 +563,7 @@ document.getElementById("usersUpdateBtn").addEventListener("click", updateUsersEconomy); document.getElementById("loadQ1Btn").addEventListener("click", () => showQueue(1)); document.getElementById("loadQ2Btn").addEventListener("click", () => showQueue(2)); + document.getElementById("loadQ3Btn").addEventListener("click", () => showQueue(3)); refreshAll(); diff --git a/shine-solana/shine/programs/shine_payments/web/buy_ticket.html b/shine-solana/shine/programs/shine_payments/web/buy_ticket.html index 739ad02..b068677 100644 --- a/shine-solana/shine/programs/shine_payments/web/buy_ticket.html +++ b/shine-solana/shine/programs/shine_payments/web/buy_ticket.html @@ -85,11 +85,12 @@ const connection = new solanaWeb3.Connection(RPC_URL, "confirmed"); const SEEDS = { - config: "shine_payments_v3_config", - coef: "shine_payments_v3_coef_limit", - queues: "shine_payments_v3_queues", - ticketQ1: "shine_payments_v3_q1_ticket", + config: "shine_payments_config", + coef: "shine_payments_coef_limit", + queues: "shine_payments_queues", + ticketQ1: "shine_payments_q1_ticket", }; + const IX = { buyTicketUsd: 5, buyTicketSol: 6 }; const COEF_SCALE = 1_000_000n; const LAMPORTS_PER_SOL = 1_000_000_000n; @@ -177,10 +178,8 @@ return (cents * (10_000n - bp)) / 10_000n; } - async function ixDiscriminator(name) { - const msg = utf8("global:" + name); - const hash = await crypto.subtle.digest("SHA-256", msg); - return new Uint8Array(hash).slice(0, 8); + function ixData(tag, ...parts) { + return concat(new Uint8Array([tag]), ...parts); } function parseConfig(data) { @@ -209,7 +208,11 @@ const q2Paid = readU64(data, o); o += 8; const q2SumTotal = readU64(data, o); o += 8; const q2SumPaid = readU64(data, o); o += 8; - return { version, q1Total, q1Paid, q1SumTotal, q1SumPaid, q2Total, q2Paid, q2SumTotal, q2SumPaid }; + const q3Total = readU64(data, o); o += 8; + const q3Paid = readU64(data, o); o += 8; + const q3SumTotal = readU64(data, o); o += 8; + const q3SumPaid = readU64(data, o); o += 8; + return { version, q1Total, q1Paid, q1SumTotal, q1SumPaid, q2Total, q2Paid, q2SumTotal, q2SumPaid, q3Total, q3Paid, q3SumTotal, q3SumPaid }; } function getProvider() { @@ -354,8 +357,7 @@ const nextIndex = queues.q1Total + 1n; const [ticketPda] = solanaWeb3.PublicKey.findProgramAddressSync([utf8(SEEDS.ticketQ1), u64ToBytes(nextIndex)], PROGRAM_ID); - const disc = await ixDiscriminator("buy_ticket_usd"); - const data = concat(disc, u64ToBytes(usdCents), u64ToBytes(maxPayLamports), recipient.toBytes()); + const data = ixData(IX.buyTicketUsd, u64ToBytes(usdCents), u64ToBytes(maxPayLamports), recipient.toBytes()); const keys = [ { pubkey: walletPubkey, isSigner: true, isWritable: true }, { pubkey: pdas.configPda, isSigner: false, isWritable: true }, @@ -394,8 +396,7 @@ const nextIndex = queues.q1Total + 1n; const [ticketPda] = solanaWeb3.PublicKey.findProgramAddressSync([utf8(SEEDS.ticketQ1), u64ToBytes(nextIndex)], PROGRAM_ID); - const disc = await ixDiscriminator("buy_ticket_sol"); - const data = concat(disc, u64ToBytes(lamports), u64ToBytes(minUsdCents), recipient.toBytes()); + const data = ixData(IX.buyTicketSol, u64ToBytes(lamports), u64ToBytes(minUsdCents), recipient.toBytes()); const keys = [ { pubkey: walletPubkey, isSigner: true, isWritable: true }, { pubkey: pdas.configPda, isSigner: false, isWritable: true }, diff --git a/shine-solana/shine/programs/shine_payments/web/dao_tools.html b/shine-solana/shine/programs/shine_payments/web/dao_tools.html index fd56972..880fe89 100644 --- a/shine-solana/shine/programs/shine_payments/web/dao_tools.html +++ b/shine-solana/shine/programs/shine_payments/web/dao_tools.html @@ -65,6 +65,7 @@ +
@@ -87,9 +88,10 @@ const RPC_URL = "https://api.devnet.solana.com"; const connection = new solanaWeb3.Connection(RPC_URL, "confirmed"); const SEEDS = { - config: "shine_payments_v3_config", - managerAllowance: "shine_p_v3_manager_allow", + config: "shine_payments_config", + managerAllowance: "shine_p_manager_allow", }; + const IX = { grantManagerLimits: 3 }; let walletPubkey = null; let configCache = null; document.getElementById("programId").textContent = PROGRAM_ID.toBase58(); @@ -124,10 +126,8 @@ if (!Number.isFinite(v) || v < 0) throw new Error("Некорректная сумма USD"); return BigInt(Math.round(v * 100)); } - async function ixDiscriminator(name) { - const msg = utf8("global:" + name); - const hash = await crypto.subtle.digest("SHA-256", msg); - return new Uint8Array(hash).slice(0, 8); + function ixData(tag, ...parts) { + return concat(new Uint8Array([tag]), ...parts); } function isUnauthorizedDao(msg) { const s = String(msg || "").toLowerCase(); @@ -147,7 +147,8 @@ const manager = new solanaWeb3.PublicKey(data.slice(o, o + 32)); o += 32; const q1 = readU64(data, o); o += 8; const q2 = readU64(data, o); o += 8; - return { version, manager, q1, q2 }; + const q3 = readU64(data, o); o += 8; + return { version, manager, q1, q2, q3 }; } function getProvider() { @@ -216,11 +217,11 @@ const manager = new solanaWeb3.PublicKey(document.getElementById("managerWallet").value.trim()); const addQ1 = usdToCents(document.getElementById("addQ1").value.trim()); const addQ2 = usdToCents(document.getElementById("addQ2").value.trim()); - if (addQ1 === 0n && addQ2 === 0n) throw new Error("Нужно указать сумму хотя бы для одной очереди."); + const addQ3 = usdToCents(document.getElementById("addQ3").value.trim()); + if (addQ1 === 0n && addQ2 === 0n && addQ3 === 0n) throw new Error("Нужно указать сумму хотя бы для одной очереди."); const allowancePda = deriveManagerAllowancePda(manager); - const disc = await ixDiscriminator("grant_manager_limits"); - const data = concat(disc, manager.toBytes(), u64ToBytes(addQ1), u64ToBytes(addQ2)); + const data = ixData(IX.grantManagerLimits, manager.toBytes(), u64ToBytes(addQ1), u64ToBytes(addQ2), u64ToBytes(addQ3)); const keys = [ { pubkey: walletPubkey, isSigner: true, isWritable: true }, { pubkey: configPda, isSigner: false, isWritable: true }, @@ -258,6 +259,7 @@
PDA: ${allowancePda.toBase58()}
Доступно Q1: ${centsToUsdStr(st.q1)} USD
Доступно Q2: ${centsToUsdStr(st.q2)} USD
+
Доступно Q3: ${centsToUsdStr(st.q3)} USD
`; } catch (e) { out.innerHTML = `${String(e.message || e)}`; diff --git a/shine-solana/shine/programs/shine_payments/web/manager_tools.html b/shine-solana/shine/programs/shine_payments/web/manager_tools.html index 04f7243..1a45a59 100644 --- a/shine-solana/shine/programs/shine_payments/web/manager_tools.html +++ b/shine-solana/shine/programs/shine_payments/web/manager_tools.html @@ -62,6 +62,7 @@ @@ -80,11 +81,13 @@ const RPC_URL = "https://api.devnet.solana.com"; const connection = new solanaWeb3.Connection(RPC_URL, "confirmed"); const SEEDS = { - managerAllowance: "shine_p_v3_manager_allow", - queues: "shine_payments_v3_queues", - ticketQ1: "shine_payments_v3_q1_ticket", - ticketQ2: "shine_payments_v3_q2_ticket", + managerAllowance: "shine_p_manager_allow", + queues: "shine_payments_queues", + ticketQ1: "shine_payments_q1_ticket", + ticketQ2: "shine_payments_q2_ticket", + ticketQ3: "shine_payments_q3_ticket", }; + const IX = { managerAddTicket: 7 }; let walletPubkey = null; let queuesCache = null; document.getElementById("programId").textContent = PROGRAM_ID.toBase58(); @@ -119,10 +122,8 @@ if (!Number.isFinite(v) || v <= 0) throw new Error("Некорректная сумма USD"); return BigInt(Math.round(v * 100)); } - async function ixDiscriminator(name) { - const msg = utf8("global:" + name); - const hash = await crypto.subtle.digest("SHA-256", msg); - return new Uint8Array(hash).slice(0, 8); + function ixData(tag, ...parts) { + return concat(new Uint8Array([tag]), ...parts); } function isManagerErrors(msg) { const s = String(msg || "").toLowerCase(); @@ -135,7 +136,8 @@ const manager = new solanaWeb3.PublicKey(data.slice(o, o + 32)); o += 32; const q1 = readU64(data, o); o += 8; const q2 = readU64(data, o); o += 8; - return { version, manager, q1, q2 }; + const q3 = readU64(data, o); o += 8; + return { version, manager, q1, q2, q3 }; } function parseQueues(data) { let o = 0; @@ -148,7 +150,11 @@ const q2Paid = readU64(data, o); o += 8; const q2SumTotal = readU64(data, o); o += 8; const q2SumPaid = readU64(data, o); o += 8; - return { version, q1Total, q1Paid, q1SumTotal, q1SumPaid, q2Total, q2Paid, q2SumTotal, q2SumPaid }; + const q3Total = readU64(data, o); o += 8; + const q3Paid = readU64(data, o); o += 8; + const q3SumTotal = readU64(data, o); o += 8; + const q3SumPaid = readU64(data, o); o += 8; + return { version, q1Total, q1Paid, q1SumTotal, q1SumPaid, q2Total, q2Paid, q2SumTotal, q2SumPaid, q3Total, q3Paid, q3SumTotal, q3SumPaid }; } function getProvider() { @@ -187,7 +193,7 @@ return pda; } function deriveTicketPda(queueId, index) { - const seed = queueId === 1 ? SEEDS.ticketQ1 : SEEDS.ticketQ2; + const seed = queueId === 1 ? SEEDS.ticketQ1 : (queueId === 2 ? SEEDS.ticketQ2 : SEEDS.ticketQ3); const [pda] = solanaWeb3.PublicKey.findProgramAddressSync([utf8(seed), u64ToBytes(index)], PROGRAM_ID); return pda; } @@ -223,6 +229,7 @@
PDA лимитов: ${core.allowancePda.toBase58()}
Доступно Q1: ${centsToUsdStr(core.allowance.q1)} USD
Доступно Q2: ${centsToUsdStr(core.allowance.q2)} USD
+
Доступно Q3: ${centsToUsdStr(core.allowance.q3)} USD
`; } catch (e) { el.innerHTML = `${String(e.message || e)}`; @@ -241,15 +248,16 @@ if (!core.allowance) throw new Error("Для этого кошелька лимиты менеджера не выданы."); const queueId = Number(document.getElementById("queueId").value); - if (queueId !== 1 && queueId !== 2) throw new Error("Очередь должна быть 1 или 2"); + if (![1, 2, 3].includes(queueId)) throw new Error("Очередь должна быть 1, 2 или 3"); const recipient = new solanaWeb3.PublicKey(document.getElementById("recipient").value.trim()); const payout = usdToCents(document.getElementById("payoutUsd").value.trim()); - const nextIndex = queueId === 1 ? (core.queues.q1Total + 1n) : (core.queues.q2Total + 1n); + const nextIndex = queueId === 1 + ? (core.queues.q1Total + 1n) + : (queueId === 2 ? (core.queues.q2Total + 1n) : (core.queues.q3Total + 1n)); const ticketPda = deriveTicketPda(queueId, nextIndex); - const disc = await ixDiscriminator("manager_add_ticket"); - const data = concat(disc, new Uint8Array([queueId]), recipient.toBytes(), u64ToBytes(payout)); + const data = ixData(IX.managerAddTicket, new Uint8Array([queueId]), recipient.toBytes(), u64ToBytes(payout)); const keys = [ { pubkey: walletPubkey, isSigner: true, isWritable: true }, { pubkey: core.allowancePda, isSigner: false, isWritable: true }, diff --git a/shine-solana/shine/programs/shine_payments/web/track_ticket.html b/shine-solana/shine/programs/shine_payments/web/track_ticket.html index 9322026..2f08da2 100644 --- a/shine-solana/shine/programs/shine_payments/web/track_ticket.html +++ b/shine-solana/shine/programs/shine_payments/web/track_ticket.html @@ -83,12 +83,14 @@ const connection = new solanaWeb3.Connection(RPC_URL, "confirmed"); const SEEDS = { - config: "shine_payments_v3_config", - coef: "shine_payments_v3_coef_limit", - queues: "shine_payments_v3_queues", - ticketQ1: "shine_payments_v3_q1_ticket", - ticketQ2: "shine_payments_v3_q2_ticket", + config: "shine_payments_config", + coef: "shine_payments_coef_limit", + queues: "shine_payments_queues", + ticketQ1: "shine_payments_q1_ticket", + ticketQ2: "shine_payments_q2_ticket", + ticketQ3: "shine_payments_q3_ticket", }; + const IX = { changeTicketRecipient: 9, stepPayout: 8 }; const LAMPORTS_PER_SOL = 1_000_000_000n; let walletPubkey = null; @@ -133,10 +135,8 @@ function centsToUsdStr(c) { return trimZeros((Number(c) / 100).toFixed(2)); } - async function ixDiscriminator(name) { - const msg = utf8("global:" + name); - const hash = await crypto.subtle.digest("SHA-256", msg); - return new Uint8Array(hash).slice(0, 8); + function ixData(tag, ...parts) { + return concat(new Uint8Array([tag]), ...parts); } function isNotEnoughForStep(msg) { const s = String(msg || "").toLowerCase(); @@ -187,7 +187,11 @@ const q2Paid = readU64(data, o); o += 8; const q2SumTotal = readU64(data, o); o += 8; const q2SumPaid = readU64(data, o); o += 8; - return { version, q1Total, q1Paid, q1SumTotal, q1SumPaid, q2Total, q2Paid, q2SumTotal, q2SumPaid }; + const q3Total = readU64(data, o); o += 8; + const q3Paid = readU64(data, o); o += 8; + const q3SumTotal = readU64(data, o); o += 8; + const q3SumPaid = readU64(data, o); o += 8; + return { version, q1Total, q1Paid, q1SumTotal, q1SumPaid, q2Total, q2Paid, q2SumTotal, q2SumPaid, q3Total, q3Paid, q3SumTotal, q3SumPaid }; } function parseTicket(data) { let o = 0; @@ -232,7 +236,7 @@ return { configPda, coefPda, queuesPda }; } function deriveTicketPda(queueId, index) { - const seed = queueId === 1 ? SEEDS.ticketQ1 : SEEDS.ticketQ2; + const seed = queueId === 1 ? SEEDS.ticketQ1 : (queueId === 2 ? SEEDS.ticketQ2 : SEEDS.ticketQ3); const [pda] = solanaWeb3.PublicKey.findProgramAddressSync([utf8(seed), u64ToBytes(index)], PROGRAM_ID); return pda; } @@ -262,14 +266,16 @@ function nextStepQueue(queues) { const q1Pending = queues.q1Total - queues.q1Paid; const q2Pending = queues.q2Total - queues.q2Paid; + const q3Pending = queues.q3Total - queues.q3Paid; if (q1Pending > 0n) return 1; if (q2Pending > 0n) return 2; + if (q3Pending > 0n) return 3; return 0; } function nextPayoutTicket(queues) { const queue = nextStepQueue(queues); if (queue === 0) return null; - const index = queue === 1 ? (queues.q1Paid + 1n) : (queues.q2Paid + 1n); + const index = queue === 1 ? (queues.q1Paid + 1n) : (queue === 2 ? (queues.q2Paid + 1n) : (queues.q3Paid + 1n)); return { queue, index }; } @@ -284,13 +290,13 @@
Курс SOL/USD (Pyth): ${trimZeros((Number(core.pyth.num) / Number(core.pyth.den) / 100).toFixed(6))}, возраст ${pythAge} сек
DAO: ${core.config.dao.toBase58()}
Сейчас это тестовый DAO-кошелек. В production здесь будет адрес реального DAO.
-
Обе очереди пусты/полностью выплачены.
+
Все очереди пусты/полностью выплачены.
На inflow vault доступно (сверх ренты): ${lamportsToSolStr(core.available)} SOL
При шаге эта сумма уйдет в DAO, награда не начисляется.
`; return; } - const nextIndex = queue === 1 ? core.queues.q1Paid + 1n : core.queues.q2Paid + 1n; + const nextIndex = queue === 1 ? core.queues.q1Paid + 1n : (queue === 2 ? core.queues.q2Paid + 1n : core.queues.q3Paid + 1n); const nextPda = deriveTicketPda(queue, nextIndex); const nextAi = await connection.getAccountInfo(nextPda, "confirmed"); if (!nextAi) { @@ -299,7 +305,7 @@ } const next = parseTicket(nextAi.data); const ticketLamports = usdCentsToLamportsCeil(next.payoutUsdCents, core.pyth); - const daoUsd = queue === 1 ? next.payoutUsdCents : (next.payoutUsdCents * 2n); + const daoUsd = next.payoutUsdCents * BigInt(queue); const daoLamports = usdCentsToLamportsCeil(daoUsd, core.pyth); const need = ticketLamports + daoLamports + core.coef.reward; const missing = core.available >= need ? 0n : (need - core.available); @@ -313,7 +319,7 @@
DAO на этом шаге: ${centsToUsdStr(daoUsd)} USD (~${lamportsToSolStr(daoLamports)} SOL)
Награда за шаг: ${lamportsToSolStr(core.coef.reward)} SOL
Нужно для шага: ${lamportsToSolStr(need)} SOL
-
Формула: ${queue === 1 ? "ticket + dao(1x) + reward" : "ticket + dao(2x) + reward"}
+
Формула: ticket + dao(${queue}x) + reward
Доступно в inflow vault: ${lamportsToSolStr(core.available)} SOL
${missing === 0n ? 'Хватает для шага выплаты.' @@ -374,8 +380,7 @@ const newRecipient = new solanaWeb3.PublicKey(newRecipientRaw); const core = cachedCore || await loadCoreState(); - const disc = await ixDiscriminator("change_ticket_recipient"); - const data = concat(disc, newRecipient.toBytes()); + const data = ixData(IX.changeTicketRecipient, newRecipient.toBytes()); const keys = [ { pubkey: walletPubkey, isSigner: true, isWritable: true }, { pubkey: core.pdas.queuesPda, isSigner: false, isWritable: true }, @@ -404,7 +409,7 @@ if (idxRaw) { const idx = BigInt(idxRaw); - for (const queue of [1, 2]) { + for (const queue of [1, 2, 3]) { const pda = deriveTicketPda(queue, idx); const ai = await connection.getAccountInfo(pda, "confirmed"); if (!ai) continue; @@ -413,8 +418,8 @@ if (results.length === 0) throw new Error(`Тикет #${idx.toString()} не найден ни в одной очереди`); } else if (walletRaw) { const recipient = new solanaWeb3.PublicKey(walletRaw); - for (const queue of [1, 2]) { - const total = queue === 1 ? core.queues.q1Total : core.queues.q2Total; + for (const queue of [1, 2, 3]) { + const total = queue === 1 ? core.queues.q1Total : (queue === 2 ? core.queues.q2Total : core.queues.q3Total); for (let i = 1n; i <= total; i++) { const pda = deriveTicketPda(queue, i); const ai = await connection.getAccountInfo(pda, "confirmed"); @@ -450,15 +455,14 @@ nextTicketPda = deriveTicketPda(1, core.queues.q1Paid + 1n); recipient = walletPubkey; } else { - const nextIndex = queue === 1 ? core.queues.q1Paid + 1n : core.queues.q2Paid + 1n; + const nextIndex = queue === 1 ? core.queues.q1Paid + 1n : (queue === 2 ? core.queues.q2Paid + 1n : core.queues.q3Paid + 1n); nextTicketPda = deriveTicketPda(queue, nextIndex); const ai = await connection.getAccountInfo(nextTicketPda, "confirmed"); if (!ai) throw new Error(`Следующий тикет #${nextIndex.toString()} для очереди ${queue} не найден`); recipient = parseTicket(ai.data).recipient; } - const disc = await ixDiscriminator("step_payout"); - const data = concat(disc); + const data = ixData(IX.stepPayout); const keys = [ { pubkey: walletPubkey, isSigner: true, isWritable: true }, { pubkey: core.pdas.configPda, isSigner: false, isWritable: true },