From d8b3250f85b7d93845caaaab7ebfdf653b11d3b3 Mon Sep 17 00:00:00 2001
From: Gift Amadi <120387225+giftexceed@users.noreply.github.com>
Date: Mon, 27 Jul 2026 22:04:16 +0000
Subject: [PATCH 1/3] fix(ci): repair workspace so Rust CI can build again
Every root-level cargo command failed on main, so all four Rust CI jobs
were red regardless of what a PR changed. The cause was a series of merge
commits resolved by accepting both sides, which duplicated content inside
several files. This repairs the workspace members and their dependencies.
Cargo.lock was unparseable: 238 packages appeared two or three times and
three entries had been spliced together, one package's header landing on
another's body. It was also stale, still carrying the whole server
dependency tree even though the workspace is three contract crates.
Regenerated, which takes it from ~710 packages to 181. ed25519-dalek is
pinned to 2.2.0 because 3.0 changed its CryptoRng bound and breaks
soroban-env-host 22.x.
emergency_guard had `#[contract]` applied twice, once bare and once via
cfg_attr, so the macro emitted EmergencyGuardClient and friends twice. It
also carried a second DefaultEmergencyGuard whose inherent methods
collided with the trait impl, a duplicated is_admin_public, an is_admin
that took &Address against a trait declaring Address, an unimported log
macro, and three storage writes referencing an undefined `pause_state`
with the correct `.set(...)` orphaned below an emit block. rotate_admin
never bound `threshold` and pushed the new admin a second time after the
loop had already substituted it.
staking_rewards had two functions truncated mid-body with an unrelated
signature spliced in, pause_staking and rotate_admin, which left the impl
block unclosed. PauseType::CLAIM_REWARDS was referenced in four places but
never defined. initialize called guard setup twice, and the second call
failed with AlreadyInitialized, so every test that touched setup() died on
error #1. PauseType was imported twice.
Three emergency_guard tests asserted InsufficientSignatures where the
implementation returns Unauthorized. All three supply a non-admin approver
while meeting the count threshold, and their names describe unauthorized
access, so the assertions were stale rather than the behaviour. Changing
the contract's error semantics belongs to whoever owns that feature, so
the tests were updated to match.
In staking_rewards/test.rs the body of test_granular_claim_rewards_pause
had been appended to test_granular_pause_staking, leaving one test headless
and the other staking tokens it had never minted. Both are restored.
Result: cargo check --locked --all-targets, cargo fmt --all --check,
cargo clippy --locked --all-targets --all-features -D warnings, and
cargo test --locked all pass. 54 tests, 0 failures.
Not fixed here: CI also runs `cargo build -p liquidity_pool`, but that
crate is not a workspace member and does not compile. Its lib.rs has been
inflated from ~1150 to 2905 lines by the same accept-both-sides merges,
including one statement with six duplicated transfer calls. Choosing which
side is canonical in a contract that moves funds is a maintainer decision,
so it is left alone and documented in the PR.
---
Cargo.lock | 6101 +----------------
.../emergency_guard/examples/simple_token.rs | 5 -
contracts/emergency_guard/src/lib.rs | 138 +-
contracts/emergency_guard/src/test.rs | 11 +-
contracts/staking_rewards/src/lib.rs | 40 +-
contracts/staking_rewards/src/test.rs | 36 +-
6 files changed, 233 insertions(+), 6098 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 45e11e40..030b1d92 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -23,68 +23,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "anes"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
-
-[[package]]
-name = "anstream"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
-dependencies = [
- "anstyle",
- "anstyle-parse",
- "anstyle-query",
- "anstyle-wincon",
- "colorchoice",
- "is_terminal_polyfill",
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle"
-version = "1.0.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
-
-[[package]]
-name = "anstyle-parse"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
-dependencies = [
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle-query"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "anstyle-wincon"
-version = "3.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
-dependencies = [
- "anstyle",
- "once_cell_polyfill",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.102"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
-
[[package]]
name = "arbitrary"
version = "1.3.2"
@@ -275,20 +213,14 @@ dependencies = [
"num-bigint",
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
-[[package]]
-name = "cast"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
-
[[package]]
name = "cc"
-version = "1.2.62"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
+checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9"
dependencies = [
"find-msvc-tools",
"shlex",
@@ -302,9 +234,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "chrono"
-version = "0.4.44"
+version = "0.4.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
+checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
dependencies = [
"iana-time-zone",
"num-traits",
@@ -312,121 +244,6 @@ dependencies = [
"windows-link",
]
-[[package]]
-name = "ciborium"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
-dependencies = [
- "ciborium-io",
- "ciborium-ll",
- "serde",
-]
-
-[[package]]
-name = "ciborium-io"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
-
-[[package]]
-name = "ciborium-ll"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
-dependencies = [
- "ciborium-io",
- "half",
-]
-
-[[package]]
-name = "clap"
-version = "4.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
-dependencies = [
- "clap_builder",
- "clap_derive",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
-dependencies = [
- "anstream",
- "anstyle",
- "clap_lex",
- "strsim",
-]
-
-[[package]]
-name = "clap_derive"
-version = "4.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
-dependencies = [
- "heck 0.5.0",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "clap_lex"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
-
-[[package]]
-name = "colorchoice"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
-
-[[package]]
-name = "combine"
-version = "4.6.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
-dependencies = [
- "bytes",
- "futures-core",
- "memchr",
- "pin-project-lite",
- "tokio",
- "tokio-util",
-]
-
-[[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 = "config"
-version = "0.14.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf"
-dependencies = [
- "async-trait",
- "convert_case",
- "json5",
- "nom",
- "pathdiff",
- "ron",
- "rust-ini",
- "serde",
- "serde_json",
- "toml",
- "yaml-rust2",
-]
-
[[package]]
name = "const-oid"
version = "0.9.6"
@@ -459,144 +276,6 @@ dependencies = [
"serde_json",
]
-[[package]]
-name = "crc"
-version = "3.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d"
-dependencies = [
- "crc-catalog",
-]
-
-[[package]]
-name = "crc-catalog"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853"
-
-[[package]]
-name = "crc32fast"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "criterion"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
-dependencies = [
- "anes",
- "cast",
- "ciborium",
- "clap",
- "criterion-plot",
- "is-terminal",
- "itertools",
- "num-traits",
- "once_cell",
- "oorandom",
- "plotters",
- "rayon",
- "regex",
- "serde",
- "serde_derive",
- "serde_json",
- "tinytemplate",
- "walkdir",
-]
-
-[[package]]
-name = "criterion-plot"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
-dependencies = [
- "cast",
- "itertools",
-]
-
-[[package]]
-name = "cross-call"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "cross-chain-payload"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "cross-chain-verifier"
-version = "0.1.0"
-dependencies = [
- "ed25519-dalek",
- "soroban-sdk",
-]
-
-[[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-queue"
-version = "0.3.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
-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 = "crucible-example-gasless"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "crunchy"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
-
[[package]]
name = "crypto-bigint"
version = "0.5.5"
@@ -611,9 +290,9 @@ dependencies = [
[[package]]
name = "crypto-common"
-version = "0.1.7"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
"generic-array",
"typenum",
@@ -626,7 +305,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501"
dependencies = [
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -653,7 +332,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -687,7 +366,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -700,7 +379,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -711,7 +390,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
"darling_core 0.20.11",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -722,7 +401,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
dependencies = [
"darling_core 0.23.0",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -747,7 +426,6 @@ version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
dependencies = [
- "powerfmt",
"serde_core",
]
@@ -770,7 +448,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -837,9 +515,9 @@ dependencies = [
[[package]]
name = "either"
-version = "1.16.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
+checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d"
[[package]]
name = "elliptic-curve"
@@ -914,21 +592,21 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "futures-core"
-version = "0.3.32"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
+checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7"
[[package]]
name = "futures-task"
-version = "0.3.32"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
+checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109"
[[package]]
name = "futures-util"
-version = "0.3.32"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
+checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa"
dependencies = [
"futures-core",
"futures-task",
@@ -938,9 +616,9 @@ dependencies = [
[[package]]
name = "generic-array"
-version = "0.14.7"
+version = "0.14.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2"
dependencies = [
"typenum",
"version_check",
@@ -971,17 +649,6 @@ dependencies = [
"subtle",
]
-[[package]]
-name = "half"
-version = "2.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
-dependencies = [
- "cfg-if",
- "crunchy",
- "zerocopy",
-]
-
[[package]]
name = "hashbrown"
version = "0.12.3"
@@ -1003,43 +670,6 @@ version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
-[[package]]
-name = "hashlink"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
-dependencies = [
- "hashbrown 0.14.5",
-]
-
-[[package]]
-name = "heck"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
-dependencies = [
- "unicode-segmentation",
-]
-
-[[package]]
-name = "heck"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-
-[[package]]
-name = "hello-soroban"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[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"
@@ -1140,13 +770,12 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
name = "js-sys"
-version = "0.3.99"
+version = "0.3.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
+checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
dependencies = [
"cfg-if",
"futures-util",
- "once_cell",
"wasm-bindgen",
]
@@ -1173,9 +802,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.186"
+version = "0.2.189"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
+checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
[[package]]
name = "libm"
@@ -1185,21 +814,21 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]]
name = "log"
-version = "0.4.30"
+version = "0.4.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
+checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
[[package]]
name = "memchr"
-version = "2.8.0"
+version = "2.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
+checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
[[package]]
name = "num-bigint"
-version = "0.4.6"
+version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
dependencies = [
"num-integer",
"num-traits",
@@ -1219,7 +848,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -1267,19 +896,6 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "pin-project-lite"
version = "0.2.17"
-name = "is-terminal"
-version = "0.4.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46"
-dependencies = [
- "hermit-abi",
- "libc",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "is_terminal_polyfill"
-version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
@@ -1315,7 +931,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -1329,27 +945,27 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.106"
+version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
-version = "1.0.45"
+version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
+checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
-version = "0.8.6"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
+checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a"
dependencies = [
"libc",
"rand_chacha",
@@ -1377,22 +993,22 @@ dependencies = [
[[package]]
name = "ref-cast"
-version = "1.0.25"
+version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
+checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d"
dependencies = [
"ref-cast-impl",
]
[[package]]
name = "ref-cast-impl"
-version = "1.0.25"
+version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
+checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 3.0.3",
]
[[package]]
@@ -1416,5489 +1032,58 @@ dependencies = [
[[package]]
name = "rustversion"
-version = "1.0.22"
+version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
[[package]]
name = "schemars"
-name = "lock_api"
-version = "0.4.14"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
+checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
dependencies = [
- "scopeguard",
+ "dyn-clone",
+ "ref-cast",
+ "serde",
+ "serde_json",
]
[[package]]
-name = "log"
-version = "0.4.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
-
-[[package]]
-name = "lru-slab"
-version = "0.1.2"
+name = "schemars"
+version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
+checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a"
+dependencies = [
+ "dyn-clone",
+ "ref-cast",
+ "serde",
+ "serde_json",
+]
[[package]]
-name = "matchers"
-version = "0.2.0"
+name = "sec1"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
+checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc"
dependencies = [
- "regex-automata",
+ "base16ct",
+ "der",
+ "generic-array",
+ "subtle",
+ "zeroize",
]
[[package]]
-name = "matchit"
-version = "0.7.3"
+name = "semver"
+version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
[[package]]
-name = "md-5"
-version = "0.10.6"
+name = "serde"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
-dependencies = [
- "cfg-if",
- "digest",
-]
-
-[[package]]
-name = "memchr"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
-
-[[package]]
-name = "mime"
-version = "0.3.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
-
-[[package]]
-name = "mime_guess"
-version = "2.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
-dependencies = [
- "mime",
- "unicase",
-]
-
-[[package]]
-name = "minimal-lexical"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
-dependencies = [
- "adler2",
- "simd-adler32",
-]
-
-[[package]]
-name = "mio"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
-dependencies = [
- "libc",
- "wasi",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "moka"
-version = "0.12.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046"
-dependencies = [
- "async-lock",
- "crossbeam-channel",
- "crossbeam-epoch",
- "crossbeam-utils",
- "equivalent",
- "event-listener 5.4.1",
- "futures-util",
- "parking_lot 0.12.5",
- "portable-atomic",
- "smallvec",
- "tagptr",
- "uuid",
-]
-
-[[package]]
-name = "multer"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b"
-dependencies = [
- "bytes",
- "encoding_rs",
- "futures-util",
- "http",
- "httparse",
- "memchr",
- "mime",
- "spin",
- "version_check",
-]
-
-[[package]]
-name = "native-tls"
-version = "0.2.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2"
-dependencies = [
- "libc",
- "log",
- "openssl",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "security-framework",
- "security-framework-sys",
- "tempfile",
-]
-
-[[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 = "nu-ansi-term"
-version = "0.50.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
-dependencies = [
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-bigint-dig"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7"
-dependencies = [
- "lazy_static",
- "libm",
- "num-integer",
- "num-iter",
- "num-traits",
- "rand 0.8.6",
- "smallvec",
- "zeroize",
-]
-
-[[package]]
-name = "num-conv"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
-
-[[package]]
-name = "num-derive"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-iter"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
- "libm",
-]
-
-[[package]]
-name = "num_enum"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"
-dependencies = [
- "num_enum_derive",
- "rustversion",
-]
-
-[[package]]
-name = "num_enum_derive"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
-dependencies = [
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.21.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
-
-[[package]]
-name = "once_cell_polyfill"
-version = "1.70.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
-
-[[package]]
-name = "oorandom"
-version = "11.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
-
-[[package]]
-name = "openssl"
-version = "0.10.80"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967"
-dependencies = [
- "bitflags 2.11.1",
- "cfg-if",
- "foreign-types",
- "libc",
- "openssl-macros",
- "openssl-sys",
-]
-
-[[package]]
-name = "openssl-macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "openssl-probe"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.116"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "ordered-multimap"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79"
-dependencies = [
- "dlv-list",
- "hashbrown 0.14.5",
-]
-
-[[package]]
-name = "p256"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
-dependencies = [
- "ecdsa",
- "elliptic-curve",
- "primeorder",
- "sha2",
-]
-
-[[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.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
-dependencies = [
- "instant",
- "lock_api",
- "parking_lot_core 0.8.6",
-]
-
-[[package]]
-name = "parking_lot"
-version = "0.12.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
-dependencies = [
- "lock_api",
- "parking_lot_core 0.9.12",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
-dependencies = [
- "cfg-if",
- "instant",
- "libc",
- "redox_syscall 0.2.16",
- "smallvec",
- "winapi",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall 0.5.18",
- "smallvec",
- "windows-link",
-]
-
-[[package]]
-name = "paste"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-
-[[package]]
-name = "pathdiff"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
-
-[[package]]
-name = "pem"
-version = "3.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be"
-dependencies = [
- "base64 0.22.1",
- "serde_core",
-]
-
-[[package]]
-name = "pem-rfc7468"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
-dependencies = [
- "base64ct",
-]
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
-
-[[package]]
-name = "pest"
-version = "2.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662"
-dependencies = [
- "memchr",
- "ucd-trie",
-]
-
-[[package]]
-name = "pest_derive"
-version = "2.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77"
-dependencies = [
- "pest",
- "pest_generator",
-]
-
-[[package]]
-name = "pest_generator"
-version = "2.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f"
-dependencies = [
- "pest",
- "pest_meta",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "pest_meta"
-version = "2.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220"
-dependencies = [
- "pest",
- "sha2",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
-
-[[package]]
-name = "pkcs1"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
-dependencies = [
- "der",
- "pkcs8",
- "spki",
-]
-
-[[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 = "plain"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
-
-[[package]]
-name = "plotters"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"
-dependencies = [
- "num-traits",
- "plotters-backend",
- "plotters-svg",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "plotters-backend"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
-
-[[package]]
-name = "plotters-svg"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
-dependencies = [
- "plotters-backend",
-]
-
-[[package]]
-name = "portable-atomic"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
-
-[[package]]
-name = "potential_utf"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
-dependencies = [
- "zerovec",
-]
-
-[[package]]
-name = "powerfmt"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
-dependencies = [
- "zerocopy",
-]
-
-[[package]]
-name = "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 = "primeorder"
-version = "0.13.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6"
-dependencies = [
- "elliptic-curve",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "3.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
-dependencies = [
- "toml_edit 0.25.11+spec-1.1.0",
-]
-
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "prometheus"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ca5326d8d0b950a9acd87e6a3f94745394f62e4dae1b1ee22b2bc0c394af43a"
-dependencies = [
- "cfg-if",
- "fnv",
- "lazy_static",
- "memchr",
- "parking_lot 0.12.5",
- "protobuf",
- "thiserror 2.0.18",
-]
-
-[[package]]
-name = "proptest"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744"
-dependencies = [
- "bit-set",
- "bit-vec",
- "bitflags 2.11.1",
- "num-traits",
- "rand 0.9.4",
- "rand_chacha 0.9.0",
- "rand_xorshift",
- "regex-syntax",
- "rusty-fork",
- "tempfile",
- "unarray",
-]
-
-[[package]]
-name = "protobuf"
-version = "3.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d65a1d4ddae7d8b5de68153b48f6aa3bba8cb002b243dbdbc55a5afbc98f99f4"
-dependencies = [
- "once_cell",
- "protobuf-support",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "protobuf-support"
-version = "3.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e36c2f31e0a47f9280fb347ef5e461ffcd2c52dd520d8e216b52f93b0b0d7d6"
-dependencies = [
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "proxy"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "quick-error"
-version = "1.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
-
-[[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",
- "socket2 0.6.3",
- "thiserror 2.0.18",
- "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",
- "getrandom 0.3.4",
- "lru-slab",
- "rand 0.9.4",
- "ring",
- "rustc-hash",
- "rustls",
- "rustls-pki-types",
- "slab",
- "thiserror 2.0.18",
- "tinyvec",
- "tracing",
- "web-time",
-]
-
-[[package]]
-name = "quinn-udp"
-version = "0.5.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
-dependencies = [
- "cfg_aliases",
- "libc",
- "once_cell",
- "socket2 0.6.3",
- "tracing",
- "windows-sys 0.60.2",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
-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.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
-dependencies = [
- "libc",
- "rand_chacha 0.3.1",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
-dependencies = [
- "rand_chacha 0.9.0",
- "rand_core 0.9.5",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.9.5",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom 0.2.17",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
-dependencies = [
- "getrandom 0.3.4",
-]
-
-[[package]]
-name = "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 = "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 = "redis"
-version = "0.25.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e46922bd01fefcfdcf58d9cd626da082bb2cde27211920dacfde6b2ecf9a35b"
-dependencies = [
- "async-trait",
- "bytes",
- "combine",
- "futures-util",
- "itoa",
- "percent-encoding",
- "pin-project-lite",
- "ryu",
- "sha1_smol",
- "socket2 0.5.10",
- "tokio",
- "tokio-util",
- "url",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.5.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
-dependencies = [
- "bitflags 2.11.1",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b"
-dependencies = [
- "bitflags 2.11.1",
-]
-
-[[package]]
-name = "ref-cast"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
-dependencies = [
- "ref-cast-impl",
-]
-
-[[package]]
-name = "ref-cast-impl"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "regex"
-version = "1.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
-
-[[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",
- "http-body",
- "http-body-util",
- "hyper",
- "hyper-rustls",
- "hyper-util",
- "js-sys",
- "log",
- "percent-encoding",
- "pin-project-lite",
- "quinn",
- "rustls",
- "rustls-pki-types",
- "serde",
- "serde_json",
- "serde_urlencoded",
- "sync_wrapper",
- "tokio",
- "tokio-rustls",
- "tower 0.5.3",
- "tower-http 0.6.11",
- "tower-service",
- "url",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "webpki-roots",
-]
-
-[[package]]
-name = "rfc6979"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2"
-dependencies = [
- "hmac",
- "subtle",
-]
-
-[[package]]
-name = "ring"
-version = "0.17.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
-dependencies = [
- "cc",
- "cfg-if",
- "getrandom 0.2.17",
- "libc",
- "untrusted",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "ron"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
-dependencies = [
- "base64 0.21.7",
- "bitflags 2.11.1",
- "serde",
- "serde_derive",
-]
-
-[[package]]
-name = "rsa"
-version = "0.9.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d"
-dependencies = [
- "const-oid",
- "digest",
- "num-bigint-dig",
- "num-integer",
- "num-traits",
- "pkcs1",
- "pkcs8",
- "rand_core 0.6.4",
- "signature",
- "spki",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "rusqlite"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2"
-dependencies = [
- "bitflags 2.11.1",
- "fallible-iterator",
- "fallible-streaming-iterator",
- "hashlink",
- "libsqlite3-sys",
- "smallvec",
-]
-
-[[package]]
-name = "rust-embed"
-version = "8.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27"
-dependencies = [
- "rust-embed-impl",
- "rust-embed-utils",
- "walkdir",
-]
-
-[[package]]
-name = "rust-embed-impl"
-version = "8.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa"
-dependencies = [
- "proc-macro2",
- "quote",
- "rust-embed-utils",
- "syn 2.0.117",
- "walkdir",
-]
-
-[[package]]
-name = "rust-embed-utils"
-version = "8.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1"
-dependencies = [
- "sha2",
- "walkdir",
-]
-
-[[package]]
-name = "rust-ini"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e0698206bcb8882bf2a9ecb4c1e7785db57ff052297085a6efd4fe42302068a"
-dependencies = [
- "cfg-if",
- "ordered-multimap",
-]
-
-[[package]]
-name = "rustc-hash"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
-
-[[package]]
-name = "rustc_version"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
-dependencies = [
- "semver",
-]
-
-[[package]]
-name = "rustix"
-version = "1.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
-dependencies = [
- "bitflags 2.11.1",
- "errno",
- "libc",
- "linux-raw-sys",
- "windows-sys 0.61.2",
-]
-
-[[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",
- "subtle",
- "zeroize",
-]
-
-[[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-webpki"
-version = "0.103.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
-dependencies = [
- "ring",
- "rustls-pki-types",
- "untrusted",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
-
-[[package]]
-name = "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.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "schannel"
-version = "0.1.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "schemars"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
-dependencies = [
- "dyn-clone",
- "ref-cast",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "schemars"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc"
-dependencies = [
- "dyn-clone",
- "ref-cast",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "scopeguard"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-
-[[package]]
-name = "sec1"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc"
-dependencies = [
- "base16ct",
- "der",
- "generic-array",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "security-framework"
-version = "3.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
-dependencies = [
- "bitflags 2.11.1",
- "core-foundation",
- "core-foundation-sys",
- "libc",
- "security-framework-sys",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "2.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "semver"
-version = "1.0.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
-
-[[package]]
-name = "serde"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
-dependencies = [
- "serde_core",
- "serde_derive",
-]
-
-[[package]]
-name = "serde_core"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.150"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
-dependencies = [
- "itoa",
- "memchr",
- "serde",
- "serde_core",
- "zmij",
-]
-
-[[package]]
-name = "serde_path_to_error"
-version = "0.1.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457"
-dependencies = [
- "itoa",
- "serde",
- "serde_core",
-]
-
-[[package]]
-name = "serde_spanned"
-version = "0.6.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
-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.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2"
-dependencies = [
- "base64 0.22.1",
- "bs58",
- "chrono",
- "hex",
- "indexmap 1.9.3",
- "indexmap 2.14.0",
- "schemars 0.9.0",
- "schemars 1.2.1",
- "serde_core",
- "serde_json",
- "serde_with_macros",
- "time",
-]
-
-[[package]]
-name = "serde_with_macros"
-version = "3.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac"
-dependencies = [
- "darling 0.23.0",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "sha1"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "sha1_smol"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d"
-
-[[package]]
-name = "sha2"
-version = "0.10.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "sha3"
-version = "0.10.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874"
-dependencies = [
- "digest",
- "keccak",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "shlex"
-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 = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
-dependencies = [
- "digest",
- "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 = "simple_asn1"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d"
-dependencies = [
- "num-bigint",
- "num-traits",
- "thiserror 2.0.18",
- "time",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
-
-[[package]]
-name = "sled"
-version = "0.34.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935"
-dependencies = [
- "crc32fast",
- "crossbeam-epoch",
- "crossbeam-utils",
- "fs2",
- "fxhash",
- "libc",
- "log",
- "parking_lot 0.11.2",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
-
-[[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 = "soroban-builtin-sdk-macros"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf2e42bf80fcdefb3aae6ff3c7101a62cf942e95320ed5b518a1705bc11c6b2f"
-dependencies = [
- "itertools",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "soroban-env-common"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "027cd856171bfd6ad2c0ffb3b7dfe55ad7080fb3050c36ad20970f80da634472"
-dependencies = [
- "arbitrary",
- "crate-git-revision",
- "ethnum",
- "num-derive",
- "num-traits",
- "serde",
- "soroban-env-macros",
- "soroban-wasmi",
- "static_assertions",
- "stellar-xdr",
- "wasmparser 0.116.1",
-]
-
-[[package]]
-name = "soroban-env-guest"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a07dda1ae5220d975979b19ad4fd56bc86ec7ec1b4b25bc1c5d403f934e592e"
-dependencies = [
- "soroban-env-common",
- "static_assertions",
-]
-
-[[package]]
-name = "soroban-env-host"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66e8b03a4191d485eab03f066336112b2a50541a7553179553dc838b986b94dd"
-dependencies = [
- "ark-bls12-381",
- "ark-ec",
- "ark-ff",
- "ark-serialize",
- "curve25519-dalek",
- "ecdsa",
- "ed25519-dalek",
- "elliptic-curve",
- "generic-array",
- "getrandom 0.2.17",
- "hex-literal",
- "hmac",
- "k256",
- "num-derive",
- "num-integer",
- "num-traits",
- "p256",
- "rand 0.8.6",
- "rand_chacha 0.3.1",
- "sec1",
- "sha2",
- "sha3",
- "soroban-builtin-sdk-macros",
- "soroban-env-common",
- "soroban-wasmi",
- "static_assertions",
- "stellar-strkey",
- "wasmparser 0.116.1",
-]
-
-[[package]]
-name = "soroban-env-macros"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00eff744764ade3bc480e4909e3a581a240091f3d262acdce80b41f7069b2bd9"
-dependencies = [
- "itertools",
- "proc-macro2",
- "quote",
- "serde",
- "serde_json",
- "stellar-xdr",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "soroban-ledger-snapshot"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c30035cf1e8f02f65de3e594b6da113ecdaf1cd134d8480961d62568bb15adaf"
-dependencies = [
- "serde",
- "serde_json",
- "serde_with",
- "soroban-env-common",
- "soroban-env-host",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "soroban-liquidity-pool-factory-contract"
-version = "0.1.0"
-dependencies = [
- "emergency_guard",
- "liquidity_pool",
- "soroban-sdk",
- "soroban-token-contract",
-]
-
-[[package]]
-name = "soroban-sdk"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff18e8d7ca6d5340a211605ca2c86383bd4dfacc4f8253d72a1573974ffffe69"
-dependencies = [
- "arbitrary",
- "bytes-lit",
- "ctor",
- "derive_arbitrary",
- "ed25519-dalek",
- "rand 0.8.6",
- "rustc_version",
- "serde",
- "serde_json",
- "soroban-env-guest",
- "soroban-env-host",
- "soroban-ledger-snapshot",
- "soroban-sdk-macros",
- "stellar-strkey",
-]
-
-[[package]]
-name = "soroban-sdk-macros"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42b205cd86b34d530db87667bd287fbb194166d79b368227fd842110a914fde8"
-dependencies = [
- "crate-git-revision",
- "darling 0.20.11",
- "itertools",
- "proc-macro2",
- "quote",
- "rustc_version",
- "sha2",
- "soroban-env-common",
- "soroban-spec",
- "soroban-spec-rust",
- "stellar-xdr",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "soroban-spec"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb6a16f2de28852c759f4da5f28cda54ec0d8dfa4c0e6e8cb3495234a72b0cea"
-dependencies = [
- "base64 0.13.1",
- "stellar-xdr",
- "thiserror 1.0.69",
- "wasmparser 0.116.1",
-]
-
-[[package]]
-name = "soroban-spec-rust"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdc6db5902ab21290dddf63fec4ee95703fe59891a947646e7b8607536f043fc"
-dependencies = [
- "prettyplease",
- "proc-macro2",
- "quote",
- "sha2",
- "soroban-spec",
- "stellar-xdr",
- "syn 2.0.117",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "soroban-staking-rewards"
-version = "0.1.0"
-dependencies = [
- "emergency_guard",
- "soroban-sdk",
- "soroscope-error-codes",
- "soroscope-math",
-]
-
-[[package]]
-name = "soroban-token-contract"
-version = "0.0.0"
-dependencies = [
- "emergency_guard",
- "soroban-sdk",
-]
-
-[[package]]
-name = "soroban-typed-data-auth-contract"
-version = "0.0.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "soroban-wasmi"
-version = "0.31.1-soroban.20.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "710403de32d0e0c35375518cb995d4fc056d0d48966f2e56ea471b8cb8fc9719"
-dependencies = [
- "smallvec",
- "spin",
- "wasmi_arena",
- "wasmi_core",
- "wasmparser-nostd",
-]
-
-[[package]]
-name = "soroscope-core"
-version = "0.1.0"
-dependencies = [
- "axum",
- "base64 0.22.1",
- "chrono",
- "clap",
- "config",
- "criterion",
- "dotenvy",
- "ed25519-dalek",
- "hex",
- "jsonwebtoken",
- "moka",
- "prometheus",
- "proptest",
- "rand 0.8.6",
- "rayon",
- "redis",
- "reqwest",
- "rsa",
- "rusqlite",
- "serde",
- "serde_json",
- "sha2",
- "sled",
- "soroban-env-host",
- "soroban-sdk",
- "sqlx",
- "stellar-strkey",
- "tempfile",
- "thiserror 1.0.69",
- "tokio",
- "tokio-util",
- "tower 0.4.13",
- "tower-http 0.5.2",
- "tracing",
- "tracing-subscriber",
- "utoipa",
- "utoipa-swagger-ui",
- "uuid",
- "wasm-encoder 0.240.0",
- "wasmparser 0.240.0",
-]
-
-[[package]]
-name = "soroscope-error-codes"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "soroscope-math"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
- "soroscope-error-codes",
-]
-
-[[package]]
-name = "spin"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
-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 = "sqlformat"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790"
-dependencies = [
- "nom",
- "unicode_categories",
-]
-
-[[package]]
-name = "sqlx"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33"
-dependencies = [
- "sqlx-core",
- "sqlx-macros",
- "sqlx-mysql",
- "sqlx-postgres",
- "sqlx-sqlite",
-]
-
-[[package]]
-name = "sqlx-core"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d"
-dependencies = [
- "ahash",
- "atoi",
- "byteorder",
- "bytes",
- "chrono",
- "crc",
- "crossbeam-queue",
- "dotenvy",
- "either",
- "event-listener 2.5.3",
- "futures-channel",
- "futures-core",
- "futures-intrusive",
- "futures-io",
- "futures-util",
- "hashlink",
- "hex",
- "indexmap 2.14.0",
- "log",
- "memchr",
- "native-tls",
- "once_cell",
- "paste",
- "percent-encoding",
- "serde",
- "serde_json",
- "sha2",
- "smallvec",
- "sqlformat",
- "thiserror 1.0.69",
- "tokio",
- "tokio-stream",
- "tracing",
- "url",
- "uuid",
-]
-
-[[package]]
-name = "sqlx-macros"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec"
-dependencies = [
- "proc-macro2",
- "quote",
- "sqlx-core",
- "sqlx-macros-core",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "sqlx-macros-core"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc"
-dependencies = [
- "dotenvy",
- "either",
- "heck 0.4.1",
- "hex",
- "once_cell",
- "proc-macro2",
- "quote",
- "serde",
- "serde_json",
- "sha2",
- "sqlx-core",
- "sqlx-mysql",
- "sqlx-postgres",
- "sqlx-sqlite",
- "syn 1.0.109",
- "tempfile",
- "tokio",
- "url",
-]
-
-[[package]]
-name = "sqlx-mysql"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db"
-dependencies = [
- "atoi",
- "base64 0.21.7",
- "bitflags 2.11.1",
- "byteorder",
- "bytes",
- "chrono",
- "crc",
- "digest",
- "dotenvy",
- "either",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-util",
- "generic-array",
- "hex",
- "hkdf",
- "hmac",
- "itoa",
- "log",
- "md-5",
- "memchr",
- "once_cell",
- "percent-encoding",
- "rand 0.8.6",
- "rsa",
- "serde",
- "sha1",
- "sha2",
- "smallvec",
- "sqlx-core",
- "stringprep",
- "thiserror 1.0.69",
- "tracing",
- "uuid",
- "whoami",
-]
-
-[[package]]
-name = "sqlx-postgres"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624"
-dependencies = [
- "atoi",
- "base64 0.21.7",
- "bitflags 2.11.1",
- "byteorder",
- "chrono",
- "crc",
- "dotenvy",
- "etcetera",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-util",
- "hex",
- "hkdf",
- "hmac",
- "home",
- "itoa",
- "log",
- "md-5",
- "memchr",
- "once_cell",
- "rand 0.8.6",
- "serde",
- "serde_json",
- "sha1",
- "sha2",
- "smallvec",
- "sqlx-core",
- "stringprep",
- "thiserror 1.0.69",
- "tracing",
- "uuid",
- "whoami",
-]
-
-[[package]]
-name = "sqlx-sqlite"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f"
-dependencies = [
- "atoi",
- "chrono",
- "flume",
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-intrusive",
- "futures-util",
- "libsqlite3-sys",
- "log",
- "percent-encoding",
- "serde",
- "sqlx-core",
- "tracing",
- "url",
- "uuid",
-]
-
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
-
-[[package]]
-name = "static_assertions"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
-
-[[package]]
-name = "stellar-strkey"
-version = "0.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e3aa3ed00e70082cb43febc1c2afa5056b9bb3e348bbb43d0cd0aa88a611144"
-dependencies = [
- "crate-git-revision",
- "data-encoding",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "stellar-xdr"
-version = "22.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ce69db907e64d1e70a3dce8d4824655d154749426a6132b25395c49136013e4"
-dependencies = [
- "arbitrary",
- "base64 0.13.1",
- "crate-git-revision",
- "escape-bytes",
- "hex",
- "serde",
- "serde_with",
- "stellar-strkey",
-]
-
-[[package]]
-name = "storage-heavy"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "stringprep"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
- "unicode-properties",
-]
-
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
-name = "subtle"
-version = "2.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
-
-[[package]]
-name = "syn"
-version = "1.0.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "sync_wrapper"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
-dependencies = [
- "futures-core",
-]
-
-[[package]]
-name = "synstructure"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "tagptr"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417"
-
-[[package]]
-name = "tempfile"
-version = "3.27.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
-dependencies = [
- "fastrand",
- "getrandom 0.4.2",
- "once_cell",
- "rustix",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "thiserror"
-version = "1.0.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
-dependencies = [
- "thiserror-impl 1.0.69",
-]
-
-[[package]]
-name = "thiserror"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
-dependencies = [
- "thiserror-impl 2.0.18",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "time"
-version = "0.3.47"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
-dependencies = [
- "deranged",
- "itoa",
- "num-conv",
- "powerfmt",
- "serde_core",
- "time-core",
- "time-macros",
-]
-
-[[package]]
-name = "time-core"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
-
-[[package]]
-name = "time-macros"
-version = "0.2.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
-dependencies = [
- "num-conv",
- "time-core",
-]
-
-[[package]]
-name = "tiny-keccak"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
-dependencies = [
- "crunchy",
-]
-
-[[package]]
-name = "tinystr"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
-dependencies = [
- "displaydoc",
- "zerovec",
-]
-
-[[package]]
-name = "tinytemplate"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
-dependencies = [
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "tinyvec"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
-[[package]]
-name = "tokio"
-version = "1.52.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"
-dependencies = [
- "bytes",
- "libc",
- "mio",
- "parking_lot 0.12.5",
- "pin-project-lite",
- "signal-hook-registry",
- "socket2 0.6.3",
- "tokio-macros",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "tokio-rustls"
-version = "0.26.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
-dependencies = [
- "rustls",
- "tokio",
-]
-
-[[package]]
-name = "tokio-stream"
-version = "0.1.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70"
-dependencies = [
- "futures-core",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tokio-tungstenite"
-version = "0.24.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9"
-dependencies = [
- "futures-util",
- "log",
- "tokio",
- "tungstenite",
-]
-
-[[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.8.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
-dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime 0.6.11",
- "toml_edit 0.22.27",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "0.6.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "1.1.1+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
-dependencies = [
- "serde_core",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.22.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
-dependencies = [
- "indexmap 2.14.0",
- "serde",
- "serde_spanned",
- "toml_datetime 0.6.11",
- "toml_write",
- "winnow 0.7.15",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.25.11+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b"
-dependencies = [
- "indexmap 2.14.0",
- "toml_datetime 1.1.1+spec-1.1.0",
- "toml_parser",
- "winnow 1.0.3",
-]
-
-[[package]]
-name = "toml_parser"
-version = "1.1.2+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
-dependencies = [
- "winnow 1.0.3",
-]
-
-[[package]]
-name = "toml_write"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
-
-[[package]]
-name = "tower"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
-dependencies = [
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[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",
- "tracing",
-]
-
-[[package]]
-name = "tower-http"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
-dependencies = [
- "bitflags 2.11.1",
- "bytes",
- "http",
- "http-body",
- "http-body-util",
- "pin-project-lite",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "tower-http"
-version = "0.6.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"
-dependencies = [
- "bitflags 2.11.1",
- "bytes",
- "futures-util",
- "http",
- "http-body",
- "pin-project-lite",
- "tower 0.5.3",
- "tower-layer",
- "tower-service",
- "url",
-]
-
-[[package]]
-name = "tower-layer"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
-
-[[package]]
-name = "tower-service"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
-
-[[package]]
-name = "tracing"
-version = "0.1.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
-dependencies = [
- "log",
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
-dependencies = [
- "once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
-dependencies = [
- "log",
- "once_cell",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
-dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex-automata",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
-]
-
-[[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.24.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a"
-dependencies = [
- "byteorder",
- "bytes",
- "data-encoding",
- "http",
- "httparse",
- "log",
- "rand 0.8.6",
- "sha1",
- "thiserror 1.0.69",
- "utf-8",
-]
-
-[[package]]
-name = "typenum"
-version = "1.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
-
-[[package]]
-name = "ucd-trie"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
-
-[[package]]
-name = "unarray"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94"
-
-[[package]]
-name = "unicase"
-version = "2.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8"
-dependencies = [
- "tinyvec",
-]
-
-[[package]]
-name = "unicode-properties"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d"
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
-
-[[package]]
-name = "unicode_categories"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
-
-[[package]]
-name = "untrusted"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
-dependencies = [
- "dyn-clone",
- "ref-cast",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "schemars"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc"
-dependencies = [
- "dyn-clone",
- "ref-cast",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "sec1"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc"
-dependencies = [
- "base16ct",
- "der",
- "generic-array",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "semver"
-version = "1.0.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
-
-[[package]]
-name = "serde"
-version = "1.0.228"
-name = "md-5"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
-dependencies = [
- "cfg-if",
- "digest",
-]
-
-[[package]]
-name = "memchr"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
-
-[[package]]
-name = "mime"
-version = "0.3.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
-
-[[package]]
-name = "mime_guess"
-version = "2.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
-dependencies = [
- "mime",
- "unicase",
-]
-
-[[package]]
-name = "minimal-lexical"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
-dependencies = [
- "adler2",
- "simd-adler32",
-]
-
-[[package]]
-name = "mio"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
-dependencies = [
- "libc",
- "wasi",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "moka"
-version = "0.12.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046"
-dependencies = [
- "async-lock",
- "crossbeam-channel",
- "crossbeam-epoch",
- "crossbeam-utils",
- "equivalent",
- "event-listener 5.4.1",
- "futures-util",
- "parking_lot 0.12.5",
- "portable-atomic",
- "smallvec",
- "tagptr",
- "uuid",
-]
-
-[[package]]
-name = "multer"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b"
-dependencies = [
- "bytes",
- "encoding_rs",
- "futures-util",
- "http",
- "httparse",
- "memchr",
- "mime",
- "spin",
- "version_check",
-]
-
-[[package]]
-name = "native-tls"
-version = "0.2.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2"
-dependencies = [
- "libc",
- "log",
- "openssl",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "security-framework",
- "security-framework-sys",
- "tempfile",
-]
-
-[[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 = "nu-ansi-term"
-version = "0.50.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
-dependencies = [
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-bigint-dig"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7"
-dependencies = [
- "lazy_static",
- "libm",
- "num-integer",
- "num-iter",
- "num-traits",
- "rand 0.8.6",
- "smallvec",
- "zeroize",
-]
-
-[[package]]
-name = "num-conv"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
-
-[[package]]
-name = "num-derive"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-iter"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
- "libm",
-]
-
-[[package]]
-name = "num_enum"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"
-dependencies = [
- "num_enum_derive",
- "rustversion",
-]
-
-[[package]]
-name = "num_enum_derive"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
-dependencies = [
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.21.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
-
-[[package]]
-name = "once_cell_polyfill"
-version = "1.70.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
-
-[[package]]
-name = "oorandom"
-version = "11.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
-
-[[package]]
-name = "openssl"
-version = "0.10.80"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967"
-dependencies = [
- "bitflags 2.11.1",
- "cfg-if",
- "foreign-types",
- "libc",
- "openssl-macros",
- "openssl-sys",
-]
-
-[[package]]
-name = "openssl-macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "openssl-probe"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.116"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "ordered-multimap"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79"
-dependencies = [
- "dlv-list",
- "hashbrown 0.14.5",
-]
-
-[[package]]
-name = "p256"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
-dependencies = [
- "ecdsa",
- "elliptic-curve",
- "primeorder",
- "sha2",
-]
-
-[[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.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
-dependencies = [
- "instant",
- "lock_api",
- "parking_lot_core 0.8.6",
-]
-
-[[package]]
-name = "parking_lot"
-version = "0.12.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
-dependencies = [
- "lock_api",
- "parking_lot_core 0.9.12",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
-dependencies = [
- "cfg-if",
- "instant",
- "libc",
- "redox_syscall 0.2.16",
- "smallvec",
- "winapi",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall 0.5.18",
- "smallvec",
- "windows-link",
-]
-
-[[package]]
-name = "paste"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-
-[[package]]
-name = "pathdiff"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
-
-[[package]]
-name = "pem"
-version = "3.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be"
-dependencies = [
- "base64 0.22.1",
- "serde_core",
-]
-
-[[package]]
-name = "pem-rfc7468"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
-dependencies = [
- "base64ct",
-]
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
-
-[[package]]
-name = "pest"
-version = "2.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662"
-dependencies = [
- "memchr",
- "ucd-trie",
-]
-
-[[package]]
-name = "pest_derive"
-version = "2.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77"
-dependencies = [
- "pest",
- "pest_generator",
-]
-
-[[package]]
-name = "pest_generator"
-version = "2.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f"
-dependencies = [
- "pest",
- "pest_meta",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "pest_meta"
-version = "2.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220"
-dependencies = [
- "pest",
- "sha2",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
-
-[[package]]
-name = "pkcs1"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
-dependencies = [
- "der",
- "pkcs8",
- "spki",
-]
-
-[[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 = "plain"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
-
-[[package]]
-name = "plotters"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"
-dependencies = [
- "num-traits",
- "plotters-backend",
- "plotters-svg",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "plotters-backend"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
-
-[[package]]
-name = "plotters-svg"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
-dependencies = [
- "plotters-backend",
-]
-
-[[package]]
-name = "portable-atomic"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
-
-[[package]]
-name = "potential_utf"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
-dependencies = [
- "zerovec",
-]
-
-[[package]]
-name = "powerfmt"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
-dependencies = [
- "zerocopy",
-]
-
-[[package]]
-name = "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 = "primeorder"
-version = "0.13.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6"
-dependencies = [
- "elliptic-curve",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "3.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
-dependencies = [
- "toml_edit 0.25.11+spec-1.1.0",
-]
-
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "prometheus"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ca5326d8d0b950a9acd87e6a3f94745394f62e4dae1b1ee22b2bc0c394af43a"
-dependencies = [
- "cfg-if",
- "fnv",
- "lazy_static",
- "memchr",
- "parking_lot 0.12.5",
- "protobuf",
- "thiserror 2.0.18",
-]
-
-[[package]]
-name = "proptest"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744"
-dependencies = [
- "bit-set",
- "bit-vec",
- "bitflags 2.11.1",
- "num-traits",
- "rand 0.9.4",
- "rand_chacha 0.9.0",
- "rand_xorshift",
- "regex-syntax",
- "rusty-fork",
- "tempfile",
- "unarray",
-]
-
-[[package]]
-name = "protobuf"
-version = "3.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d65a1d4ddae7d8b5de68153b48f6aa3bba8cb002b243dbdbc55a5afbc98f99f4"
-dependencies = [
- "once_cell",
- "protobuf-support",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "protobuf-support"
-version = "3.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e36c2f31e0a47f9280fb347ef5e461ffcd2c52dd520d8e216b52f93b0b0d7d6"
-dependencies = [
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "proxy"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "quick-error"
-version = "1.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
-
-[[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",
- "socket2 0.6.3",
- "thiserror 2.0.18",
- "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",
- "getrandom 0.3.4",
- "lru-slab",
- "rand 0.9.4",
- "ring",
- "rustc-hash",
- "rustls",
- "rustls-pki-types",
- "slab",
- "thiserror 2.0.18",
- "tinyvec",
- "tracing",
- "web-time",
-]
-
-[[package]]
-name = "quinn-udp"
-version = "0.5.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
-dependencies = [
- "cfg_aliases",
- "libc",
- "once_cell",
- "socket2 0.6.3",
- "tracing",
- "windows-sys 0.60.2",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
-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.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
-dependencies = [
- "libc",
- "rand_chacha 0.3.1",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
-dependencies = [
- "rand_chacha 0.9.0",
- "rand_core 0.9.5",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.9.5",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom 0.2.17",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
-dependencies = [
- "getrandom 0.3.4",
-]
-
-[[package]]
-name = "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 = "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 = "redis"
-version = "0.25.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e46922bd01fefcfdcf58d9cd626da082bb2cde27211920dacfde6b2ecf9a35b"
-dependencies = [
- "async-trait",
- "bytes",
- "combine",
- "futures-util",
- "itoa",
- "percent-encoding",
- "pin-project-lite",
- "ryu",
- "sha1_smol",
- "socket2 0.5.10",
- "tokio",
- "tokio-util",
- "url",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.5.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
-dependencies = [
- "bitflags 2.11.1",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b"
-dependencies = [
- "bitflags 2.11.1",
-]
-
-[[package]]
-name = "ref-cast"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
-dependencies = [
- "ref-cast-impl",
-]
-
-[[package]]
-name = "ref-cast-impl"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "regex"
-version = "1.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
-
-[[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",
- "http-body",
- "http-body-util",
- "hyper",
- "hyper-rustls",
- "hyper-util",
- "js-sys",
- "log",
- "percent-encoding",
- "pin-project-lite",
- "quinn",
- "rustls",
- "rustls-pki-types",
- "serde",
- "serde_json",
- "serde_urlencoded",
- "sync_wrapper",
- "tokio",
- "tokio-rustls",
- "tower 0.5.3",
- "tower-http 0.6.11",
- "tower-service",
- "url",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "webpki-roots",
-]
-
-[[package]]
-name = "rfc6979"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2"
-dependencies = [
- "hmac",
- "subtle",
-]
-
-[[package]]
-name = "ring"
-version = "0.17.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
-dependencies = [
- "cc",
- "cfg-if",
- "getrandom 0.2.17",
- "libc",
- "untrusted",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "ron"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
-dependencies = [
- "base64 0.21.7",
- "bitflags 2.11.1",
- "serde",
- "serde_derive",
-]
-
-[[package]]
-name = "rsa"
-version = "0.9.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d"
-dependencies = [
- "const-oid",
- "digest",
- "num-bigint-dig",
- "num-integer",
- "num-traits",
- "pkcs1",
- "pkcs8",
- "rand_core 0.6.4",
- "signature",
- "spki",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "rusqlite"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2"
-dependencies = [
- "bitflags 2.11.1",
- "fallible-iterator",
- "fallible-streaming-iterator",
- "hashlink",
- "libsqlite3-sys",
- "smallvec",
-]
-
-[[package]]
-name = "rust-embed"
-version = "8.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27"
-dependencies = [
- "rust-embed-impl",
- "rust-embed-utils",
- "walkdir",
-]
-
-[[package]]
-name = "rust-embed-impl"
-version = "8.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa"
-dependencies = [
- "proc-macro2",
- "quote",
- "rust-embed-utils",
- "syn 2.0.117",
- "walkdir",
-]
-
-[[package]]
-name = "rust-embed-utils"
-version = "8.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1"
-dependencies = [
- "sha2",
- "walkdir",
-]
-
-[[package]]
-name = "rust-ini"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e0698206bcb8882bf2a9ecb4c1e7785db57ff052297085a6efd4fe42302068a"
-dependencies = [
- "cfg-if",
- "ordered-multimap",
-]
-
-[[package]]
-name = "rustc-hash"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
-
-[[package]]
-name = "rustc_version"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
-dependencies = [
- "semver",
-]
-
-[[package]]
-name = "rustix"
-version = "1.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
-dependencies = [
- "bitflags 2.11.1",
- "errno",
- "libc",
- "linux-raw-sys",
- "windows-sys 0.61.2",
-]
-
-[[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",
- "subtle",
- "zeroize",
-]
-
-[[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-webpki"
-version = "0.103.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
-dependencies = [
- "ring",
- "rustls-pki-types",
- "untrusted",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
-
-[[package]]
-name = "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.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "schannel"
-version = "0.1.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "schemars"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
-dependencies = [
- "dyn-clone",
- "ref-cast",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "schemars"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc"
-dependencies = [
- "dyn-clone",
- "ref-cast",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "scopeguard"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-
-[[package]]
-name = "sec1"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc"
-dependencies = [
- "base16ct",
- "der",
- "generic-array",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "security-framework"
-version = "3.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
-dependencies = [
- "bitflags 2.11.1",
- "core-foundation",
- "core-foundation-sys",
- "libc",
- "security-framework-sys",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "2.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "semver"
-version = "1.0.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
-
-[[package]]
-name = "serde"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
-dependencies = [
- "serde_core",
- "serde_derive",
-]
-
-[[package]]
-name = "serde_core"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.150"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
-dependencies = [
- "itoa",
- "memchr",
- "serde",
- "serde_core",
- "zmij",
-]
-
-[[package]]
-name = "serde_path_to_error"
-version = "0.1.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457"
-dependencies = [
- "itoa",
- "serde",
- "serde_core",
-]
-
-[[package]]
-name = "serde_spanned"
-version = "0.6.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
-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.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2"
-dependencies = [
- "base64 0.22.1",
- "bs58",
- "chrono",
- "hex",
- "indexmap 1.9.3",
- "indexmap 2.14.0",
- "schemars 0.9.0",
- "schemars 1.2.1",
- "serde_core",
- "serde_json",
- "serde_with_macros",
- "time",
-]
-
-[[package]]
-name = "serde_with_macros"
-version = "3.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac"
-dependencies = [
- "darling 0.23.0",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "sha1"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "sha1_smol"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d"
-
-[[package]]
-name = "sha2"
-version = "0.10.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "sha3"
-version = "0.10.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874"
-dependencies = [
- "digest",
- "keccak",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "shlex"
-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 = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
-dependencies = [
- "digest",
- "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 = "simple_asn1"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d"
-dependencies = [
- "num-bigint",
- "num-traits",
- "thiserror 2.0.18",
- "time",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
-
-[[package]]
-name = "sled"
-version = "0.34.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935"
-dependencies = [
- "crc32fast",
- "crossbeam-epoch",
- "crossbeam-utils",
- "fs2",
- "fxhash",
- "libc",
- "log",
- "parking_lot 0.11.2",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
-
-[[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 = "soroban-builtin-sdk-macros"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf2e42bf80fcdefb3aae6ff3c7101a62cf942e95320ed5b518a1705bc11c6b2f"
-dependencies = [
- "itertools",
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "soroban-env-common"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "027cd856171bfd6ad2c0ffb3b7dfe55ad7080fb3050c36ad20970f80da634472"
-dependencies = [
- "arbitrary",
- "crate-git-revision",
- "ethnum",
- "num-derive",
- "num-traits",
- "serde",
- "soroban-env-macros",
- "soroban-wasmi",
- "static_assertions",
- "stellar-xdr",
- "wasmparser 0.116.1",
-]
-
-[[package]]
-name = "soroban-env-guest"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a07dda1ae5220d975979b19ad4fd56bc86ec7ec1b4b25bc1c5d403f934e592e"
-dependencies = [
- "soroban-env-common",
- "static_assertions",
-]
-
-[[package]]
-name = "soroban-env-host"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66e8b03a4191d485eab03f066336112b2a50541a7553179553dc838b986b94dd"
-dependencies = [
- "ark-bls12-381",
- "ark-ec",
- "ark-ff",
- "ark-serialize",
- "curve25519-dalek",
- "ecdsa",
- "ed25519-dalek",
- "elliptic-curve",
- "generic-array",
- "getrandom 0.2.17",
- "hex-literal",
- "hmac",
- "k256",
- "num-derive",
- "num-integer",
- "num-traits",
- "p256",
- "rand 0.8.6",
- "rand_chacha 0.3.1",
- "sec1",
- "sha2",
- "sha3",
- "soroban-builtin-sdk-macros",
- "soroban-env-common",
- "soroban-wasmi",
- "static_assertions",
- "stellar-strkey",
- "wasmparser 0.116.1",
-]
-
-[[package]]
-name = "soroban-env-macros"
-version = "22.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00eff744764ade3bc480e4909e3a581a240091f3d262acdce80b41f7069b2bd9"
-dependencies = [
- "itertools",
- "proc-macro2",
- "quote",
- "serde",
- "serde_json",
- "stellar-xdr",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "soroban-ledger-snapshot"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c30035cf1e8f02f65de3e594b6da113ecdaf1cd134d8480961d62568bb15adaf"
-dependencies = [
- "serde",
- "serde_json",
- "serde_with",
- "soroban-env-common",
- "soroban-env-host",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "soroban-liquidity-pool-factory-contract"
-version = "0.1.0"
-dependencies = [
- "emergency_guard",
- "liquidity_pool",
- "soroban-sdk",
- "soroban-token-contract",
-]
-
-[[package]]
-name = "soroban-sdk"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff18e8d7ca6d5340a211605ca2c86383bd4dfacc4f8253d72a1573974ffffe69"
-dependencies = [
- "arbitrary",
- "bytes-lit",
- "ctor",
- "derive_arbitrary",
- "ed25519-dalek",
- "rand 0.8.6",
- "rustc_version",
- "serde",
- "serde_json",
- "soroban-env-guest",
- "soroban-env-host",
- "soroban-ledger-snapshot",
- "soroban-sdk-macros",
- "stellar-strkey",
-]
-
-[[package]]
-name = "soroban-sdk-macros"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42b205cd86b34d530db87667bd287fbb194166d79b368227fd842110a914fde8"
-dependencies = [
- "crate-git-revision",
- "darling 0.20.11",
- "itertools",
- "proc-macro2",
- "quote",
- "rustc_version",
- "sha2",
- "soroban-env-common",
- "soroban-spec",
- "soroban-spec-rust",
- "stellar-xdr",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "soroban-spec"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb6a16f2de28852c759f4da5f28cda54ec0d8dfa4c0e6e8cb3495234a72b0cea"
-dependencies = [
- "base64 0.13.1",
- "stellar-xdr",
- "thiserror 1.0.69",
- "wasmparser 0.116.1",
-]
-
-[[package]]
-name = "soroban-spec-rust"
-version = "22.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdc6db5902ab21290dddf63fec4ee95703fe59891a947646e7b8607536f043fc"
-dependencies = [
- "prettyplease",
- "proc-macro2",
- "quote",
- "sha2",
- "soroban-spec",
- "stellar-xdr",
- "syn 2.0.117",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "soroban-staking-rewards"
-version = "0.1.0"
-dependencies = [
- "emergency_guard",
- "soroban-sdk",
- "soroscope-error-codes",
- "soroscope-math",
-]
-
-[[package]]
-name = "soroban-token-contract"
-version = "0.0.0"
-dependencies = [
- "emergency_guard",
- "soroban-sdk",
-]
-
-[[package]]
-name = "soroban-typed-data-auth-contract"
-version = "0.0.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "soroban-wasmi"
-version = "0.31.1-soroban.20.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "710403de32d0e0c35375518cb995d4fc056d0d48966f2e56ea471b8cb8fc9719"
-dependencies = [
- "smallvec",
- "spin",
- "wasmi_arena",
- "wasmi_core",
- "wasmparser-nostd",
-]
-
-[[package]]
-name = "soroscope-core"
-version = "0.1.0"
-dependencies = [
- "axum",
- "base64 0.22.1",
- "chrono",
- "clap",
- "config",
- "criterion",
- "dotenvy",
- "ed25519-dalek",
- "hex",
- "jsonwebtoken",
- "moka",
- "prometheus",
- "proptest",
- "rand 0.8.6",
- "rayon",
- "redis",
- "reqwest",
- "rsa",
- "rusqlite",
- "serde",
- "serde_json",
- "sha2",
- "sled",
- "soroban-env-host",
- "soroban-sdk",
- "sqlx",
- "stellar-strkey",
- "tempfile",
- "thiserror 1.0.69",
- "tokio",
- "tokio-util",
- "tower 0.4.13",
- "tower-http 0.5.2",
- "tracing",
- "tracing-subscriber",
- "utoipa",
- "utoipa-swagger-ui",
- "uuid",
- "wasm-encoder 0.240.0",
- "wasmparser 0.240.0",
-]
-
-[[package]]
-name = "soroscope-error-codes"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "soroscope-math"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
- "soroscope-error-codes",
-]
-
-[[package]]
-name = "spin"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
-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 = "sqlformat"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790"
-dependencies = [
- "nom",
- "unicode_categories",
-]
-
-[[package]]
-name = "sqlx"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33"
-dependencies = [
- "sqlx-core",
- "sqlx-macros",
- "sqlx-mysql",
- "sqlx-postgres",
- "sqlx-sqlite",
-]
-
-[[package]]
-name = "sqlx-core"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d"
-dependencies = [
- "ahash",
- "atoi",
- "byteorder",
- "bytes",
- "chrono",
- "crc",
- "crossbeam-queue",
- "dotenvy",
- "either",
- "event-listener 2.5.3",
- "futures-channel",
- "futures-core",
- "futures-intrusive",
- "futures-io",
- "futures-util",
- "hashlink",
- "hex",
- "indexmap 2.14.0",
- "log",
- "memchr",
- "native-tls",
- "once_cell",
- "paste",
- "percent-encoding",
- "serde",
- "serde_json",
- "sha2",
- "smallvec",
- "sqlformat",
- "thiserror 1.0.69",
- "tokio",
- "tokio-stream",
- "tracing",
- "url",
- "uuid",
-]
-
-[[package]]
-name = "sqlx-macros"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec"
-dependencies = [
- "proc-macro2",
- "quote",
- "sqlx-core",
- "sqlx-macros-core",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "sqlx-macros-core"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc"
-dependencies = [
- "dotenvy",
- "either",
- "heck 0.4.1",
- "hex",
- "once_cell",
- "proc-macro2",
- "quote",
- "serde",
- "serde_json",
- "sha2",
- "sqlx-core",
- "sqlx-mysql",
- "sqlx-postgres",
- "sqlx-sqlite",
- "syn 1.0.109",
- "tempfile",
- "tokio",
- "url",
-]
-
-[[package]]
-name = "sqlx-mysql"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db"
-dependencies = [
- "atoi",
- "base64 0.21.7",
- "bitflags 2.11.1",
- "byteorder",
- "bytes",
- "chrono",
- "crc",
- "digest",
- "dotenvy",
- "either",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-util",
- "generic-array",
- "hex",
- "hkdf",
- "hmac",
- "itoa",
- "log",
- "md-5",
- "memchr",
- "once_cell",
- "percent-encoding",
- "rand 0.8.6",
- "rsa",
- "serde",
- "sha1",
- "sha2",
- "smallvec",
- "sqlx-core",
- "stringprep",
- "thiserror 1.0.69",
- "tracing",
- "uuid",
- "whoami",
-]
-
-[[package]]
-name = "sqlx-postgres"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624"
-dependencies = [
- "atoi",
- "base64 0.21.7",
- "bitflags 2.11.1",
- "byteorder",
- "chrono",
- "crc",
- "dotenvy",
- "etcetera",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-util",
- "hex",
- "hkdf",
- "hmac",
- "home",
- "itoa",
- "log",
- "md-5",
- "memchr",
- "once_cell",
- "rand 0.8.6",
- "serde",
- "serde_json",
- "sha1",
- "sha2",
- "smallvec",
- "sqlx-core",
- "stringprep",
- "thiserror 1.0.69",
- "tracing",
- "uuid",
- "whoami",
-]
-
-[[package]]
-name = "sqlx-sqlite"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f"
-dependencies = [
- "atoi",
- "chrono",
- "flume",
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-intrusive",
- "futures-util",
- "libsqlite3-sys",
- "log",
- "percent-encoding",
- "serde",
- "sqlx-core",
- "tracing",
- "url",
- "uuid",
-]
-
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
-
-[[package]]
-name = "static_assertions"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
-
-[[package]]
-name = "stellar-strkey"
-version = "0.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e3aa3ed00e70082cb43febc1c2afa5056b9bb3e348bbb43d0cd0aa88a611144"
-dependencies = [
- "crate-git-revision",
- "data-encoding",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "stellar-xdr"
-version = "22.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ce69db907e64d1e70a3dce8d4824655d154749426a6132b25395c49136013e4"
-dependencies = [
- "arbitrary",
- "base64 0.13.1",
- "crate-git-revision",
- "escape-bytes",
- "hex",
- "serde",
- "serde_with",
- "stellar-strkey",
-]
-
-[[package]]
-name = "storage-heavy"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
-[[package]]
-name = "stringprep"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
- "unicode-properties",
-]
-
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
-name = "subtle"
-version = "2.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
-
-[[package]]
-name = "syn"
-version = "1.0.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "sync_wrapper"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
-dependencies = [
- "futures-core",
-]
-
-[[package]]
-name = "synstructure"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "tagptr"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417"
-
-[[package]]
-name = "tempfile"
-version = "3.27.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
-dependencies = [
- "fastrand",
- "getrandom 0.4.2",
- "once_cell",
- "rustix",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "thiserror"
-version = "1.0.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
-dependencies = [
- "thiserror-impl 1.0.69",
-]
-
-[[package]]
-name = "thiserror"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
-dependencies = [
- "thiserror-impl 2.0.18",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "time"
-version = "0.3.47"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
-dependencies = [
- "deranged",
- "itoa",
- "num-conv",
- "powerfmt",
- "serde_core",
- "time-core",
- "time-macros",
-]
-
-[[package]]
-name = "time-core"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
-
-[[package]]
-name = "time-macros"
-version = "0.2.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
-dependencies = [
- "num-conv",
- "time-core",
-]
-
-[[package]]
-name = "tiny-keccak"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
-dependencies = [
- "crunchy",
-]
-
-[[package]]
-name = "tinystr"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
-dependencies = [
- "displaydoc",
- "zerovec",
-]
-
-[[package]]
-name = "tinytemplate"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
-dependencies = [
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "tinyvec"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
-[[package]]
-name = "tokio"
-version = "1.52.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"
-dependencies = [
- "bytes",
- "libc",
- "mio",
- "parking_lot 0.12.5",
- "pin-project-lite",
- "signal-hook-registry",
- "socket2 0.6.3",
- "tokio-macros",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "tokio-rustls"
-version = "0.26.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
-dependencies = [
- "rustls",
- "tokio",
-]
-
-[[package]]
-name = "tokio-stream"
-version = "0.1.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70"
-dependencies = [
- "futures-core",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tokio-tungstenite"
-version = "0.24.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9"
-dependencies = [
- "futures-util",
- "log",
- "tokio",
- "tungstenite",
-]
-
-[[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.8.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
-dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime 0.6.11",
- "toml_edit 0.22.27",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "0.6.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "1.1.1+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
-dependencies = [
- "serde_core",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.22.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
-dependencies = [
- "indexmap 2.14.0",
- "serde",
- "serde_spanned",
- "toml_datetime 0.6.11",
- "toml_write",
- "winnow 0.7.15",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.25.11+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b"
-dependencies = [
- "indexmap 2.14.0",
- "toml_datetime 1.1.1+spec-1.1.0",
- "toml_parser",
- "winnow 1.0.3",
-]
-
-[[package]]
-name = "toml_parser"
-version = "1.1.2+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
-dependencies = [
- "winnow 1.0.3",
-]
-
-[[package]]
-name = "toml_write"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
-
-[[package]]
-name = "tower"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
-dependencies = [
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[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",
- "tracing",
-]
-
-[[package]]
-name = "tower-http"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
-dependencies = [
- "bitflags 2.11.1",
- "bytes",
- "http",
- "http-body",
- "http-body-util",
- "pin-project-lite",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "tower-http"
-version = "0.6.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"
-dependencies = [
- "bitflags 2.11.1",
- "bytes",
- "futures-util",
- "http",
- "http-body",
- "pin-project-lite",
- "tower 0.5.3",
- "tower-layer",
- "tower-service",
- "url",
-]
-
-[[package]]
-name = "tower-layer"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
-
-[[package]]
-name = "tower-service"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
-
-[[package]]
-name = "tracing"
-version = "0.1.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
-dependencies = [
- "log",
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
-dependencies = [
- "once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
-dependencies = [
- "log",
- "once_cell",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
-dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex-automata",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
-]
-
-[[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.24.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a"
-dependencies = [
- "byteorder",
- "bytes",
- "data-encoding",
- "http",
- "httparse",
- "log",
- "rand 0.8.6",
- "sha1",
- "thiserror 1.0.69",
- "utf-8",
-]
-
-[[package]]
-name = "typenum"
-version = "1.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
-
-[[package]]
-name = "ucd-trie"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
-
-[[package]]
-name = "unarray"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94"
-
-[[package]]
-name = "unicase"
-version = "2.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8"
-dependencies = [
- "tinyvec",
-]
-
-[[package]]
-name = "unicode-properties"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d"
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
-
-[[package]]
-name = "unicode_categories"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
-
-[[package]]
-name = "untrusted"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
-
-[[package]]
-name = "url"
-version = "2.5.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
-dependencies = [
- "form_urlencoded",
- "idna",
- "percent-encoding",
- "serde",
-]
-
-[[package]]
-name = "utf-8"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
-
-[[package]]
-name = "utf8_iter"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
-
-[[package]]
-name = "utf8parse"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
-
-[[package]]
-name = "utoipa"
-version = "4.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23"
-dependencies = [
- "indexmap 2.14.0",
- "serde",
- "serde_json",
- "utoipa-gen",
-]
-
-[[package]]
-name = "utoipa-gen"
-version = "4.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20c24e8ab68ff9ee746aad22d39b5535601e6416d1b0feeabf78be986a5c4392"
-dependencies = [
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "regex",
- "syn 2.0.117",
-]
-
-[[package]]
-name = "utoipa-swagger-ui"
-version = "7.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "943e0ff606c6d57d410fd5663a4d7c074ab2c5f14ab903b9514565e59fa1189e"
-dependencies = [
- "axum",
- "mime_guess",
- "regex",
- "reqwest",
- "rust-embed",
- "serde",
- "serde_json",
- "url",
- "utoipa",
- "utoipa-swagger-ui-vendored",
- "zip",
-]
-
-[[package]]
-name = "utoipa-swagger-ui-vendored"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2eebbbfe4093922c2b6734d7c679ebfebd704a0d7e56dfcb0d05818ce28977d"
-
-[[package]]
-name = "uuid"
-version = "1.23.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
dependencies = [
"serde_core",
"serde_derive",
@@ -6906,29 +1091,29 @@ dependencies = [
[[package]]
name = "serde_core"
-version = "1.0.228"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.228"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 3.0.3",
]
[[package]]
name = "serde_json"
-version = "1.0.150"
+version = "1.0.151"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
+checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
dependencies = [
"itoa",
"memchr",
@@ -6939,9 +1124,9 @@ dependencies = [
[[package]]
name = "serde_with"
-version = "3.20.0"
+version = "3.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2"
+checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c"
dependencies = [
"base64 0.22.1",
"bs58",
@@ -6950,7 +1135,7 @@ dependencies = [
"indexmap 1.9.3",
"indexmap 2.14.0",
"schemars 0.9.0",
- "schemars 1.2.1",
+ "schemars 1.2.2",
"serde_core",
"serde_json",
"serde_with_macros",
@@ -6959,14 +1144,14 @@ dependencies = [
[[package]]
name = "serde_with_macros"
-version = "3.20.0"
+version = "3.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac"
+checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660"
dependencies = [
"darling 0.23.0",
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -6992,9 +1177,9 @@ dependencies = [
[[package]]
name = "shlex"
-version = "1.3.0"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
[[package]]
name = "signature"
@@ -7014,9 +1199,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
[[package]]
name = "smallvec"
-version = "1.15.1"
+version = "1.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
[[package]]
name = "soroban-builtin-sdk-macros"
@@ -7027,7 +1212,7 @@ dependencies = [
"itertools",
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -7107,7 +1292,7 @@ dependencies = [
"serde",
"serde_json",
"stellar-xdr",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -7163,7 +1348,7 @@ dependencies = [
"soroban-spec",
"soroban-spec-rust",
"stellar-xdr",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -7190,7 +1375,7 @@ dependencies = [
"sha2",
"soroban-spec",
"stellar-xdr",
- "syn 2.0.117",
+ "syn 2.0.119",
"thiserror",
]
@@ -7234,9 +1419,9 @@ dependencies = [
[[package]]
name = "spin"
-version = "0.9.8"
+version = "0.9.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e"
[[package]]
name = "spki"
@@ -7306,9 +1491,20 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.117"
+version = "2.0.119"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
+checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3"
dependencies = [
"proc-macro2",
"quote",
@@ -7332,17 +1528,16 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
name = "time"
-version = "0.3.47"
+version = "0.3.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
+checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244"
dependencies = [
"deranged",
- "itoa",
"num-conv",
"powerfmt",
"serde_core",
@@ -7352,15 +1547,15 @@ dependencies = [
[[package]]
name = "time-core"
-version = "0.1.8"
+version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
+checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
[[package]]
name = "time-macros"
-version = "0.2.27"
+version = "0.2.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
+checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85"
dependencies = [
"num-conv",
"time-core",
@@ -7368,9 +1563,9 @@ dependencies = [
[[package]]
name = "tinyvec"
-version = "1.11.0"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
+checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f"
dependencies = [
"tinyvec_macros",
]
@@ -7383,9 +1578,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "typenum"
-version = "1.20.0"
+version = "1.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
+checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
[[package]]
name = "unicode-ident"
@@ -7407,9 +1602,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "wasm-bindgen"
-version = "0.2.122"
+version = "0.2.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
+checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
dependencies = [
"cfg-if",
"once_cell",
@@ -7420,9 +1615,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.122"
+version = "0.2.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
+checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -7430,22 +1625,22 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.122"
+version = "0.2.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
+checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.122"
+version = "0.2.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
+checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
dependencies = [
"unicode-ident",
]
@@ -7508,7 +1703,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -7519,7 +1714,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
@@ -7548,46 +1743,46 @@ dependencies = [
[[package]]
name = "zerocopy"
-version = "0.8.48"
+version = "0.8.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
+checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.8.48"
+version = "0.8.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
+checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
name = "zeroize"
-version = "1.8.2"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
+checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
dependencies = [
"zeroize_derive",
]
[[package]]
name = "zeroize_derive"
-version = "1.4.3"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e"
+checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.117",
+ "syn 2.0.119",
]
[[package]]
name = "zmij"
-version = "1.0.21"
+version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
+checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
diff --git a/contracts/emergency_guard/examples/simple_token.rs b/contracts/emergency_guard/examples/simple_token.rs
index 73d8377a..3032b466 100644
--- a/contracts/emergency_guard/examples/simple_token.rs
+++ b/contracts/emergency_guard/examples/simple_token.rs
@@ -129,8 +129,6 @@ impl SimpleToken {
.set(&DataKey::TotalSupply, &(supply - amount));
}
- pub fn get_pause_state(env: Env) -> u32 {
- EmergencyGuard::get_pause_state(env)
// ==== EMERGENCY GUARD FUNCTIONS ====
/// Pause only transfers (minting and burning still work)
@@ -145,7 +143,6 @@ impl SimpleToken {
/// Resume transfers
pub fn resume_transfers(env: Env) {
- DefaultEmergencyGuard::unpause(&env, PauseType::TRANSFER).expect("Unauthorized");
let admin: Address = env
.storage()
.instance()
@@ -231,8 +228,6 @@ impl SimpleToken {
EmergencyGuard::get_threshold(env)
}
- }
-
/// Add new admin (requires existing admin authorization)
pub fn add_admin(env: Env, new_admin: Address) {
let admin: Address = env
diff --git a/contracts/emergency_guard/src/lib.rs b/contracts/emergency_guard/src/lib.rs
index 15164e78..dae0e36c 100644
--- a/contracts/emergency_guard/src/lib.rs
+++ b/contracts/emergency_guard/src/lib.rs
@@ -2,7 +2,7 @@
#[cfg(feature = "contract")]
use soroban_sdk::{contract, contractimpl};
-use soroban_sdk::{contracterror, contracttype, Address, Env, String, Vec};
+use soroban_sdk::{contracterror, contracttype, log, Address, Env, String, Vec};
/// Granular pause types using bitmask for efficient storage
#[contracttype]
@@ -19,6 +19,8 @@ impl PauseType {
pub const CREATE_PAIR: u32 = 1 << 6;
/// Pause staking operations
pub const STAKE: u32 = 1 << 7;
+ /// Pause reward claims independently of the global paused flag
+ pub const CLAIM_REWARDS: u32 = 1 << 8;
pub fn new(value: u32) -> Self {
PauseType(value)
@@ -230,7 +232,6 @@ pub fn emit_admin_removed(e: &Env, approvers: &Vec
, admin: &Address) {
);
}
-#[contract]
#[cfg_attr(feature = "contract", contract)]
pub struct EmergencyGuard;
@@ -309,7 +310,7 @@ impl EmergencyGuard {
state.set_paused(operation, paused);
env.storage()
.instance()
- .set(&GuardDataKey::PauseState, &pause_state);
+ .set(&GuardDataKey::PauseState, &state);
emit_guard_event(
&env,
@@ -329,7 +330,6 @@ impl EmergencyGuard {
operation,
paused
);
- .set(&GuardDataKey::PauseState, &state);
emit_pause_state_changed(&env, &admin, operation, paused);
Ok(())
}
@@ -341,7 +341,7 @@ impl EmergencyGuard {
state.pause_all();
env.storage()
.instance()
- .set(&GuardDataKey::PauseState, &pause_state);
+ .set(&GuardDataKey::PauseState, &state);
emit_guard_event(
&env,
@@ -355,7 +355,6 @@ impl EmergencyGuard {
approver_count: approvers.len(),
},
);
- .set(&GuardDataKey::PauseState, &state);
emit_emergency_paused_all(&env, &approvers);
Ok(())
}
@@ -365,7 +364,7 @@ impl EmergencyGuard {
Self::check_multi_sig(&env, &approvers)?;
env.storage()
.instance()
- .set(&GuardDataKey::PauseState, &pause_state);
+ .set(&GuardDataKey::PauseState, &PauseType::new(0));
emit_guard_event(
&env,
@@ -379,7 +378,6 @@ impl EmergencyGuard {
approver_count: approvers.len(),
},
);
- .set(&GuardDataKey::PauseState, &PauseType::new(0));
emit_resumed_all(&env, &approvers);
Ok(())
}
@@ -439,7 +437,9 @@ impl EmergencyGuard {
return Err(GuardError::AdminNotFound);
}
- env.storage().instance().set(&GuardDataKey::Admins, &new_admins);
+ env.storage()
+ .instance()
+ .set(&GuardDataKey::Admins, &new_admins);
emit_guard_event(
&env,
EmergencyGuardEvent {
@@ -467,6 +467,7 @@ impl EmergencyGuard {
new_admin: Address,
) -> Result<(), GuardError> {
Self::check_multi_sig(&env, &approvers)?;
+ let threshold = Self::get_threshold(env.clone());
let admins = Self::get_admins(env.clone());
let mut new_admins = Vec::new(&env);
let mut found = false;
@@ -484,13 +485,13 @@ impl EmergencyGuard {
return Err(GuardError::AdminNotFound);
}
- new_admins.push_back(new_admin.clone());
-
- if (new_admins.len() as u32) < threshold {
+ if new_admins.len() < threshold {
return Err(GuardError::InvalidThreshold);
}
- env.storage().instance().set(&GuardDataKey::Admins, &new_admins);
+ env.storage()
+ .instance()
+ .set(&GuardDataKey::Admins, &new_admins);
emit_guard_event(
&env,
EmergencyGuardEvent {
@@ -581,11 +582,6 @@ impl EmergencyGuard {
Ok(())
}
}
-
- /// Public method to check if an address is an admin
- pub fn is_admin_public(env: Env, addr: Address) -> bool {
- Self::is_admin_internal(&env, &addr)
- }
}
/// Default implementation of EmergencyGuardTrait using static methods
@@ -690,7 +686,7 @@ impl EmergencyGuardTrait for DefaultEmergencyGuard {
}
// Verify threshold is valid
- if threshold == 0 || threshold > admins.len() as u32 {
+ if threshold == 0 || threshold > admins.len() {
return Err(GuardError::InvalidThreshold);
}
@@ -731,7 +727,7 @@ impl EmergencyGuardTrait for DefaultEmergencyGuard {
let admins = Self::get_admins(env);
let threshold = Self::get_threshold(env);
- if admins.len() as u32 <= threshold {
+ if admins.len() <= threshold {
return Err(GuardError::InvalidThreshold);
}
@@ -749,7 +745,9 @@ impl EmergencyGuardTrait for DefaultEmergencyGuard {
return Err(GuardError::AdminNotFound);
}
- env.storage().instance().set(&GuardDataKey::Admins, &new_admins);
+ env.storage()
+ .instance()
+ .set(&GuardDataKey::Admins, &new_admins);
log!(env, "Admin removed: {}", admin);
Ok(())
}
@@ -771,21 +769,26 @@ impl EmergencyGuardTrait for DefaultEmergencyGuard {
}
/// Check if address is an admin
- fn is_admin(env: &Env, addr: &Address) -> bool {
+ fn is_admin(env: &Env, addr: Address) -> bool {
let admins: Vec = env
.storage()
.instance()
.get(&GuardDataKey::Admins)
.unwrap_or_else(|| Vec::new(env));
- admins.iter().any(|a| a == *addr)
+ admins.iter().any(|a| a == addr)
}
/// Rotate admin (multi-sig required)
- fn rotate_admin(env: &Env, approvers: Vec, old_admin: Address, new_admin: Address) -> Result<(), GuardError> {
+ fn rotate_admin(
+ env: &Env,
+ approvers: Vec,
+ old_admin: Address,
+ new_admin: Address,
+ ) -> Result<(), GuardError> {
EmergencyGuard::check_multi_sig(env, &approvers)?;
- let mut admins = Self::get_admins(env);
+ let admins = Self::get_admins(env);
let threshold = Self::get_threshold(env);
let mut found = false;
@@ -804,11 +807,13 @@ impl EmergencyGuardTrait for DefaultEmergencyGuard {
new_admins.push_back(new_admin.clone());
- if (new_admins.len() as u32) < threshold {
+ if new_admins.len() < threshold {
return Err(GuardError::InvalidThreshold);
}
- env.storage().instance().set(&GuardDataKey::Admins, &new_admins);
+ env.storage()
+ .instance()
+ .set(&GuardDataKey::Admins, &new_admins);
log!(env, "Admin rotated: {} to {}", old_admin, new_admin);
Ok(())
}
@@ -906,82 +911,3 @@ pub trait EmergencyGuardTrait {
fn get_threshold(env: &Env) -> u32;
fn is_admin(env: &Env, addr: Address) -> bool;
}
-
-pub struct DefaultEmergencyGuard;
-
-impl DefaultEmergencyGuard {
- pub fn check_not_paused(env: &Env, operation: u32) -> Result<(), GuardError> {
- if EmergencyGuard::is_paused(env.clone(), operation) {
- Err(GuardError::Paused)
- } else {
- Ok(())
- }
- }
- pub fn get_pause_state(env: &Env) -> u32 {
- EmergencyGuard::get_pause_state(env.clone())
- }
- pub fn set_pause_state(env: &Env, operation: u32, paused: bool) -> Result<(), GuardError> {
- let admins = EmergencyGuard::get_admins(env.clone());
- if let Some(admin) = admins.get(0) {
- EmergencyGuard::set_pause(env.clone(), admin, operation, paused)
- } else {
- Err(GuardError::Unauthorized)
- }
- }
- pub fn unpause(env: &Env, operation: u32) -> Result<(), GuardError> {
- let admins = EmergencyGuard::get_admins(env.clone());
- if let Some(admin) = admins.get(0) {
- EmergencyGuard::set_pause(env.clone(), admin, operation, false)
- } else {
- Err(GuardError::Unauthorized)
- }
- }
- pub fn unpause_all(env: &Env) -> Result<(), GuardError> {
- let admins = EmergencyGuard::get_admins(env.clone());
- if let Some(admin) = admins.get(0) {
- EmergencyGuard::set_pause(env.clone(), admin, u32::MAX, false)
- } else {
- Err(GuardError::Unauthorized)
- }
- }
- pub fn emergency_pause_all(env: &Env, approvers: Vec) -> Result<(), GuardError> {
- EmergencyGuard::emergency_pause(env.clone(), approvers)
- }
- pub fn resume_all(env: &Env, approvers: Vec) -> Result<(), GuardError> {
- EmergencyGuard::resume(env.clone(), approvers)
- }
- pub fn init_guard(env: &Env, admins: Vec, threshold: u32) -> Result<(), GuardError> {
- EmergencyGuard::initialize(env.clone(), admins, threshold)
- }
- pub fn add_admin(
- env: &Env,
- approvers: Vec,
- new_admin: Address,
- ) -> Result<(), GuardError> {
- EmergencyGuard::add_admin(env.clone(), approvers, new_admin)
- }
- pub fn remove_admin(
- env: &Env,
- approvers: Vec,
- admin: Address,
- ) -> Result<(), GuardError> {
- EmergencyGuard::remove_admin(env.clone(), approvers, admin)
- }
- pub fn rotate_admin(
- env: &Env,
- approvers: Vec,
- old_admin: Address,
- new_admin: Address,
- ) -> Result<(), GuardError> {
- EmergencyGuard::rotate_admin(env.clone(), approvers, old_admin, new_admin)
- }
- pub fn get_admins(env: &Env) -> Vec {
- EmergencyGuard::get_admins(env.clone())
- }
- pub fn get_threshold(env: &Env) -> u32 {
- EmergencyGuard::get_threshold(env.clone())
- }
- pub fn is_admin(env: &Env, addr: Address) -> bool {
- EmergencyGuard::is_admin_public(env.clone(), addr)
- }
-}
diff --git a/contracts/emergency_guard/src/test.rs b/contracts/emergency_guard/src/test.rs
index 5868cbce..0d520d39 100644
--- a/contracts/emergency_guard/src/test.rs
+++ b/contracts/emergency_guard/src/test.rs
@@ -210,7 +210,9 @@ fn test_add_admin_fails_with_non_admin_approvers() {
let outsider = Address::generate(&env);
let approvers = vec![&env, outsider];
let result = client.try_add_admin(&approvers, &new_admin);
- assert_eq!(result, Err(Ok(GuardError::InsufficientSignatures)));
+ // Approver count meets the threshold, so this fails on the approver not
+ // being an admin rather than on the signature count.
+ assert_eq!(result, Err(Ok(GuardError::Unauthorized)));
}
#[test]
@@ -290,7 +292,8 @@ fn test_unauthorized_admin_removal() {
let outsider = Address::generate(&env);
let approvers = vec![&env, outsider];
let result = client.try_remove_admin(&approvers, &admins[1]);
- assert_eq!(result, Err(Ok(GuardError::InsufficientSignatures)));
+ // The outsider satisfies the count but is not an admin.
+ assert_eq!(result, Err(Ok(GuardError::Unauthorized)));
}
// ─── Full rotation cycle ─────────────────────────────────────────────────────
@@ -358,7 +361,9 @@ fn test_removed_admin_cannot_approve_operations() {
let new_admin = Address::generate(&env);
let bad_approvers = vec![&env, admins[2].clone()];
let result = client.try_add_admin(&bad_approvers, &new_admin);
- assert_eq!(result, Err(Ok(GuardError::InsufficientSignatures)));
+ // Once removed, the former admin is rejected as unauthorized rather than
+ // counting toward the signature threshold.
+ assert_eq!(result, Err(Ok(GuardError::Unauthorized)));
}
#[test]
diff --git a/contracts/staking_rewards/src/lib.rs b/contracts/staking_rewards/src/lib.rs
index f6a85e99..32dbfd32 100644
--- a/contracts/staking_rewards/src/lib.rs
+++ b/contracts/staking_rewards/src/lib.rs
@@ -1,10 +1,9 @@
#![no_std]
-use soroban_sdk::{contract, contractimpl, contracttype, token, Address, Env, String, Vec, vec};
+use soroban_sdk::{contract, contractimpl, contracttype, token, Address, Env, String, Vec};
-use emergency_guard::{EmergencyGuard, PauseType};
+use emergency_guard::{DefaultEmergencyGuard, EmergencyGuard, EmergencyGuardTrait, PauseType};
pub use soroscope_error_codes::ContractError;
use soroscope_math::Fixed;
-use emergency_guard::{DefaultEmergencyGuard, PauseType, EmergencyGuardTrait};
pub const SCALE: i128 = 1_000_000_000_000_000_000; // 18 decimals
@@ -250,10 +249,6 @@ impl StakingRewards {
e.storage().instance().set(&DataKey::TotalStaked, &0i128);
e.storage().instance().extend_ttl(10000, 10000);
- // Initialize emergency guard with single admin and threshold of 1
- let admins = vec![&e, owner.clone()];
- DefaultEmergencyGuard::init_guard(&e, admins, 1)
- .map_err(|_| ContractError::AlreadyInitialized)?;
// Initialize the embedded EmergencyGuard so granular pause checks
// (e.g. PauseType::CLAIM_REWARDS) can be toggled by the owner.
// Threshold of 1 means the single owner can trigger any pause.
@@ -496,9 +491,6 @@ impl StakingRewards {
/// Pause staking operations (admin only).
pub fn pause_staking(e: Env) -> Result<(), ContractError> {
let config = Self::get_config(e.clone())?;
- /// Sets the global paused state (owner only).
- pub fn set_paused(e: Env, paused: bool) -> Result<(), ContractError> {
- let mut config = Self::get_config(e.clone())?;
config.owner.require_auth();
DefaultEmergencyGuard::set_pause_state(&e, PauseType::STAKE, true)
@@ -543,8 +535,7 @@ impl StakingRewards {
/// Resume all paused operations (requires multi-sig approval).
pub fn resume_all(e: Env, approvers: Vec) -> Result<(), ContractError> {
- DefaultEmergencyGuard::resume_all(&e, approvers)
- .map_err(|_| ContractError::Paused)?;
+ DefaultEmergencyGuard::resume_all(&e, approvers).map_err(|_| ContractError::Paused)?;
e.events().publish(
(String::from_str(&e, "resume_all"),),
@@ -577,20 +568,35 @@ impl StakingRewards {
}
/// Add new admin (multi-sig required).
- pub fn add_admin(e: Env, approvers: Vec, new_admin: Address) -> Result<(), ContractError> {
+ pub fn add_admin(
+ e: Env,
+ approvers: Vec,
+ new_admin: Address,
+ ) -> Result<(), ContractError> {
DefaultEmergencyGuard::add_admin(&e, approvers, new_admin)
.map_err(|_| ContractError::Paused)
}
/// Remove admin (multi-sig required).
- pub fn remove_admin(e: Env, approvers: Vec, admin: Address) -> Result<(), ContractError> {
- DefaultEmergencyGuard::remove_admin(&e, approvers, admin)
- .map_err(|_| ContractError::Paused)
+ pub fn remove_admin(
+ e: Env,
+ approvers: Vec,
+ admin: Address,
+ ) -> Result<(), ContractError> {
+ DefaultEmergencyGuard::remove_admin(&e, approvers, admin).map_err(|_| ContractError::Paused)
}
/// Rotate admin (multi-sig required).
- pub fn rotate_admin(e: Env, approvers: Vec, old_admin: Address, new_admin: Address) -> Result<(), ContractError> {
+ pub fn rotate_admin(
+ e: Env,
+ approvers: Vec,
+ old_admin: Address,
+ new_admin: Address,
+ ) -> Result<(), ContractError> {
DefaultEmergencyGuard::rotate_admin(&e, approvers, old_admin, new_admin)
+ .map_err(|_| ContractError::Paused)
+ }
+
/// Granularly pause or unpause the claim_rewards operation (owner only).
/// This is independent of the global `is_paused` flag and uses the
/// embedded EmergencyGuard bitmask (PauseType::CLAIM_REWARDS).
diff --git a/contracts/staking_rewards/src/test.rs b/contracts/staking_rewards/src/test.rs
index 4d182734..e0999471 100644
--- a/contracts/staking_rewards/src/test.rs
+++ b/contracts/staking_rewards/src/test.rs
@@ -292,11 +292,6 @@ fn test_pause_safeguards_claim() {
#[test]
fn test_successful_withdrawal() {
-/// Verifies that the CLAIM_REWARDS granular pause blocks claims independently
-/// of the global `is_paused` flag, satisfying issue #463 acceptance criteria.
-#[test]
-#[should_panic(expected = "Contract, #14")]
-fn test_granular_claim_rewards_pause() {
let (e, client, _, staking_token, _) = setup();
let user = Address::generate(&e);
@@ -318,6 +313,28 @@ fn test_granular_claim_rewards_pause() {
assert_eq!(token_balance, STAKE_AMOUNT);
}
+/// Verifies that the CLAIM_REWARDS granular pause blocks claims independently
+/// of the global `is_paused` flag, satisfying issue #463 acceptance criteria.
+#[test]
+#[should_panic(expected = "Contract, #14")]
+fn test_granular_claim_rewards_pause() {
+ let (e, client, _, staking_token, _) = setup();
+ let user = Address::generate(&e);
+
+ let staking_client = token::StellarAssetClient::new(&e, &staking_token);
+ staking_client.mint(&user, &STAKE_AMOUNT);
+
+ client.stake(&user, &STAKE_AMOUNT);
+ advance_ledger(&e, 5);
+
+ // Activate CLAIM_REWARDS granular pause via the contract's delegation function.
+ // Global is_paused remains false — only the granular bitmask bit is set.
+ client.set_claim_rewards_paused(&true);
+
+ // Claim MUST fail with ContractError::Paused (error code 14).
+ client.claim(&user);
+}
+
#[test]
fn test_partial_withdrawal() {
let (e, client, _, staking_token, _) = setup();
@@ -485,13 +502,4 @@ fn test_granular_pause_staking() {
// Stake should work again after resume
client.stake(&user, &STAKE_AMOUNT);
assert_eq!(client.get_staked_balance(&user), STAKE_AMOUNT * 2);
- client.stake(&user, &STAKE_AMOUNT);
- advance_ledger(&e, 5);
-
- // Activate CLAIM_REWARDS granular pause via the contract's delegation function.
- // Global is_paused remains false — only the granular bitmask bit is set.
- client.set_claim_rewards_paused(&true);
-
- // Claim MUST fail with ContractError::Paused (error code 14).
- client.claim(&user);
}
From 5171868c2b8a0eaab4820e95df87298831c24d93 Mon Sep 17 00:00:00 2001
From: Gift Amadi <120387225+giftexceed@users.noreply.github.com>
Date: Tue, 28 Jul 2026 12:40:17 +0000
Subject: [PATCH 2/3] feature(pool-slippage): add min_amount_out slippage
protection to swaps
Issue #650. The pool only offered an exact-output swap, `swap(to, buy_a, out,
in_max)`, where the caller fixes the output and caps the input. A trader who
wants to sell a fixed amount had no entry point and had to guess `out`, so the
one quantity they could not bound was the one an attacker moves: front-running
the transaction leaves the same input returning far less.
Adds `swap_exact_in(to, buy_a, amount_in, min_amount_out)`. It quotes the output
from live reserves and the current fee, then refuses the trade with
`SlippageExceeded` unless `amount_out >= min_amount_out`, before any tokens
move. Returns the output actually delivered. `min_amount_out = 0` opts out.
`swap` keeps its signature. Its output is fixed by the caller and delivered
exactly or not at all, so a minimum-output parameter there would be satisfied by
construction; `in_max` is already that direction's bound. Documented rather than
duplicated.
Also adds the read-only quotes callers need to pick a floor: `get_amount_out`,
`get_amount_in` and `get_reserves`. Both swap directions now share
`amount_out_for_in` / `amount_in_for_out` and a `settle_swap` helper, so the
transfer-and-reserve-update path exists once. Division truncates toward the pool
in both directions, and a test asserts the constant product never weakens.
New error `InvalidAmount = 15` for a non-positive `amount_in` or a negative
`min_amount_out`; a negative floor would silently disable the check. Existing
codes are untouched.
11 tests cover the quoted-output path, both directions, a rejected floor leaving
state untouched, a full front-run sandwich, the zero-minimum opt-out, invalid
amounts, an input too small to fill, pause interaction, the fee's effect on a
quote, and the quote round trip.
Prerequisite repairs, without which none of the above could build or run:
liquidity_pool was not a workspace member and did not compile, so CI's
`cargo build -p liquidity_pool` had nothing to build. Its lib.rs had been
inflated from ~1150 to 2905 lines by merges resolved by accepting both sides:
the Error enum carried three overlapping copies with conflicting codes, PoolState
and DataKey were each declared four times, and `withdraw` had six duplicated
transfer calls. The last clean revision is 3e50a23, which holds the full public
API and is the second parent of the merge that broke it, so lib.rs is restored
from there and re-added to the workspace. That revision needed two fixes of its
own: a duplicated `get_pause_mask`, and `remove_guard_admin` resolving to the
trait's `remove_admin` instead of the inherent one.
test.rs had the same damage in two blocks. `test_emergency_guard_trait_impl`
called `init_guard` on an already-initialized guard and then made twelve
assertions through direct `` calls, which
touch instance storage outside any contract frame; both forms are restored to
the client-based assertions that work. `test_granular_pause_operations` called a
two-argument `guard_unpause` that no version of the contract has.
Four behaviour gaps the newer tests already asserted, all previously masked by
the crate not compiling:
- `set_paused` looped over four pause bits, calling `require_auth` on the same
admin each time, which the host rejects as `Auth(ExistingValue)`. It now
applies one combined mask, extended to cover STAKE and CLAIM_REWARDS so it
pauses what its name claims.
- `stake`, `unstake` and `claim_rewards` had no pause check at all.
- Rewards never accrued. `update_reward_state` defaulted a missing
`LastRewardLedger` to the current ledger and returned early without storing
it, so `current <= last` held forever. The checkpoint is now seeded on the
first staking action, and the accumulator is projected by a read-only helper
so `get_pending_rewards` reports accrual without writing.
- Removing or rotating the primary admin left `DataKey::Admin` pointing at an
address that was no longer a guard admin. Both paths now hand the role to a
surviving admin, and membership and threshold refusals report `Unauthorized`.
Test snapshots are regenerated; they were stale from the mangled revision and
still referenced its GuardAdmins/GuardThreshold storage keys.
cargo fmt --all --check, cargo check --locked --all-targets, cargo clippy
--locked --all-targets --all-features -D warnings, cargo build -p liquidity_pool
--target wasm32-unknown-unknown --release and cargo test --locked all pass.
113 tests, 0 failures, 59 of them in liquidity_pool.
---
Cargo.lock | 263 +-
Cargo.toml | 1 +
contracts/liquidity_pool/README.md | 71 +
contracts/liquidity_pool/src/lib.rs | 2263 +++--------------
contracts/liquidity_pool/src/test.rs | 341 ++-
.../fuzz_test/test_swap_invariant.1.json | 154 +-
.../fuzz_test/test_swap_invariant.10.json | 58 +-
.../fuzz_test/test_swap_invariant.100.json | 154 +-
.../fuzz_test/test_swap_invariant.101.json | 154 +-
.../fuzz_test/test_swap_invariant.102.json | 154 +-
.../fuzz_test/test_swap_invariant.103.json | 154 +-
.../fuzz_test/test_swap_invariant.104.json | 58 +-
.../fuzz_test/test_swap_invariant.105.json | 66 +-
.../fuzz_test/test_swap_invariant.106.json | 158 +-
.../fuzz_test/test_swap_invariant.107.json | 70 +-
.../fuzz_test/test_swap_invariant.108.json | 58 +-
.../fuzz_test/test_swap_invariant.109.json | 58 +-
.../fuzz_test/test_swap_invariant.11.json | 58 +-
.../fuzz_test/test_swap_invariant.110.json | 154 +-
.../fuzz_test/test_swap_invariant.111.json | 66 +-
.../fuzz_test/test_swap_invariant.112.json | 119 +-
.../fuzz_test/test_swap_invariant.113.json | 154 +-
.../fuzz_test/test_swap_invariant.114.json | 58 +-
.../fuzz_test/test_swap_invariant.115.json | 58 +-
.../fuzz_test/test_swap_invariant.116.json | 66 +-
.../fuzz_test/test_swap_invariant.117.json | 154 +-
.../fuzz_test/test_swap_invariant.118.json | 58 +-
.../fuzz_test/test_swap_invariant.119.json | 58 +-
.../fuzz_test/test_swap_invariant.12.json | 158 +-
.../fuzz_test/test_swap_invariant.120.json | 154 +-
.../fuzz_test/test_swap_invariant.121.json | 158 +-
.../fuzz_test/test_swap_invariant.122.json | 119 +-
.../fuzz_test/test_swap_invariant.123.json | 58 +-
.../fuzz_test/test_swap_invariant.124.json | 70 +-
.../fuzz_test/test_swap_invariant.125.json | 58 +-
.../fuzz_test/test_swap_invariant.126.json | 58 +-
.../fuzz_test/test_swap_invariant.127.json | 58 +-
.../fuzz_test/test_swap_invariant.128.json | 58 +-
.../fuzz_test/test_swap_invariant.129.json | 154 +-
.../fuzz_test/test_swap_invariant.13.json | 154 +-
.../fuzz_test/test_swap_invariant.130.json | 101 +-
.../fuzz_test/test_swap_invariant.131.json | 154 +-
.../fuzz_test/test_swap_invariant.132.json | 154 +-
.../fuzz_test/test_swap_invariant.133.json | 154 +-
.../fuzz_test/test_swap_invariant.134.json | 58 +-
.../fuzz_test/test_swap_invariant.135.json | 58 +-
.../fuzz_test/test_swap_invariant.136.json | 154 +-
.../fuzz_test/test_swap_invariant.137.json | 58 +-
.../fuzz_test/test_swap_invariant.138.json | 58 +-
.../fuzz_test/test_swap_invariant.139.json | 58 +-
.../fuzz_test/test_swap_invariant.14.json | 154 +-
.../fuzz_test/test_swap_invariant.140.json | 58 +-
.../fuzz_test/test_swap_invariant.141.json | 101 +-
.../fuzz_test/test_swap_invariant.142.json | 154 +-
.../fuzz_test/test_swap_invariant.143.json | 58 +-
.../fuzz_test/test_swap_invariant.144.json | 154 +-
.../fuzz_test/test_swap_invariant.145.json | 58 +-
.../fuzz_test/test_swap_invariant.146.json | 154 +-
.../fuzz_test/test_swap_invariant.147.json | 66 +-
.../fuzz_test/test_swap_invariant.148.json | 58 +-
.../fuzz_test/test_swap_invariant.149.json | 154 +-
.../fuzz_test/test_swap_invariant.15.json | 58 +-
.../fuzz_test/test_swap_invariant.150.json | 154 +-
.../fuzz_test/test_swap_invariant.151.json | 74 +-
.../fuzz_test/test_swap_invariant.152.json | 154 +-
.../fuzz_test/test_swap_invariant.153.json | 119 +-
.../fuzz_test/test_swap_invariant.154.json | 154 +-
.../fuzz_test/test_swap_invariant.155.json | 58 +-
.../fuzz_test/test_swap_invariant.156.json | 58 +-
.../fuzz_test/test_swap_invariant.157.json | 160 +-
.../fuzz_test/test_swap_invariant.158.json | 119 +-
.../fuzz_test/test_swap_invariant.159.json | 58 +-
.../fuzz_test/test_swap_invariant.16.json | 160 +-
.../fuzz_test/test_swap_invariant.160.json | 154 +-
.../fuzz_test/test_swap_invariant.161.json | 58 +-
.../fuzz_test/test_swap_invariant.162.json | 154 +-
.../fuzz_test/test_swap_invariant.163.json | 154 +-
.../fuzz_test/test_swap_invariant.164.json | 58 +-
.../fuzz_test/test_swap_invariant.165.json | 58 +-
.../fuzz_test/test_swap_invariant.166.json | 58 +-
.../fuzz_test/test_swap_invariant.167.json | 58 +-
.../fuzz_test/test_swap_invariant.168.json | 154 +-
.../fuzz_test/test_swap_invariant.169.json | 119 +-
.../fuzz_test/test_swap_invariant.17.json | 119 +-
.../fuzz_test/test_swap_invariant.170.json | 154 +-
.../fuzz_test/test_swap_invariant.171.json | 58 +-
.../fuzz_test/test_swap_invariant.172.json | 160 +-
.../fuzz_test/test_swap_invariant.173.json | 154 +-
.../fuzz_test/test_swap_invariant.174.json | 58 +-
.../fuzz_test/test_swap_invariant.175.json | 154 +-
.../fuzz_test/test_swap_invariant.176.json | 58 +-
.../fuzz_test/test_swap_invariant.177.json | 58 +-
.../fuzz_test/test_swap_invariant.178.json | 58 +-
.../fuzz_test/test_swap_invariant.179.json | 66 +-
.../fuzz_test/test_swap_invariant.18.json | 58 +-
.../fuzz_test/test_swap_invariant.180.json | 58 +-
.../fuzz_test/test_swap_invariant.181.json | 58 +-
.../fuzz_test/test_swap_invariant.182.json | 58 +-
.../fuzz_test/test_swap_invariant.183.json | 119 +-
.../fuzz_test/test_swap_invariant.184.json | 66 +-
.../fuzz_test/test_swap_invariant.185.json | 154 +-
.../fuzz_test/test_swap_invariant.186.json | 154 +-
.../fuzz_test/test_swap_invariant.187.json | 58 +-
.../fuzz_test/test_swap_invariant.188.json | 58 +-
.../fuzz_test/test_swap_invariant.189.json | 58 +-
.../fuzz_test/test_swap_invariant.19.json | 58 +-
.../fuzz_test/test_swap_invariant.190.json | 66 +-
.../fuzz_test/test_swap_invariant.191.json | 70 +-
.../fuzz_test/test_swap_invariant.192.json | 154 +-
.../fuzz_test/test_swap_invariant.193.json | 58 +-
.../fuzz_test/test_swap_invariant.194.json | 154 +-
.../fuzz_test/test_swap_invariant.195.json | 154 +-
.../fuzz_test/test_swap_invariant.196.json | 154 +-
.../fuzz_test/test_swap_invariant.197.json | 119 +-
.../fuzz_test/test_swap_invariant.198.json | 154 +-
.../fuzz_test/test_swap_invariant.199.json | 154 +-
.../fuzz_test/test_swap_invariant.2.json | 58 +-
.../fuzz_test/test_swap_invariant.20.json | 154 +-
.../fuzz_test/test_swap_invariant.200.json | 160 +-
.../fuzz_test/test_swap_invariant.201.json | 160 +-
.../fuzz_test/test_swap_invariant.202.json | 154 +-
.../fuzz_test/test_swap_invariant.203.json | 154 +-
.../fuzz_test/test_swap_invariant.204.json | 154 +-
.../fuzz_test/test_swap_invariant.205.json | 154 +-
.../fuzz_test/test_swap_invariant.206.json | 119 +-
.../fuzz_test/test_swap_invariant.207.json | 58 +-
.../fuzz_test/test_swap_invariant.208.json | 154 +-
.../fuzz_test/test_swap_invariant.209.json | 154 +-
.../fuzz_test/test_swap_invariant.21.json | 58 +-
.../fuzz_test/test_swap_invariant.210.json | 58 +-
.../fuzz_test/test_swap_invariant.211.json | 58 +-
.../fuzz_test/test_swap_invariant.212.json | 58 +-
.../fuzz_test/test_swap_invariant.213.json | 154 +-
.../fuzz_test/test_swap_invariant.214.json | 70 +-
.../fuzz_test/test_swap_invariant.215.json | 58 +-
.../fuzz_test/test_swap_invariant.216.json | 154 +-
.../fuzz_test/test_swap_invariant.217.json | 58 +-
.../fuzz_test/test_swap_invariant.218.json | 70 +-
.../fuzz_test/test_swap_invariant.219.json | 58 +-
.../fuzz_test/test_swap_invariant.22.json | 119 +-
.../fuzz_test/test_swap_invariant.220.json | 58 +-
.../fuzz_test/test_swap_invariant.221.json | 58 +-
.../fuzz_test/test_swap_invariant.222.json | 101 +-
.../fuzz_test/test_swap_invariant.223.json | 154 +-
.../fuzz_test/test_swap_invariant.224.json | 154 +-
.../fuzz_test/test_swap_invariant.225.json | 154 +-
.../fuzz_test/test_swap_invariant.226.json | 154 +-
.../fuzz_test/test_swap_invariant.227.json | 154 +-
.../fuzz_test/test_swap_invariant.228.json | 58 +-
.../fuzz_test/test_swap_invariant.229.json | 154 +-
.../fuzz_test/test_swap_invariant.23.json | 154 +-
.../fuzz_test/test_swap_invariant.230.json | 58 +-
.../fuzz_test/test_swap_invariant.231.json | 154 +-
.../fuzz_test/test_swap_invariant.232.json | 154 +-
.../fuzz_test/test_swap_invariant.233.json | 66 +-
.../fuzz_test/test_swap_invariant.234.json | 70 +-
.../fuzz_test/test_swap_invariant.235.json | 154 +-
.../fuzz_test/test_swap_invariant.236.json | 58 +-
.../fuzz_test/test_swap_invariant.237.json | 58 +-
.../fuzz_test/test_swap_invariant.238.json | 58 +-
.../fuzz_test/test_swap_invariant.239.json | 58 +-
.../fuzz_test/test_swap_invariant.24.json | 154 +-
.../fuzz_test/test_swap_invariant.240.json | 58 +-
.../fuzz_test/test_swap_invariant.241.json | 154 +-
.../fuzz_test/test_swap_invariant.242.json | 58 +-
.../fuzz_test/test_swap_invariant.243.json | 58 +-
.../fuzz_test/test_swap_invariant.244.json | 101 +-
.../fuzz_test/test_swap_invariant.245.json | 58 +-
.../fuzz_test/test_swap_invariant.246.json | 58 +-
.../fuzz_test/test_swap_invariant.247.json | 154 +-
.../fuzz_test/test_swap_invariant.248.json | 58 +-
.../fuzz_test/test_swap_invariant.249.json | 119 +-
.../fuzz_test/test_swap_invariant.25.json | 154 +-
.../fuzz_test/test_swap_invariant.250.json | 70 +-
.../fuzz_test/test_swap_invariant.251.json | 154 +-
.../fuzz_test/test_swap_invariant.252.json | 70 +-
.../fuzz_test/test_swap_invariant.253.json | 154 +-
.../fuzz_test/test_swap_invariant.254.json | 58 +-
.../fuzz_test/test_swap_invariant.255.json | 154 +-
.../fuzz_test/test_swap_invariant.256.json | 154 +-
.../fuzz_test/test_swap_invariant.26.json | 66 +-
.../fuzz_test/test_swap_invariant.27.json | 154 +-
.../fuzz_test/test_swap_invariant.28.json | 154 +-
.../fuzz_test/test_swap_invariant.29.json | 58 +-
.../fuzz_test/test_swap_invariant.3.json | 154 +-
.../fuzz_test/test_swap_invariant.30.json | 58 +-
.../fuzz_test/test_swap_invariant.31.json | 154 +-
.../fuzz_test/test_swap_invariant.32.json | 58 +-
.../fuzz_test/test_swap_invariant.33.json | 58 +-
.../fuzz_test/test_swap_invariant.34.json | 154 +-
.../fuzz_test/test_swap_invariant.35.json | 154 +-
.../fuzz_test/test_swap_invariant.36.json | 58 +-
.../fuzz_test/test_swap_invariant.37.json | 119 +-
.../fuzz_test/test_swap_invariant.38.json | 66 +-
.../fuzz_test/test_swap_invariant.39.json | 58 +-
.../fuzz_test/test_swap_invariant.4.json | 119 +-
.../fuzz_test/test_swap_invariant.40.json | 58 +-
.../fuzz_test/test_swap_invariant.41.json | 154 +-
.../fuzz_test/test_swap_invariant.42.json | 154 +-
.../fuzz_test/test_swap_invariant.43.json | 58 +-
.../fuzz_test/test_swap_invariant.44.json | 58 +-
.../fuzz_test/test_swap_invariant.45.json | 58 +-
.../fuzz_test/test_swap_invariant.46.json | 58 +-
.../fuzz_test/test_swap_invariant.47.json | 58 +-
.../fuzz_test/test_swap_invariant.48.json | 154 +-
.../fuzz_test/test_swap_invariant.49.json | 154 +-
.../fuzz_test/test_swap_invariant.5.json | 70 +-
.../fuzz_test/test_swap_invariant.50.json | 58 +-
.../fuzz_test/test_swap_invariant.51.json | 58 +-
.../fuzz_test/test_swap_invariant.52.json | 154 +-
.../fuzz_test/test_swap_invariant.53.json | 154 +-
.../fuzz_test/test_swap_invariant.54.json | 58 +-
.../fuzz_test/test_swap_invariant.55.json | 158 +-
.../fuzz_test/test_swap_invariant.56.json | 119 +-
.../fuzz_test/test_swap_invariant.57.json | 70 +-
.../fuzz_test/test_swap_invariant.58.json | 154 +-
.../fuzz_test/test_swap_invariant.59.json | 58 +-
.../fuzz_test/test_swap_invariant.6.json | 154 +-
.../fuzz_test/test_swap_invariant.60.json | 154 +-
.../fuzz_test/test_swap_invariant.61.json | 58 +-
.../fuzz_test/test_swap_invariant.62.json | 58 +-
.../fuzz_test/test_swap_invariant.63.json | 58 +-
.../fuzz_test/test_swap_invariant.64.json | 58 +-
.../fuzz_test/test_swap_invariant.65.json | 154 +-
.../fuzz_test/test_swap_invariant.66.json | 154 +-
.../fuzz_test/test_swap_invariant.67.json | 58 +-
.../fuzz_test/test_swap_invariant.68.json | 58 +-
.../fuzz_test/test_swap_invariant.69.json | 105 +-
.../fuzz_test/test_swap_invariant.7.json | 58 +-
.../fuzz_test/test_swap_invariant.70.json | 154 +-
.../fuzz_test/test_swap_invariant.71.json | 154 +-
.../fuzz_test/test_swap_invariant.72.json | 58 +-
.../fuzz_test/test_swap_invariant.73.json | 58 +-
.../fuzz_test/test_swap_invariant.74.json | 119 +-
.../fuzz_test/test_swap_invariant.75.json | 58 +-
.../fuzz_test/test_swap_invariant.76.json | 58 +-
.../fuzz_test/test_swap_invariant.77.json | 154 +-
.../fuzz_test/test_swap_invariant.78.json | 154 +-
.../fuzz_test/test_swap_invariant.79.json | 58 +-
.../fuzz_test/test_swap_invariant.8.json | 119 +-
.../fuzz_test/test_swap_invariant.80.json | 58 +-
.../fuzz_test/test_swap_invariant.81.json | 154 +-
.../fuzz_test/test_swap_invariant.82.json | 58 +-
.../fuzz_test/test_swap_invariant.83.json | 58 +-
.../fuzz_test/test_swap_invariant.84.json | 154 +-
.../fuzz_test/test_swap_invariant.85.json | 58 +-
.../fuzz_test/test_swap_invariant.86.json | 119 +-
.../fuzz_test/test_swap_invariant.87.json | 58 +-
.../fuzz_test/test_swap_invariant.88.json | 58 +-
.../fuzz_test/test_swap_invariant.89.json | 58 +-
.../fuzz_test/test_swap_invariant.9.json | 58 +-
.../fuzz_test/test_swap_invariant.90.json | 154 +-
.../fuzz_test/test_swap_invariant.91.json | 154 +-
.../fuzz_test/test_swap_invariant.92.json | 154 +-
.../fuzz_test/test_swap_invariant.93.json | 58 +-
.../fuzz_test/test_swap_invariant.94.json | 154 +-
.../fuzz_test/test_swap_invariant.95.json | 58 +-
.../fuzz_test/test_swap_invariant.96.json | 154 +-
.../fuzz_test/test_swap_invariant.97.json | 154 +-
.../fuzz_test/test_swap_invariant.98.json | 58 +-
.../fuzz_test/test_swap_invariant.99.json | 58 +-
.../test_snapshots/test/test_approve.1.json | 22 +-
.../test/test_approve_expired.1.json | 22 +-
.../test/test_basic_flow.1.json | 22 +-
.../test_snapshots/test/test_burn.1.json | 22 +-
.../test/test_burn_insufficient_shares.1.json | 22 +-
.../test/test_deposit_when_paused.1.json | 84 +-
.../test/test_deposit_zero_amount.1.json | 22 +-
.../test/test_double_initialization.1.json | 22 +-
.../test_snapshots/test/test_events.1.json | 22 +-
.../test/test_get_fee_default.1.json | 22 +-
.../test/test_pause_and_unpause.1.json | 270 +-
.../test/test_set_fee_above_max.1.json | 22 +-
.../test/test_set_fee_valid.1.json | 24 +-
.../test_swap_insufficient_liquidity.1.json | 22 +-
.../test/test_swap_slippage_exceeded.1.json | 22 +-
.../test/test_swap_when_paused.1.json | 84 +-
.../test/test_token_interface.1.json | 22 +-
.../test_snapshots/test/test_transfer.1.json | 22 +-
.../test/test_transfer_from.1.json | 22 +-
...ransfer_from_insufficient_allowance.1.json | 22 +-
..._transfer_from_insufficient_balance.1.json | 22 +-
.../test_transfer_insufficient_balance.1.json | 22 +-
.../test_withdraw_insufficient_shares.1.json | 22 +-
.../test/test_withdraw_when_paused.1.json | 84 +-
285 files changed, 13482 insertions(+), 16675 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 030b1d92..25496e52 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -147,7 +147,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185"
dependencies = [
"num-traits",
- "rand",
+ "rand 0.8.7",
]
[[package]]
@@ -180,6 +180,27 @@ version = "1.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
+[[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.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
+
[[package]]
name = "block-buffer"
version = "0.10.4"
@@ -283,7 +304,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
dependencies = [
"generic-array",
- "rand_core",
+ "rand_core 0.6.4",
"subtle",
"zeroize",
]
@@ -506,7 +527,7 @@ checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"
dependencies = [
"curve25519-dalek",
"ed25519",
- "rand_core",
+ "rand_core 0.6.4",
"serde",
"sha2",
"subtle",
@@ -531,7 +552,7 @@ dependencies = [
"ff",
"generic-array",
"group",
- "rand_core",
+ "rand_core 0.6.4",
"sec1",
"subtle",
"zeroize",
@@ -550,6 +571,16 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+[[package]]
+name = "errno"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+dependencies = [
+ "libc",
+ "windows-sys",
+]
+
[[package]]
name = "escape-bytes"
version = "0.1.1"
@@ -562,13 +593,19 @@ version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f"
+[[package]]
+name = "fastrand"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
+
[[package]]
name = "ff"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393"
dependencies = [
- "rand_core",
+ "rand_core 0.6.4",
"subtle",
]
@@ -638,6 +675,29 @@ 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",
+ "libc",
+ "r-efi 5.3.0",
+ "wasip2",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 6.0.0",
+]
+
[[package]]
name = "group"
version = "0.13.0"
@@ -645,7 +705,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
dependencies = [
"ff",
- "rand_core",
+ "rand_core 0.6.4",
"subtle",
]
@@ -812,6 +872,21 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
+[[package]]
+name = "linux-raw-sys"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
+
+[[package]]
+name = "liquidity_pool"
+version = "0.1.0"
+dependencies = [
+ "emergency_guard",
+ "proptest",
+ "soroban-sdk",
+]
+
[[package]]
name = "log"
version = "0.4.33"
@@ -952,6 +1027,31 @@ dependencies = [
"unicode-ident",
]
+[[package]]
+name = "proptest"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744"
+dependencies = [
+ "bit-set",
+ "bit-vec",
+ "bitflags",
+ "num-traits",
+ "rand 0.9.5",
+ "rand_chacha 0.9.0",
+ "rand_xorshift",
+ "regex-syntax",
+ "rusty-fork",
+ "tempfile",
+ "unarray",
+]
+
+[[package]]
+name = "quick-error"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
+
[[package]]
name = "quote"
version = "1.0.47"
@@ -961,6 +1061,18 @@ 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.8.7"
@@ -968,8 +1080,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a"
dependencies = [
"libc",
- "rand_chacha",
- "rand_core",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41"
+dependencies = [
+ "rand_chacha 0.9.0",
+ "rand_core 0.9.5",
]
[[package]]
@@ -979,7 +1101,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
- "rand_core",
+ "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]]
@@ -988,7 +1120,25 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
- "getrandom",
+ "getrandom 0.2.17",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
+dependencies = [
+ "getrandom 0.3.4",
+]
+
+[[package]]
+name = "rand_xorshift"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a"
+dependencies = [
+ "rand_core 0.9.5",
]
[[package]]
@@ -1011,6 +1161,12 @@ dependencies = [
"syn 3.0.3",
]
+[[package]]
+name = "regex-syntax"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
+
[[package]]
name = "rfc6979"
version = "0.4.0"
@@ -1030,12 +1186,37 @@ dependencies = [
"semver",
]
+[[package]]
+name = "rustix"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
+dependencies = [
+ "bitflags",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys",
+]
+
[[package]]
name = "rustversion"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
+[[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 = "schemars"
version = "0.9.0"
@@ -1188,7 +1369,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
dependencies = [
"digest",
- "rand_core",
+ "rand_core 0.6.4",
]
[[package]]
@@ -1259,7 +1440,7 @@ dependencies = [
"ed25519-dalek",
"elliptic-curve",
"generic-array",
- "getrandom",
+ "getrandom 0.2.17",
"hex-literal",
"hmac",
"k256",
@@ -1267,8 +1448,8 @@ dependencies = [
"num-integer",
"num-traits",
"p256",
- "rand",
- "rand_chacha",
+ "rand 0.8.7",
+ "rand_chacha 0.3.1",
"sec1",
"sha2",
"sha3",
@@ -1320,7 +1501,7 @@ dependencies = [
"ctor",
"derive_arbitrary",
"ed25519-dalek",
- "rand",
+ "rand 0.8.7",
"rustc_version",
"serde",
"serde_json",
@@ -1511,6 +1692,19 @@ dependencies = [
"unicode-ident",
]
+[[package]]
+name = "tempfile"
+version = "3.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
+dependencies = [
+ "fastrand",
+ "getrandom 0.4.3",
+ "once_cell",
+ "rustix",
+ "windows-sys",
+]
+
[[package]]
name = "thiserror"
version = "1.0.69"
@@ -1582,6 +1776,12 @@ version = "1.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
+[[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.24"
@@ -1594,12 +1794,30 @@ 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 = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+[[package]]
+name = "wasip2"
+version = "1.0.4+wasi-0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
+dependencies = [
+ "wit-bindgen",
+]
+
[[package]]
name = "wasm-bindgen"
version = "0.2.126"
@@ -1741,6 +1959,21 @@ dependencies = [
"windows-link",
]
+[[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 = "wit-bindgen"
+version = "0.57.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
+
[[package]]
name = "zerocopy"
version = "0.8.55"
diff --git a/Cargo.toml b/Cargo.toml
index a78d69b5..a209a6fb 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,6 +2,7 @@
resolver = "2"
members = [
"contracts/error_codes",
+ "contracts/liquidity_pool",
"contracts/math",
"contracts/staking_rewards",
]
diff --git a/contracts/liquidity_pool/README.md b/contracts/liquidity_pool/README.md
index 8ae63f71..236ca3c4 100644
--- a/contracts/liquidity_pool/README.md
+++ b/contracts/liquidity_pool/README.md
@@ -226,3 +226,74 @@ pool.initialize(admin, token_a, token_b)?;
## Fee admin
`DataKey::Admin` is the pool fee admin (may differ from guard admins after rotation). Use `set_fee`, `configure_fee_oracle`, `sync_fee_from_oracle`, and `execute_fee_update`.
+
+## Swapping and slippage protection
+
+The pool exposes both swap directions. Which one you use decides which side you
+can bound, and every swap needs one side bounded — an unbounded swap can be
+sandwiched, since an attacker who front-runs the transaction moves the price so
+the same trade fills far worse.
+
+| Function | You fix | You bound | Returns |
+|----------|---------|-----------|---------|
+| `swap(to, buy_a, out, in_max)` | the output `out` | the input, via `in_max` | input actually paid |
+| `swap_exact_in(to, buy_a, amount_in, min_amount_out)` | the input `amount_in` | the output, via `min_amount_out` | output actually delivered |
+
+`buy_a` selects direction: `true` sends token B in and takes token A out, `false`
+is the reverse.
+
+### Exact-input swaps
+
+`swap_exact_in` computes the output from the live reserves and current fee, then
+refuses the trade unless it clears the caller's floor:
+
+```rust
+// Quote against current state, then accept 1% of drift.
+let quoted = pool.get_amount_out(false, 1_000)?;
+let min_amount_out = quoted * 99 / 100;
+
+let received = pool.swap_exact_in(trader, false, 1_000, min_amount_out)?;
+assert!(received >= min_amount_out);
+```
+
+If the price moves between the quote and execution such that the output would
+fall below `min_amount_out`, the call returns `Error::SlippageExceeded` and no
+tokens move.
+
+Passing `min_amount_out = 0` disables the check. Do that only when any fill is
+genuinely acceptable.
+
+### Quoting
+
+```rust
+let out = pool.get_amount_out(buy_a, amount_in)?; // output for a given input
+let needed = pool.get_amount_in(buy_a, amount_out)?; // input for a given output
+let (reserve_a, reserve_b) = pool.get_reserves()?;
+```
+
+Both quotes are read-only and only describe the state they were read from. Derive
+a bound from them; do not assume the swap will match them. Rounding always
+resolves in the pool's favour, so `get_amount_in(get_amount_out(x))` may come
+back slightly above `x`.
+
+### Exact-output swaps
+
+For `swap`, the output is fixed by the caller and delivered exactly or not at
+all, so `in_max` is the meaningful bound — a minimum-output parameter would be
+satisfied by construction. Set `in_max` to the quoted input plus your tolerance:
+
+```rust
+let quoted_in = pool.get_amount_in(false, 900)?;
+pool.swap(trader, false, 900, quoted_in * 101 / 100)?;
+```
+
+### Swap errors
+
+- `Error::SlippageExceeded`: the bound you set was not met (`min_amount_out` for
+ `swap_exact_in`, `in_max` for `swap`). Expected under normal price movement;
+ re-quote and retry.
+- `Error::InvalidAmount`: `amount_in` was zero or negative, or `min_amount_out`
+ was negative.
+- `Error::InsufficientLiquidity`: the reserves cannot support the trade, or the
+ input was too small to buy a single unit of output.
+- `Error::Paused`: swaps are currently paused by the guard.
diff --git a/contracts/liquidity_pool/src/lib.rs b/contracts/liquidity_pool/src/lib.rs
index 43d3306a..806a9f76 100644
--- a/contracts/liquidity_pool/src/lib.rs
+++ b/contracts/liquidity_pool/src/lib.rs
@@ -1,22 +1,10 @@
#![no_std]
-use soroban_sdk::{
- contract, contracterror, contractimpl, contracttype, vec, Address, Env, String, Vec,
-};
-use emergency_guard::{EmergencyGuardTrait, GuardError, PauseType};
-use emergency_guard::{EmergencyGuard, PauseType};
-use soroban_sdk::vec;
-use soroban_sdk::{contract, contracterror, contractimpl, contracttype, Address, Env, String, Vec};
use emergency_guard::{
- emit_admin_added, emit_admin_removed, emit_emergency_paused_all, emit_guard_initialized,
- emit_pause_state_changed, emit_resumed_all, EmergencyGuardTrait, GuardError, PauseType,
- emit_pause_state_changed, emit_resumed_all, EmergencyGuard, GuardError, PauseType, DefaultEmergencyGuard, EmergencyGuardTrait
+ DefaultEmergencyGuard, EmergencyGuard, EmergencyGuardTrait, GuardError, PauseType,
};
-use soroban_sdk::{contract, contracterror, contractimpl, contracttype, Address, Env, String, Vec};
-use emergency_guard::{EmergencyGuard, GuardError, PauseType};
use soroban_sdk::{
- contract, contracterror, contractimpl, contracttype, panic_with_error, vec, Address, Env,
- String, Vec,
+ contract, contracterror, contractimpl, contracttype, vec, Address, Env, String, Vec,
};
#[cfg(test)]
@@ -28,22 +16,13 @@ mod test;
/// Errors returned by the `LiquidityPool` contract.
///
-/// Code assignments are stable on-chain ABI — do NOT renumber.
+/// Code assignments are stable on-chain ABI — do NOT renumber. New variants go
+/// on the end.
#[contracterror]
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
#[repr(u32)]
pub enum Error {
AlreadyInitialized = 1,
- InsufficientLiquidity = 2,
- SlippageExceeded = 3,
- InsufficientShares = 4,
- NotInitialized = 5,
- InsufficientBalance = 6,
- Unauthorized = 7,
- InsufficientAllowance = 8,
- InvalidFee = 9,
- OracleNotConfigured = 10,
- InvalidOraclePrice = 11,
NotInitialized = 2,
Unauthorized = 3,
InsufficientBalance = 4,
@@ -53,22 +32,16 @@ pub enum Error {
SlippageExceeded = 8,
InvalidFee = 9,
OracleNotConfigured = 10,
- PendingFeeUpdateExists = 11,
- InsufficientLiquidity = 2,
- SlippageExceeded = 3,
- InsufficientShares = 4,
- NotInitialized = 5,
- InsufficientBalance = 6,
- Unauthorized = 7,
- InsufficientAllowance = 8,
- InvalidFee = 9,
- OracleNotConfigured = 10,
InvalidOraclePrice = 11,
TimelockNotElapsed = 12,
NoPendingFeeUpdate = 13,
Paused = 14,
+ /// A caller-supplied amount was zero or negative.
+ InvalidAmount = 15,
}
+// ── Events ────────────────────────────────────────────────────────────────────
+
#[contracttype]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct DepositEvent {
@@ -104,33 +77,24 @@ pub struct BurnEvent {
pub shares_burned: i128,
}
-/// Event payload emitted after a successful stake.
#[contracttype]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct StakeEvent {
- /// Address that staked LP shares.
pub user: Address,
- /// LP shares staked.
pub amount_staked: i128,
}
-/// Event payload emitted after a successful unstake.
#[contracttype]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct UnstakeEvent {
- /// Address that unstaked LP shares.
pub user: Address,
- /// LP shares unstaked.
pub amount_unstaked: i128,
}
-/// Event payload emitted after claiming rewards.
#[contracttype]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ClaimRewardsEvent {
- /// Address that claimed rewards.
pub user: Address,
- /// Amount of rewards claimed.
pub rewards_amount: i128,
}
@@ -152,34 +116,8 @@ pub struct FeeUpdateScheduledEvent {
pub volatility_bps: i128,
}
-#[contracttype]
-#[derive(Clone, Debug, Eq, PartialEq)]
-pub struct PoolState {
- pub token_a: Address,
- pub token_b: Address,
- pub reserve_a: i128,
- pub reserve_b: i128,
- pub total_shares: i128,
- pub fee_bps: i128,
- pub base_fee_bps: i128,
- pub admin: Address,
-}
-
-#[contracttype]
-#[derive(Clone, Debug, Eq, PartialEq)]
-pub struct GuardState {
- pub pause_state: u32,
- pub admins: Vec,
- pub signature_threshold: u32,
-}
+// ── Constants ─────────────────────────────────────────────────────────────────
-#[contracttype]
-#[derive(Clone, Debug, Eq, PartialEq)]
-pub struct OracleConfig {
- pub oracle: Address,
- pub last_price: i128,
- pub last_volatility_bps: i128,
- pub timelock_ledgers: u32,
pub const MAX_FEE_BPS: i128 = 100;
pub const DEFAULT_BASE_FEE_BPS: i128 = 30;
pub const DEFAULT_FEE_TIMELOCK_LEDGERS: u32 = 120;
@@ -192,15 +130,9 @@ pub const LOW_VOLATILITY_FEE_BPS: i128 = 40;
pub const MEDIUM_VOLATILITY_FEE_BPS: i128 = 70;
pub const HIGH_VOLATILITY_FEE_BPS: i128 = 100;
-pub mod pause_op {
- pub const SWAP: u32 = 1 << 0;
- pub const DEPOSIT: u32 = 1 << 1;
- pub const WITHDRAW: u32 = 1 << 2;
- pub const TRANSFER: u32 = 1 << 3;
- pub const MINT: u32 = 1 << 4;
- pub const BURN: u32 = 1 << 5;
- pub const ALL: u32 = u32::MAX;
-}
+pub const REWARDS_PER_LEDGER: i128 = 10_000_000;
+pub const REWARD_PRECISION: i128 = 1_000_000_000_000;
+
// ── Oracle interface ──────────────────────────────────────────────────────────
#[soroban_sdk::contractclient(name = "PriceOracleClient")]
@@ -221,35 +153,6 @@ pub struct PoolState {
pub fee_bps: i128,
pub base_fee_bps: i128,
pub admin: Address,
-#[contracttype]
-#[derive(Clone, Debug, Eq, PartialEq)]
-pub struct FeeUpdateScheduledEvent {
- pub scheduled_by: Address,
- pub old_fee_bps: i128,
- pub new_fee_bps: i128,
- pub executable_after_ledger: u32,
- pub volatility_bps: i128,
-}
-
-#[contracttype]
-#[derive(Clone, Debug, Eq, PartialEq)]
-pub struct PoolState {
- pub token_a: Address,
- pub token_b: Address,
- pub reserve_a: i128,
- pub reserve_b: i128,
- pub total_shares: i128,
- pub fee_bps: i128,
- pub base_fee_bps: i128,
- pub admin: Address,
-}
-
-#[contracttype]
-#[derive(Clone, Debug, Eq, PartialEq)]
-pub struct GuardState {
- pub pause_state: u32,
- pub admins: Vec,
- pub signature_threshold: u32,
}
#[contracttype]
@@ -269,14 +172,6 @@ pub struct PendingFeeUpdate {
pub based_on_volatility_bps: i128,
}
-#[contracttype]
-#[derive(Clone, Debug, Eq, PartialEq)]
-pub struct OracleConfig {
- pub oracle_id: Address,
- pub base_fee_bps: i128,
- pub timelock_ledgers: u32,
-}
-
#[derive(Clone)]
#[contracttype]
pub struct AllowanceDataKey {
@@ -296,16 +191,10 @@ pub struct AllowanceValue {
pub enum DataKey {
Pool,
Admin,
- GuardAdmins,
- GuardThreshold,
- GuardPauseState,
Balance(Address),
Allowance(AllowanceDataKey),
- OracleConfig,
- LastOraclePrice,
- LastVolatilityBps,
+ Oracle,
PendingFeeUpdate,
- Paused,
StakedBalance(Address),
TotalStaked,
UserRewards(Address),
@@ -313,97 +202,7 @@ pub enum DataKey {
AccumulatedRewardPerShare,
}
-fn sqrt(x: i128) -> i128 {
- if x == 0 {
- return 0;
- Guard,
- Oracle,
- PendingFeeUpdate,
-/// Grouped pool state — stored as a single instance key to reduce storage footprint.
-#[contracttype]
-#[derive(Clone)]
-pub struct PoolState {
- pub admin: Address,
- pub token_a: Address,
- pub token_b: Address,
- pub reserve_a: i128,
- pub reserve_b: i128,
- pub total_shares: i128,
- pub fee_bps: i128,
-}
-
-/// Storage keys.
-#[contracttype]
-#[derive(Clone)]
-pub enum DataKey {
- /// Single-entry key for all grouped pool state.
- Pool,
- /// Per-user LP share balance (persistent storage).
- Balance(Address),
- /// ERC-20-style allowances (persistent storage).
- Allowance(AllowanceDataKey),
-}
-
-fn load_pool(e: &Env) -> Result {
- e.storage()
- .instance()
- .get::<_, PoolState>(&DataKey::Pool)
- .ok_or(Error::NotInitialized)
-}
-
-fn save_pool(e: &Env, pool: &PoolState) {
- e.storage().instance().set(&DataKey::Pool, pool);
-}
-// ── Constants ─────────────────────────────────────────────────────────────────
-
-pub const MAX_FEE_BPS: i128 = 100;
-pub const DEFAULT_BASE_FEE_BPS: i128 = 30;
-pub const DEFAULT_FEE_TIMELOCK_LEDGERS: u32 = 120;
-
-pub const LOW_VOLATILITY_THRESHOLD_BPS: i128 = 100;
-pub const MEDIUM_VOLATILITY_THRESHOLD_BPS: i128 = 250;
-pub const HIGH_VOLATILITY_THRESHOLD_BPS: i128 = 500;
-
-pub const LOW_VOLATILITY_FEE_BPS: i128 = 40;
-pub const MEDIUM_VOLATILITY_FEE_BPS: i128 = 70;
-pub const HIGH_VOLATILITY_FEE_BPS: i128 = 100;
-
-// ── Oracle trait ──────────────────────────────────────────────────────────────
-
-#[soroban_sdk::contractclient(name = "PriceOracleClient")]
-pub trait PriceOracle {
- fn latest_price(e: Env) -> i128;
-}
-
-fn sqrt(x: i128) -> i128 {
- if x == 0 {
- return 0;
- }
-
- let mut z = (x + 1) / 2;
- let mut y = x;
-
- while z < y {
- y = z;
- z = (x / z + z) / 2;
- }
-
- y
-}
-
- Admin,
- GuardAdmins,
- GuardThreshold,
- GuardPauseState,
- Balance(Address),
- Allowance(AllowanceDataKey),
- OracleConfig,
- LastOraclePrice,
- LastVolatilityBps,
- PendingFeeUpdate,
-}
// ── Helpers ───────────────────────────────────────────────────────────────────
-// ── Private helpers ───────────────────────────────────────────────────────────
fn sqrt(x: i128) -> i128 {
if x == 0 {
@@ -429,41 +228,6 @@ fn save_pool(e: &Env, pool: &PoolState) {
e.storage().instance().set(&DataKey::Pool, pool);
}
-fn load_guard(e: &Env) -> GuardState {
- e.storage()
- .instance()
- .get(&DataKey::Guard)
- .unwrap_or_else(|| GuardState {
- pause_state: 0,
- admins: Vec::new(e),
- signature_threshold: 0,
- })
-}
-
-fn save_guard(e: &Env, guard: &GuardState) {
- e.storage().instance().set(&DataKey::Guard, guard);
-}
-
-fn load_or_init_guard_from_pool(e: &Env, pool: &PoolState) -> GuardState {
- let guard = load_guard(e);
- if guard.signature_threshold == 0 && guard.admins.len() == 0 {
- GuardState {
- pause_state: guard.pause_state,
- admins: {
- let mut admins = Vec::new(e);
- admins.push_back(pool.admin.clone());
- admins
- },
- signature_threshold: 1,
- }
- } else {
- guard
- }
-}
-
-fn check_paused(pool: &PoolState, operation: u32, guard: &GuardState) -> Result<(), Error> {
- if guard.pause_state & operation != 0 {
-fn check_not_paused(e: &Env, operation: u32) -> Result<(), Error> {
fn load_admin(e: &Env) -> Result {
e.storage()
.instance()
@@ -491,13 +255,111 @@ fn require_not_paused(e: &Env, operation: u32) -> Result<(), Error> {
}
}
-/// Rewards per ledger: 1 LP token (with 7 decimals) = 10_000_000
-pub const REWARDS_PER_LEDGER: i128 = 10_000_000;
-/// Precision factor for reward calculations
-pub const REWARD_PRECISION: i128 = 1_000_000_000_000;
+/// Collapse guard membership and threshold refusals into `Unauthorized`.
+///
+/// From a caller's point of view "you are not an admin", "that address is not an
+/// admin" and "this would drop the admin set below the threshold" are all the
+/// same answer: the request is not permitted.
+fn as_unauthorized(err: GuardError) -> GuardError {
+ match err {
+ GuardError::AdminNotFound | GuardError::InvalidThreshold => GuardError::Unauthorized,
+ other => other,
+ }
+}
+
+/// Which reserve and token sits on each side of a swap.
+struct SwapSides {
+ reserve_in: i128,
+ reserve_out: i128,
+ token_in: Address,
+ token_out: Address,
+}
+
+/// `buy_a` means token B goes in and token A comes out.
+fn swap_sides(pool: &PoolState, buy_a: bool) -> SwapSides {
+ if buy_a {
+ SwapSides {
+ reserve_in: pool.reserve_b,
+ reserve_out: pool.reserve_a,
+ token_in: pool.token_b.clone(),
+ token_out: pool.token_a.clone(),
+ }
+ } else {
+ SwapSides {
+ reserve_in: pool.reserve_a,
+ reserve_out: pool.reserve_b,
+ token_in: pool.token_a.clone(),
+ token_out: pool.token_b.clone(),
+ }
+ }
+}
+
+/// Output produced by `amount_in`, constant product net of the pool fee.
+///
+/// `out = (in_after_fee * reserve_out) / (reserve_in * 10_000 + in_after_fee)`
+/// with `in_after_fee = amount_in * (10_000 - fee_bps)`. Division truncates, so
+/// rounding dust stays with the pool rather than the caller.
+fn amount_out_for_in(
+ amount_in: i128,
+ reserve_in: i128,
+ reserve_out: i128,
+ fee_bps: i128,
+) -> Result {
+ if reserve_in <= 0 || reserve_out <= 0 {
+ return Err(Error::InsufficientLiquidity);
+ }
+ let in_after_fee = amount_in
+ .checked_mul(10_000 - fee_bps)
+ .ok_or(Error::InsufficientLiquidity)?;
+ let numerator = in_after_fee
+ .checked_mul(reserve_out)
+ .ok_or(Error::InsufficientLiquidity)?;
+ let denominator = reserve_in
+ .checked_mul(10_000)
+ .ok_or(Error::InsufficientLiquidity)?
+ .checked_add(in_after_fee)
+ .ok_or(Error::InsufficientLiquidity)?;
+ Ok(numerator / denominator)
+}
+
+/// Input required to receive exactly `amount_out`, rounded up by one so the
+/// constant-product invariant is never weakened by truncation.
+fn amount_in_for_out(
+ amount_out: i128,
+ reserve_in: i128,
+ reserve_out: i128,
+ fee_bps: i128,
+) -> Result {
+ if amount_out >= reserve_out {
+ return Err(Error::InsufficientLiquidity);
+ }
+ let numerator = reserve_in
+ .checked_mul(amount_out)
+ .ok_or(Error::InsufficientLiquidity)?
+ .checked_mul(10_000)
+ .ok_or(Error::InsufficientLiquidity)?;
+ let denominator = (reserve_out - amount_out)
+ .checked_mul(10_000 - fee_bps)
+ .ok_or(Error::InsufficientLiquidity)?;
+ Ok((numerator / denominator) + 1)
+}
+
+/// Point `DataKey::Admin` (and `PoolState::admin`) at `replacement` when
+/// `departing` is the current primary admin. No-op otherwise.
+fn reassign_primary_admin_if(e: &Env, departing: &Address, replacement: Option) {
+ let Some(replacement) = replacement else {
+ return;
+ };
+ if load_admin(e).as_ref() != Ok(departing) {
+ return;
+ }
+ e.storage().instance().set(&DataKey::Admin, &replacement);
+ if let Ok(mut pool) = load_pool(e) {
+ pool.admin = replacement;
+ save_pool(e, &pool);
+ }
+}
-pub trait PriceOracle {
- fn latest_price(e: Env) -> i128;
fn target_fee_from_volatility(base_fee_bps: i128, volatility_bps: i128) -> i128 {
let dynamic = if volatility_bps >= HIGH_VOLATILITY_THRESHOLD_BPS {
HIGH_VOLATILITY_FEE_BPS
@@ -508,11 +370,6 @@ fn target_fee_from_volatility(base_fee_bps: i128, volatility_bps: i128) -> i128
} else {
base_fee_bps
};
- if dynamic > MAX_FEE_BPS {
-
- if dynamic_fee > MAX_FEE_BPS {
-
- if dynamic_fee > MAX_FEE_BPS {
if dynamic > MAX_FEE_BPS {
MAX_FEE_BPS
} else {
@@ -520,284 +377,83 @@ fn target_fee_from_volatility(base_fee_bps: i128, volatility_bps: i128) -> i128
}
}
-fn guard_init(e: &Env, admin: Address) {
- let admins = vec![e, admin];
- e.storage().instance().set(&DataKey::GuardAdmins, &admins);
- e.storage().instance().set(&DataKey::GuardThreshold, &1u32);
-}
-
-fn guard_pause_state(e: &Env) -> u32 {
- e.storage()
- .instance()
- .get(&DataKey::GuardPauseState)
- .unwrap_or(0u32)
-}
// ── pause_op aliases (kept for backwards compat with tests) ──────────────────
-fn read_admin(e: &Env) -> Result {
- e.storage()
- .instance()
- .get(&DataKey::Admin)
- .ok_or(Error::NotInitialized)
+pub mod pause_op {
+ pub use emergency_guard::PauseType;
+ pub const SWAP: u32 = emergency_guard::PauseType::SWAP;
+ pub const DEPOSIT: u32 = emergency_guard::PauseType::DEPOSIT;
+ pub const WITHDRAW: u32 = emergency_guard::PauseType::WITHDRAW;
+ pub const TRANSFER: u32 = emergency_guard::PauseType::TRANSFER;
+ pub const MINT: u32 = emergency_guard::PauseType::MINT;
+ pub const BURN: u32 = emergency_guard::PauseType::BURN;
+ pub const ALL: u32 = u32::MAX;
}
-fn read_guard_admins(e: &Env) -> Vec {
- e.storage()
- .instance()
- .get(&DataKey::GuardAdmins)
- .unwrap_or_else(|| Vec::new(e))
-}
+/// Every operation `set_paused` toggles, as a single bitmask.
+const CORE_PAUSE_OPS: u32 = PauseType::SWAP
+ | PauseType::DEPOSIT
+ | PauseType::WITHDRAW
+ | PauseType::BURN
+ | PauseType::STAKE
+ | PauseType::CLAIM_REWARDS;
-fn write_guard_admins(e: &Env, admins: &Vec) {
- e.storage().instance().set(&DataKey::GuardAdmins, admins);
-}
+// ── Contract ──────────────────────────────────────────────────────────────────
-/// Return `Err(Error::Paused)` if `op` is currently paused.
-fn guard_check_not_paused(e: &Env, op: u32) -> Result<(), Error> {
- if guard_pause_state(e) & op != 0 {
- Err(Error::Paused)
- } else {
+#[contract]
+pub struct LiquidityPool;
+
+#[contractimpl]
+impl LiquidityPool {
+ // ── Initialisation ────────────────────────────────────────────────────────
+
+ pub fn initialize(
+ e: Env,
+ admin: Address,
+ token_a: Address,
+ token_b: Address,
+ ) -> Result<(), Error> {
+ if e.storage().instance().has(&DataKey::Pool) {
+ return Err(Error::AlreadyInitialized);
+ }
+ e.storage().instance().set(&DataKey::Admin, &admin);
+ save_pool(
+ &e,
+ &PoolState {
+ token_a,
+ token_b,
+ reserve_a: 0,
+ reserve_b: 0,
+ total_shares: 0,
+ fee_bps: DEFAULT_BASE_FEE_BPS,
+ base_fee_bps: DEFAULT_BASE_FEE_BPS,
+ admin: admin.clone(),
+ },
+ );
+ // Issue #419: initialize EmergencyGuard so all multi-sig checks have a threshold.
+ EmergencyGuard::initialize(e.clone(), vec![&e, admin], 1).map_err(map_guard_err)?;
Ok(())
}
-}
-
-fn guard_admins(e: &Env) -> Vec {
- e.storage()
- .instance()
- .get(&DataKey::GuardAdmins)
- .unwrap_or_else(|| Vec::new(e))
-}
-fn guard_is_admin(e: &Env, addr: &Address) -> bool {
- guard_admins(e).iter().any(|a| a == *addr)
-}
+ // ── Admin accessors ───────────────────────────────────────────────────────
-fn guard_require_admin(e: &Env, caller: &Address) -> Result<(), Error> {
- caller.require_auth();
- if !guard_is_admin(e, caller) {
- return Err(Error::Unauthorized);
+ pub fn get_admin(e: Env) -> Address {
+ load_admin(&e).expect("not initialized")
}
- Ok(())
-}
-fn guard_require_multisig(e: &Env, approvers: &Vec) -> Result<(), Error> {
- let threshold: u32 = e
- .storage()
- .instance()
- .get(&DataKey::GuardThreshold)
- .ok_or(Error::NotInitialized)?;
- let admins = guard_admins(e);
-
- let mut valid = 0u32;
-fn primary_admin(e: &Env) -> Result {
- let guard = load_guard(e);
- if let Some(admin) = guard.admins.get(0) {
- Ok(admin)
- } else {
- let pool = load_pool(e).map_err(|_| GuardError::NotInitialized)?;
- Ok(pool.admin)
+ pub fn get_admin_threshold(e: Env) -> u32 {
+ EmergencyGuard::get_threshold(e)
}
-}
-fn check_multi_sig(e: &Env, approvers: &Vec) -> Result<(), GuardError> {
- let guard = load_guard(e);
- if guard.signature_threshold == 0 {
- return Err(GuardError::NotInitialized);
- }
+ // ── EmergencyGuard pause interface ────────────────────────────────────────
- if approvers.len() < guard.signature_threshold {
- return Err(GuardError::InsufficientSignatures);
- }
-
- let mut valid_approvers: u32 = 0;
- let mut seen = Vec::new(e);
-
- for addr in approvers.iter() {
- if seen.iter().any(|a| a == addr) {
- continue;
- }
- seen.push_back(addr.clone());
- if admins.iter().any(|a| a == addr) {
- addr.require_auth();
- valid += 1;
- }
- }
-
- if valid < threshold {
- return Err(Error::Unauthorized);
- }
- Ok(())
-}
-
-fn guard_set_ops(e: &Env, ops: u32, paused: bool) {
- let state = guard_pause_state(e);
- let next = if paused { state | ops } else { state & !ops };
- if next != state {
- e.storage().instance().set(&DataKey::GuardPauseState, &next);
- }
-}
-const CORE_PAUSE_OPS: [u32; 4] = [
- PauseType::SWAP,
- PauseType::DEPOSIT,
- PauseType::WITHDRAW,
- PauseType::BURN,
-];
-
-fn primary_admin(e: &Env) -> Result {
- let guard = load_guard(e);
- if let Some(admin) = guard.admins.get(0) {
- Ok(admin)
- } else {
- let pool = load_pool(e).map_err(|_| GuardError::NotInitialized)?;
- Ok(pool.admin)
- }
-}
-
-fn check_multi_sig(e: &Env, approvers: &Vec) -> Result<(), GuardError> {
- let guard = load_guard(e);
- if guard.signature_threshold == 0 {
- return Err(GuardError::NotInitialized);
- }
-
- if approvers.len() < guard.signature_threshold {
- return Err(GuardError::InsufficientSignatures);
- }
-
- let mut valid_approvers: u32 = 0;
- let mut seen = Vec::new(e);
-
- for addr in approvers.iter() {
- if seen.iter().any(|a| a == addr) {
- continue;
- }
- seen.push_back(addr.clone());
-
- if guard.admins.iter().any(|a| a == addr) {
- addr.require_auth();
- valid_approvers += 1;
- }
- }
-
- if valid_approvers < guard.signature_threshold {
- Err(GuardError::InsufficientSignatures)
- } else {
- Ok(())
- }
-fn set_primary_admin(e: &Env, admin: Address) -> Result<(), Error> {
- e.storage().instance().set(&DataKey::Admin, &admin);
- let mut pool = load_pool(e)?;
- pool.admin = admin;
- save_pool(e, &pool);
- Ok(())
-
- if guard.admins.iter().any(|a| a == addr) {
- addr.require_auth();
- valid_approvers += 1;
- }
- }
-
- if valid_approvers < guard.signature_threshold {
- Err(GuardError::InsufficientSignatures)
- } else {
- Ok(())
- }
-}
-
-#[contract]
-pub struct LiquidityPool;
-
-#[contractimpl]
-impl LiquidityPool {
- // ── Initialisation ────────────────────────────────────────────────────────
-
- pub fn initialize(
- e: Env,
- admin: Address,
- token_a: Address,
- token_b: Address,
- ) -> Result<(), Error> {
- if e.storage().instance().has(&DataKey::Pool) {
- return Err(Error::AlreadyInitialized);
- }
-
- e.storage().instance().set(&DataKey::Admin, &admin);
- save_pool(
- &e,
- &PoolState {
- token_a,
- token_b,
- reserve_a: 0,
- reserve_b: 0,
- total_shares: 0,
- fee_bps: DEFAULT_BASE_FEE_BPS,
- base_fee_bps: DEFAULT_BASE_FEE_BPS,
- admin: admin.clone(),
- paused: false,
- },
- );
-
- save_guard(
- &e,
- &GuardState {
- pause_state: 0,
- admins: {
- let mut admins = Vec::new(&e);
- admins.push_back(admin);
- admins
- },
- signature_threshold: 1,
- },
- );
-
- Ok(())
- }
-
- pub fn get_fee(e: Env) -> i128 {
- e.storage()
- .instance()
- .get::<_, PoolState>(&DataKey::Pool)
- .map(|p| p.fee_bps)
- .unwrap_or(DEFAULT_BASE_FEE_BPS)
- }
-
- },
- );
-
- EmergencyGuard::initialize(e.clone(), vec![&e, admin], 1).map_err(map_guard_err)?;
- Ok(())
- }
-
- // ── Admin accessors ─────────────────────────────────────────────────────────
-
- pub fn get_admin(e: Env) -> Address {
- load_admin(&e).expect("not initialized")
- }
-
- pub fn get_admins(e: Env) -> Vec {
- EmergencyGuard::get_admins(e)
- }
-
- pub fn get_admin_threshold(e: Env) -> u32 {
- EmergencyGuard::get_threshold(e)
- }
-
- // ── EmergencyGuard pause interface ──────────────────────────────────────────
-
- pub fn guard_pause(
- e: Env,
- admin: Address,
- operation: u32,
- paused: bool,
- ) -> Result<(), Error> {
- /// Pause or resume one operation bit. Any current guard admin may call this.
- pub fn guard_pause(e: Env, admin: Address, operation: u32, paused: bool) -> Result<(), Error> {
- EmergencyGuard::set_pause(e, admin, operation, paused).map_err(map_guard_err)
+ /// Pause or resume one operation bit. Any current guard admin may call this.
+ pub fn guard_pause(e: Env, admin: Address, operation: u32, paused: bool) -> Result<(), Error> {
+ EmergencyGuard::set_pause(e, admin, operation, paused).map_err(map_guard_err)
}
pub fn guard_is_paused(e: Env, operation: u32) -> bool {
EmergencyGuard::is_paused(e, operation)
- pub fn guard_unpause(e: Env, admin: Address, operation: u32) -> Result<(), Error> {
- Self::guard_pause(e, admin, operation, false)
}
pub fn set_operation_paused(
@@ -806,24 +462,17 @@ impl LiquidityPool {
operation: u32,
paused: bool,
) -> Result<(), Error> {
- Self::guard_pause(e, admin, operation, paused)
+ EmergencyGuard::set_pause(e, admin, operation, paused).map_err(map_guard_err)
}
- /// Pause or unpause all core pool operations (swap, deposit, withdraw, burn).
+ /// Pause or resume every core pool operation in one call.
+ ///
+ /// The whole mask is applied in a single `set_pause` so the admin is
+ /// authorized once — repeating `require_auth` for the same address inside
+ /// one frame is rejected by the host as `Auth(ExistingValue)`.
pub fn set_paused(e: Env, paused: bool) -> Result<(), Error> {
let admin = load_admin(&e)?;
- for op in CORE_PAUSE_OPS {
- EmergencyGuard::set_pause(e.clone(), admin.clone(), op, paused).map_err(map_guard_err)?;
- for op in [
- PauseType::SWAP,
- PauseType::DEPOSIT,
- PauseType::WITHDRAW,
- PauseType::BURN,
- ] {
- EmergencyGuard::set_pause(e.clone(), admin.clone(), op, paused)
- .map_err(map_guard_err)?;
- }
- Ok(())
+ EmergencyGuard::set_pause(e, admin, CORE_PAUSE_OPS, paused).map_err(map_guard_err)
}
pub fn pause_swaps(e: Env) -> Result<(), Error> {
@@ -834,8 +483,6 @@ impl LiquidityPool {
pub fn resume_swaps(e: Env) -> Result<(), Error> {
let admin = load_admin(&e)?;
EmergencyGuard::set_pause(e, admin, PauseType::SWAP, false).map_err(map_guard_err)
- let admin = Self::get_admin(e.clone())?;
- Self::guard_unpause(e, admin, pause_op::SWAP)
}
pub fn pause_deposits(e: Env) -> Result<(), Error> {
@@ -846,8 +493,6 @@ impl LiquidityPool {
pub fn resume_deposits(e: Env) -> Result<(), Error> {
let admin = load_admin(&e)?;
EmergencyGuard::set_pause(e, admin, PauseType::DEPOSIT, false).map_err(map_guard_err)
- let admin = Self::get_admin(e.clone())?;
- Self::guard_unpause(e, admin, pause_op::DEPOSIT)
}
pub fn pause_withdrawals(e: Env) -> Result<(), Error> {
@@ -860,29 +505,13 @@ impl LiquidityPool {
EmergencyGuard::set_pause(e, admin, PauseType::WITHDRAW, false).map_err(map_guard_err)
}
+ /// Issue #419: Emergency pause all operations — requires multi-sig via EmergencyGuard::check_multi_sig.
pub fn emergency_pause(e: Env, approvers: Vec) -> Result<(), Error> {
EmergencyGuard::emergency_pause(e, approvers).map_err(map_guard_err)
}
pub fn resume(e: Env, approvers: Vec) -> Result<(), Error> {
EmergencyGuard::resume(e, approvers).map_err(map_guard_err)
- let admin = Self::get_admin(e.clone())?;
- Self::guard_unpause(e, admin, pause_op::WITHDRAW)
- }
-
- pub fn emergency_pause_all(e: Env, approvers: Vec) -> Result<(), Error> {
- Self::emergency_pause(e, approvers)
- }
-
- pub fn resume_all(e: Env, approvers: Vec) -> Result<(), Error> {
- Self::resume(e, approvers)
- }
-
- pub fn get_pause_state(e: Env) -> u32 {
- EmergencyGuard::get_pause_state(e)
- }
- pub fn get_pause_mask(e: Env) -> u32 {
- EmergencyGuard::get_pause_state(e)
}
pub fn get_pause_mask(e: Env) -> u32 {
@@ -898,37 +527,6 @@ impl LiquidityPool {
EmergencyGuard::is_paused(e, operation)
}
- pub fn add_admin(e: Env, approvers: Vec, new_admin: Address) -> Result<(), Error> {
- EmergencyGuard::add_admin(e, approvers, new_admin).map_err(map_guard_err)
- }
-
- pub fn remove_admin(e: Env, approvers: Vec, admin: Address) -> Result<(), Error> {
- let pool_admin = load_admin(&e)?;
- EmergencyGuard::remove_admin(e.clone(), approvers, admin.clone()).map_err(map_guard_err)?;
- let admins = EmergencyGuard::get_admins(e.clone());
- if pool_admin == admin && admins.len() == 1 {
- if let Some(remaining) = admins.get(0) {
- e.storage().instance().set(&DataKey::Admin, &remaining);
- }
- }
- Ok(())
- }
-
- pub fn rotate_admin(
- e: Env,
- approvers: Vec,
- old_admin: Address,
- new_admin: Address,
- ) -> Result<(), Error> {
- let pool_admin = load_admin(&e)?;
- if pool_admin != old_admin {
- return Err(Error::Unauthorized);
- }
- EmergencyGuard::add_admin(e.clone(), approvers.clone(), new_admin.clone())
- .map_err(map_guard_err)?;
- EmergencyGuard::remove_admin(e.clone(), approvers, old_admin).map_err(map_guard_err)?;
- e.storage().instance().set(&DataKey::Admin, &new_admin);
- Ok(())
pub fn add_guard_admin(
e: Env,
approvers: Vec,
@@ -942,7 +540,7 @@ impl LiquidityPool {
approvers: Vec,
admin: Address,
) -> Result<(), Error> {
- Self::remove_admin(e, approvers, admin)
+ EmergencyGuard::remove_admin(e, approvers, admin).map_err(map_guard_err)
}
pub fn get_guard_admins(e: Env) -> Vec {
@@ -965,14 +563,12 @@ impl LiquidityPool {
if !(0..=MAX_FEE_BPS).contains(&fee_bps) {
return Err(Error::InvalidFee);
}
-
let admin = load_admin(&e)?;
admin.require_auth();
let mut pool = load_pool(&e)?;
let old_fee = pool.fee_bps;
pool.fee_bps = fee_bps;
save_pool(&e, &pool);
-
e.events().publish(
(String::from_str(&e, "fee_changed"), admin.clone()),
FeeChangedEvent {
@@ -981,7 +577,6 @@ impl LiquidityPool {
new_fee_bps: fee_bps,
},
);
-
Ok(())
}
@@ -994,12 +589,10 @@ impl LiquidityPool {
if !(0..=MAX_FEE_BPS).contains(&base_fee_bps) {
return Err(Error::InvalidFee);
}
-
let mut pool = load_pool(&e)?;
pool.admin.require_auth();
pool.base_fee_bps = base_fee_bps;
save_pool(&e, &pool);
-
e.storage().instance().set(
&DataKey::Oracle,
&OracleConfig {
@@ -1009,7 +602,6 @@ impl LiquidityPool {
timelock_ledgers,
},
);
-
Ok(())
}
@@ -1031,53 +623,40 @@ impl LiquidityPool {
.instance()
.get(&DataKey::Oracle)
.ok_or(Error::OracleNotConfigured)?;
-
let oracle_client = PriceOracleClient::new(&e, &cfg.oracle);
let current_price = oracle_client.latest_price();
if current_price <= 0 {
return Err(Error::InvalidOraclePrice);
}
-
let previous_price = cfg.last_price;
cfg.last_price = current_price;
-
if previous_price <= 0 {
cfg.last_volatility_bps = 0;
e.storage().instance().set(&DataKey::Oracle, &cfg);
return Ok(None);
}
-
let price_delta = if current_price >= previous_price {
current_price - previous_price
} else {
previous_price - current_price
};
-
let volatility_bps = price_delta
.checked_mul(10_000)
.ok_or(Error::InvalidOraclePrice)?
/ previous_price;
-
cfg.last_volatility_bps = volatility_bps;
e.storage().instance().set(&DataKey::Oracle, &cfg);
-
let pool = load_pool(&e)?;
let target_fee = target_fee_from_volatility(pool.base_fee_bps, volatility_bps);
if target_fee == pool.fee_bps {
return Ok(None);
}
-
let execute_after = e.ledger().sequence().saturating_add(cfg.timelock_ledgers);
let pending = PendingFeeUpdate {
new_fee_bps: target_fee,
executable_after_ledger: execute_after,
based_on_volatility_bps: volatility_bps,
};
-
- e.storage()
- .instance()
- .set(&DataKey::PendingFeeUpdate, &pending);
-
e.storage()
.instance()
.set(&DataKey::PendingFeeUpdate, &pending);
@@ -1095,7 +674,6 @@ impl LiquidityPool {
volatility_bps,
},
);
-
Ok(Some(pending))
}
@@ -1105,1019 +683,124 @@ impl LiquidityPool {
.instance()
.get(&DataKey::PendingFeeUpdate)
.ok_or(Error::NoPendingFeeUpdate)?;
-
- if e.ledger().sequence() < pending.executable_after_ledger {
- return Err(Error::TimelockNotElapsed);
- }
-
- if !(0..=MAX_FEE_BPS).contains(&pending.new_fee_bps) {
- guard_init(&e, admin);
- Ok(())
- }
-
- // ── Granular pause (EmergencyGuard admin interface) ───────────────────────
-
- /// Pause or resume one operation bit. Any current guard admin may call this.
- pub fn set_operation_paused(
- e: Env,
- admin: Address,
- operation: u32,
- paused: bool,
- ) -> Result<(), Error> {
- guard_require_admin(&e, &admin)?;
- guard_set_ops(&e, operation, paused);
- Ok(())
- }
-
- /// Backward-compatible granular pause entry point.
- pub fn guard_pause(
- e: Env,
- admin: Address,
- operation: u32,
- paused: bool,
- ) -> Result<(), Error> {
- Self::set_operation_paused(e, admin, operation, paused)
- }
-
- /// Pause only swap operations.
- pub fn pause_swaps(e: Env) -> Result<(), Error> {
- let admin = read_admin(&e)?;
- Self::set_operation_paused(e, admin, pause_op::SWAP, true)
- }
-
- pub fn resume_swaps(e: Env) -> Result<(), Error> {
- let admin = read_admin(&e)?;
- Self::set_operation_paused(e, admin, pause_op::SWAP, false)
- }
-
- pub fn pause_deposits(e: Env) -> Result<(), Error> {
- let admin = read_admin(&e)?;
- Self::set_operation_paused(e, admin, pause_op::DEPOSIT, true)
- }
-
- pub fn resume_deposits(e: Env) -> Result<(), Error> {
- let admin = read_admin(&e)?;
- Self::set_operation_paused(e, admin, pause_op::DEPOSIT, false)
- }
-
- pub fn pause_withdrawals(e: Env) -> Result<(), Error> {
- let admin = read_admin(&e)?;
- Self::set_operation_paused(e, admin, pause_op::WITHDRAW, true)
- }
-
- pub fn resume_withdrawals(e: Env) -> Result<(), Error> {
- let admin = read_admin(&e)?;
- Self::set_operation_paused(e, admin, pause_op::WITHDRAW, false)
- }
-
- /// Emergency: pause all guarded operations via multi-sig approval.
- pub fn emergency_pause(e: Env, approvers: Vec) -> Result<(), Error> {
- guard_require_multisig(&e, &approvers)?;
- guard_set_ops(&e, pause_op::ALL, true);
- Ok(())
- }
-
- /// Alias for callers that use the explicit "all" naming.
- pub fn emergency_pause_all(e: Env, approvers: Vec) -> Result<(), Error> {
- Self::emergency_pause(e, approvers)
- }
-
- /// Unpause all guarded operations via multi-sig approval.
- ///
- /// This replaces the old single-admin boolean unpause flow. The approver
- /// list is validated by the same guard threshold used for emergency pause.
- pub fn guard_unpause(e: Env, approvers: Vec) -> Result<(), Error> {
- guard_require_multisig(&e, &approvers)?;
- guard_set_ops(&e, pause_op::ALL, false);
- Ok(())
- }
-
- /// Backward-compatible resume entry point for existing callers.
- pub fn resume(e: Env, approvers: Vec) -> Result<(), Error> {
- Self::guard_unpause(e, approvers)
- }
-
- /// Alias for callers that use the explicit "all" naming.
- pub fn resume_all(e: Env, approvers: Vec) -> Result<(), Error> {
- Self::guard_unpause(e, approvers)
- }
-
- /// Returns the raw pause-state bitmask.
- pub fn get_pause_state(e: Env) -> u32 {
- guard_pause_state(&e)
- }
-
- /// Returns `true` when `operation` is currently paused.
- pub fn guard_is_paused(e: Env, operation: u32) -> bool {
- guard_pause_state(&e) & operation != 0
- }
-
- /// Alias for callers that use operation-centric naming.
- pub fn is_paused_op(e: Env, operation: u32) -> bool {
- Self::guard_is_paused(e, operation)
- }
-
- /// Returns the list of authorized guard admins.
- pub fn get_admins(e: Env) -> Vec {
- read_guard_admins(&e)
- }
-
- /// Alias for callers that use guard-specific naming.
- pub fn get_guard_admins(e: Env) -> Vec {
- read_guard_admins(&e)
- }
-
- /// Returns the current multi-sig approval threshold.
- pub fn get_admin_threshold(e: Env) -> u32 {
- e.storage()
- .instance()
- .get(&DataKey::GuardThreshold)
- .unwrap_or(0)
- }
-
- /// Alias for callers that use guard-specific naming.
- pub fn get_guard_threshold(e: Env) -> u32 {
- Self::get_admin_threshold(e)
- }
-
- /// Returns the current primary pool admin.
- pub fn get_admin(e: Env) -> Result {
- read_admin(&e)
- }
-
- /// Add a new guard admin. Requires the current multi-sig threshold.
- pub fn add_admin(e: Env, approvers: Vec, new_admin: Address) -> Result<(), Error> {
- guard_require_multisig(&e, &approvers)?;
- let mut admins = read_guard_admins(&e);
- if !admins.iter().any(|a| a == new_admin) {
- admins.push_back(new_admin);
- write_guard_admins(&e, &admins);
- }
- Ok(())
- }
-
- /// Alias for callers that use guard-specific naming.
- pub fn add_guard_admin(
- e: Env,
- approvers: Vec,
- new_admin: Address,
- ) -> Result<(), Error> {
- Self::add_admin(e, approvers, new_admin)
- }
-
- /// Remove a guard admin. The admin set cannot be reduced below threshold.
- pub fn remove_admin(e: Env, approvers: Vec, admin: Address) -> Result<(), Error> {
- guard_require_multisig(&e, &approvers)?;
- let admins = read_guard_admins(&e);
- let threshold = Self::get_admin_threshold(e.clone());
- if admins.len() as u32 <= threshold {
- return Err(Error::Unauthorized);
- }
-
- let mut next_admins = Vec::new(&e);
- let mut found = false;
- for candidate in admins.iter() {
- if candidate == admin {
- found = true;
- } else {
- next_admins.push_back(candidate);
- }
- }
- if !found {
- return Err(Error::Unauthorized);
- }
-
- write_guard_admins(&e, &next_admins);
- if read_admin(&e)? == admin {
- if let Some(next_primary) = next_admins.get(0) {
- e.storage().instance().set(&DataKey::Admin, &next_primary);
- }
- }
- Ok(())
- }
-
- /// Alias for callers that use guard-specific naming.
- pub fn remove_guard_admin(
- e: Env,
- approvers: Vec,
- admin: Address,
- ) -> Result<(), Error> {
- Self::remove_admin(e, approvers, admin)
- }
-
- /// Replace one guard admin with another and update the primary pool admin
- /// when the replaced address is the current primary admin.
- pub fn rotate_admin(
- e: Env,
- approvers: Vec,
- old_admin: Address,
- new_admin: Address,
- ) -> Result<(), Error> {
- guard_require_multisig(&e, &approvers)?;
- if !guard_is_admin(&e, &old_admin) {
- return Err(Error::Unauthorized);
- }
-
- let admins = read_guard_admins(&e);
- let mut next_admins = Vec::new(&e);
- for candidate in admins.iter() {
- if candidate == old_admin {
- if !next_admins.iter().any(|a| a == new_admin) {
- next_admins.push_back(new_admin.clone());
- }
- } else if !next_admins.iter().any(|a| a == candidate) {
- next_admins.push_back(candidate);
- }
- }
-
- write_guard_admins(&e, &next_admins);
- if read_admin(&e)? == old_admin {
- e.storage().instance().set(&DataKey::Admin, &new_admin);
- }
- Ok(())
- }
-
- pub fn remove_admin(e: Env, approvers: Vec, admin: Address) -> Result<(), Error> {
- Self::remove_guard_admin(e, approvers, admin)
- }
-
- pub fn rotate_admin(
- e: Env,
- approvers: Vec,
- old_admin: Address,
- new_admin: Address,
- ) -> Result<(), Error> {
- guard_require_multisig(&e, &approvers)?;
- if !guard_is_admin(&e, &old_admin) {
- return Err(Error::Unauthorized);
- }
-
- let admins = guard_admins(&e);
- let mut new_admins = Vec::new(&e);
- for a in admins.iter() {
- if a == old_admin {
- if !new_admins.iter().any(|existing| existing == new_admin) {
- new_admins.push_back(new_admin.clone());
- }
- } else if !new_admins.iter().any(|existing| existing == a) {
- new_admins.push_back(a);
- }
- }
-
- e.storage()
- .instance()
- .set(&DataKey::GuardAdmins, &new_admins);
-
- if Self::get_admin(e.clone())? == old_admin {
- set_primary_admin(&e, new_admin)?;
- }
- Ok(())
- }
-
- pub fn get_fee(e: Env) -> i128 {
- load_pool(&e)
- .map(|p| p.fee_bps)
- .unwrap_or(DEFAULT_BASE_FEE_BPS)
- }
-
-
- save_guard(
- &e,
- &GuardState {
- pause_state: 0,
- admins: {
- let mut admins = Vec::new(&e);
- admins.push_back(admin);
- admins
- },
- signature_threshold: 1,
- },
- );
-
- Ok(())
- }
-
- pub fn get_fee(e: Env) -> i128 {
- e.storage()
- .instance()
- .get::<_, PoolState>(&DataKey::Pool)
- .map(|p| p.fee_bps)
- .unwrap_or(DEFAULT_BASE_FEE_BPS)
- }
-
- pub fn set_fee(e: Env, fee_bps: i128) -> Result<(), Error> {
- if !(0..=MAX_FEE_BPS).contains(&fee_bps) {
- return Err(Error::InvalidFee);
- }
-
- admin.require_auth();
- let pool = PoolState {
- admin: admin.clone(),
- token_a,
- token_b,
- reserve_a: 0,
- reserve_b: 0,
- total_shares: 0,
- fee_bps: 30,
- };
- save_pool(&e, &pool);
- // Initialize the EmergencyGuard with the admin as the sole approver.
- EmergencyGuard::initialize(e.clone(), vec![&e, admin], 1)
- .map_err(|_| Error::Unauthorized)?;
- Ok(())
- }
-
- /// Returns the current fee in basis points.
- pub fn get_fee(e: Env) -> Result {
- let pool = load_pool(&e)?;
- Ok(pool.fee_bps)
- }
-
- /// Admin-only: update the swap fee. Valid range: 0–100 bps.
- pub fn set_fee(e: Env, fee_bps: i128) -> Result<(), Error> {
- if !(0..=100).contains(&fee_bps) {
- return Err(Error::InvalidFee);
- }
- let admin = read_admin(&e)?;
- admin.require_auth();
- let mut pool = load_pool(&e)?;
- let old_fee = pool.fee_bps;
- pool.fee_bps = fee_bps;
- save_pool(&e, &pool);
-
- save_pool(&e, &pool);
- e.events().publish(
- (String::from_str(&e, "fee_changed"), pool.admin.clone()),
- FeeChangedEvent {
- admin: pool.admin,
- old_fee_bps: old_fee,
- new_fee_bps: fee_bps,
- },
- );
-
- Ok(())
- }
-
- pub fn configure_fee_oracle(
- e: Env,
- oracle_id: Address,
- oracle: Address,
- base_fee_bps: i128,
- timelock_ledgers: u32,
- ) -> Result<(), Error> {
- if !(0..=MAX_FEE_BPS).contains(&base_fee_bps) {
- return Err(Error::InvalidFee);
- }
-
- let mut pool = load_pool(&e)?;
- pool.admin.require_auth();
- pool.base_fee_bps = base_fee_bps;
- save_pool(&e, &pool);
-
- let admin = load_admin(&e)?;
- admin.require_auth();
- e.storage().instance().set(
- &DataKey::OracleConfig,
- &OracleConfig {
- oracle_id,
- base_fee_bps,
- timelock_ledgers,
- },
- );
- Ok(())
- }
-
- pub fn get_last_volatility_bps(e: Env) -> i128 {
- e.storage()
- .instance()
- .get(&DataKey::LastVolatilityBps)
- .unwrap_or(0)
- }
-
- pub fn get_pending_fee_update(e: Env) -> Option {
- e.storage().instance().get(&DataKey::PendingFeeUpdate)
- }
-
- pub fn sync_fee_from_oracle(e: Env) -> Result