From 9da7c4bd04e4e3060eac9b9eb726cb48325ba6c1 Mon Sep 17 00:00:00 2001 From: Pierre Date: Thu, 19 Sep 2024 11:23:08 +0800 Subject: [PATCH] feat: Amplification ratio (#5) * feat: Amplification ratio * rename to simply default * default dynamic slippage to avoid collision in jupiter-core-rs --- Cargo.lock | 193 ++++++++++++++++++++++++++++++++++- Cargo.toml | 2 + dynamic_slippage_config.json | 1 + src/lib.rs | 52 +++++++--- src/range.rs | 7 ++ 5 files changed, 240 insertions(+), 15 deletions(-) create mode 100644 src/range.rs diff --git a/Cargo.lock b/Cargo.lock index 614dbf1..7a0dd4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,17 @@ # It is not intended for manual editing. version = 3 +[[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" @@ -176,6 +187,18 @@ 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 = "blake3" version = "1.5.1" @@ -302,6 +325,28 @@ dependencies = [ "serde", ] +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytemuck" version = "1.17.0" @@ -325,6 +370,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytes" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" + [[package]] name = "cc" version = "1.1.13" @@ -446,6 +497,8 @@ name = "dynamic-slippage-config" version = "0.1.0" dependencies = [ "itertools 0.13.0", + "rust_decimal", + "rust_decimal_macros", "serde", "serde_json", "solana-program", @@ -469,6 +522,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "generic-array" version = "0.14.7" @@ -503,13 +562,22 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + [[package]] name = "hashbrown" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash", + "ahash 0.8.11", ] [[package]] @@ -798,6 +866,26 @@ 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" @@ -807,6 +895,12 @@ 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" @@ -887,6 +981,70 @@ dependencies = [ "bitflags", ] +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rust_decimal" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" +dependencies = [ + "arrayvec", + "borsh 1.5.1", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rust_decimal_macros" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da991f231869f34268415a49724c6578e740ad697ba0999199d6f22b3949332c" +dependencies = [ + "quote", + "rust_decimal", +] + [[package]] name = "rustc_version" version = "0.4.0" @@ -914,6 +1072,12 @@ 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 = "semver" version = "1.0.23" @@ -1001,6 +1165,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "smallvec" version = "1.13.2" @@ -1106,6 +1276,12 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "thiserror" version = "1.0.63" @@ -1179,6 +1355,12 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" + [[package]] name = "version_check" version = "0.9.5" @@ -1335,6 +1517,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index 9ed2b4f..8d2bdf2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,8 @@ edition = "2021" [dependencies] itertools = "0.13.0" +rust_decimal = "1.36.0" +rust_decimal_macros = "1.36.0" serde = "1.0.208" serde_json = "1.0.125" solana-program = "2.0.6" diff --git a/dynamic_slippage_config.json b/dynamic_slippage_config.json index 2fe5083..8076fb8 100644 --- a/dynamic_slippage_config.json +++ b/dynamic_slippage_config.json @@ -179,6 +179,7 @@ } ], "default": { + "amplificatioRatio": 1.5, "range": { "min": 30, "max": 300 diff --git a/src/lib.rs b/src/lib.rs index a1d972c..bc8ce74 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,17 +1,19 @@ +use range::Range; +use rust_decimal::Decimal; +use rust_decimal_macros::dec; use serde::Deserialize; use serde_json::{self, error::Result}; use solana_program::pubkey::Pubkey; mod field_as_string; +mod range; + +const DYNAMIC_SLIPPAGE_CONFIG_JSON: &str = include_str!("../dynamic_slippage_config.json"); -#[derive(Copy, Clone, Deserialize, PartialEq, Debug, Default)] -pub struct Range { - pub min: u16, - pub max: u16, -} pub struct Category { pub name: String, pub range: Range, + /// This range applies when the 2 traded mints belong to that category pub pair_range: Option, pub mints: Vec, } @@ -29,31 +31,44 @@ struct CategoryOriginal { #[serde(rename_all = "camelCase")] pub struct DeserializablePubkey(#[serde(with = "field_as_string")] pub Pubkey); +fn default_amplification_ratio() -> Decimal { + dec!(1.5) +} + #[derive(Deserialize)] #[serde(rename_all = "camelCase")] -pub struct DefaultSlippage { + +pub struct DynamicSlippageDefault { + #[serde(default = "default_amplification_ratio")] + pub amplification_ratio: Decimal, pub range: Range, } #[derive(Deserialize)] #[serde(rename_all = "camelCase")] -struct DynamicSlippageCategories { +struct DynamicSlippageConfigOriginal { categories: Vec, - default: DefaultSlippage, + default: DynamicSlippageDefault, } -const DYNAMIC_SLIPPAGE_CONFIG_JSON: &str = include_str!("../dynamic_slippage_config.json"); +pub struct DynamicSlippageConfig { + pub categories: Vec, + pub default: DynamicSlippageDefault, +} -pub fn deserialize_dynamic_slippage_config() -> Result<(DefaultSlippage, Vec)> { - let DynamicSlippageCategories { +fn deserialize_dynamic_slippage_config( + dynamic_slippage_config: &str, +) -> Result { + let DynamicSlippageConfigOriginal { categories, default, - } = serde_json::from_str::(DYNAMIC_SLIPPAGE_CONFIG_JSON)?; + } = serde_json::from_str::(dynamic_slippage_config)?; let categories = categories .into_iter() .map( |CategoryOriginal { name, + range, pair_range, mints, @@ -66,7 +81,15 @@ pub fn deserialize_dynamic_slippage_config() -> Result<(DefaultSlippage, Vec Result { + deserialize_dynamic_slippage_config(DYNAMIC_SLIPPAGE_CONFIG_JSON) } #[cfg(test)] @@ -77,7 +100,8 @@ mod tests { #[test] fn test_deserialize_dynamic_slippage_config() { - let (_, categories) = deserialize_dynamic_slippage_config().unwrap(); + let DynamicSlippageConfig { categories, .. } = + deserialize_embedded_dynamic_slippage_config().unwrap(); assert_eq!( categories.iter().map(|c| &c.name).collect::>(), diff --git a/src/range.rs b/src/range.rs new file mode 100644 index 0000000..6b00931 --- /dev/null +++ b/src/range.rs @@ -0,0 +1,7 @@ +use serde::Deserialize; + +#[derive(Copy, Clone, Deserialize, PartialEq, Debug, Default)] +pub struct Range { + pub min: u16, + pub max: u16, +}