From 1eed83b64f1c8d50d2cd27829210dc2cba66beb5 Mon Sep 17 00:00:00 2001 From: LimpidCrypto Date: Wed, 17 Jul 2024 08:42:50 +0200 Subject: [PATCH] add order_books --- .devcontainer/devcontainer.json | 31 + .github/dependabot.yml | 12 + .gitignore | 3 +- .vscode/launch.json | 21 + .vscode/settings.json | 5 + {xrplt => trading-lib}/.gitignore | 0 trading-lib/Cargo.toml | 30 + {xrplt => trading-lib}/LICENSE | 0 {xrplt => trading-lib}/README.md | 2 +- {xrplt => trading-lib}/src/account/README.md | 0 {xrplt => trading-lib}/src/lib.rs | 1 + trading-lib/src/models/currency.rs | 49 + trading-lib/src/models/mod.rs | 1 + trading-lib/src/order_books/exceptions.rs | 7 + trading-lib/src/order_books/mod.rs | 38 + trading-lib/src/order_books/order.rs | 164 ++ trading-lib/src/order_books/order_book.rs | 207 ++ .../src/trading_types/arbitrage/mod.rs | 6 + .../arbitrage/swap/exceptions.rs | 7 + .../src/trading_types/arbitrage/swap/mod.rs | 234 ++ .../trading_types/arbitrage/triangular/mod.rs | 1 + .../automated_market_maker/mod.rs | 1 + .../src/trading_types/market_maker/mod.rs | 1 + trading-lib/src/trading_types/mod.rs | 6 + {xrplt => trading-lib}/src/utils/README.md | 0 trading-lib/src/utils/mod.rs | 1 + {xrplt => trading-lib}/src/wallet/README.md | 0 trading-lib/tests/unit/common/dummy_data.rs | 48 + trading-lib/tests/unit/common/mod.rs | 2 + trading-lib/tests/unit/common/order_books.rs | 87 + trading-lib/tests/unit/mod.rs | 3 + trading-lib/tests/unit/order_books/mod.rs | 9 + xrpl-trading/.gitignore | 4 - xrpl-trading/Cargo.lock | 2585 +++++++++++++++++ xrpl-trading/Cargo.toml | 3 +- xrplt/Cargo.toml | 12 - xrplt/src/order_books/mod.rs | 0 xrplt/src/trading_types/arbitrage/mod.rs | 0 .../automated_market_maker/mod.rs | 0 xrplt/src/trading_types/market_maker/mod.rs | 0 xrplt/src/trading_types/mod.rs | 3 - xrplt/src/utils/mod.rs | 0 42 files changed, 3561 insertions(+), 23 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .github/dependabot.yml create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json rename {xrplt => trading-lib}/.gitignore (100%) create mode 100644 trading-lib/Cargo.toml rename {xrplt => trading-lib}/LICENSE (100%) rename {xrplt => trading-lib}/README.md (78%) rename {xrplt => trading-lib}/src/account/README.md (100%) rename {xrplt => trading-lib}/src/lib.rs (78%) create mode 100644 trading-lib/src/models/currency.rs create mode 100644 trading-lib/src/models/mod.rs create mode 100644 trading-lib/src/order_books/exceptions.rs create mode 100644 trading-lib/src/order_books/mod.rs create mode 100644 trading-lib/src/order_books/order.rs create mode 100644 trading-lib/src/order_books/order_book.rs create mode 100644 trading-lib/src/trading_types/arbitrage/mod.rs create mode 100644 trading-lib/src/trading_types/arbitrage/swap/exceptions.rs create mode 100644 trading-lib/src/trading_types/arbitrage/swap/mod.rs create mode 100644 trading-lib/src/trading_types/arbitrage/triangular/mod.rs create mode 100644 trading-lib/src/trading_types/automated_market_maker/mod.rs create mode 100644 trading-lib/src/trading_types/market_maker/mod.rs create mode 100644 trading-lib/src/trading_types/mod.rs rename {xrplt => trading-lib}/src/utils/README.md (100%) create mode 100644 trading-lib/src/utils/mod.rs rename {xrplt => trading-lib}/src/wallet/README.md (100%) create mode 100644 trading-lib/tests/unit/common/dummy_data.rs create mode 100644 trading-lib/tests/unit/common/mod.rs create mode 100644 trading-lib/tests/unit/common/order_books.rs create mode 100644 trading-lib/tests/unit/mod.rs create mode 100644 trading-lib/tests/unit/order_books/mod.rs create mode 100644 xrpl-trading/Cargo.lock delete mode 100644 xrplt/Cargo.toml delete mode 100644 xrplt/src/order_books/mod.rs delete mode 100644 xrplt/src/trading_types/arbitrage/mod.rs delete mode 100644 xrplt/src/trading_types/automated_market_maker/mod.rs delete mode 100644 xrplt/src/trading_types/market_maker/mod.rs delete mode 100644 xrplt/src/trading_types/mod.rs delete mode 100644 xrplt/src/utils/mod.rs diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..f8fff10 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/rust +{ + "name": "Rust", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/rust:1-1-bullseye" + + // Use 'mounts' to make the cargo cache persistent in a Docker Volume. + // "mounts": [ + // { + // "source": "devcontainer-cargo-cache-${devcontainerId}", + // "target": "/usr/local/cargo", + // "type": "volume" + // } + // ] + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "rustc --version", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..f33a02c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for more information: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates +# https://containers.dev/guide/dependabot + +version: 2 +updates: + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: weekly diff --git a/.gitignore b/.gitignore index 32bbae2..44f598d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,9 @@ target target_ci target_ci_stable -Cargo.lock third_party /Cargo.toml out/ .idea -.vscode \ No newline at end of file +# .vscode \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..eea5c9b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,21 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Cargo test", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib" + ] + }, + "args": [] + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..de72790 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "editor.formatOnSave": true, + "files.autoSave": "onFocusChange", + "editor.defaultFormatter": "rust-lang.rust-analyzer" +} \ No newline at end of file diff --git a/xrplt/.gitignore b/trading-lib/.gitignore similarity index 100% rename from xrplt/.gitignore rename to trading-lib/.gitignore diff --git a/trading-lib/Cargo.toml b/trading-lib/Cargo.toml new file mode 100644 index 0000000..ff08563 --- /dev/null +++ b/trading-lib/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "trading-lib" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.86" +rust_decimal = "1.35.0" +thiserror = "1.0.62" + +[dependencies.xrpl-rust] +git = "https://github.com/sephynox/xrpl-rust.git" +branch = "dev" +optional = true + +[dev-dependencies] +rand = "0.8.5" + +[features] +default = ["arbitrage", "market-maker", "xrpl"] +xrpl = ["xrpl-rust", "automated-market-maker"] +arbitrage = [] +market-maker = [] +automated-market-maker = [] + +[[test]] +name = "unit_tests" +path = "tests/unit/mod.rs" diff --git a/xrplt/LICENSE b/trading-lib/LICENSE similarity index 100% rename from xrplt/LICENSE rename to trading-lib/LICENSE diff --git a/xrplt/README.md b/trading-lib/README.md similarity index 78% rename from xrplt/README.md rename to trading-lib/README.md index 132d67b..7ce2d7d 100644 --- a/xrplt/README.md +++ b/trading-lib/README.md @@ -1 +1 @@ -A library providing utilities for arbitrage trading and market making on the XRPL. \ No newline at end of file +A library providing utilities for arbitrage trading and market making. \ No newline at end of file diff --git a/xrplt/src/account/README.md b/trading-lib/src/account/README.md similarity index 100% rename from xrplt/src/account/README.md rename to trading-lib/src/account/README.md diff --git a/xrplt/src/lib.rs b/trading-lib/src/lib.rs similarity index 78% rename from xrplt/src/lib.rs rename to trading-lib/src/lib.rs index ff79ba5..66008f1 100644 --- a/xrplt/src/lib.rs +++ b/trading-lib/src/lib.rs @@ -1,3 +1,4 @@ +pub mod models; pub mod order_books; pub mod trading_types; pub mod utils; diff --git a/trading-lib/src/models/currency.rs b/trading-lib/src/models/currency.rs new file mode 100644 index 0000000..58fb23f --- /dev/null +++ b/trading-lib/src/models/currency.rs @@ -0,0 +1,49 @@ +use std::borrow::Cow; + +extern crate xrpl; + +use xrpl::models::amount::{Amount, IssuedCurrencyAmount, XRPAmount}; +#[cfg(feature = "xrpl")] +use xrpl::models::currency::Currency as XRPLCurrency; + +#[derive(Debug, Clone, PartialEq)] +pub struct Currency<'a> { + pub currency_code: Cow<'a, str>, + pub issuer: Cow<'a, str>, + pub transfer_fee: f32, +} + +#[cfg(feature = "xrpl")] +impl<'a> Currency<'a> { + pub fn get_xrpl_amount(&self, amount: Cow<'a, str>) -> Amount<'a> { + match self.currency_code.as_ref() { + "XRP" => XRPAmount(amount).into(), + _ => IssuedCurrencyAmount::new(self.currency_code.clone(), self.issuer.clone(), amount) + .into(), + } + } +} + +#[cfg(feature = "xrpl")] +impl<'a> Currency<'a> { + pub fn from_xrpl(currency: XRPLCurrency<'a>, transfer_fee: Option) -> Self { + match currency { + XRPLCurrency::XRP(_) => Self { + currency_code: "XRP".into(), + issuer: "".into(), + transfer_fee: 0.0, + }, + XRPLCurrency::IssuedCurrency(issued_currency) => Self { + currency_code: issued_currency.currency, + issuer: issued_currency.issuer, + transfer_fee: transfer_fee.unwrap_or(0.0), + }, + } + } +} + +impl Currency<'_> { + pub fn is_same_currency(&self, other: &Self) -> bool { + self.currency_code == other.currency_code + } +} diff --git a/trading-lib/src/models/mod.rs b/trading-lib/src/models/mod.rs new file mode 100644 index 0000000..b4c705f --- /dev/null +++ b/trading-lib/src/models/mod.rs @@ -0,0 +1 @@ +pub mod currency; diff --git a/trading-lib/src/order_books/exceptions.rs b/trading-lib/src/order_books/exceptions.rs new file mode 100644 index 0000000..d77940a --- /dev/null +++ b/trading-lib/src/order_books/exceptions.rs @@ -0,0 +1,7 @@ +use thiserror::Error; + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Error)] +pub enum OrderBookException { + #[error("Invalid order")] + InvalidOrder, +} diff --git a/trading-lib/src/order_books/mod.rs b/trading-lib/src/order_books/mod.rs new file mode 100644 index 0000000..277e250 --- /dev/null +++ b/trading-lib/src/order_books/mod.rs @@ -0,0 +1,38 @@ +pub mod exceptions; +pub mod order; +pub mod order_book; + +use order_book::OrderBook; + +#[derive(Debug)] +pub struct OrderBooks<'a> { + pub order_books: Vec>, + pub liquidity_spread: f64, +} + +impl<'a> OrderBooks<'a> { + pub fn sort(&mut self) { + self.order_books + .iter_mut() + .for_each(|order_book| order_book.sort()); + } +} + +pub trait IsLiquid { + /// Returns true if the order book is liquid determained based on the provided `liquidity_spread`. + fn is_liquid(&self, liquidity_spread: f64) -> bool; +} + +pub trait Flip { + fn flip(&mut self); + + fn get_flipped(&self) -> Self + where + Self: Sized + Clone, + { + let mut flipped = self.clone(); + flipped.flip(); + + flipped + } +} diff --git a/trading-lib/src/order_books/order.rs b/trading-lib/src/order_books/order.rs new file mode 100644 index 0000000..a0346bf --- /dev/null +++ b/trading-lib/src/order_books/order.rs @@ -0,0 +1,164 @@ +use std::{cmp::Ordering, mem::swap}; + +use rust_decimal::{prelude::FromPrimitive, Decimal}; +#[cfg(feature = "xrpl")] +use xrpl::models::{ + amount::Amount, + currency::{Currency as XRPLCurrency, IssuedCurrency, XRP}, + ledger::Offer, + transactions::{OfferCreate, OfferCreateFlag}, + FlagCollection, +}; + +use crate::models::currency::Currency; + +use super::Flip; + +#[derive(Debug, Clone)] +pub struct Order<'a> { + pub base: Currency<'a>, + pub counter: Currency<'a>, + pub base_quantity: Decimal, + pub rate: Decimal, +} + +impl Flip for Order<'_> { + fn flip(&mut self) { + self.rate = Decimal::from(1) / self.rate; + self.base_quantity = self.base_quantity * self.rate; + swap(&mut self.base, &mut self.counter); + } +} + +impl PartialEq for Order<'_> { + fn eq(&self, other: &Self) -> bool { + self.rate == other.rate + } +} + +impl Eq for Order<'_> {} + +impl PartialOrd for Order<'_> { + fn partial_cmp(&self, other: &Self) -> Option { + self.rate.partial_cmp(&other.rate) + } +} + +impl Ord for Order<'_> { + fn cmp(&self, other: &Self) -> Ordering { + self.rate.cmp(&other.rate) + } +} + +impl Order<'_> { + pub fn calculate_counter_quantity_after_fee(&self) -> Decimal { + (self.base_quantity * self.rate) + * Decimal::from_f32(1.0 - self.counter.transfer_fee).unwrap() + } +} + +#[cfg(feature = "xrpl")] +impl<'a> From> for Order<'a> { + fn from(offer: Offer<'a>) -> Self { + let (taker_gets_currency, taker_gets_amount): (XRPLCurrency, String) = + match offer.taker_gets { + Amount::XRPAmount(xrp) => (XRP::new().into(), xrp.0.into()), + Amount::IssuedCurrencyAmount(issued_currency) => ( + IssuedCurrency::new(issued_currency.currency, issued_currency.issuer).into(), + issued_currency.value.into(), + ), + }; + let (taker_pays_currency, taker_pays_amount): (XRPLCurrency, String) = + match offer.taker_pays { + Amount::XRPAmount(xrp) => (XRP::new().into(), xrp.0.into()), + Amount::IssuedCurrencyAmount(issued_currency) => ( + IssuedCurrency::new(issued_currency.currency, issued_currency.issuer).into(), + issued_currency.value.into(), + ), + }; + let taker_gets_amount: Decimal = taker_gets_amount.parse().unwrap(); + let taker_pays_amount: Decimal = taker_pays_amount.parse().unwrap(); + + Self { + base: Currency::from_xrpl(taker_pays_currency, None), + counter: Currency::from_xrpl(taker_gets_currency, None), + base_quantity: taker_pays_amount, + rate: taker_gets_amount / taker_pays_amount, + } + } +} + +#[cfg(feature = "xrpl")] +impl<'a> Into> for Order<'a> { + fn into(self) -> OfferCreate<'a> { + let base_qty = self.base_quantity.to_string(); + let counter_qty = self.calculate_counter_quantity_after_fee().to_string(); + + OfferCreate::new( + "".into(), + None, + None, + Some(FlagCollection::new(vec![ + OfferCreateFlag::TfImmediateOrCancel, + OfferCreateFlag::TfSell, + ])), + None, + None, + None, + None, + None, + None, + self.counter.get_xrpl_amount(counter_qty.into()), + self.base.get_xrpl_amount(base_qty.into()), + None, + None, + ) + } +} + +#[cfg(test)] +mod order_tests { + use rust_decimal::{prelude::FromPrimitive, Decimal}; + use xrpl::models::{ + amount::{IssuedCurrencyAmount, XRPAmount}, + FlagCollection, + }; + + use super::*; + + #[test] + #[cfg(feature = "xrpl")] + fn test_from_offer() { + let offer = Offer::new( + FlagCollection::new(Vec::new()), + None, + None, + "r".into(), + "1".into(), + "10".into(), + "".into(), + "".into(), + 0, + 0, + IssuedCurrencyAmount::new("USD".into(), "issuer".into(), "10".into()).into(), + XRPAmount("20".into()).into(), + None, + ); + let order = Order::from(offer); + assert_eq!( + order, + Order { + base: Currency::from_xrpl(XRPLCurrency::XRP(XRP::new()), None), + counter: Currency::from_xrpl( + XRPLCurrency::IssuedCurrency(IssuedCurrency::new( + "USD".into(), + "issuer".into() + )), + None + ), + base_quantity: Decimal::from(20), + rate: Decimal::from_f32(0.5).unwrap(), + } + ); + } +} diff --git a/trading-lib/src/order_books/order_book.rs b/trading-lib/src/order_books/order_book.rs new file mode 100644 index 0000000..53c2594 --- /dev/null +++ b/trading-lib/src/order_books/order_book.rs @@ -0,0 +1,207 @@ +use std::mem::swap; + +use anyhow::{bail, Result}; +use rust_decimal::prelude::ToPrimitive; + +use crate::models::currency::Currency; + +use super::{exceptions::OrderBookException, order::Order, Flip, IsLiquid}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum OrderBookSideType { + Bids, + Asks, +} + +#[derive(Debug, Clone)] +pub struct OrderBookSide<'a> { + pub side_type: OrderBookSideType, + pub orders: Vec>, +} + +impl<'a> From<(&[Order<'a>], OrderBookSideType)> for OrderBookSide<'a> { + fn from((orders, side_type): (&[Order<'a>], OrderBookSideType)) -> Self { + Self { + side_type, + orders: orders.to_vec(), + } + } +} + +#[derive(Debug, Clone)] +pub struct OrderBook<'a> { + // The currency that is being sold. + pub base: Currency<'a>, + // The currency that is being bought. + pub counter: Currency<'a>, + pub bids: OrderBookSide<'a>, + pub asks: OrderBookSide<'a>, +} + +impl<'a> Flip for OrderBook<'a> { + fn flip(&mut self) { + self.bids.orders.iter_mut().for_each(|order| order.flip()); + self.asks.orders.iter_mut().for_each(|order| order.flip()); + swap(&mut self.bids, &mut self.asks); + swap(&mut self.base, &mut self.counter); + } +} + +// impl IsProfitable for OrderBook<'_> { +// /// Returns true if any bid in self is profitable against any ask in other. +// fn is_profitable(&self, other: &OrderBook<'_>) -> bool { +// self.bids +// .orders +// .iter() +// .any(|bid| other.asks.orders.iter().any(|ask| bid.is_profitable(ask))) +// } +// } + +impl IsLiquid for OrderBook<'_> { + fn is_liquid(&self, liquidity_spread: f64) -> bool { + let order_book_spread = self.calculate_spread_pct(); + order_book_spread <= liquidity_spread + } +} + +impl PartialEq for OrderBook<'_> { + fn eq(&self, other: &Self) -> bool { + self.bids.orders == other.bids.orders + } +} + +impl Eq for OrderBook<'_> {} + +impl<'a> OrderBook<'a> { + /// Sorts the bids in descending order and the asks in ascending order. + pub fn sort(&mut self) { + self.bids.orders.sort_by(|a, b| b.cmp(a)); + self.asks.orders.sort(); + } + + pub fn calculate_spread_pct(&self) -> f64 { + let best_bid = self.bids.orders.first().unwrap(); + let best_ask = self.asks.orders.first().unwrap(); + let spread = best_ask.rate - best_bid.rate; + let spread_pct = spread / best_bid.rate; + spread_pct.to_f64().unwrap() + } + + pub fn determain_order_book_side_type(&self, order: &Order<'_>) -> Option { + if order.base == self.base && order.counter == self.counter { + Some(OrderBookSideType::Bids) + } else if order.base == self.counter && order.counter == self.base { + Some(OrderBookSideType::Asks) + } else { + None + } + } + + pub fn is_order_for_order_book(&self, order: &Order<'_>) -> bool { + self.determain_order_book_side_type(order).is_some() + } + + pub fn add_order<'b: 'a>(&mut self, mut order: Order<'b>) -> Result<()> { + let order_book_side = self.determain_order_book_side_type(&order); + match order_book_side { + Some(OrderBookSideType::Bids) => self.bids.orders.push(order), + Some(OrderBookSideType::Asks) => { + order.flip(); + self.asks.orders.push(order) + } + None => bail!(OrderBookException::InvalidOrder), + } + self.sort(); + Ok(()) + } +} + +#[cfg(test)] +mod order_book_tests { + use rust_decimal::{prelude::FromPrimitive, Decimal}; + + use super::*; + + #[test] + #[cfg(feature = "xrpl")] + fn test_sort_order_book() { + use xrpl::models::currency::{Currency as XRPLCurrency, IssuedCurrency, XRP}; + let mut order_book = OrderBook { + base: Currency::from_xrpl(XRPLCurrency::XRP(XRP::new()), None), + counter: Currency::from_xrpl( + XRPLCurrency::IssuedCurrency(IssuedCurrency::new( + "USD".into(), + "rDk7FQvkQxQQNGTtfM2Fr66s7Nm3k87vdS".into(), + )), + None, + ), + bids: OrderBookSide { + side_type: OrderBookSideType::Bids, + orders: vec![ + Order { + base: Currency::from_xrpl(XRPLCurrency::XRP(XRP::new()), None), + counter: Currency::from_xrpl( + XRPLCurrency::IssuedCurrency(IssuedCurrency::new( + "USD".into(), + "rDk7FQvkQxQQNGTtfM2Fr66s7Nm3k87vdS".into(), + )), + None, + ), + base_quantity: Decimal::from(80), + rate: Decimal::from_f32(0.23).unwrap(), + }, + Order { + base: Currency::from_xrpl(XRPLCurrency::XRP(XRP::new()), None), + counter: Currency::from_xrpl( + XRPLCurrency::IssuedCurrency(IssuedCurrency::new( + "USD".into(), + "rDk7FQvkQxQQNGTtfM2Fr66s7Nm3k87vdS".into(), + )), + None, + ), + base_quantity: Decimal::from(100), + rate: Decimal::from_f32(0.24).unwrap(), + }, + ], + }, + asks: OrderBookSide { + side_type: OrderBookSideType::Asks, + orders: vec![ + Order { + base: Currency::from_xrpl(XRPLCurrency::XRP(XRP::new()), None), + counter: Currency::from_xrpl( + XRPLCurrency::IssuedCurrency(IssuedCurrency::new( + "USD".into(), + "rDk7FQvkQxQQNGTtfM2Fr66s7Nm3k87vdS".into(), + )), + None, + ), + base_quantity: Decimal::from(100), + rate: Decimal::from_f32(0.26).unwrap(), + }, + Order { + base: Currency::from_xrpl(XRPLCurrency::XRP(XRP::new()), None), + counter: Currency::from_xrpl( + XRPLCurrency::IssuedCurrency(IssuedCurrency::new( + "USD".into(), + "rDk7FQvkQxQQNGTtfM2Fr66s7Nm3k87vdS".into(), + )), + None, + ), + base_quantity: Decimal::from(90), + rate: Decimal::from_f32(0.25).unwrap(), + }, + ], + }, + }; + order_book.sort(); + assert_eq!( + order_book.bids.orders[0].rate, + Decimal::from_f32(0.24).unwrap() + ); + assert_eq!( + order_book.asks.orders[0].rate, + Decimal::from_f32(0.25).unwrap() + ); + } +} diff --git a/trading-lib/src/trading_types/arbitrage/mod.rs b/trading-lib/src/trading_types/arbitrage/mod.rs new file mode 100644 index 0000000..3fe2686 --- /dev/null +++ b/trading-lib/src/trading_types/arbitrage/mod.rs @@ -0,0 +1,6 @@ +pub mod swap; +pub mod triangular; + +pub trait IsProfitable { + fn is_profitable(&self) -> bool; +} diff --git a/trading-lib/src/trading_types/arbitrage/swap/exceptions.rs b/trading-lib/src/trading_types/arbitrage/swap/exceptions.rs new file mode 100644 index 0000000..17851ab --- /dev/null +++ b/trading-lib/src/trading_types/arbitrage/swap/exceptions.rs @@ -0,0 +1,7 @@ +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum SwapArbitrageException { + #[error("Invalid order book combination. The base currency of the first order book must be the counter currency of the second order book.")] + InvalidOrderBookCombo, +} diff --git a/trading-lib/src/trading_types/arbitrage/swap/mod.rs b/trading-lib/src/trading_types/arbitrage/swap/mod.rs new file mode 100644 index 0000000..6e49940 --- /dev/null +++ b/trading-lib/src/trading_types/arbitrage/swap/mod.rs @@ -0,0 +1,234 @@ +pub mod exceptions; + +use std::borrow::Cow; + +use anyhow::{bail, Result}; +use exceptions::SwapArbitrageException; +#[cfg(feature = "xrpl")] +use xrpl::models::transactions::OfferCreate; + +use crate::{ + models::currency::Currency, + order_books::{order::Order, order_book::OrderBook, Flip, OrderBooks}, +}; + +use super::IsProfitable; + +/// Represents a profitable swap trade between two order books from the perspective of the trader. +/// There are different combinations of how orders of two order books can be swapped: +/// ### 1. Example (Trade for more XRP) +/// *Order Book 1*: XRP/USD:GateHub
+/// *Order Book 2*: XRP/USD:Bitstamp
+/// *Consuming Bid of XRP/USD:GateHub (counterparty wants to buy XRP with USD)*: XRP -> USD:GateHub (you sell XRP for USD)
+/// *Consuming Ask of XRP/USD:Bitstamp (counterparty wants to buy USD with XRP)*: USD:Bitstamp -> XRP (you buy XRP with USD) +/// +/// ### 2. Example (Trade for more USD) +/// *Order Book 1*: XRP/USD:GateHub
+/// *Order Book 2*: XRP/USD:Bitstamp
+/// *Consuming Ask of XRP/USD:GateHub (counterparty wants to buy USD for XRP)*: USD:GateHub -> XRP (you sell USD for XRP)
+/// *Consuming Bid of XRP/USD:Bitstamp (counterparty wants to buy XRP with USD)*: XRP -> USD:Bitstamp (you buy USD with XRP) +/// +/// ### 3. Example (Trade for more XRP with second order book flipped) +/// *Order Book 1*: XRP/USD:GateHub
+/// *Order Book 2*: USD:Bitstamp/XRP
+/// *Consuming Bid of XRP/USD:GateHub (counterparty wants to buy XRP with USD)*: XRP -> USD:GateHub (you sell XRP for USD)
+/// *Consuming Bid of USD:Bitstamp/XRP (counterparty wants to buy XRP with USD)*: USD:Bitstamp -> XRP (you buy XRP with USD) +/// +/// ### 4. Example (Trade for more USD with second order book flipped) +/// *Order Book 1*: XRP/USD:GateHub
+/// *Order Book 2*: USD:Bitstamp/XRP
+/// *Consuming Ask of XRP/USD:GateHub (counterparty wants to buy USD for XRP)*: USD:GateHub -> XRP (you sell USD for XRP)
+/// *Consuming Ask of USD:Bitstamp/XRP (counterparty wants to buy XRP with USD)*: XRP -> USD:Bitstamp (you buy USD with XRP) +/// +/// ### 5. Example (Trade for more XRP with first order books flipped) +/// *Order Book 1*: USD:GateHub/XRP
+/// *Order Book 2*: XRP/USD:Bitstamp
+/// *Consuming Ask of USD:GateHub/XRP (counterparty wants to buy XRP with USD)*: XRP -> USD:GateHub (you sell XRP for USD)
+/// *Consuming Ask of XRP/USD:Bitstamp (counterparty wants to buy USD with XRP)*: USD:Bitstamp -> XRP (you buy XRP with USD) +/// +/// ### 6. Example (Trade for more USD with first order books flipped) +/// *Order Book 1*: USD:GateHub/XRP
+/// *Order Book 2*: XRP/USD:Bitstamp
+/// *Consuming Bid of USD:GateHub/XRP (counterparty wants to buy USD for XRP)*: USD:GateHub -> XRP (you sell USD for XRP)
+/// *Consuming Bid of XRP/USD:Bitstamp (counterparty wants to buy XRP with USD)*: XRP -> USD:Bitstamp (you buy USD with XRP) +#[derive(Debug, Clone, PartialEq)] +pub struct SwapTrade<'a> { + pub sell_order: Order<'a>, + pub buy_order: Order<'a>, + pub starting_currency: Currency<'a>, +} + +#[cfg(feature = "xrpl")] +impl<'a> Into<(OfferCreate<'a>, OfferCreate<'a>)> for SwapTrade<'a> { + fn into(self) -> (OfferCreate<'a>, OfferCreate<'a>) { + (self.sell_order.into(), self.buy_order.into()) + } +} + +impl IsProfitable for SwapTrade<'_> { + fn is_profitable(&self) -> bool { + let counter_quantity_after_fee = self.sell_order.calculate_counter_quantity_after_fee(); + let mut other = self.buy_order.clone(); + if counter_quantity_after_fee < other.base_quantity { + other.base_quantity = counter_quantity_after_fee; + } + + counter_quantity_after_fee < other.calculate_counter_quantity_after_fee() + } +} + +impl<'a> TryFrom<(&mut OrderBook<'a>, &mut OrderBook<'a>, Cow<'a, str>)> for SwapTrade<'a> { + type Error = anyhow::Error; + + fn try_from( + (sell_order_book, buy_order_book, trading_currency): ( + &mut OrderBook<'a>, + &mut OrderBook<'a>, + Cow<'a, str>, + ), + ) -> Result { + sell_order_book.sort(); + buy_order_book.sort(); + if sell_order_book.base.is_same_currency(&buy_order_book.base) + && sell_order_book + .counter + .is_same_currency(&buy_order_book.counter) + && sell_order_book.base.currency_code == trading_currency + && buy_order_book.base.currency_code == trading_currency + { + // 1. Example (Trade for more XRP) + // *Order Book 1*: XRP/USD:GateHub
+ // *Order Book 2*: XRP/USD:Bitstamp
+ // *Consuming Bid of XRP/USD:GateHub*: XRP -> USD:GateHub (sell XRP)
+ // *Consuming Ask of XRP/USD:Bitstamp*: USD:Bitstamp -> XRP (buy XRP) + let mut buy_order = buy_order_book.asks.orders[0].clone(); + buy_order.flip(); + Ok(SwapTrade { + sell_order: sell_order_book.bids.orders[0].clone(), + buy_order, + starting_currency: sell_order_book.base.clone(), + }) + } else if sell_order_book.base.is_same_currency(&buy_order_book.base) + && sell_order_book + .counter + .is_same_currency(&buy_order_book.counter) + && sell_order_book.counter.currency_code == trading_currency + && buy_order_book.counter.currency_code == trading_currency + { + // 2. Example (Trade for more USD) + // *Order Book 1*: XRP/USD:GateHub
+ // *Order Book 2*: XRP/USD:Bitstamp
+ // *Consuming Ask of XRP/USD:GateHub*: USD:GateHub -> XRP (sell USD)
+ // *Consuming Bid of XRP/USD:Bitstamp*: XRP -> USD:Bitstamp (buy USD) + let mut sell_order = sell_order_book.asks.orders[0].clone(); + sell_order.flip(); + Ok(SwapTrade { + sell_order, + buy_order: buy_order_book.bids.orders[0].clone(), + starting_currency: sell_order_book.counter.clone(), + }) + } else if sell_order_book + .base + .is_same_currency(&buy_order_book.counter) + && sell_order_book + .counter + .is_same_currency(&buy_order_book.base) + && sell_order_book.base.currency_code == trading_currency + && buy_order_book.counter.currency_code == trading_currency + { + // ### 3. Example (Trade for more XRP with second order book flipped) + // *Order Book 1*: XRP/USD:GateHub
+ // *Order Book 2*: USD:Bitstamp/XRP
+ // *Consuming Bid of XRP/USD:GateHub*: XRP -> USD:GateHub (sell XRP)
+ // *Consuming Bid of USD:Bitstamp/XRP*: USD:Bitstamp -> XRP (buy XRP) + Ok(SwapTrade { + sell_order: sell_order_book.bids.orders[0].clone(), + buy_order: buy_order_book.bids.orders[0].clone(), + starting_currency: sell_order_book.base.clone(), + }) + } else if sell_order_book + .base + .is_same_currency(&buy_order_book.counter) + && sell_order_book + .counter + .is_same_currency(&buy_order_book.base) + && sell_order_book.counter.currency_code == trading_currency + && buy_order_book.base.currency_code == trading_currency + { + // ### 4. Example (Trade for more USD with second order book flipped) + // *Order Book 1*: XRP/USD:GateHub
+ // *Order Book 2*: USD:Bitstamp/XRP
+ // *Consuming Ask of XRP/USD:GateHub*: USD:GateHub -> XRP (sell USD)
+ // *Consuming Ask of USD:Bitstamp/XRP*: XRP -> USD:Bitstamp (buy USD) + let mut sell_order = sell_order_book.asks.orders[0].clone(); + sell_order.flip(); + let mut buy_order = buy_order_book.asks.orders[0].clone(); + buy_order.flip(); + Ok(SwapTrade { + sell_order, + buy_order, + starting_currency: sell_order_book.counter.clone(), + }) + } else { + bail!(SwapArbitrageException::InvalidOrderBookCombo) + } + } +} + +impl GetProfitableTrades for OrderBooks<'_> { + fn get_profitable_trades(&self) -> Vec> { + let mut profitable_trades = Vec::new(); + for i in 0..self.order_books.len() { + for j in i + 1..self.order_books.len() { + let mut order_book_1 = self.order_books[i].clone(); + order_book_1.sort(); + let mut order_book_2 = self.order_books[j].clone(); + order_book_2.sort(); + let trading_base_currency = order_book_1.base.clone(); + let trading_counter_currency = order_book_1.counter.clone(); + let trade_1 = SwapTrade::try_from(( + &mut order_book_1, + &mut order_book_2, + trading_base_currency.currency_code.clone(), + )) + .unwrap(); + let trade_2 = SwapTrade::try_from(( + &mut order_book_1, + &mut order_book_2, + trading_counter_currency.currency_code.clone(), + )) + .unwrap(); + let trade_3 = SwapTrade::try_from(( + &mut order_book_2, + &mut order_book_1, + trading_base_currency.currency_code.clone(), + )) + .unwrap(); + let trade_4 = SwapTrade::try_from(( + &mut order_book_2, + &mut order_book_1, + trading_counter_currency.currency_code.clone(), + )) + .unwrap(); + if trade_1.is_profitable() { + profitable_trades.push(trade_1); + } + if trade_2.is_profitable() { + profitable_trades.push(trade_2); + } + if trade_3.is_profitable() { + profitable_trades.push(trade_3); + } + if trade_4.is_profitable() { + profitable_trades.push(trade_4); + } + } + } + + profitable_trades + } +} + +pub trait GetProfitableTrades { + fn get_profitable_trades(&self) -> Vec>; +} diff --git a/trading-lib/src/trading_types/arbitrage/triangular/mod.rs b/trading-lib/src/trading_types/arbitrage/triangular/mod.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/trading-lib/src/trading_types/arbitrage/triangular/mod.rs @@ -0,0 +1 @@ + diff --git a/trading-lib/src/trading_types/automated_market_maker/mod.rs b/trading-lib/src/trading_types/automated_market_maker/mod.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/trading-lib/src/trading_types/automated_market_maker/mod.rs @@ -0,0 +1 @@ + diff --git a/trading-lib/src/trading_types/market_maker/mod.rs b/trading-lib/src/trading_types/market_maker/mod.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/trading-lib/src/trading_types/market_maker/mod.rs @@ -0,0 +1 @@ + diff --git a/trading-lib/src/trading_types/mod.rs b/trading-lib/src/trading_types/mod.rs new file mode 100644 index 0000000..7d13408 --- /dev/null +++ b/trading-lib/src/trading_types/mod.rs @@ -0,0 +1,6 @@ +#[cfg(feature = "arbitrage")] +pub mod arbitrage; +#[cfg(feature = "automated-market-maker")] +pub mod automated_market_maker; +#[cfg(feature = "market-maker")] +pub mod market_maker; diff --git a/xrplt/src/utils/README.md b/trading-lib/src/utils/README.md similarity index 100% rename from xrplt/src/utils/README.md rename to trading-lib/src/utils/README.md diff --git a/trading-lib/src/utils/mod.rs b/trading-lib/src/utils/mod.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/trading-lib/src/utils/mod.rs @@ -0,0 +1 @@ + diff --git a/xrplt/src/wallet/README.md b/trading-lib/src/wallet/README.md similarity index 100% rename from xrplt/src/wallet/README.md rename to trading-lib/src/wallet/README.md diff --git a/trading-lib/tests/unit/common/dummy_data.rs b/trading-lib/tests/unit/common/dummy_data.rs new file mode 100644 index 0000000..3ba2f0a --- /dev/null +++ b/trading-lib/tests/unit/common/dummy_data.rs @@ -0,0 +1,48 @@ +use rand::Rng; +use rust_decimal::prelude::*; +use trading_lib::models::currency::Currency; + +pub fn generate_currency<'a>() -> Currency<'a> { + let currency = Currency { + currency_code: generate_random_currency_code().into(), + issuer: generate_random_issuer().into(), + transfer_fee: generate_random_f32(0.0, 0.5), + }; + currency +} + +pub fn generate_random_currency_code() -> String { + let currency_code = generate_random_string(3); + currency_code.to_uppercase() +} + +pub fn generate_random_issuer() -> String { + let issuer = generate_random_string(10); + issuer +} + +/// Generate a random string of a given length with both uppercase and lowercase characters. +pub fn generate_random_string(len: u8) -> String { + let mut rng = rand::thread_rng(); + let s: String = (0..len) + .map(|_| { + let choice = rng.gen_range(0..2); + if choice == 0 { + rng.gen_range(b'A'..=b'Z') as char + } else { + rng.gen_range(b'a'..=b'z') as char + } + }) + .collect(); + s +} + +pub fn generate_random_decimal(min: f32, max: f32) -> Decimal { + let random_f32 = generate_random_f32(min, max); + Decimal::from_f32(random_f32).unwrap() +} + +pub fn generate_random_f32(min: f32, max: f32) -> f32 { + let mut rng = rand::thread_rng(); + rng.gen_range(min..max) +} diff --git a/trading-lib/tests/unit/common/mod.rs b/trading-lib/tests/unit/common/mod.rs new file mode 100644 index 0000000..854d077 --- /dev/null +++ b/trading-lib/tests/unit/common/mod.rs @@ -0,0 +1,2 @@ +pub mod dummy_data; +pub mod order_books; diff --git a/trading-lib/tests/unit/common/order_books.rs b/trading-lib/tests/unit/common/order_books.rs new file mode 100644 index 0000000..df3d609 --- /dev/null +++ b/trading-lib/tests/unit/common/order_books.rs @@ -0,0 +1,87 @@ +use std::borrow::Cow; + +use trading_lib::order_books::{ + order::Order, + order_book::{OrderBook, OrderBookSideType}, + Flip, OrderBooks, +}; + +use super::dummy_data::{ + generate_currency, generate_random_currency_code, generate_random_decimal, +}; + +fn generate_orders<'a>( + num: usize, + base_currency: Option>, + counter_currency: Option>, +) -> Vec> { + let mut base = generate_currency(); + if let Some(base_currency) = base_currency { + base.currency_code = base_currency; + } + let mut counter = generate_currency(); + if let Some(counter_currency) = counter_currency { + counter.currency_code = counter_currency; + } + let mut rate = generate_random_decimal(0.01, 1.0); + let mut orders = Vec::new(); + for _ in 0..num { + rate *= generate_random_decimal(1.05, 1.2); + orders.push(Order { + base: base.clone(), + counter: counter.clone(), + base_quantity: generate_random_decimal(1.0, 100.0), + rate, + }); + } + + orders +} + +fn generate_order_books_with_same_currency_codes<'a>( + num: usize, + num_orders: usize, +) -> Vec> { + let base_currency_code = generate_random_currency_code(); + let counter_currency_code = generate_random_currency_code(); + let mut order_books = Vec::new(); + for _ in 0..num { + let orders = generate_orders( + num_orders, + Some(base_currency_code.clone().into()), + Some(counter_currency_code.clone().into()), + ); + let base_currency = orders[0].base.clone(); + let counter_currency = orders[0].counter.clone(); + let (bids, asks) = orders.split_at(num_orders / 2); + let mut order_book = OrderBook { + base: base_currency, + counter: counter_currency, + bids: (bids, OrderBookSideType::Bids).into(), + asks: (asks, OrderBookSideType::Asks).into(), + }; + if rand::random() { + order_book.flip(); + } + order_books.push(order_book); + } + + order_books +} + +pub fn generate_order_books<'a>( + num_currency_pairs: usize, + num_order_books_per_currency_pair: usize, +) -> OrderBooks<'a> { + let mut order_books = Vec::new(); + for _ in 0..num_currency_pairs { + let order_books_with_same_currency_codes = + generate_order_books_with_same_currency_codes(num_order_books_per_currency_pair, 10); + order_books.extend(order_books_with_same_currency_codes); + } + + OrderBooks { + order_books, + liquidity_spread: 0.1, + } +} diff --git a/trading-lib/tests/unit/mod.rs b/trading-lib/tests/unit/mod.rs new file mode 100644 index 0000000..a364dba --- /dev/null +++ b/trading-lib/tests/unit/mod.rs @@ -0,0 +1,3 @@ +mod common; + +mod order_books; diff --git a/trading-lib/tests/unit/order_books/mod.rs b/trading-lib/tests/unit/order_books/mod.rs new file mode 100644 index 0000000..699b780 --- /dev/null +++ b/trading-lib/tests/unit/order_books/mod.rs @@ -0,0 +1,9 @@ +use super::common::order_books::generate_order_books; +use trading_lib::trading_types::arbitrage::swap::GetProfitableTrades; + +#[test] +fn test_() { + let mut order_books = generate_order_books(1, 5); + order_books.sort(); + dbg!(order_books.get_profitable_trades()); +} diff --git a/xrpl-trading/.gitignore b/xrpl-trading/.gitignore index 26a6b27..43c09e4 100644 --- a/xrpl-trading/.gitignore +++ b/xrpl-trading/.gitignore @@ -2,10 +2,6 @@ # will have compiled files and executables /target/ -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - # These are backup files generated by rustfmt **/*.rs.bk diff --git a/xrpl-trading/Cargo.lock b/xrpl-trading/Cargo.lock new file mode 100644 index 0000000..aadeaa0 --- /dev/null +++ b/xrpl-trading/Cargo.lock @@ -0,0 +1,2585 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.71", + "syn_derive", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2 0.10.8", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" + +[[package]] +name = "cc" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.6", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "critical-section" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.71", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive-new" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "embassy-futures" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" + +[[package]] +name = "embassy-sync" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e0c49ff02ebe324faf3a8653ba91582e2d0a7fdef5bc88f449d5aa1bfcc05c" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io-async", + "futures-util", + "heapless 0.8.0", +] + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "embedded-io-async" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" +dependencies = [ + "embedded-io", +] + +[[package]] +name = "embedded-websocket" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9507c2a5614887a69183d80ccd86bc397fecd31a678dec4dc1e474a9bc407" +dependencies = [ + "base64 0.13.1", + "byteorder", + "futures", + "heapless 0.7.17", + "httparse", + "rand_core 0.6.4", + "sha1", +] + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "h2" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", + "serde", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32 0.2.1", + "rustc_version", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32 0.3.1", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", + "serde", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "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.71", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit", +] + +[[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", + "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.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc 0.2.0", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_hc" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b363d4f6370f88d62bf586c80405657bde0f0e1b8945d47d2ad59b906cb4f54" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rust_decimal" +version = "1.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.23.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "rustls-webpki" +version = "0.102.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.6", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.71", +] + +[[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.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "thiserror" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "thiserror-impl-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "thiserror-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea" +dependencies = [ + "thiserror-impl-no-std", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +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.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +dependencies = [ + "futures-util", + "log", + "native-tls", + "tokio", + "tokio-native-tls", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "trading-lib" +version = "0.1.0" +dependencies = [ + "anyhow", + "rust_decimal", + "thiserror", + "xrpl-rust", +] + +[[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.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "native-tls", + "rand 0.8.5", + "sha1", + "thiserror", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xrpl-rust" +version = "0.2.0" +source = "git+https://github.com/sephynox/xrpl-rust.git?branch=dev#e827d7a00103c9e0a302c50cc31b7262969d164b" +dependencies = [ + "anyhow", + "bs58", + "bytes", + "chrono", + "crypto-bigint", + "derive-new", + "ed25519-dalek", + "embassy-futures", + "embassy-sync", + "embedded-io-async", + "embedded-websocket", + "fnv", + "futures", + "hashbrown 0.14.5", + "hex", + "indexmap 2.2.6", + "lazy_static", + "rand 0.8.5", + "rand_core 0.6.4", + "rand_hc 0.3.2", + "regex", + "reqwest", + "ripemd", + "rust_decimal", + "secp256k1", + "serde", + "serde_json", + "serde_repr", + "serde_with", + "sha2 0.10.8", + "strum", + "strum_macros", + "thiserror-no-std", + "tokio-tungstenite", + "tokio-util", + "url", + "zeroize", +] + +[[package]] +name = "xrpl-trading" +version = "0.1.0" +dependencies = [ + "trading-lib", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] diff --git a/xrpl-trading/Cargo.toml b/xrpl-trading/Cargo.toml index a2c914b..aa2c8ca 100644 --- a/xrpl-trading/Cargo.toml +++ b/xrpl-trading/Cargo.toml @@ -1,8 +1,9 @@ [package] -name = "xrpltui" +name = "xrpl-trading" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +trading-lib = { path = "../trading-lib" } diff --git a/xrplt/Cargo.toml b/xrplt/Cargo.toml deleted file mode 100644 index e1d9688..0000000 --- a/xrplt/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "xrplt" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] - -[dependencies.xrpl-rust] -git = "https://github.com/sephynox/xrpl-rust.git" -branch = "dev" diff --git a/xrplt/src/order_books/mod.rs b/xrplt/src/order_books/mod.rs deleted file mode 100644 index e69de29..0000000 diff --git a/xrplt/src/trading_types/arbitrage/mod.rs b/xrplt/src/trading_types/arbitrage/mod.rs deleted file mode 100644 index e69de29..0000000 diff --git a/xrplt/src/trading_types/automated_market_maker/mod.rs b/xrplt/src/trading_types/automated_market_maker/mod.rs deleted file mode 100644 index e69de29..0000000 diff --git a/xrplt/src/trading_types/market_maker/mod.rs b/xrplt/src/trading_types/market_maker/mod.rs deleted file mode 100644 index e69de29..0000000 diff --git a/xrplt/src/trading_types/mod.rs b/xrplt/src/trading_types/mod.rs deleted file mode 100644 index b4a2533..0000000 --- a/xrplt/src/trading_types/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod arbitrage; -pub mod automated_market_maker; -pub mod market_maker; diff --git a/xrplt/src/utils/mod.rs b/xrplt/src/utils/mod.rs deleted file mode 100644 index e69de29..0000000