From 09f5d141603cf309b62abd4bcf825d12f11ec5d4 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Mon, 10 Jun 2024 21:50:38 +0800 Subject: [PATCH 01/13] feat: token 2022 + bump anchor to 0.29.0 to support extension type --- Cargo.lock | 472 ++++++++++++++++-- programs/lb_clmm/Cargo.toml | 8 +- programs/lb_clmm/src/errors.rs | 12 + .../lb_clmm/src/instructions/claim_fee.rs | 7 +- .../lb_clmm/src/instructions/claim_fee2.rs | 59 +++ .../src/instructions/initialize_lb_pair.rs | 5 +- .../src/instructions/initialize_lb_pair2.rs | 110 ++++ .../src/instructions/initialize_reward.rs | 4 +- .../instructions/initialize_token_badge.rs | 35 ++ programs/lb_clmm/src/instructions/mod.rs | 3 + programs/lb_clmm/src/lib.rs | 20 + programs/lb_clmm/src/state/mod.rs | 1 + programs/lb_clmm/src/state/token_badge.rs | 18 + programs/lb_clmm/src/utils/mod.rs | 1 + programs/lb_clmm/src/utils/pda.rs | 4 + programs/lb_clmm/src/utils/token.rs | 43 ++ target/idl/lb_clmm.json | 246 +++++++++ target/types/lb_clmm.ts | 72 +++ 18 files changed, 1059 insertions(+), 61 deletions(-) create mode 100644 programs/lb_clmm/src/instructions/claim_fee2.rs create mode 100644 programs/lb_clmm/src/instructions/initialize_lb_pair2.rs create mode 100644 programs/lb_clmm/src/instructions/initialize_token_badge.rs create mode 100644 programs/lb_clmm/src/state/token_badge.rs create mode 100644 programs/lb_clmm/src/utils/token.rs diff --git a/Cargo.lock b/Cargo.lock index 1397ae33..609884c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -113,7 +113,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faa5be5b72abea167f87c868379ba3c2be356bfca9e6f474fd055fa0f7eeb4f2" dependencies = [ - "anchor-syn", + "anchor-syn 0.28.0", "anyhow", "proc-macro2 1.0.63", "quote 1.0.29", @@ -121,13 +121,25 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "anchor-attribute-access-control" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5f619f1d04f53621925ba8a2e633ba5a6081f2ae14758cbb67f38fd823e0a3e" +dependencies = [ + "anchor-syn 0.29.0", + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 1.0.109", +] + [[package]] name = "anchor-attribute-account" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f468970344c7c9f9d03b4da854fd7c54f21305059f53789d0045c1dd803f0018" dependencies = [ - "anchor-syn", + "anchor-syn 0.28.0", "anyhow", "bs58 0.5.0", "proc-macro2 1.0.63", @@ -136,62 +148,120 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "anchor-attribute-account" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f2a3e1df4685f18d12a943a9f2a7456305401af21a07c9fe076ef9ecd6e400" +dependencies = [ + "anchor-syn 0.29.0", + "bs58 0.5.0", + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 1.0.109", +] + [[package]] name = "anchor-attribute-constant" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59948e7f9ef8144c2aefb3f32a40c5fce2798baeec765ba038389e82301017ef" dependencies = [ - "anchor-syn", + "anchor-syn 0.28.0", "proc-macro2 1.0.63", "syn 1.0.109", ] +[[package]] +name = "anchor-attribute-constant" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9423945cb55627f0b30903288e78baf6f62c6c8ab28fb344b6b25f1ffee3dca7" +dependencies = [ + "anchor-syn 0.29.0", + "quote 1.0.29", + "syn 1.0.109", +] + [[package]] name = "anchor-attribute-error" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc753c9d1c7981cb8948cf7e162fb0f64558999c0413058e2d43df1df5448086" dependencies = [ - "anchor-syn", + "anchor-syn 0.28.0", "proc-macro2 1.0.63", "quote 1.0.29", "syn 1.0.109", ] +[[package]] +name = "anchor-attribute-error" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ed12720033cc3c3bf3cfa293349c2275cd5ab99936e33dd4bf283aaad3e241" +dependencies = [ + "anchor-syn 0.29.0", + "quote 1.0.29", + "syn 1.0.109", +] + [[package]] name = "anchor-attribute-event" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38b4e172ba1b52078f53fdc9f11e3dc0668ad27997838a0aad2d148afac8c97" dependencies = [ - "anchor-syn", + "anchor-syn 0.28.0", "anyhow", "proc-macro2 1.0.63", "quote 1.0.29", "syn 1.0.109", ] +[[package]] +name = "anchor-attribute-event" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eef4dc0371eba2d8c8b54794b0b0eb786a234a559b77593d6f80825b6d2c77a2" +dependencies = [ + "anchor-syn 0.29.0", + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 1.0.109", +] + [[package]] name = "anchor-attribute-program" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eebd21543606ab61e2d83d9da37d24d3886a49f390f9c43a1964735e8c0f0d5" dependencies = [ - "anchor-syn", + "anchor-syn 0.28.0", "anyhow", "proc-macro2 1.0.63", "quote 1.0.29", "syn 1.0.109", ] +[[package]] +name = "anchor-attribute-program" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b18c4f191331e078d4a6a080954d1576241c29c56638783322a18d308ab27e4f" +dependencies = [ + "anchor-syn 0.29.0", + "quote 1.0.29", + "syn 1.0.109", +] + [[package]] name = "anchor-client" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8434a6bf33efba0c93157f7fa2fafac658cb26ab75396886dcedd87c2a8ad445" dependencies = [ - "anchor-lang", + "anchor-lang 0.28.0", "anyhow", "futures", "regex", @@ -210,13 +280,37 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec4720d899b3686396cced9508f23dab420f1308344456ec78ef76f98fda42af" dependencies = [ - "anchor-syn", + "anchor-syn 0.28.0", "anyhow", "proc-macro2 1.0.63", "quote 1.0.29", "syn 1.0.109", ] +[[package]] +name = "anchor-derive-accounts" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de10d6e9620d3bcea56c56151cad83c5992f50d5960b3a9bebc4a50390ddc3c" +dependencies = [ + "anchor-syn 0.29.0", + "quote 1.0.29", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-serde" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e2e5be518ec6053d90a2a7f26843dbee607583c779e6c8395951b9739bdfbe" +dependencies = [ + "anchor-syn 0.29.0", + "borsh-derive-internal 0.10.3", + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 1.0.109", +] + [[package]] name = "anchor-derive-space" version = "0.28.0" @@ -228,20 +322,56 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "anchor-derive-space" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecc31d19fa54840e74b7a979d44bcea49d70459de846088a1d71e87ba53c419" +dependencies = [ + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 1.0.109", +] + [[package]] name = "anchor-lang" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d2d4b20100f1310a774aba3471ef268e5c4ba4d5c28c0bbe663c2658acbc414" dependencies = [ - "anchor-attribute-access-control", - "anchor-attribute-account", - "anchor-attribute-constant", - "anchor-attribute-error", - "anchor-attribute-event", - "anchor-attribute-program", - "anchor-derive-accounts", - "anchor-derive-space", + "anchor-attribute-access-control 0.28.0", + "anchor-attribute-account 0.28.0", + "anchor-attribute-constant 0.28.0", + "anchor-attribute-error 0.28.0", + "anchor-attribute-event 0.28.0", + "anchor-attribute-program 0.28.0", + "anchor-derive-accounts 0.28.0", + "anchor-derive-space 0.28.0", + "arrayref", + "base64 0.13.1", + "bincode", + "borsh 0.10.3", + "bytemuck", + "getrandom 0.2.10", + "solana-program", + "thiserror", +] + +[[package]] +name = "anchor-lang" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35da4785497388af0553586d55ebdc08054a8b1724720ef2749d313494f2b8ad" +dependencies = [ + "anchor-attribute-access-control 0.29.0", + "anchor-attribute-account 0.29.0", + "anchor-attribute-constant 0.29.0", + "anchor-attribute-error 0.29.0", + "anchor-attribute-event 0.29.0", + "anchor-attribute-program 0.29.0", + "anchor-derive-accounts 0.29.0", + "anchor-derive-serde", + "anchor-derive-space 0.29.0", "arrayref", "base64 0.13.1", "bincode", @@ -258,11 +388,24 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78f860599da1c2354e7234c768783049eb42e2f54509ecfc942d2e0076a2da7b" dependencies = [ - "anchor-lang", + "anchor-lang 0.28.0", + "solana-program", + "spl-associated-token-account 1.1.3", + "spl-token 3.5.0", + "spl-token-2022 0.6.1", +] + +[[package]] +name = "anchor-spl" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" +dependencies = [ + "anchor-lang 0.29.0", "solana-program", - "spl-associated-token-account", - "spl-token", - "spl-token-2022", + "spl-associated-token-account 2.2.0", + "spl-token 4.0.0", + "spl-token-2022 0.9.0", ] [[package]] @@ -283,6 +426,24 @@ dependencies = [ "thiserror", ] +[[package]] +name = "anchor-syn" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9101b84702fed2ea57bd22992f75065da5648017135b844283a2f6d74f27825" +dependencies = [ + "anyhow", + "bs58 0.5.0", + "heck 0.3.3", + "proc-macro2 1.0.63", + "quote 1.0.29", + "serde", + "serde_json", + "sha2 0.10.7", + "syn 1.0.109", + "thiserror", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -889,9 +1050,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" dependencies = [ "bytemuck_derive", ] @@ -1083,8 +1244,8 @@ name = "cli" version = "0.3.0" dependencies = [ "anchor-client", - "anchor-lang", - "anchor-spl", + "anchor-lang 0.28.0", + "anchor-spl 0.28.0", "anyhow", "bincode", "clap 4.4.7", @@ -1095,7 +1256,7 @@ dependencies = [ "rand 0.8.5", "rust_decimal", "shellexpand", - "spl-associated-token-account", + "spl-associated-token-account 1.1.3", "tokio", ] @@ -2252,8 +2413,8 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" name = "lb_clmm" version = "0.8.0" dependencies = [ - "anchor-lang", - "anchor-spl", + "anchor-lang 0.29.0", + "anchor-spl 0.29.0", "assert_matches", "async-trait", "bytemuck", @@ -2386,8 +2547,8 @@ name = "market_making" version = "0.0.1" dependencies = [ "anchor-client", - "anchor-lang", - "anchor-spl", + "anchor-lang 0.28.0", + "anchor-spl 0.28.0", "anyhow", "bs58 0.5.0", "chrono", @@ -2401,7 +2562,7 @@ dependencies = [ "serde_json", "shellexpand", "solana-transaction-status", - "spl-associated-token-account", + "spl-associated-token-account 1.1.3", "tokio", "ureq", ] @@ -2522,7 +2683,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "651388b8ccae4805f240ebd495172eb44ea10153e018623b628df7034e042a96" dependencies = [ "borsh 0.10.3", - "num-derive", + "num-derive 0.3.3", "num-traits", "solana-program", "thiserror", @@ -2617,6 +2778,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2 1.0.63", + "quote 1.0.29", + "syn 2.0.23", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -4001,8 +4173,8 @@ dependencies = [ "solana-address-lookup-table-program", "solana-config-program", "solana-sdk", - "spl-token", - "spl-token-2022", + "spl-token 3.5.0", + "spl-token-2022 0.6.1", "thiserror", "zstd", ] @@ -4016,7 +4188,7 @@ dependencies = [ "bincode", "bytemuck", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", "rustc_version", "serde", @@ -4383,7 +4555,7 @@ dependencies = [ "log", "memoffset 0.9.0", "num-bigint 0.4.3", - "num-derive", + "num-derive 0.3.3", "num-traits", "parking_lot 0.12.1", "rand 0.7.3", @@ -4418,7 +4590,7 @@ dependencies = [ "itertools", "libc", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", "percentage", "rand 0.7.3", @@ -4532,7 +4704,7 @@ dependencies = [ "console", "dialoguer", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", "parking_lot 0.12.1", "qstring", @@ -4586,7 +4758,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022", + "spl-token-2022 0.6.1", "thiserror", ] @@ -4630,7 +4802,7 @@ dependencies = [ "lz4", "memmap2", "modular-bitfield", - "num-derive", + "num-derive 0.3.3", "num-traits", "num_cpus", "num_enum 0.6.1", @@ -4699,7 +4871,7 @@ dependencies = [ "libsecp256k1", "log", "memmap2", - "num-derive", + "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", "pbkdf2 0.11.0", @@ -4875,10 +5047,10 @@ dependencies = [ "solana-account-decoder", "solana-address-lookup-table-program", "solana-sdk", - "spl-associated-token-account", - "spl-memo", - "spl-token", - "spl-token-2022", + "spl-associated-token-account 1.1.3", + "spl-memo 3.0.1", + "spl-token 3.5.0", + "spl-token-2022 0.6.1", "thiserror", ] @@ -4921,7 +5093,7 @@ checksum = "ab8b719e077cc9e42b8965dd06ff6b5f09fa2a436f2297efdcf471c05d187a6c" dependencies = [ "bincode", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", "rustc_version", "serde", @@ -4943,7 +5115,7 @@ checksum = "5404829f9236ac760a943a4e2f16be6f180ce4a07e1bbb9d538dcfa62b98888c" dependencies = [ "bytemuck", "getrandom 0.1.16", - "num-derive", + "num-derive 0.3.3", "num-traits", "solana-program-runtime", "solana-sdk", @@ -4966,7 +5138,7 @@ dependencies = [ "itertools", "lazy_static", "merlin", - "num-derive", + "num-derive 0.3.3", "num-traits", "rand 0.7.3", "serde", @@ -5028,11 +5200,62 @@ checksum = "978dba3bcbe88d0c2c58366c254d9ea41c5f73357e72fc0bdee4d6b5fc99c8f4" dependencies = [ "assert_matches", "borsh 0.9.3", - "num-derive", + "num-derive 0.3.3", "num-traits", "solana-program", - "spl-token", - "spl-token-2022", + "spl-token 3.5.0", + "spl-token-2022 0.6.1", + "thiserror", +] + +[[package]] +name = "spl-associated-token-account" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3" +dependencies = [ + "assert_matches", + "borsh 0.10.3", + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-token 4.0.0", + "spl-token-2022 0.9.0", + "thiserror", +] + +[[package]] +name = "spl-discriminator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" +dependencies = [ + "quote 1.0.29", + "spl-discriminator-syn", + "syn 2.0.23", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" +dependencies = [ + "proc-macro2 1.0.63", + "quote 1.0.29", + "sha2 0.10.7", + "syn 2.0.23", "thiserror", ] @@ -5045,6 +5268,67 @@ dependencies = [ "solana-program", ] +[[package]] +name = "spl-memo" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +dependencies = [ + "borsh 0.10.3", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" +dependencies = [ + "proc-macro2 1.0.63", + "quote 1.0.29", + "sha2 0.10.7", + "syn 2.0.23", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + [[package]] name = "spl-token" version = "3.5.0" @@ -5053,13 +5337,28 @@ checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.3.3", "num-traits", "num_enum 0.5.11", "solana-program", "thiserror", ] +[[package]] +name = "spl-token" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token-2022" version = "0.6.1" @@ -5068,16 +5367,81 @@ checksum = "0043b590232c400bad5ee9eb983ced003d15163c4c5d56b090ac6d9a57457b47" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.3.3", "num-traits", "num_enum 0.5.11", "solana-program", "solana-zk-token-sdk", - "spl-memo", - "spl-token", + "spl-memo 3.0.1", + "spl-token 3.5.0", "thiserror", ] +[[package]] +name = "spl-token-2022" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.1", + "solana-program", + "solana-zk-token-sdk", + "spl-memo 4.0.0", + "spl-pod", + "spl-token 4.0.0", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.3", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + [[package]] name = "static_assertions" version = "1.1.0" diff --git a/programs/lb_clmm/Cargo.toml b/programs/lb_clmm/Cargo.toml index 425db2e5..c1f1623e 100644 --- a/programs/lb_clmm/Cargo.toml +++ b/programs/lb_clmm/Cargo.toml @@ -1,6 +1,10 @@ [package] name = "lb_clmm" +<<<<<<< HEAD version = "0.8.0" +======= +version = "0.7.0" +>>>>>>> 19dbfda (feat: token 2022 + bump anchor to 0.29.0 to support extension type) description = "Created with Anchor" edition = "2021" @@ -20,8 +24,8 @@ test-bpf = [] staging = [] [dependencies] -anchor-lang = { version = "0.28.0", features = ["event-cpi"] } -anchor-spl = "0.28.0" +anchor-lang = { version = "0.29.0", features = ["event-cpi"] } +anchor-spl = "0.29.0" uint = "0.8.5" bytemuck = { version = "1.13.1", features = ["derive", "min_const_generics"] } ruint = "1.3.0" diff --git a/programs/lb_clmm/src/errors.rs b/programs/lb_clmm/src/errors.rs index 47ed2372..9fd1aafe 100644 --- a/programs/lb_clmm/src/errors.rs +++ b/programs/lb_clmm/src/errors.rs @@ -179,4 +179,16 @@ pub enum LBError { #[msg("Invalid activation type")] InvalidActivationType, + + #[msg("Invalid lock release slot")] + InvalidLockReleaseSlot, + + #[msg("Bin range is not empty")] + BinRangeIsNotEmpty, + + #[msg("Unsupported mint extension")] + UnsupportedMintExtension, + + #[msg("Unmatch token mint")] + UnmatchTokenMint, } diff --git a/programs/lb_clmm/src/instructions/claim_fee.rs b/programs/lb_clmm/src/instructions/claim_fee.rs index 89b9ea1b..6794c104 100644 --- a/programs/lb_clmm/src/instructions/claim_fee.rs +++ b/programs/lb_clmm/src/instructions/claim_fee.rs @@ -1,7 +1,9 @@ use crate::authorize_claim_fee_position; use crate::state::{bin::BinArray, lb_pair::LbPair, position::PositionV2}; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::token::Token; +use anchor_spl::token_interface::{Mint, TokenAccount}; + #[event_cpi] #[derive(Accounts)] pub struct ClaimFee<'info> { @@ -47,9 +49,10 @@ pub struct ClaimFee<'info> { pub token_x_mint: Box>, pub token_y_mint: Box>, - pub token_program: Interface<'info, TokenInterface>, + pub token_program: Program<'info, Token>, } +// Support only token program. To support both token, and token 2022, please use `ClaimFee2` pub fn handle(ctx: Context) -> Result<()> { Ok(()) } diff --git a/programs/lb_clmm/src/instructions/claim_fee2.rs b/programs/lb_clmm/src/instructions/claim_fee2.rs new file mode 100644 index 00000000..f6177f74 --- /dev/null +++ b/programs/lb_clmm/src/instructions/claim_fee2.rs @@ -0,0 +1,59 @@ +use crate::authorize_claim_fee_position; +use crate::errors::LBError; +use crate::state::{bin::BinArray, lb_pair::LbPair, position::PositionV2}; +use crate::PositionLiquidityFlowValidator; +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface, TransferChecked}; + +#[event_cpi] +#[derive(Accounts)] +pub struct ClaimFee2<'info> { + #[account( + mut, + has_one = reserve_x, + has_one = reserve_y, + has_one = token_x_mint, + has_one = token_y_mint, + )] + pub lb_pair: AccountLoader<'info, LbPair>, + + #[account( + mut, + has_one = lb_pair, + constraint = authorize_claim_fee_position(&position, sender.key())? + )] + pub position: AccountLoader<'info, PositionV2>, + + #[account( + mut, + has_one = lb_pair + )] + pub bin_array_lower: AccountLoader<'info, BinArray>, + #[account( + mut, + has_one = lb_pair + )] + pub bin_array_upper: AccountLoader<'info, BinArray>, + + pub sender: Signer<'info>, + + #[account(mut)] + pub reserve_x: Box>, + #[account(mut)] + pub reserve_y: Box>, + + #[account(mut)] + pub user_token_x: Box>, + #[account(mut)] + pub user_token_y: Box>, + + pub token_x_mint: Box>, + pub token_y_mint: Box>, + + pub token_program_x: Interface<'info, TokenInterface>, + pub token_program_y: Interface<'info, TokenInterface>, +} + +pub fn handle(ctx: Context) -> Result<()> { + Ok(()) +} diff --git a/programs/lb_clmm/src/instructions/initialize_lb_pair.rs b/programs/lb_clmm/src/instructions/initialize_lb_pair.rs index 05e910f2..94a576ca 100644 --- a/programs/lb_clmm/src/instructions/initialize_lb_pair.rs +++ b/programs/lb_clmm/src/instructions/initialize_lb_pair.rs @@ -7,6 +7,7 @@ use crate::state::preset_parameters::PresetParameter; use crate::utils::seeds::BIN_ARRAY_BITMAP_SEED; use crate::utils::seeds::ORACLE; use anchor_lang::prelude::*; +use anchor_spl::token::Token; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; use std::cmp::{max, min}; @@ -89,12 +90,12 @@ pub struct InitializeLbPair<'info> { #[account(mut)] pub funder: Signer<'info>, - // #[account(address = Token2022::id())] - pub token_program: Interface<'info, TokenInterface>, + pub token_program: Program<'info, Token>, pub system_program: Program<'info, System>, pub rent: Sysvar<'info, Rent>, } +// To support token 2022, please use `InitializeLbPair2` pub fn handle(ctx: Context, active_id: i32, bin_step: u16) -> Result<()> { Ok(()) } diff --git a/programs/lb_clmm/src/instructions/initialize_lb_pair2.rs b/programs/lb_clmm/src/instructions/initialize_lb_pair2.rs new file mode 100644 index 00000000..fef572ad --- /dev/null +++ b/programs/lb_clmm/src/instructions/initialize_lb_pair2.rs @@ -0,0 +1,110 @@ +use crate::constants::DEFAULT_OBSERVATION_LENGTH; +use crate::errors::LBError; +use crate::events::LbPairCreate; +use crate::state::bin_array_bitmap_extension::BinArrayBitmapExtension; +use crate::state::lb_pair::LbPair; +use crate::state::lb_pair::PairType; +use crate::state::oracle::Oracle; +use crate::state::preset_parameters::PresetParameter; +use crate::state::token_badge::TokenBadge; +use crate::utils::seeds::BIN_ARRAY_BITMAP_SEED; +use crate::utils::seeds::ORACLE; +use anchor_lang::prelude::*; +use anchor_spl::token_interface::TokenInterface; +use anchor_spl::token_interface::{Mint, TokenAccount}; +use std::cmp::{max, min}; + +#[event_cpi] +#[derive(Accounts)] +#[instruction(active_id: i32, bin_step: u16)] +pub struct InitializeLbPair2<'info> { + #[account( + init, + seeds = [ + min(token_mint_x.key(), token_mint_y.key()).as_ref(), + max(token_mint_x.key(), token_mint_y.key()).as_ref(), + &bin_step.to_le_bytes(), + &preset_parameter.base_factor.to_le_bytes() + ], + bump, + payer = funder, + space = 8 + LbPair::INIT_SPACE + )] + pub lb_pair: AccountLoader<'info, LbPair>, + + #[account( + init, + seeds = [ + BIN_ARRAY_BITMAP_SEED, + lb_pair.key().as_ref(), + ], + bump, + payer = funder, + space = 8 + BinArrayBitmapExtension::INIT_SPACE + )] + pub bin_array_bitmap_extension: Option>, + + #[account(constraint = token_mint_x.key() != token_mint_y.key(), mint::token_program = token_program_x)] + pub token_mint_x: Box>, + #[account(mint::token_program = token_program_y)] + pub token_mint_y: Box>, + + #[account( + init, + seeds = [ + lb_pair.key().as_ref(), + token_mint_x.key().as_ref() + ], + bump, + payer = funder, + token::mint = token_mint_x, + token::authority = lb_pair, + token::token_program = token_program_x, + )] + pub reserve_x: Box>, + #[account( + init, + seeds = [ + lb_pair.key().as_ref(), + token_mint_y.key().as_ref() + ], + bump, + payer = funder, + token::mint = token_mint_y, + token::authority = lb_pair, + token::token_program = token_program_y, + )] + pub reserve_y: Box>, + + #[account( + init, + seeds = [ + ORACLE, + lb_pair.key().as_ref() + ], + bump, + payer = funder, + space = Oracle::space(DEFAULT_OBSERVATION_LENGTH) + )] + pub oracle: AccountLoader<'info, Oracle>, + + #[account( + constraint = bin_step == preset_parameter.bin_step @ LBError::NonPresetBinStep, + )] + pub preset_parameter: Account<'info, PresetParameter>, + + #[account(mut)] + pub funder: Signer<'info>, + + pub token_badge_x: Option>, + pub token_badge_y: Option>, + + pub token_program_x: Interface<'info, TokenInterface>, + pub token_program_y: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, + pub rent: Sysvar<'info, Rent>, +} + +pub fn handle(ctx: Context, active_id: i32, bin_step: u16) -> Result<()> { + Ok(()) +} diff --git a/programs/lb_clmm/src/instructions/initialize_reward.rs b/programs/lb_clmm/src/instructions/initialize_reward.rs index f577db3b..44894515 100644 --- a/programs/lb_clmm/src/instructions/initialize_reward.rs +++ b/programs/lb_clmm/src/instructions/initialize_reward.rs @@ -1,6 +1,6 @@ -use crate::assert_eq_admin; use crate::errors::LBError; use crate::state::lb_pair::LbPair; +use crate::{assert_eq_admin, state::token_badge::TokenBadge}; use anchor_lang::prelude::*; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; @@ -26,6 +26,8 @@ pub struct InitializeReward<'info> { pub reward_mint: Box>, + pub token_badge: Option>, + #[account( mut, constraint = assert_eq_admin(admin.key()) @ LBError::InvalidAdmin, diff --git a/programs/lb_clmm/src/instructions/initialize_token_badge.rs b/programs/lb_clmm/src/instructions/initialize_token_badge.rs new file mode 100644 index 00000000..fd4c708a --- /dev/null +++ b/programs/lb_clmm/src/instructions/initialize_token_badge.rs @@ -0,0 +1,35 @@ +use crate::assert_eq_admin; +use crate::errors::LBError; +use crate::state::*; +use anchor_lang::prelude::*; +use anchor_spl::token_interface::Mint; +use token_badge::TokenBadge; + +#[derive(Accounts)] +pub struct InitializeTokenBadge<'info> { + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = admin, + seeds = [ + b"token_badge", + token_mint.key().as_ref(), + ], + bump, + space = 8 + TokenBadge::INIT_SPACE + )] + pub token_badge: AccountLoader<'info, TokenBadge>, + + #[account( + mut, + constraint = assert_eq_admin(admin.key()) @ LBError::InvalidAdmin, + )] + pub admin: Signer<'info>, + + pub system_program: Program<'info, System>, +} + +pub fn handle(ctx: Context) -> Result<()> { + Ok(()) +} diff --git a/programs/lb_clmm/src/instructions/mod.rs b/programs/lb_clmm/src/instructions/mod.rs index e622e2fe..dca31402 100644 --- a/programs/lb_clmm/src/instructions/mod.rs +++ b/programs/lb_clmm/src/instructions/mod.rs @@ -5,6 +5,7 @@ pub mod add_liquidity_by_weight; pub mod add_liquidity_by_weight_one_side; pub mod add_liquidity_single_side_precise; pub mod claim_fee; +pub mod claim_fee2; pub mod claim_reward; pub mod close_position; pub mod close_preset_parameter; @@ -13,12 +14,14 @@ pub mod increase_oracle_length; pub mod initialize_bin_array; pub mod initialize_bin_array_bitmap_extension; pub mod initialize_lb_pair; +pub mod initialize_lb_pair2; pub mod initialize_permission_lb_pair; pub mod initialize_position; pub mod initialize_position_by_operator; pub mod initialize_position_pda; pub mod initialize_preset_parameters; pub mod initialize_reward; +pub mod initialize_token_badge; pub mod migrate_bin_array; pub mod migrate_position; pub mod position_authorize; diff --git a/programs/lb_clmm/src/lib.rs b/programs/lb_clmm/src/lib.rs index 70f0c009..a53d4536 100644 --- a/programs/lb_clmm/src/lib.rs +++ b/programs/lb_clmm/src/lib.rs @@ -18,6 +18,7 @@ use instructions::add_liquidity_by_weight::*; use instructions::add_liquidity_by_weight_one_side::*; use instructions::add_liquidity_single_side_precise::*; use instructions::claim_fee::*; +use instructions::claim_fee2::*; use instructions::claim_reward::*; use instructions::close_position::*; use instructions::close_preset_parameter::*; @@ -26,12 +27,14 @@ use instructions::increase_oracle_length::*; use instructions::initialize_bin_array::*; use instructions::initialize_bin_array_bitmap_extension::*; use instructions::initialize_lb_pair::*; +use instructions::initialize_lb_pair2::*; use instructions::initialize_permission_lb_pair::*; use instructions::initialize_position::*; use instructions::initialize_position_by_operator::*; use instructions::initialize_position_pda::*; use instructions::initialize_preset_parameters::*; use instructions::initialize_reward::*; +use instructions::initialize_token_badge::*; use instructions::migrate_bin_array::*; use instructions::migrate_position::*; use instructions::position_authorize::*; @@ -280,6 +283,7 @@ pub mod lb_clmm { instructions::claim_reward::handle(ctx, reward_index) } + #[deprecated = "Please use claim_fee2 instead. Which support both token and token 2022 program"] pub fn claim_fee(ctx: Context) -> Result<()> { instructions::claim_fee::handle(ctx) } @@ -406,4 +410,20 @@ pub mod lb_clmm { max_price_impact_bps, ) } + + pub fn claim_fee2(ctx: Context) -> Result<()> { + instructions::claim_fee2::handle(ctx) + } + + pub fn initialize_token_badge(ctx: Context) -> Result<()> { + instructions::initialize_token_badge::handle(ctx) + } + + pub fn initialize_lb_pair2( + ctx: Context, + active_id: i32, + bin_step: u16, + ) -> Result<()> { + instructions::initialize_lb_pair2::handle(ctx, active_id, bin_step) + } } diff --git a/programs/lb_clmm/src/state/mod.rs b/programs/lb_clmm/src/state/mod.rs index bb3422b6..bef654a6 100644 --- a/programs/lb_clmm/src/state/mod.rs +++ b/programs/lb_clmm/src/state/mod.rs @@ -6,3 +6,4 @@ pub mod oracle; pub mod parameters; pub mod position; pub mod preset_parameters; +pub mod token_badge; diff --git a/programs/lb_clmm/src/state/token_badge.rs b/programs/lb_clmm/src/state/token_badge.rs new file mode 100644 index 00000000..a4dfa716 --- /dev/null +++ b/programs/lb_clmm/src/state/token_badge.rs @@ -0,0 +1,18 @@ +use anchor_lang::prelude::*; + +#[account(zero_copy)] +#[derive(InitSpace, Debug)] +/// Parameter that set by the protocol +pub struct TokenBadge { + /// Token mint + pub token_mint: Pubkey, + /// Reserved space + pub _padding: [u8; 128], +} + +impl TokenBadge { + pub fn initialize(&mut self, token_mint: Pubkey) -> Result<()> { + self.token_mint = token_mint; + Ok(()) + } +} diff --git a/programs/lb_clmm/src/utils/mod.rs b/programs/lb_clmm/src/utils/mod.rs index f577dc79..699521bc 100644 --- a/programs/lb_clmm/src/utils/mod.rs +++ b/programs/lb_clmm/src/utils/mod.rs @@ -1,2 +1,3 @@ pub mod pda; pub mod seeds; +pub mod token; diff --git a/programs/lb_clmm/src/utils/pda.rs b/programs/lb_clmm/src/utils/pda.rs index b561b2ab..be4d9707 100644 --- a/programs/lb_clmm/src/utils/pda.rs +++ b/programs/lb_clmm/src/utils/pda.rs @@ -116,3 +116,7 @@ pub fn derive_preset_parameter_pda2(bin_step: u16, base_factor: u16) -> (Pubkey, &crate::ID, ) } + +pub fn derive_token_badge_pda(token_mint: Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[b"token_badge", token_mint.as_ref()], &crate::ID) +} diff --git a/programs/lb_clmm/src/utils/token.rs b/programs/lb_clmm/src/utils/token.rs new file mode 100644 index 00000000..da31c9f1 --- /dev/null +++ b/programs/lb_clmm/src/utils/token.rs @@ -0,0 +1,43 @@ +use crate::errors::LBError; +use crate::state::token_badge::TokenBadge; +use anchor_lang::prelude::*; +use anchor_spl::{ + token::Token, + token_2022::spl_token_2022::{ + self, + extension::{BaseStateWithExtensions, ExtensionType, StateWithExtensions}, + }, + token_interface::Mint, +}; + +pub fn validate_mint<'info>( + mint_account: &InterfaceAccount, + token_badge: &Option>, +) -> Result<()> { + let mint_info = mint_account.to_account_info(); + + if *mint_info.owner == Token::id() { + return Ok(()); + } + match token_badge { + Some(account) => { + let token_badge = account.load()?; + if token_badge.token_mint == mint_account.key() { + Ok(()) + } else { + Err(LBError::UnmatchTokenMint.into()) + } + } + None => { + let mint_data = mint_info.try_borrow_data()?; + let mint = StateWithExtensions::::unpack(&mint_data)?; + let extensions = mint.get_extension_types()?; + for e in extensions { + if e != ExtensionType::MetadataPointer && e != ExtensionType::TokenMetadata { + return Err(LBError::UnsupportedMintExtension.into()); + } + } + Ok(()) + } + } +} diff --git a/target/idl/lb_clmm.json b/target/idl/lb_clmm.json index 375beae4..19f70f50 100644 --- a/target/idl/lb_clmm.json +++ b/target/idl/lb_clmm.json @@ -1455,6 +1455,12 @@ "isMut": false, "isSigner": false }, + { + "name": "tokenBadge", + "isMut": false, + "isSigner": false, + "isOptional": true + }, { "name": "admin", "isMut": true, @@ -2612,6 +2618,216 @@ "type": "publicKey" } ] + }, + { + "name": "claimFee2", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "initializeTokenBadge", + "accounts": [ + { + "name": "tokenMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenBadge", + "isMut": true, + "isSigner": false + }, + { + "name": "admin", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "initializeLbPair2", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenMintX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenMintY", + "isMut": false, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "oracle", + "isMut": true, + "isSigner": false + }, + { + "name": "presetParameter", + "isMut": false, + "isSigner": false + }, + { + "name": "funder", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenBadgeX", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenBadgeY", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "activeId", + "type": "i32" + }, + { + "name": "binStep", + "type": "u16" + } + ] } ], "accounts": [ @@ -3350,6 +3566,36 @@ } ] } + }, + { + "name": "TokenBadge", + "docs": [ + "Parameter that set by the protocol" + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "tokenMint", + "docs": [ + "Token mint" + ], + "type": "publicKey" + }, + { + "name": "padding", + "docs": [ + "Reserved space" + ], + "type": { + "array": [ + "u8", + 128 + ] + } + } + ] + } } ], "types": [ diff --git a/target/types/lb_clmm.ts b/target/types/lb_clmm.ts index de1b7e7b..116d1fe3 100644 --- a/target/types/lb_clmm.ts +++ b/target/types/lb_clmm.ts @@ -1270,6 +1270,12 @@ export type LbClmm = { "isMut": false, "isSigner": false }, + { + "name": "tokenBadge", + "isMut": false, + "isSigner": false, + "isOptional": true + }, { "name": "admin", "isMut": true, @@ -3148,6 +3154,36 @@ export type LbClmm = { } ] } + }, + { + "name": "tokenBadge", + "docs": [ + "Parameter that set by the protocol" + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "tokenMint", + "docs": [ + "Token mint" + ], + "type": "publicKey" + }, + { + "name": "padding", + "docs": [ + "Reserved space" + ], + "type": { + "array": [ + "u8", + 128 + ] + } + } + ] + } } ], "types": [ @@ -6210,6 +6246,12 @@ export const IDL: LbClmm = { "isMut": false, "isSigner": false }, + { + "name": "tokenBadge", + "isMut": false, + "isSigner": false, + "isOptional": true + }, { "name": "admin", "isMut": true, @@ -8088,6 +8130,36 @@ export const IDL: LbClmm = { } ] } + }, + { + "name": "tokenBadge", + "docs": [ + "Parameter that set by the protocol" + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "tokenMint", + "docs": [ + "Token mint" + ], + "type": "publicKey" + }, + { + "name": "padding", + "docs": [ + "Reserved space" + ], + "type": { + "array": [ + "u8", + 128 + ] + } + } + ] + } } ], "types": [ From 080e4f4f6e7061dc45a7a937f67c3981ec34ebda Mon Sep 17 00:00:00 2001 From: codewithgun Date: Mon, 10 Jun 2024 21:54:31 +0800 Subject: [PATCH 02/13] chore: bump workspace anchor version --- Cargo.lock | 209 +++------------------- Cargo.toml | 6 +- cli/src/instructions/initialize_reward.rs | 13 +- market_making/Cargo.toml | 39 ++-- 4 files changed, 60 insertions(+), 207 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 609884c5..1cfd3c9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -107,44 +107,15 @@ dependencies = [ "alloc-no-stdlib", ] -[[package]] -name = "anchor-attribute-access-control" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa5be5b72abea167f87c868379ba3c2be356bfca9e6f474fd055fa0f7eeb4f2" -dependencies = [ - "anchor-syn 0.28.0", - "anyhow", - "proc-macro2 1.0.63", - "quote 1.0.29", - "regex", - "syn 1.0.109", -] - [[package]] name = "anchor-attribute-access-control" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5f619f1d04f53621925ba8a2e633ba5a6081f2ae14758cbb67f38fd823e0a3e" dependencies = [ - "anchor-syn 0.29.0", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-account" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f468970344c7c9f9d03b4da854fd7c54f21305059f53789d0045c1dd803f0018" -dependencies = [ - "anchor-syn 0.28.0", - "anyhow", - "bs58 0.5.0", + "anchor-syn", "proc-macro2 1.0.63", "quote 1.0.29", - "rustversion", "syn 1.0.109", ] @@ -154,43 +125,20 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f2a3e1df4685f18d12a943a9f2a7456305401af21a07c9fe076ef9ecd6e400" dependencies = [ - "anchor-syn 0.29.0", + "anchor-syn", "bs58 0.5.0", "proc-macro2 1.0.63", "quote 1.0.29", "syn 1.0.109", ] -[[package]] -name = "anchor-attribute-constant" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59948e7f9ef8144c2aefb3f32a40c5fce2798baeec765ba038389e82301017ef" -dependencies = [ - "anchor-syn 0.28.0", - "proc-macro2 1.0.63", - "syn 1.0.109", -] - [[package]] name = "anchor-attribute-constant" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9423945cb55627f0b30903288e78baf6f62c6c8ab28fb344b6b25f1ffee3dca7" dependencies = [ - "anchor-syn 0.29.0", - "quote 1.0.29", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-error" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc753c9d1c7981cb8948cf7e162fb0f64558999c0413058e2d43df1df5448086" -dependencies = [ - "anchor-syn 0.28.0", - "proc-macro2 1.0.63", + "anchor-syn", "quote 1.0.29", "syn 1.0.109", ] @@ -201,20 +149,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93ed12720033cc3c3bf3cfa293349c2275cd5ab99936e33dd4bf283aaad3e241" dependencies = [ - "anchor-syn 0.29.0", - "quote 1.0.29", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-event" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38b4e172ba1b52078f53fdc9f11e3dc0668ad27997838a0aad2d148afac8c97" -dependencies = [ - "anchor-syn 0.28.0", - "anyhow", - "proc-macro2 1.0.63", + "anchor-syn", "quote 1.0.29", "syn 1.0.109", ] @@ -225,20 +160,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eef4dc0371eba2d8c8b54794b0b0eb786a234a559b77593d6f80825b6d2c77a2" dependencies = [ - "anchor-syn 0.29.0", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-program" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eebd21543606ab61e2d83d9da37d24d3886a49f390f9c43a1964735e8c0f0d5" -dependencies = [ - "anchor-syn 0.28.0", - "anyhow", + "anchor-syn", "proc-macro2 1.0.63", "quote 1.0.29", "syn 1.0.109", @@ -250,18 +172,18 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b18c4f191331e078d4a6a080954d1576241c29c56638783322a18d308ab27e4f" dependencies = [ - "anchor-syn 0.29.0", + "anchor-syn", "quote 1.0.29", "syn 1.0.109", ] [[package]] name = "anchor-client" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8434a6bf33efba0c93157f7fa2fafac658cb26ab75396886dcedd87c2a8ad445" +checksum = "cb48c4a7911038da546dc752655a29fa49f6bd50ebc1edca218bac8da1012acd" dependencies = [ - "anchor-lang 0.28.0", + "anchor-lang", "anyhow", "futures", "regex", @@ -274,26 +196,13 @@ dependencies = [ "url", ] -[[package]] -name = "anchor-derive-accounts" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4720d899b3686396cced9508f23dab420f1308344456ec78ef76f98fda42af" -dependencies = [ - "anchor-syn 0.28.0", - "anyhow", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", -] - [[package]] name = "anchor-derive-accounts" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5de10d6e9620d3bcea56c56151cad83c5992f50d5960b3a9bebc4a50390ddc3c" dependencies = [ - "anchor-syn 0.29.0", + "anchor-syn", "quote 1.0.29", "syn 1.0.109", ] @@ -304,24 +213,13 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4e2e5be518ec6053d90a2a7f26843dbee607583c779e6c8395951b9739bdfbe" dependencies = [ - "anchor-syn 0.29.0", + "anchor-syn", "borsh-derive-internal 0.10.3", "proc-macro2 1.0.63", "quote 1.0.29", "syn 1.0.109", ] -[[package]] -name = "anchor-derive-space" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f495e85480bd96ddeb77b71d499247c7d4e8b501e75ecb234e9ef7ae7bd6552a" -dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", -] - [[package]] name = "anchor-derive-space" version = "0.29.0" @@ -333,45 +231,21 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "anchor-lang" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2d4b20100f1310a774aba3471ef268e5c4ba4d5c28c0bbe663c2658acbc414" -dependencies = [ - "anchor-attribute-access-control 0.28.0", - "anchor-attribute-account 0.28.0", - "anchor-attribute-constant 0.28.0", - "anchor-attribute-error 0.28.0", - "anchor-attribute-event 0.28.0", - "anchor-attribute-program 0.28.0", - "anchor-derive-accounts 0.28.0", - "anchor-derive-space 0.28.0", - "arrayref", - "base64 0.13.1", - "bincode", - "borsh 0.10.3", - "bytemuck", - "getrandom 0.2.10", - "solana-program", - "thiserror", -] - [[package]] name = "anchor-lang" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35da4785497388af0553586d55ebdc08054a8b1724720ef2749d313494f2b8ad" dependencies = [ - "anchor-attribute-access-control 0.29.0", - "anchor-attribute-account 0.29.0", - "anchor-attribute-constant 0.29.0", - "anchor-attribute-error 0.29.0", - "anchor-attribute-event 0.29.0", - "anchor-attribute-program 0.29.0", - "anchor-derive-accounts 0.29.0", + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-constant", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-program", + "anchor-derive-accounts", "anchor-derive-serde", - "anchor-derive-space 0.29.0", + "anchor-derive-space", "arrayref", "base64 0.13.1", "bincode", @@ -382,50 +256,19 @@ dependencies = [ "thiserror", ] -[[package]] -name = "anchor-spl" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f860599da1c2354e7234c768783049eb42e2f54509ecfc942d2e0076a2da7b" -dependencies = [ - "anchor-lang 0.28.0", - "solana-program", - "spl-associated-token-account 1.1.3", - "spl-token 3.5.0", - "spl-token-2022 0.6.1", -] - [[package]] name = "anchor-spl" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" dependencies = [ - "anchor-lang 0.29.0", + "anchor-lang", "solana-program", "spl-associated-token-account 2.2.0", "spl-token 4.0.0", "spl-token-2022 0.9.0", ] -[[package]] -name = "anchor-syn" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a125e4b0cc046cfec58f5aa25038e34cf440151d58f0db3afc55308251fe936d" -dependencies = [ - "anyhow", - "bs58 0.5.0", - "heck 0.3.3", - "proc-macro2 1.0.63", - "quote 1.0.29", - "serde", - "serde_json", - "sha2 0.10.7", - "syn 1.0.109", - "thiserror", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1244,8 +1087,8 @@ name = "cli" version = "0.3.0" dependencies = [ "anchor-client", - "anchor-lang 0.28.0", - "anchor-spl 0.28.0", + "anchor-lang", + "anchor-spl", "anyhow", "bincode", "clap 4.4.7", @@ -2413,8 +2256,8 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" name = "lb_clmm" version = "0.8.0" dependencies = [ - "anchor-lang 0.29.0", - "anchor-spl 0.29.0", + "anchor-lang", + "anchor-spl", "assert_matches", "async-trait", "bytemuck", @@ -2547,8 +2390,8 @@ name = "market_making" version = "0.0.1" dependencies = [ "anchor-client", - "anchor-lang 0.28.0", - "anchor-spl 0.28.0", + "anchor-lang", + "anchor-spl", "anyhow", "bs58 0.5.0", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 03c24bc0..5856da9c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,9 +2,9 @@ members = ["programs/*", "cli", "market_making", "commons"] [workspace.dependencies] -anchor-lang = "0.28.0" -anchor-spl = "0.28.0" -anchor-client = "0.28.0" +anchor-lang = "0.29.0" +anchor-spl = "0.29.0" +anchor-client = "0.29.0" clap = "4.3.3" anyhow = "1.0.71" shellexpand = "3.1.0" diff --git a/cli/src/instructions/initialize_reward.rs b/cli/src/instructions/initialize_reward.rs index 8b4384e7..4a58e3c8 100644 --- a/cli/src/instructions/initialize_reward.rs +++ b/cli/src/instructions/initialize_reward.rs @@ -1,6 +1,6 @@ use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; -use lb_clmm::utils::pda::derive_event_authority_pda; +use lb_clmm::utils::pda::{derive_event_authority_pda, derive_token_badge_pda}; use std::ops::Deref; use anyhow::*; @@ -36,6 +36,16 @@ pub async fn initialize_reward + Clone>( let (event_authority, _bump) = derive_event_authority_pda(); + let (reward_token_badge, _bump) = derive_token_badge_pda(reward_mint); + + let reward_token_badge = program + .async_rpc() + .get_account(&reward_token_badge) + .await + .map(|_| reward_token_badge) + .or_else(|_| Ok(lb_clmm::ID)) + .ok(); + let accounts = accounts::InitializeReward { lb_pair, reward_vault, @@ -46,6 +56,7 @@ pub async fn initialize_reward + Clone>( system_program: anchor_client::solana_sdk::system_program::ID, event_authority, program: lb_clmm::ID, + token_badge: reward_token_badge, }; let ix: instruction::InitializeReward = instruction::InitializeReward { diff --git a/market_making/Cargo.toml b/market_making/Cargo.toml index 678c368b..7c78c9b3 100644 --- a/market_making/Cargo.toml +++ b/market_making/Cargo.toml @@ -6,23 +6,22 @@ edition = "2021" authors = ["andrew "] [dependencies] -tokio = {workspace=true, features = ["full"] } -hyper = { workspace=true, features = ["full"] } -routerify = {workspace=true} -ureq = { workspace=true, features = ["json"]} -anchor-client={workspace=true, features=["async"]} -anchor-spl={workspace=true} -anchor-lang={workspace=true} -env_logger={workspace=true} -log={workspace=true} -clap = { workspace=true, features = ["derive"] } -shellexpand = {workspace=true} -anyhow = {workspace=true} -lb_clmm = { path = "../programs/lb_clmm", features = ["cpi"] } -serde_json = {workspace=true} -serde = { workspace=true, features = ["derive"] } -spl-associated-token-account = {workspace=true} -solana-transaction-status={workspace=true} -bs58 = {workspace=true} -chrono={workspace=true} - +tokio = { workspace = true, features = ["full"] } +hyper = { workspace = true, features = ["full"] } +routerify = { workspace = true } +ureq = { workspace = true, features = ["json"] } +anchor-client = { workspace = true, features = ["async"] } +anchor-spl = { workspace = true } +anchor-lang = { workspace = true } +env_logger = { workspace = true } +log = { workspace = true } +clap = { workspace = true, features = ["derive"] } +shellexpand = { workspace = true } +anyhow = { workspace = true } +lb_clmm = { path = "../programs/lb_clmm", features = ["cpi"] } +serde_json = { workspace = true } +serde = { workspace = true, features = ["derive"] } +spl-associated-token-account = { workspace = true } +solana-transaction-status = { workspace = true } +bs58 = { workspace = true } +chrono = { workspace = true } From 99143d15ac99f458a912650d503bdc80e8dd2b0c Mon Sep 17 00:00:00 2001 From: codewithgun Date: Mon, 10 Jun 2024 22:35:22 +0800 Subject: [PATCH 03/13] fix: ts sdk use claimFee2 --- ts-client/src/dlmm/helpers/derive.ts | 7 + ts-client/src/dlmm/idl.ts | 11944 ++++++++++++------------- ts-client/src/dlmm/index.ts | 84 +- ts-client/src/dlmm/types/index.ts | 1 + 4 files changed, 5817 insertions(+), 6219 deletions(-) diff --git a/ts-client/src/dlmm/helpers/derive.ts b/ts-client/src/dlmm/helpers/derive.ts index 4d881f5d..5f253e29 100644 --- a/ts-client/src/dlmm/helpers/derive.ts +++ b/ts-client/src/dlmm/helpers/derive.ts @@ -82,6 +82,13 @@ export function deriveLbPair( ); } +export function deriveTokenBadge(token: PublicKey, programId: PublicKey) { + return PublicKey.findProgramAddressSync( + [Buffer.from("token_badge"), token.toBuffer()], + programId + ); +} + export function derivePermissionLbPair( baseKey: PublicKey, tokenX: PublicKey, diff --git a/ts-client/src/dlmm/idl.ts b/ts-client/src/dlmm/idl.ts index 64e03074..266cbae6 100644 --- a/ts-client/src/dlmm/idl.ts +++ b/ts-client/src/dlmm/idl.ts @@ -3,1457 +3,1453 @@ export type LbClmm = { "name": "lb_clmm", "constants": [ { - "name": "BASIS_POINT_MAX", - "type": "i32", - "value": "10000" + name: "BASIS_POINT_MAX"; + type: "i32"; + value: "10000"; }, { - "name": "MAX_BIN_PER_ARRAY", - "type": { - "defined": "usize" - }, - "value": "70" + name: "MAX_BIN_PER_ARRAY"; + type: { + defined: "usize"; + }; + value: "70"; }, { - "name": "MAX_BIN_PER_POSITION", - "type": { - "defined": "usize" - }, - "value": "70" + name: "MAX_BIN_PER_POSITION"; + type: { + defined: "usize"; + }; + value: "70"; }, { - "name": "MIN_BIN_ID", - "type": "i32", - "value": "- 443636" + name: "MIN_BIN_ID"; + type: "i32"; + value: "- 443636"; }, { - "name": "MAX_BIN_ID", - "type": "i32", - "value": "443636" + name: "MAX_BIN_ID"; + type: "i32"; + value: "443636"; }, { - "name": "MAX_FEE_RATE", - "type": "u64", - "value": "100_000_000" + name: "MAX_FEE_RATE"; + type: "u64"; + value: "100_000_000"; }, { - "name": "FEE_PRECISION", - "type": "u64", - "value": "1_000_000_000" + name: "FEE_PRECISION"; + type: "u64"; + value: "1_000_000_000"; }, { - "name": "MAX_PROTOCOL_SHARE", - "type": "u16", - "value": "2_500" + name: "MAX_PROTOCOL_SHARE"; + type: "u16"; + value: "2_500"; }, { - "name": "HOST_FEE_BPS", - "type": "u16", - "value": "2_000" + name: "HOST_FEE_BPS"; + type: "u16"; + value: "2_000"; }, { - "name": "NUM_REWARDS", - "type": { - "defined": "usize" - }, - "value": "2" + name: "NUM_REWARDS"; + type: { + defined: "usize"; + }; + value: "2"; }, { - "name": "MIN_REWARD_DURATION", - "type": "u64", - "value": "1" + name: "MIN_REWARD_DURATION"; + type: "u64"; + value: "1"; }, { - "name": "MAX_REWARD_DURATION", - "type": "u64", - "value": "31536000" + name: "MAX_REWARD_DURATION"; + type: "u64"; + value: "31536000"; }, { - "name": "EXTENSION_BINARRAY_BITMAP_SIZE", - "type": { - "defined": "usize" - }, - "value": "12" + name: "EXTENSION_BINARRAY_BITMAP_SIZE"; + type: { + defined: "usize"; + }; + value: "12"; }, { - "name": "BIN_ARRAY_BITMAP_SIZE", - "type": "i32", - "value": "512" + name: "BIN_ARRAY_BITMAP_SIZE"; + type: "i32"; + value: "512"; }, { - "name": "MAX_REWARD_BIN_SPLIT", - "type": { - "defined": "usize" - }, - "value": "15" + name: "MAX_REWARD_BIN_SPLIT"; + type: { + defined: "usize"; + }; + value: "15"; }, { - "name": "BIN_ARRAY", - "type": "bytes", - "value": "[98, 105, 110, 95, 97, 114, 114, 97, 121]" + name: "BIN_ARRAY"; + type: "bytes"; + value: "[98, 105, 110, 95, 97, 114, 114, 97, 121]"; }, { - "name": "ORACLE", - "type": "bytes", - "value": "[111, 114, 97, 99, 108, 101]" + name: "ORACLE"; + type: "bytes"; + value: "[111, 114, 97, 99, 108, 101]"; }, { - "name": "BIN_ARRAY_BITMAP_SEED", - "type": "bytes", - "value": "[98, 105, 116, 109, 97, 112]" + name: "BIN_ARRAY_BITMAP_SEED"; + type: "bytes"; + value: "[98, 105, 116, 109, 97, 112]"; }, { - "name": "PRESET_PARAMETER", - "type": "bytes", - "value": "[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]" + name: "PRESET_PARAMETER"; + type: "bytes"; + value: "[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]"; }, { - "name": "POSITION", - "type": "bytes", - "value": "[112, 111, 115, 105, 116, 105, 111, 110]" + name: "POSITION"; + type: "bytes"; + value: "[112, 111, 115, 105, 116, 105, 111, 110]"; } - ], - "instructions": [ + ]; + instructions: [ { - "name": "initializeLbPair", - "accounts": [ + name: "initializeLbPair"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "tokenMintX", - "isMut": false, - "isSigner": false + name: "tokenMintX"; + isMut: false; + isSigner: false; }, { - "name": "tokenMintY", - "isMut": false, - "isSigner": false + name: "tokenMintY"; + isMut: false; + isSigner: false; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle"; + isMut: true; + isSigner: false; }, { - "name": "presetParameter", - "isMut": false, - "isSigner": false + name: "presetParameter"; + isMut: false; + isSigner: false; }, { - "name": "funder", - "isMut": true, - "isSigner": true + name: "funder"; + isMut: true; + isSigner: true; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "activeId", - "type": "i32" + name: "activeId"; + type: "i32"; }, { - "name": "binStep", - "type": "u16" + name: "binStep"; + type: "u16"; } - ] + ]; }, { "name": "initializePermissionLbPair", "accounts": [ { - "name": "base", - "isMut": false, - "isSigner": true + name: "base"; + isMut: false; + isSigner: true; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "tokenMintX", - "isMut": false, - "isSigner": false + name: "tokenMintX"; + isMut: false; + isSigner: false; }, { - "name": "tokenMintY", - "isMut": false, - "isSigner": false + name: "tokenMintY"; + isMut: false; + isSigner: false; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle"; + isMut: true; + isSigner: false; }, { - "name": "admin", - "isMut": true, - "isSigner": true + name: "admin"; + isMut: true; + isSigner: true; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "ixData", - "type": { - "defined": "InitPermissionPairIx" - } + name: "ixData"; + type: { + defined: "InitPermissionPairIx"; + }; } - ] + ]; }, { - "name": "initializeBinArrayBitmapExtension", - "accounts": [ + name: "initializeBinArrayBitmapExtension"; + accounts: [ { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair"; + isMut: false; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "docs": [ + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + docs: [ "Initialize an account to store if a bin array is initialized." - ] + ]; }, { - "name": "funder", - "isMut": true, - "isSigner": true + name: "funder"; + isMut: true; + isSigner: true; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { - "name": "initializeBinArray", - "accounts": [ + name: "initializeBinArray"; + accounts: [ { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair"; + isMut: false; + isSigner: false; }, { - "name": "binArray", - "isMut": true, - "isSigner": false + name: "binArray"; + isMut: true; + isSigner: false; }, { - "name": "funder", - "isMut": true, - "isSigner": true + name: "funder"; + isMut: true; + isSigner: true; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "index", - "type": "i64" + name: "index"; + type: "i64"; } - ] + ]; }, { - "name": "addLiquidity", - "accounts": [ + name: "addLiquidity"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX"; + isMut: true; + isSigner: false; }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY"; + isMut: true; + isSigner: false; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameter" - } + name: "liquidityParameter"; + type: { + defined: "LiquidityParameter"; + }; } - ] + ]; }, { - "name": "addLiquidityByWeight", - "accounts": [ + name: "addLiquidityByWeight"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX"; + isMut: true; + isSigner: false; }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY"; + isMut: true; + isSigner: false; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameterByWeight" - } + name: "liquidityParameter"; + type: { + defined: "LiquidityParameterByWeight"; + }; } - ] + ]; }, { - "name": "addLiquidityByStrategy", - "accounts": [ + name: "addLiquidityByStrategy"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX"; + isMut: true; + isSigner: false; }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY"; + isMut: true; + isSigner: false; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameterByStrategy" - } + name: "liquidityParameter"; + type: { + defined: "LiquidityParameterByStrategy"; + }; } - ] + ]; }, { - "name": "addLiquidityByStrategyOneSide", - "accounts": [ + name: "addLiquidityByStrategyOneSide"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "userToken", - "isMut": true, - "isSigner": false + name: "userToken"; + isMut: true; + isSigner: false; }, { - "name": "reserve", - "isMut": true, - "isSigner": false + name: "reserve"; + isMut: true; + isSigner: false; }, { - "name": "tokenMint", - "isMut": false, - "isSigner": false + name: "tokenMint"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameterByStrategyOneSide" - } + name: "liquidityParameter"; + type: { + defined: "LiquidityParameterByStrategyOneSide"; + }; } - ] + ]; }, { - "name": "addLiquidityOneSide", - "accounts": [ + name: "addLiquidityOneSide"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "userToken", - "isMut": true, - "isSigner": false + name: "userToken"; + isMut: true; + isSigner: false; }, { - "name": "reserve", - "isMut": true, - "isSigner": false + name: "reserve"; + isMut: true; + isSigner: false; }, { - "name": "tokenMint", - "isMut": false, - "isSigner": false + name: "tokenMint"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityOneSideParameter" - } + name: "liquidityParameter"; + type: { + defined: "LiquidityOneSideParameter"; + }; } - ] + ]; }, { - "name": "removeLiquidity", - "accounts": [ + name: "removeLiquidity"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX"; + isMut: true; + isSigner: false; }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY"; + isMut: true; + isSigner: false; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "binLiquidityRemoval", - "type": { - "vec": { - "defined": "BinLiquidityReduction" - } - } + name: "binLiquidityRemoval"; + type: { + vec: { + defined: "BinLiquidityReduction"; + }; + }; } - ] + ]; }, { - "name": "initializePosition", - "accounts": [ + name: "initializePosition"; + accounts: [ { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer"; + isMut: true; + isSigner: true; }, { - "name": "position", - "isMut": true, - "isSigner": true + name: "position"; + isMut: true; + isSigner: true; }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair"; + isMut: false; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "lowerBinId", - "type": "i32" + name: "lowerBinId"; + type: "i32"; }, { - "name": "width", - "type": "i32" + name: "width"; + type: "i32"; } - ] + ]; }, { - "name": "initializePositionPda", - "accounts": [ + name: "initializePositionPda"; + accounts: [ { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer"; + isMut: true; + isSigner: true; }, { - "name": "base", - "isMut": false, - "isSigner": true + name: "base"; + isMut: false; + isSigner: true; }, { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair"; + isMut: false; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true, - "docs": [ - "owner" - ] + name: "owner"; + isMut: false; + isSigner: true; + docs: ["owner"]; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "lowerBinId", - "type": "i32" + name: "lowerBinId"; + type: "i32"; }, { - "name": "width", - "type": "i32" + name: "width"; + type: "i32"; } - ] + ]; }, { - "name": "initializePositionByOperator", - "accounts": [ + name: "initializePositionByOperator"; + accounts: [ { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer"; + isMut: true; + isSigner: true; }, { - "name": "base", - "isMut": false, - "isSigner": true + name: "base"; + isMut: false; + isSigner: true; }, { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair"; + isMut: false; + isSigner: false; }, { - "name": "operator", - "isMut": false, - "isSigner": true, - "docs": [ - "operator" - ] + name: "operator"; + isMut: false; + isSigner: true; + docs: ["operator"]; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "lowerBinId", - "type": "i32" + name: "lowerBinId"; + type: "i32"; }, { - "name": "width", - "type": "i32" + name: "width"; + type: "i32"; }, { - "name": "owner", - "type": "publicKey" + name: "owner"; + type: "publicKey"; }, { - "name": "feeOwner", - "type": "publicKey" + name: "feeOwner"; + type: "publicKey"; } - ] + ]; }, { - "name": "updatePositionOperator", - "accounts": [ + name: "updatePositionOperator"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "operator", - "type": "publicKey" + name: "operator"; + type: "publicKey"; } - ] + ]; }, { - "name": "swap", - "accounts": [ + name: "swap"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: false; + isSigner: false; + isOptional: true; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "userTokenIn", - "isMut": true, - "isSigner": false + name: "userTokenIn"; + isMut: true; + isSigner: false; }, { - "name": "userTokenOut", - "isMut": true, - "isSigner": false + name: "userTokenOut"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle"; + isMut: true; + isSigner: false; }, { - "name": "hostFeeIn", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "hostFeeIn"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "user", - "isMut": false, - "isSigner": true + name: "user"; + isMut: false; + isSigner: true; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "amountIn", - "type": "u64" + name: "amountIn"; + type: "u64"; }, { - "name": "minAmountOut", - "type": "u64" + name: "minAmountOut"; + type: "u64"; } - ] + ]; }, { - "name": "swapExactOut", - "accounts": [ + name: "swapExactOut"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: false; + isSigner: false; + isOptional: true; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "userTokenIn", - "isMut": true, - "isSigner": false + name: "userTokenIn"; + isMut: true; + isSigner: false; }, { - "name": "userTokenOut", - "isMut": true, - "isSigner": false + name: "userTokenOut"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle"; + isMut: true; + isSigner: false; }, { - "name": "hostFeeIn", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "hostFeeIn"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "user", - "isMut": false, - "isSigner": true + name: "user"; + isMut: false; + isSigner: true; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "maxInAmount", - "type": "u64" + name: "maxInAmount"; + type: "u64"; }, { - "name": "outAmount", - "type": "u64" + name: "outAmount"; + type: "u64"; } - ] + ]; }, { - "name": "swapWithPriceImpact", - "accounts": [ + name: "swapWithPriceImpact"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: false; + isSigner: false; + isOptional: true; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "userTokenIn", - "isMut": true, - "isSigner": false + name: "userTokenIn"; + isMut: true; + isSigner: false; }, { - "name": "userTokenOut", - "isMut": true, - "isSigner": false + name: "userTokenOut"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle"; + isMut: true; + isSigner: false; }, { - "name": "hostFeeIn", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "hostFeeIn"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "user", - "isMut": false, - "isSigner": true + name: "user"; + isMut: false; + isSigner: true; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "amountIn", - "type": "u64" + name: "amountIn"; + type: "u64"; }, { - "name": "activeId", - "type": { - "option": "i32" - } + name: "activeId"; + type: { + option: "i32"; + }; }, { - "name": "maxPriceImpactBps", - "type": "u16" + name: "maxPriceImpactBps"; + type: "u16"; } - ] + ]; }, { - "name": "withdrawProtocolFee", - "accounts": [ + name: "withdrawProtocolFee"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "receiverTokenX", - "isMut": true, - "isSigner": false + name: "receiverTokenX"; + isMut: true; + isSigner: false; }, { - "name": "receiverTokenY", - "isMut": true, - "isSigner": false + name: "receiverTokenY"; + isMut: true; + isSigner: false; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "amountX", - "type": "u64" + name: "amountX"; + type: "u64"; }, { - "name": "amountY", - "type": "u64" + name: "amountY"; + type: "u64"; } - ] + ]; }, { - "name": "initializeReward", - "accounts": [ + name: "initializeReward"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "rewardVault", - "isMut": true, - "isSigner": false + name: "rewardVault"; + isMut: true; + isSigner: false; }, { - "name": "rewardMint", - "isMut": false, - "isSigner": false + name: "rewardMint"; + isMut: false; + isSigner: false; }, { "name": "admin", @@ -1461,582 +1457,582 @@ export type LbClmm = { "isSigner": true }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex"; + type: "u64"; }, { - "name": "rewardDuration", - "type": "u64" + name: "rewardDuration"; + type: "u64"; }, { - "name": "funder", - "type": "publicKey" + name: "funder"; + type: "publicKey"; } - ] + ]; }, { - "name": "fundReward", - "accounts": [ + name: "fundReward"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "rewardVault", - "isMut": true, - "isSigner": false + name: "rewardVault"; + isMut: true; + isSigner: false; }, { - "name": "rewardMint", - "isMut": false, - "isSigner": false + name: "rewardMint"; + isMut: false; + isSigner: false; }, { - "name": "funderTokenAccount", - "isMut": true, - "isSigner": false + name: "funderTokenAccount"; + isMut: true; + isSigner: false; }, { - "name": "funder", - "isMut": false, - "isSigner": true + name: "funder"; + isMut: false; + isSigner: true; }, { - "name": "binArray", - "isMut": true, - "isSigner": false + name: "binArray"; + isMut: true; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex"; + type: "u64"; }, { - "name": "amount", - "type": "u64" + name: "amount"; + type: "u64"; }, { - "name": "carryForward", - "type": "bool" + name: "carryForward"; + type: "bool"; } - ] + ]; }, { - "name": "updateRewardFunder", - "accounts": [ + name: "updateRewardFunder"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin"; + isMut: false; + isSigner: true; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex"; + type: "u64"; }, { - "name": "newFunder", - "type": "publicKey" + name: "newFunder"; + type: "publicKey"; } - ] + ]; }, { - "name": "updateRewardDuration", - "accounts": [ + name: "updateRewardDuration"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin"; + isMut: false; + isSigner: true; }, { - "name": "binArray", - "isMut": true, - "isSigner": false + name: "binArray"; + isMut: true; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex"; + type: "u64"; }, { - "name": "newDuration", - "type": "u64" + name: "newDuration"; + type: "u64"; } - ] + ]; }, { - "name": "claimReward", - "accounts": [ + name: "claimReward"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "rewardVault", - "isMut": true, - "isSigner": false + name: "rewardVault"; + isMut: true; + isSigner: false; }, { - "name": "rewardMint", - "isMut": false, - "isSigner": false + name: "rewardMint"; + isMut: false; + isSigner: false; }, { - "name": "userTokenAccount", - "isMut": true, - "isSigner": false + name: "userTokenAccount"; + isMut: true; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex"; + type: "u64"; } - ] + ]; }, { - "name": "claimFee", - "accounts": [ + name: "claimFee"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX"; + isMut: true; + isSigner: false; }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { "name": "closePosition", "accounts": [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "rentReceiver", - "isMut": true, - "isSigner": false + name: "rentReceiver"; + isMut: true; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { - "name": "updateFeeParameters", - "accounts": [ + name: "updateFeeParameters"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin"; + isMut: false; + isSigner: true; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "feeParameter", - "type": { - "defined": "FeeParameter" - } + name: "feeParameter"; + type: { + defined: "FeeParameter"; + }; } - ] + ]; }, { - "name": "increaseOracleLength", - "accounts": [ + name: "increaseOracleLength"; + accounts: [ { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle"; + isMut: true; + isSigner: false; }, { - "name": "funder", - "isMut": true, - "isSigner": true + name: "funder"; + isMut: true; + isSigner: true; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "lengthToAdd", - "type": "u64" + name: "lengthToAdd"; + type: "u64"; } - ] + ]; }, { - "name": "initializePresetParameter", - "accounts": [ + name: "initializePresetParameter"; + accounts: [ { - "name": "presetParameter", - "isMut": true, - "isSigner": false + name: "presetParameter"; + isMut: true; + isSigner: false; }, { - "name": "admin", - "isMut": true, - "isSigner": true + name: "admin"; + isMut: true; + isSigner: true; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "ix", - "type": { - "defined": "InitPresetParametersIx" - } + name: "ix"; + type: { + defined: "InitPresetParametersIx"; + }; } - ] + ]; }, { - "name": "closePresetParameter", - "accounts": [ + name: "closePresetParameter"; + accounts: [ { - "name": "presetParameter", - "isMut": true, - "isSigner": false + name: "presetParameter"; + isMut: true; + isSigner: false; }, { - "name": "admin", - "isMut": true, - "isSigner": true + name: "admin"; + isMut: true; + isSigner: true; }, { - "name": "rentReceiver", - "isMut": true, - "isSigner": false + name: "rentReceiver"; + isMut: true; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { - "name": "removeAllLiquidity", - "accounts": [ + name: "removeAllLiquidity"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX"; + isMut: true; + isSigner: false; }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY"; + isMut: true; + isSigner: false; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { "name": "removeLiquiditySingleSide", @@ -2109,672 +2105,645 @@ export type LbClmm = { "name": "togglePairStatus", "accounts": [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin"; + isMut: false; + isSigner: true; } - ], - "args": [] + ]; + args: []; }, { - "name": "updateWhitelistedWallet", - "accounts": [ + name: "updateWhitelistedWallet"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "creator", - "isMut": false, - "isSigner": true + name: "creator"; + isMut: false; + isSigner: true; } - ], - "args": [ + ]; + args: [ { - "name": "wallet", - "type": "publicKey" + name: "wallet"; + type: "publicKey"; } - ] + ]; }, { - "name": "migratePosition", - "accounts": [ + name: "migratePosition"; + accounts: [ { - "name": "positionV2", - "isMut": true, - "isSigner": true + name: "positionV2"; + isMut: true; + isSigner: true; }, { - "name": "positionV1", - "isMut": true, - "isSigner": false + name: "positionV1"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": true, - "isSigner": true + name: "owner"; + isMut: true; + isSigner: true; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "rentReceiver", - "isMut": true, - "isSigner": false + name: "rentReceiver"; + isMut: true; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { - "name": "migrateBinArray", - "accounts": [ + name: "migrateBinArray"; + accounts: [ { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { - "name": "updateFeesAndRewards", - "accounts": [ + name: "updateFeesAndRewards"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; } - ], - "args": [] + ]; + args: []; }, { - "name": "withdrawIneligibleReward", - "accounts": [ + name: "withdrawIneligibleReward"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "rewardVault", - "isMut": true, - "isSigner": false + name: "rewardVault"; + isMut: true; + isSigner: false; }, { - "name": "rewardMint", - "isMut": false, - "isSigner": false + name: "rewardMint"; + isMut: false; + isSigner: false; }, { - "name": "funderTokenAccount", - "isMut": true, - "isSigner": false + name: "funderTokenAccount"; + isMut: true; + isSigner: false; }, { - "name": "funder", - "isMut": false, - "isSigner": true + name: "funder"; + isMut: false; + isSigner: true; }, { - "name": "binArray", - "isMut": true, - "isSigner": false + name: "binArray"; + isMut: true; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex"; + type: "u64"; } - ] + ]; }, { "name": "setActivationPoint", "accounts": [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "admin", - "isMut": true, - "isSigner": true + name: "admin"; + isMut: true; + isSigner: true; } - ], - "args": [ + ]; + args: [ { "name": "activationPoint", "type": "u64" } - ] + ]; }, { "name": "setLockReleasePoint", "accounts": [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair"; + isMut: false; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { "name": "newLockReleasePoint", "type": "u64" } - ] + ]; }, { - "name": "removeLiquidityByRange", - "accounts": [ + name: "removeLiquidityByRange"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX"; + isMut: true; + isSigner: false; }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY"; + isMut: true; + isSigner: false; }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX"; + isMut: true; + isSigner: false; }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY"; + isMut: true; + isSigner: false; }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint"; + isMut: false; + isSigner: false; }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram"; + isMut: false; + isSigner: false; }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "fromBinId", - "type": "i32" + name: "fromBinId"; + type: "i32"; }, { - "name": "toBinId", - "type": "i32" + name: "toBinId"; + type: "i32"; }, { - "name": "bpsToRemove", - "type": "u16" + name: "bpsToRemove"; + type: "u16"; } - ] + ]; }, { - "name": "addLiquidityOneSidePrecise", - "accounts": [ + name: "addLiquidityOneSidePrecise"; + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position"; + isMut: true; + isSigner: false; }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; }, { - "name": "userToken", - "isMut": true, - "isSigner": false + name: "userToken"; + isMut: true; + isSigner: false; }, { - "name": "reserve", - "isMut": true, - "isSigner": false + name: "reserve"; + isMut: true; + isSigner: false; }, { - "name": "tokenMint", - "isMut": false, - "isSigner": false + name: "tokenMint"; + isMut: false; + isSigner: false; }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower"; + isMut: true; + isSigner: false; }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper"; + isMut: true; + isSigner: false; }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender"; + isMut: false; + isSigner: true; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "parameter", - "type": { - "defined": "AddLiquiditySingleSidePreciseParameter" - } + name: "parameter"; + type: { + defined: "AddLiquiditySingleSidePreciseParameter"; + }; } - ] + ]; }, { - "name": "goToABin", - "accounts": [ + name: "goToABin"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension"; + isMut: false; + isSigner: false; + isOptional: true; }, { - "name": "fromBinArray", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "fromBinArray"; + isMut: false; + isSigner: false; + isOptional: true; }, { - "name": "toBinArray", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "toBinArray"; + isMut: false; + isSigner: false; + isOptional: true; }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority"; + isMut: false; + isSigner: false; }, { - "name": "program", - "isMut": false, - "isSigner": false + name: "program"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "binId", - "type": "i32" + name: "binId"; + type: "i32"; } - ] + ]; }, { "name": "setPreActivationDuration", "accounts": [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "creator", - "isMut": false, - "isSigner": true + name: "creator"; + isMut: false; + isSigner: true; } - ], - "args": [ + ]; + args: [ { "name": "preActivationDuration", "type": "u16" } - ] + ]; }, { - "name": "setPreActivationSwapAddress", - "accounts": [ + name: "setPreActivationSwapAddress"; + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair"; + isMut: true; + isSigner: false; }, { - "name": "creator", - "isMut": false, - "isSigner": true + name: "creator"; + isMut: false; + isSigner: true; } - ], - "args": [ + ]; + args: [ { - "name": "preActivationSwapAddress", - "type": "publicKey" + name: "preActivationSwapAddress"; + type: "publicKey"; } ] } - ], - "accounts": [ + ]; + accounts: [ { - "name": "binArrayBitmapExtension", - "type": { - "kind": "struct", - "fields": [ + name: "binArrayBitmapExtension"; + type: { + kind: "struct"; + fields: [ { - "name": "lbPair", - "type": "publicKey" + name: "lbPair"; + type: "publicKey"; }, { - "name": "positiveBinArrayBitmap", - "docs": [ + name: "positiveBinArrayBitmap"; + docs: [ "Packed initialized bin array state for start_bin_index is positive" - ], - "type": { - "array": [ + ]; + type: { + array: [ { - "array": [ - "u64", - 8 - ] + array: ["u64", 8]; }, 12 - ] - } + ]; + }; }, { - "name": "negativeBinArrayBitmap", - "docs": [ + name: "negativeBinArrayBitmap"; + docs: [ "Packed initialized bin array state for start_bin_index is negative" - ], - "type": { - "array": [ + ]; + type: { + array: [ { - "array": [ - "u64", - 8 - ] + array: ["u64", 8]; }, 12 - ] - } + ]; + }; } - ] - } + ]; + }; }, { - "name": "binArray", - "docs": [ + name: "binArray"; + docs: [ "An account to contain a range of bin. For example: Bin 100 <-> 200.", "For example:", "BinArray index: 0 contains bin 0 <-> 599", "index: 2 contains bin 600 <-> 1199, ..." - ], - "type": { - "kind": "struct", - "fields": [ + ]; + type: { + kind: "struct"; + fields: [ { - "name": "index", - "type": "i64" + name: "index"; + type: "i64"; }, { - "name": "version", - "docs": [ - "Version of binArray" - ], - "type": "u8" + name: "version"; + docs: ["Version of binArray"]; + type: "u8"; }, { - "name": "padding", - "type": { - "array": [ - "u8", - 7 - ] - } + name: "padding"; + type: { + array: ["u8", 7]; + }; }, { - "name": "lbPair", - "type": "publicKey" + name: "lbPair"; + type: "publicKey"; }, { - "name": "bins", - "type": { - "array": [ + name: "bins"; + type: { + array: [ { - "defined": "Bin" + defined: "Bin"; }, 70 - ] - } + ]; + }; } - ] - } + ]; + }; }, { - "name": "lbPair", - "type": { - "kind": "struct", - "fields": [ + name: "lbPair"; + type: { + kind: "struct"; + fields: [ { - "name": "parameters", - "type": { - "defined": "StaticParameters" - } + name: "parameters"; + type: { + defined: "StaticParameters"; + }; }, { - "name": "vParameters", - "type": { - "defined": "VariableParameters" - } + name: "vParameters"; + type: { + defined: "VariableParameters"; + }; }, { - "name": "bumpSeed", - "type": { - "array": [ - "u8", - 1 - ] - } + name: "bumpSeed"; + type: { + array: ["u8", 1]; + }; }, { - "name": "binStepSeed", - "docs": [ - "Bin step signer seed" - ], - "type": { - "array": [ - "u8", - 2 - ] - } + name: "binStepSeed"; + docs: ["Bin step signer seed"]; + type: { + array: ["u8", 2]; + }; }, { - "name": "pairType", - "docs": [ - "Type of the pair" - ], - "type": "u8" + name: "pairType"; + docs: ["Type of the pair"]; + type: "u8"; }, { - "name": "activeId", - "docs": [ - "Active bin id" - ], - "type": "i32" + name: "activeId"; + docs: ["Active bin id"]; + type: "i32"; }, { - "name": "binStep", - "docs": [ - "Bin step. Represent the price increment / decrement." - ], - "type": "u16" + name: "binStep"; + docs: ["Bin step. Represent the price increment / decrement."]; + type: "u16"; }, { - "name": "status", - "docs": [ - "Status of the pair. Check PairStatus enum." - ], - "type": "u8" + name: "status"; + docs: ["Status of the pair. Check PairStatus enum."]; + type: "u8"; }, { "name": "requireBaseFactorSeed", @@ -2810,41 +2779,31 @@ export type LbClmm = { "type": "u8" }, { - "name": "tokenXMint", - "docs": [ - "Token X mint" - ], - "type": "publicKey" + name: "tokenXMint"; + docs: ["Token X mint"]; + type: "publicKey"; }, { - "name": "tokenYMint", - "docs": [ - "Token Y mint" - ], - "type": "publicKey" + name: "tokenYMint"; + docs: ["Token Y mint"]; + type: "publicKey"; }, { - "name": "reserveX", - "docs": [ - "LB token X vault" - ], - "type": "publicKey" + name: "reserveX"; + docs: ["LB token X vault"]; + type: "publicKey"; }, { - "name": "reserveY", - "docs": [ - "LB token Y vault" - ], - "type": "publicKey" + name: "reserveY"; + docs: ["LB token Y vault"]; + type: "publicKey"; }, { - "name": "protocolFee", - "docs": [ - "Uncollected protocol fee" - ], - "type": { - "defined": "ProtocolFee" - } + name: "protocolFee"; + docs: ["Uncollected protocol fee"]; + type: { + defined: "ProtocolFee"; + }; }, { "name": "padding1", @@ -2859,51 +2818,38 @@ export type LbClmm = { } }, { - "name": "rewardInfos", - "docs": [ - "Farming reward information" - ], - "type": { - "array": [ + name: "rewardInfos"; + docs: ["Farming reward information"]; + type: { + array: [ { - "defined": "RewardInfo" + defined: "RewardInfo"; }, 2 - ] - } + ]; + }; }, { - "name": "oracle", - "docs": [ - "Oracle pubkey" - ], - "type": "publicKey" + name: "oracle"; + docs: ["Oracle pubkey"]; + type: "publicKey"; }, { - "name": "binArrayBitmap", - "docs": [ - "Packed initialized bin array state" - ], - "type": { - "array": [ - "u64", - 16 - ] - } + name: "binArrayBitmap"; + docs: ["Packed initialized bin array state"]; + type: { + array: ["u64", 16]; + }; }, { - "name": "lastUpdatedAt", - "docs": [ - "Last time the pool fee parameter was updated" - ], - "type": "i64" + name: "lastUpdatedAt"; + docs: ["Last time the pool fee parameter was updated"]; + type: "i64"; }, { - "name": "whitelistedWallet", - "docs": [ - "Whitelisted wallet" - ], - "type": "publicKey" + name: "whitelistedWallet"; + docs: ["Whitelisted wallet"]; + type: "publicKey"; }, { "name": "preActivationSwapAddress", @@ -2913,11 +2859,9 @@ export type LbClmm = { "type": "publicKey" }, { - "name": "baseKey", - "docs": [ - "Base keypair. Only required for permission pair" - ], - "type": "publicKey" + name: "baseKey"; + docs: ["Base keypair. Only required for permission pair"]; + type: "publicKey"; }, { "name": "activationPoint", @@ -2949,36 +2893,29 @@ export type LbClmm = { "name": "lockDuration", "docs": [ "Liquidity lock duration for positions which created before activate. Only applicable for permission pair." - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "creator", - "docs": [ - "Pool creator" - ], - "type": "publicKey" + name: "creator"; + docs: ["Pool creator"]; + type: "publicKey"; }, { - "name": "reserved", - "docs": [ - "Reserved space for future use" - ], - "type": { - "array": [ - "u8", - 24 - ] - } + name: "reserved"; + docs: ["Reserved space for future use"]; + type: { + array: ["u8", 24]; + }; } - ] - } + ]; + }; }, { - "name": "oracle", - "type": { - "kind": "struct", - "fields": [ + name: "oracle"; + type: { + kind: "struct"; + fields: [ { "name": "idx", "docs": [ @@ -2987,255 +2924,198 @@ export type LbClmm = { "type": "u64" }, { - "name": "activeSize", - "docs": [ + name: "activeSize"; + docs: [ "Size of active sample. Active sample is initialized observation." - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "length", - "docs": [ - "Number of observations" - ], - "type": "u64" + name: "length"; + docs: ["Number of observations"]; + type: "u64"; } - ] - } + ]; + }; }, { - "name": "position", - "type": { - "kind": "struct", - "fields": [ + name: "position"; + type: { + kind: "struct"; + fields: [ { - "name": "lbPair", - "docs": [ - "The LB pair of this position" - ], - "type": "publicKey" + name: "lbPair"; + docs: ["The LB pair of this position"]; + type: "publicKey"; }, { - "name": "owner", - "docs": [ + name: "owner"; + docs: [ "Owner of the position. Client rely on this to to fetch their positions." - ], - "type": "publicKey" + ]; + type: "publicKey"; }, { - "name": "liquidityShares", - "docs": [ + name: "liquidityShares"; + docs: [ "Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept." - ], - "type": { - "array": [ - "u64", - 70 - ] - } + ]; + type: { + array: ["u64", 70]; + }; }, { - "name": "rewardInfos", - "docs": [ - "Farming reward information" - ], - "type": { - "array": [ + name: "rewardInfos"; + docs: ["Farming reward information"]; + type: { + array: [ { - "defined": "UserRewardInfo" + defined: "UserRewardInfo"; }, 70 - ] - } + ]; + }; }, { - "name": "feeInfos", - "docs": [ - "Swap fee to claim information" - ], - "type": { - "array": [ + name: "feeInfos"; + docs: ["Swap fee to claim information"]; + type: { + array: [ { - "defined": "FeeInfo" + defined: "FeeInfo"; }, 70 - ] - } + ]; + }; }, { - "name": "lowerBinId", - "docs": [ - "Lower bin ID" - ], - "type": "i32" + name: "lowerBinId"; + docs: ["Lower bin ID"]; + type: "i32"; }, { - "name": "upperBinId", - "docs": [ - "Upper bin ID" - ], - "type": "i32" + name: "upperBinId"; + docs: ["Upper bin ID"]; + type: "i32"; }, { - "name": "lastUpdatedAt", - "docs": [ - "Last updated timestamp" - ], - "type": "i64" + name: "lastUpdatedAt"; + docs: ["Last updated timestamp"]; + type: "i64"; }, { - "name": "totalClaimedFeeXAmount", - "docs": [ - "Total claimed token fee X" - ], - "type": "u64" + name: "totalClaimedFeeXAmount"; + docs: ["Total claimed token fee X"]; + type: "u64"; }, { - "name": "totalClaimedFeeYAmount", - "docs": [ - "Total claimed token fee Y" - ], - "type": "u64" + name: "totalClaimedFeeYAmount"; + docs: ["Total claimed token fee Y"]; + type: "u64"; }, { - "name": "totalClaimedRewards", - "docs": [ - "Total claimed rewards" - ], - "type": { - "array": [ - "u64", - 2 - ] - } + name: "totalClaimedRewards"; + docs: ["Total claimed rewards"]; + type: { + array: ["u64", 2]; + }; }, { - "name": "reserved", - "docs": [ - "Reserved space for future use" - ], - "type": { - "array": [ - "u8", - 160 - ] - } + name: "reserved"; + docs: ["Reserved space for future use"]; + type: { + array: ["u8", 160]; + }; } - ] - } + ]; + }; }, { - "name": "positionV2", - "type": { - "kind": "struct", - "fields": [ + name: "positionV2"; + type: { + kind: "struct"; + fields: [ { - "name": "lbPair", - "docs": [ - "The LB pair of this position" - ], - "type": "publicKey" + name: "lbPair"; + docs: ["The LB pair of this position"]; + type: "publicKey"; }, { - "name": "owner", - "docs": [ + name: "owner"; + docs: [ "Owner of the position. Client rely on this to to fetch their positions." - ], - "type": "publicKey" + ]; + type: "publicKey"; }, { - "name": "liquidityShares", - "docs": [ + name: "liquidityShares"; + docs: [ "Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept." - ], - "type": { - "array": [ - "u128", - 70 - ] - } + ]; + type: { + array: ["u128", 70]; + }; }, { - "name": "rewardInfos", - "docs": [ - "Farming reward information" - ], - "type": { - "array": [ + name: "rewardInfos"; + docs: ["Farming reward information"]; + type: { + array: [ { - "defined": "UserRewardInfo" + defined: "UserRewardInfo"; }, 70 - ] - } + ]; + }; }, { - "name": "feeInfos", - "docs": [ - "Swap fee to claim information" - ], - "type": { - "array": [ + name: "feeInfos"; + docs: ["Swap fee to claim information"]; + type: { + array: [ { - "defined": "FeeInfo" + defined: "FeeInfo"; }, 70 - ] - } + ]; + }; }, { - "name": "lowerBinId", - "docs": [ - "Lower bin ID" - ], - "type": "i32" + name: "lowerBinId"; + docs: ["Lower bin ID"]; + type: "i32"; }, { - "name": "upperBinId", - "docs": [ - "Upper bin ID" - ], - "type": "i32" + name: "upperBinId"; + docs: ["Upper bin ID"]; + type: "i32"; }, { - "name": "lastUpdatedAt", - "docs": [ - "Last updated timestamp" - ], - "type": "i64" + name: "lastUpdatedAt"; + docs: ["Last updated timestamp"]; + type: "i64"; }, { - "name": "totalClaimedFeeXAmount", - "docs": [ - "Total claimed token fee X" - ], - "type": "u64" + name: "totalClaimedFeeXAmount"; + docs: ["Total claimed token fee X"]; + type: "u64"; }, { - "name": "totalClaimedFeeYAmount", - "docs": [ - "Total claimed token fee Y" - ], - "type": "u64" + name: "totalClaimedFeeYAmount"; + docs: ["Total claimed token fee Y"]; + type: "u64"; }, { - "name": "totalClaimedRewards", - "docs": [ - "Total claimed rewards" - ], - "type": { - "array": [ - "u64", - 2 - ] - } + name: "totalClaimedRewards"; + docs: ["Total claimed rewards"]; + type: { + array: ["u64", 2]; + }; }, { - "name": "operator", - "docs": [ - "Operator of position" - ], - "type": "publicKey" + name: "operator"; + docs: ["Operator of position"]; + type: "publicKey"; }, { "name": "lockReleasePoint", @@ -3245,471 +3125,405 @@ export type LbClmm = { "type": "u64" }, { - "name": "subjectedToBootstrapLiquidityLocking", - "docs": [ + name: "subjectedToBootstrapLiquidityLocking"; + docs: [ "Is the position subjected to liquidity locking for the launch pool." - ], - "type": "u8" + ]; + type: "u8"; }, { - "name": "feeOwner", - "docs": [ + name: "feeOwner"; + docs: [ "Address is able to claim fee in this position, only valid for bootstrap_liquidity_position" - ], - "type": "publicKey" + ]; + type: "publicKey"; }, { - "name": "reserved", - "docs": [ - "Reserved space for future use" - ], - "type": { - "array": [ - "u8", - 87 - ] - } + name: "reserved"; + docs: ["Reserved space for future use"]; + type: { + array: ["u8", 87]; + }; } - ] - } + ]; + }; }, { - "name": "presetParameter", - "type": { - "kind": "struct", - "fields": [ + name: "presetParameter"; + type: { + kind: "struct"; + fields: [ { - "name": "binStep", - "docs": [ - "Bin step. Represent the price increment / decrement." - ], - "type": "u16" + name: "binStep"; + docs: ["Bin step. Represent the price increment / decrement."]; + type: "u16"; }, { - "name": "baseFactor", - "docs": [ + name: "baseFactor"; + docs: [ "Used for base fee calculation. base_fee_rate = base_factor * bin_step" - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "filterPeriod", - "docs": [ + name: "filterPeriod"; + docs: [ "Filter period determine high frequency trading time window." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "decayPeriod", - "docs": [ + name: "decayPeriod"; + docs: [ "Decay period determine when the volatile fee start decay / decrease." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "reductionFactor", - "docs": [ + name: "reductionFactor"; + docs: [ "Reduction factor controls the volatile fee rate decrement rate." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "variableFeeControl", - "docs": [ + name: "variableFeeControl"; + docs: [ "Used to scale the variable fee component depending on the dynamic of the market" - ], - "type": "u32" + ]; + type: "u32"; }, { - "name": "maxVolatilityAccumulator", - "docs": [ + name: "maxVolatilityAccumulator"; + docs: [ "Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate." - ], - "type": "u32" + ]; + type: "u32"; }, { - "name": "minBinId", - "docs": [ + name: "minBinId"; + docs: [ "Min bin id supported by the pool based on the configured bin step." - ], - "type": "i32" + ]; + type: "i32"; }, { - "name": "maxBinId", - "docs": [ + name: "maxBinId"; + docs: [ "Max bin id supported by the pool based on the configured bin step." - ], - "type": "i32" + ]; + type: "i32"; }, { - "name": "protocolShare", - "docs": [ + name: "protocolShare"; + docs: [ "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" - ], - "type": "u16" + ]; + type: "u16"; } ] } } - ], - "types": [ + ]; + types: [ { - "name": "LiquidityParameterByStrategyOneSide", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityParameterByStrategyOneSide"; + type: { + kind: "struct"; + fields: [ { - "name": "amount", - "docs": [ - "Amount of X token or Y token to deposit" - ], - "type": "u64" + name: "amount"; + docs: ["Amount of X token or Y token to deposit"]; + type: "u64"; }, { - "name": "activeId", - "docs": [ - "Active bin that integrator observe off-chain" - ], - "type": "i32" + name: "activeId"; + docs: ["Active bin that integrator observe off-chain"]; + type: "i32"; }, { - "name": "maxActiveBinSlippage", - "docs": [ - "max active bin slippage allowed" - ], - "type": "i32" + name: "maxActiveBinSlippage"; + docs: ["max active bin slippage allowed"]; + type: "i32"; }, { - "name": "strategyParameters", - "docs": [ - "strategy parameters" - ], - "type": { - "defined": "StrategyParameters" - } + name: "strategyParameters"; + docs: ["strategy parameters"]; + type: { + defined: "StrategyParameters"; + }; } - ] - } + ]; + }; }, { - "name": "LiquidityParameterByStrategy", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityParameterByStrategy"; + type: { + kind: "struct"; + fields: [ { - "name": "amountX", - "docs": [ - "Amount of X token to deposit" - ], - "type": "u64" + name: "amountX"; + docs: ["Amount of X token to deposit"]; + type: "u64"; }, { - "name": "amountY", - "docs": [ - "Amount of Y token to deposit" - ], - "type": "u64" + name: "amountY"; + docs: ["Amount of Y token to deposit"]; + type: "u64"; }, { - "name": "activeId", - "docs": [ - "Active bin that integrator observe off-chain" - ], - "type": "i32" + name: "activeId"; + docs: ["Active bin that integrator observe off-chain"]; + type: "i32"; }, { - "name": "maxActiveBinSlippage", - "docs": [ - "max active bin slippage allowed" - ], - "type": "i32" + name: "maxActiveBinSlippage"; + docs: ["max active bin slippage allowed"]; + type: "i32"; }, { - "name": "strategyParameters", - "docs": [ - "strategy parameters" - ], - "type": { - "defined": "StrategyParameters" - } + name: "strategyParameters"; + docs: ["strategy parameters"]; + type: { + defined: "StrategyParameters"; + }; } - ] - } + ]; + }; }, { - "name": "StrategyParameters", - "type": { - "kind": "struct", - "fields": [ + name: "StrategyParameters"; + type: { + kind: "struct"; + fields: [ { - "name": "minBinId", - "docs": [ - "min bin id" - ], - "type": "i32" + name: "minBinId"; + docs: ["min bin id"]; + type: "i32"; }, { - "name": "maxBinId", - "docs": [ - "max bin id" - ], - "type": "i32" + name: "maxBinId"; + docs: ["max bin id"]; + type: "i32"; }, { - "name": "strategyType", - "docs": [ - "strategy type" - ], - "type": { - "defined": "StrategyType" - } + name: "strategyType"; + docs: ["strategy type"]; + type: { + defined: "StrategyType"; + }; }, { - "name": "parameteres", - "docs": [ - "parameters" - ], - "type": { - "array": [ - "u8", - 64 - ] - } + name: "parameteres"; + docs: ["parameters"]; + type: { + array: ["u8", 64]; + }; } - ] - } + ]; + }; }, { - "name": "LiquidityOneSideParameter", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityOneSideParameter"; + type: { + kind: "struct"; + fields: [ { - "name": "amount", - "docs": [ - "Amount of X token or Y token to deposit" - ], - "type": "u64" + name: "amount"; + docs: ["Amount of X token or Y token to deposit"]; + type: "u64"; }, { - "name": "activeId", - "docs": [ - "Active bin that integrator observe off-chain" - ], - "type": "i32" + name: "activeId"; + docs: ["Active bin that integrator observe off-chain"]; + type: "i32"; }, { - "name": "maxActiveBinSlippage", - "docs": [ - "max active bin slippage allowed" - ], - "type": "i32" + name: "maxActiveBinSlippage"; + docs: ["max active bin slippage allowed"]; + type: "i32"; }, { - "name": "binLiquidityDist", - "docs": [ - "Liquidity distribution to each bins" - ], - "type": { - "vec": { - "defined": "BinLiquidityDistributionByWeight" - } - } + name: "binLiquidityDist"; + docs: ["Liquidity distribution to each bins"]; + type: { + vec: { + defined: "BinLiquidityDistributionByWeight"; + }; + }; } - ] - } + ]; + }; }, { - "name": "BinLiquidityDistributionByWeight", - "type": { - "kind": "struct", - "fields": [ + name: "BinLiquidityDistributionByWeight"; + type: { + kind: "struct"; + fields: [ { - "name": "binId", - "docs": [ - "Define the bin ID wish to deposit to." - ], - "type": "i32" + name: "binId"; + docs: ["Define the bin ID wish to deposit to."]; + type: "i32"; }, { - "name": "weight", - "docs": [ - "weight of liquidity distributed for this bin id" - ], - "type": "u16" + name: "weight"; + docs: ["weight of liquidity distributed for this bin id"]; + type: "u16"; } - ] - } + ]; + }; }, { - "name": "LiquidityParameterByWeight", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityParameterByWeight"; + type: { + kind: "struct"; + fields: [ { - "name": "amountX", - "docs": [ - "Amount of X token to deposit" - ], - "type": "u64" + name: "amountX"; + docs: ["Amount of X token to deposit"]; + type: "u64"; }, { - "name": "amountY", - "docs": [ - "Amount of Y token to deposit" - ], - "type": "u64" + name: "amountY"; + docs: ["Amount of Y token to deposit"]; + type: "u64"; }, { - "name": "activeId", - "docs": [ - "Active bin that integrator observe off-chain" - ], - "type": "i32" + name: "activeId"; + docs: ["Active bin that integrator observe off-chain"]; + type: "i32"; }, { - "name": "maxActiveBinSlippage", - "docs": [ - "max active bin slippage allowed" - ], - "type": "i32" + name: "maxActiveBinSlippage"; + docs: ["max active bin slippage allowed"]; + type: "i32"; }, { - "name": "binLiquidityDist", - "docs": [ - "Liquidity distribution to each bins" - ], - "type": { - "vec": { - "defined": "BinLiquidityDistributionByWeight" - } - } + name: "binLiquidityDist"; + docs: ["Liquidity distribution to each bins"]; + type: { + vec: { + defined: "BinLiquidityDistributionByWeight"; + }; + }; } - ] - } + ]; + }; }, { - "name": "AddLiquiditySingleSidePreciseParameter", - "type": { - "kind": "struct", - "fields": [ + name: "AddLiquiditySingleSidePreciseParameter"; + type: { + kind: "struct"; + fields: [ { - "name": "bins", - "type": { - "vec": { - "defined": "CompressedBinDepositAmount" - } - } + name: "bins"; + type: { + vec: { + defined: "CompressedBinDepositAmount"; + }; + }; }, { - "name": "decompressMultiplier", - "type": "u64" + name: "decompressMultiplier"; + type: "u64"; } - ] - } + ]; + }; }, { - "name": "CompressedBinDepositAmount", - "type": { - "kind": "struct", - "fields": [ + name: "CompressedBinDepositAmount"; + type: { + kind: "struct"; + fields: [ { - "name": "binId", - "type": "i32" + name: "binId"; + type: "i32"; }, { - "name": "amount", - "type": "u32" + name: "amount"; + type: "u32"; } - ] - } + ]; + }; }, { - "name": "BinLiquidityDistribution", - "type": { - "kind": "struct", - "fields": [ + name: "BinLiquidityDistribution"; + type: { + kind: "struct"; + fields: [ { - "name": "binId", - "docs": [ - "Define the bin ID wish to deposit to." - ], - "type": "i32" + name: "binId"; + docs: ["Define the bin ID wish to deposit to."]; + type: "i32"; }, { - "name": "distributionX", - "docs": [ + name: "distributionX"; + docs: [ "DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "distributionY", - "docs": [ + name: "distributionY"; + docs: [ "DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin." - ], - "type": "u16" + ]; + type: "u16"; } - ] - } + ]; + }; }, { - "name": "LiquidityParameter", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityParameter"; + type: { + kind: "struct"; + fields: [ { - "name": "amountX", - "docs": [ - "Amount of X token to deposit" - ], - "type": "u64" + name: "amountX"; + docs: ["Amount of X token to deposit"]; + type: "u64"; }, { - "name": "amountY", - "docs": [ - "Amount of Y token to deposit" - ], - "type": "u64" + name: "amountY"; + docs: ["Amount of Y token to deposit"]; + type: "u64"; }, { - "name": "binLiquidityDist", - "docs": [ - "Liquidity distribution to each bins" - ], - "type": { - "vec": { - "defined": "BinLiquidityDistribution" - } - } + name: "binLiquidityDist"; + docs: ["Liquidity distribution to each bins"]; + type: { + vec: { + defined: "BinLiquidityDistribution"; + }; + }; } - ] - } + ]; + }; }, { - "name": "InitPermissionPairIx", - "type": { - "kind": "struct", - "fields": [ + name: "InitPermissionPairIx"; + type: { + kind: "struct"; + fields: [ { - "name": "activeId", - "type": "i32" + name: "activeId"; + type: "i32"; }, { - "name": "binStep", - "type": "u16" + name: "binStep"; + type: "u16"; }, { - "name": "baseFactor", - "type": "u16" + name: "baseFactor"; + type: "u16"; }, { - "name": "minBinId", - "type": "i32" + name: "minBinId"; + type: "i32"; }, { - "name": "maxBinId", - "type": "i32" + name: "maxBinId"; + type: "i32"; }, { "name": "lockDuration", @@ -3719,86 +3533,84 @@ export type LbClmm = { "name": "activationType", "type": "u8" } - ] - } + ]; + }; }, { - "name": "InitPresetParametersIx", - "type": { - "kind": "struct", - "fields": [ + name: "InitPresetParametersIx"; + type: { + kind: "struct"; + fields: [ { - "name": "binStep", - "docs": [ - "Bin step. Represent the price increment / decrement." - ], - "type": "u16" + name: "binStep"; + docs: ["Bin step. Represent the price increment / decrement."]; + type: "u16"; }, { - "name": "baseFactor", - "docs": [ + name: "baseFactor"; + docs: [ "Used for base fee calculation. base_fee_rate = base_factor * bin_step" - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "filterPeriod", - "docs": [ + name: "filterPeriod"; + docs: [ "Filter period determine high frequency trading time window." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "decayPeriod", - "docs": [ + name: "decayPeriod"; + docs: [ "Decay period determine when the volatile fee start decay / decrease." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "reductionFactor", - "docs": [ + name: "reductionFactor"; + docs: [ "Reduction factor controls the volatile fee rate decrement rate." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "variableFeeControl", - "docs": [ + name: "variableFeeControl"; + docs: [ "Used to scale the variable fee component depending on the dynamic of the market" - ], - "type": "u32" + ]; + type: "u32"; }, { - "name": "maxVolatilityAccumulator", - "docs": [ + name: "maxVolatilityAccumulator"; + docs: [ "Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate." - ], - "type": "u32" + ]; + type: "u32"; }, { - "name": "minBinId", - "docs": [ + name: "minBinId"; + docs: [ "Min bin id supported by the pool based on the configured bin step." - ], - "type": "i32" + ]; + type: "i32"; }, { - "name": "maxBinId", - "docs": [ + name: "maxBinId"; + docs: [ "Max bin id supported by the pool based on the configured bin step." - ], - "type": "i32" + ]; + type: "i32"; }, { - "name": "protocolShare", - "docs": [ + name: "protocolShare"; + docs: [ "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" - ], - "type": "u16" + ]; + type: "u16"; } - ] - } + ]; + }; }, { "name": "FeeParameter", @@ -3806,21 +3618,19 @@ export type LbClmm = { "kind": "struct", "fields": [ { - "name": "protocolShare", - "docs": [ + name: "protocolShare"; + docs: [ "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "baseFactor", - "docs": [ - "Base factor for base fee rate" - ], - "type": "u16" + name: "baseFactor"; + docs: ["Base factor for base fee rate"]; + type: "u16"; } - ] - } + ]; + }; }, { "name": "BinLiquidityReduction", @@ -3844,453 +3654,389 @@ export type LbClmm = { "kind": "struct", "fields": [ { - "name": "amountX", - "docs": [ + name: "amountX"; + docs: [ "Amount of token X in the bin. This already excluded protocol fees." - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "amountY", - "docs": [ + name: "amountY"; + docs: [ "Amount of token Y in the bin. This already excluded protocol fees." - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "price", - "docs": [ - "Bin price" - ], - "type": "u128" + name: "price"; + docs: ["Bin price"]; + type: "u128"; }, { - "name": "liquiditySupply", - "docs": [ + name: "liquiditySupply"; + docs: [ "Liquidities of the bin. This is the same as LP mint supply. q-number" - ], - "type": "u128" + ]; + type: "u128"; }, { - "name": "rewardPerTokenStored", - "docs": [ - "reward_a_per_token_stored" - ], - "type": { - "array": [ - "u128", - 2 - ] - } + name: "rewardPerTokenStored"; + docs: ["reward_a_per_token_stored"]; + type: { + array: ["u128", 2]; + }; }, { - "name": "feeAmountXPerTokenStored", - "docs": [ - "Swap fee amount of token X per liquidity deposited." - ], - "type": "u128" + name: "feeAmountXPerTokenStored"; + docs: ["Swap fee amount of token X per liquidity deposited."]; + type: "u128"; }, { - "name": "feeAmountYPerTokenStored", - "docs": [ - "Swap fee amount of token Y per liquidity deposited." - ], - "type": "u128" + name: "feeAmountYPerTokenStored"; + docs: ["Swap fee amount of token Y per liquidity deposited."]; + type: "u128"; }, { - "name": "amountXIn", - "docs": [ + name: "amountXIn"; + docs: [ "Total token X swap into the bin. Only used for tracking purpose." - ], - "type": "u128" + ]; + type: "u128"; }, { - "name": "amountYIn", - "docs": [ + name: "amountYIn"; + docs: [ "Total token Y swap into he bin. Only used for tracking purpose." - ], - "type": "u128" + ]; + type: "u128"; } - ] - } + ]; + }; }, { - "name": "ProtocolFee", - "type": { - "kind": "struct", - "fields": [ + name: "ProtocolFee"; + type: { + kind: "struct"; + fields: [ { - "name": "amountX", - "type": "u64" + name: "amountX"; + type: "u64"; }, { - "name": "amountY", - "type": "u64" + name: "amountY"; + type: "u64"; } - ] - } + ]; + }; }, { - "name": "RewardInfo", - "docs": [ - "Stores the state relevant for tracking liquidity mining rewards" - ], - "type": { - "kind": "struct", - "fields": [ + name: "RewardInfo"; + docs: ["Stores the state relevant for tracking liquidity mining rewards"]; + type: { + kind: "struct"; + fields: [ { - "name": "mint", - "docs": [ - "Reward token mint." - ], - "type": "publicKey" + name: "mint"; + docs: ["Reward token mint."]; + type: "publicKey"; }, { - "name": "vault", - "docs": [ - "Reward vault token account." - ], - "type": "publicKey" + name: "vault"; + docs: ["Reward vault token account."]; + type: "publicKey"; }, { - "name": "funder", - "docs": [ - "Authority account that allows to fund rewards" - ], - "type": "publicKey" + name: "funder"; + docs: ["Authority account that allows to fund rewards"]; + type: "publicKey"; }, { - "name": "rewardDuration", - "docs": [ - "TODO check whether we need to store it in pool" - ], - "type": "u64" + name: "rewardDuration"; + docs: ["TODO check whether we need to store it in pool"]; + type: "u64"; }, { - "name": "rewardDurationEnd", - "docs": [ - "TODO check whether we need to store it in pool" - ], - "type": "u64" + name: "rewardDurationEnd"; + docs: ["TODO check whether we need to store it in pool"]; + type: "u64"; }, { - "name": "rewardRate", - "docs": [ - "TODO check whether we need to store it in pool" - ], - "type": "u128" + name: "rewardRate"; + docs: ["TODO check whether we need to store it in pool"]; + type: "u128"; }, { - "name": "lastUpdateTime", - "docs": [ - "The last time reward states were updated." - ], - "type": "u64" + name: "lastUpdateTime"; + docs: ["The last time reward states were updated."]; + type: "u64"; }, { - "name": "cumulativeSecondsWithEmptyLiquidityReward", - "docs": [ + name: "cumulativeSecondsWithEmptyLiquidityReward"; + docs: [ "Accumulated seconds where when farm distribute rewards, but the bin is empty. The reward will be accumulated for next reward time window." - ], - "type": "u64" + ]; + type: "u64"; } - ] - } + ]; + }; }, { - "name": "Observation", - "type": { - "kind": "struct", - "fields": [ + name: "Observation"; + type: { + kind: "struct"; + fields: [ { - "name": "cumulativeActiveBinId", - "docs": [ - "Cumulative active bin ID" - ], - "type": "i128" + name: "cumulativeActiveBinId"; + docs: ["Cumulative active bin ID"]; + type: "i128"; }, { - "name": "createdAt", - "docs": [ - "Observation sample created timestamp" - ], - "type": "i64" + name: "createdAt"; + docs: ["Observation sample created timestamp"]; + type: "i64"; }, { - "name": "lastUpdatedAt", - "docs": [ - "Observation sample last updated timestamp" - ], - "type": "i64" + name: "lastUpdatedAt"; + docs: ["Observation sample last updated timestamp"]; + type: "i64"; } - ] - } + ]; + }; }, { - "name": "StaticParameters", - "docs": [ - "Parameter that set by the protocol" - ], - "type": { - "kind": "struct", - "fields": [ + name: "StaticParameters"; + docs: ["Parameter that set by the protocol"]; + type: { + kind: "struct"; + fields: [ { - "name": "baseFactor", - "docs": [ + name: "baseFactor"; + docs: [ "Used for base fee calculation. base_fee_rate = base_factor * bin_step" - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "filterPeriod", - "docs": [ + name: "filterPeriod"; + docs: [ "Filter period determine high frequency trading time window." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "decayPeriod", - "docs": [ + name: "decayPeriod"; + docs: [ "Decay period determine when the volatile fee start decay / decrease." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "reductionFactor", - "docs": [ + name: "reductionFactor"; + docs: [ "Reduction factor controls the volatile fee rate decrement rate." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "variableFeeControl", - "docs": [ + name: "variableFeeControl"; + docs: [ "Used to scale the variable fee component depending on the dynamic of the market" - ], - "type": "u32" + ]; + type: "u32"; }, { - "name": "maxVolatilityAccumulator", - "docs": [ + name: "maxVolatilityAccumulator"; + docs: [ "Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate." - ], - "type": "u32" + ]; + type: "u32"; }, { - "name": "minBinId", - "docs": [ + name: "minBinId"; + docs: [ "Min bin id supported by the pool based on the configured bin step." - ], - "type": "i32" + ]; + type: "i32"; }, { - "name": "maxBinId", - "docs": [ + name: "maxBinId"; + docs: [ "Max bin id supported by the pool based on the configured bin step." - ], - "type": "i32" + ]; + type: "i32"; }, { - "name": "protocolShare", - "docs": [ + name: "protocolShare"; + docs: [ "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "padding", - "docs": [ - "Padding for bytemuck safe alignment" - ], - "type": { - "array": [ - "u8", - 6 - ] - } + name: "padding"; + docs: ["Padding for bytemuck safe alignment"]; + type: { + array: ["u8", 6]; + }; } - ] - } + ]; + }; }, { - "name": "VariableParameters", - "docs": [ - "Parameters that changes based on dynamic of the market" - ], - "type": { - "kind": "struct", - "fields": [ + name: "VariableParameters"; + docs: ["Parameters that changes based on dynamic of the market"]; + type: { + kind: "struct"; + fields: [ { - "name": "volatilityAccumulator", - "docs": [ + name: "volatilityAccumulator"; + docs: [ "Volatility accumulator measure the number of bin crossed since reference bin ID. Normally (without filter period taken into consideration), reference bin ID is the active bin of last swap.", "It affects the variable fee rate" - ], - "type": "u32" + ]; + type: "u32"; }, { - "name": "volatilityReference", - "docs": [ + name: "volatilityReference"; + docs: [ "Volatility reference is decayed volatility accumulator. It is always <= volatility_accumulator" - ], - "type": "u32" + ]; + type: "u32"; }, { - "name": "indexReference", - "docs": [ - "Active bin id of last swap." - ], - "type": "i32" + name: "indexReference"; + docs: ["Active bin id of last swap."]; + type: "i32"; }, { - "name": "padding", - "docs": [ - "Padding for bytemuck safe alignment" - ], - "type": { - "array": [ - "u8", - 4 - ] - } + name: "padding"; + docs: ["Padding for bytemuck safe alignment"]; + type: { + array: ["u8", 4]; + }; }, { - "name": "lastUpdateTimestamp", - "docs": [ - "Last timestamp the variable parameters was updated" - ], - "type": "i64" + name: "lastUpdateTimestamp"; + docs: ["Last timestamp the variable parameters was updated"]; + type: "i64"; }, { - "name": "padding1", - "docs": [ - "Padding for bytemuck safe alignment" - ], - "type": { - "array": [ - "u8", - 8 - ] - } + name: "padding1"; + docs: ["Padding for bytemuck safe alignment"]; + type: { + array: ["u8", 8]; + }; } - ] - } + ]; + }; }, { - "name": "FeeInfo", - "type": { - "kind": "struct", - "fields": [ + name: "FeeInfo"; + type: { + kind: "struct"; + fields: [ { - "name": "feeXPerTokenComplete", - "type": "u128" + name: "feeXPerTokenComplete"; + type: "u128"; }, { - "name": "feeYPerTokenComplete", - "type": "u128" + name: "feeYPerTokenComplete"; + type: "u128"; }, { - "name": "feeXPending", - "type": "u64" + name: "feeXPending"; + type: "u64"; }, { - "name": "feeYPending", - "type": "u64" + name: "feeYPending"; + type: "u64"; } - ] - } + ]; + }; }, { - "name": "UserRewardInfo", - "type": { - "kind": "struct", - "fields": [ + name: "UserRewardInfo"; + type: { + kind: "struct"; + fields: [ { - "name": "rewardPerTokenCompletes", - "type": { - "array": [ - "u128", - 2 - ] - } + name: "rewardPerTokenCompletes"; + type: { + array: ["u128", 2]; + }; }, { - "name": "rewardPendings", - "type": { - "array": [ - "u64", - 2 - ] - } + name: "rewardPendings"; + type: { + array: ["u64", 2]; + }; } - ] - } + ]; + }; }, { - "name": "StrategyType", - "type": { - "kind": "enum", - "variants": [ + name: "StrategyType"; + type: { + kind: "enum"; + variants: [ { - "name": "SpotOneSide" + name: "SpotOneSide"; }, { - "name": "CurveOneSide" + name: "CurveOneSide"; }, { - "name": "BidAskOneSide" + name: "BidAskOneSide"; }, { - "name": "SpotBalanced" + name: "SpotBalanced"; }, { - "name": "CurveBalanced" + name: "CurveBalanced"; }, { - "name": "BidAskBalanced" + name: "BidAskBalanced"; }, { - "name": "SpotImBalanced" + name: "SpotImBalanced"; }, { - "name": "CurveImBalanced" + name: "CurveImBalanced"; }, { - "name": "BidAskImBalanced" + name: "BidAskImBalanced"; } - ] - } + ]; + }; }, { - "name": "Rounding", - "type": { - "kind": "enum", - "variants": [ + name: "Rounding"; + type: { + kind: "enum"; + variants: [ { - "name": "Up" + name: "Up"; }, { - "name": "Down" + name: "Down"; } - ] - } + ]; + }; }, { - "name": "LayoutVersion", - "docs": [ - "Layout version" - ], - "type": { - "kind": "enum", - "variants": [ + name: "LayoutVersion"; + docs: ["Layout version"]; + type: { + kind: "enum"; + variants: [ { - "name": "V0" + name: "V0"; }, { - "name": "V1" + name: "V1"; } - ] - } + ]; + }; }, { "name": "ActivationType", @@ -4313,510 +4059,504 @@ export type LbClmm = { "name": "PairType", "docs": [ "Type of the Pair. 0 = Permissionless, 1 = Permission. Putting 0 as permissionless for backward compatibility." - ], - "type": { - "kind": "enum", - "variants": [ + ]; + type: { + kind: "enum"; + variants: [ { - "name": "Permissionless" + name: "Permissionless"; }, { - "name": "Permission" + name: "Permission"; } - ] - } + ]; + }; }, { - "name": "PairStatus", - "docs": [ + name: "PairStatus"; + docs: [ "Pair status. 0 = Enabled, 1 = Disabled. Putting 0 as enabled for backward compatibility." - ], - "type": { - "kind": "enum", - "variants": [ + ]; + type: { + kind: "enum"; + variants: [ { - "name": "Enabled" + name: "Enabled"; }, { - "name": "Disabled" + name: "Disabled"; } - ] - } + ]; + }; } - ], - "events": [ + ]; + events: [ { - "name": "CompositionFee", - "fields": [ + name: "CompositionFee"; + fields: [ { - "name": "from", - "type": "publicKey", - "index": false + name: "from"; + type: "publicKey"; + index: false; }, { - "name": "binId", - "type": "i16", - "index": false + name: "binId"; + type: "i16"; + index: false; }, { - "name": "tokenXFeeAmount", - "type": "u64", - "index": false + name: "tokenXFeeAmount"; + type: "u64"; + index: false; }, { - "name": "tokenYFeeAmount", - "type": "u64", - "index": false + name: "tokenYFeeAmount"; + type: "u64"; + index: false; }, { - "name": "protocolTokenXFeeAmount", - "type": "u64", - "index": false + name: "protocolTokenXFeeAmount"; + type: "u64"; + index: false; }, { - "name": "protocolTokenYFeeAmount", - "type": "u64", - "index": false + name: "protocolTokenYFeeAmount"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "AddLiquidity", - "fields": [ + name: "AddLiquidity"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "from", - "type": "publicKey", - "index": false + name: "from"; + type: "publicKey"; + index: false; }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position"; + type: "publicKey"; + index: false; }, { - "name": "amounts", - "type": { - "array": [ - "u64", - 2 - ] - }, - "index": false + name: "amounts"; + type: { + array: ["u64", 2]; + }; + index: false; }, { - "name": "activeBinId", - "type": "i32", - "index": false + name: "activeBinId"; + type: "i32"; + index: false; } - ] + ]; }, { - "name": "RemoveLiquidity", - "fields": [ + name: "RemoveLiquidity"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "from", - "type": "publicKey", - "index": false + name: "from"; + type: "publicKey"; + index: false; }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position"; + type: "publicKey"; + index: false; }, { - "name": "amounts", - "type": { - "array": [ - "u64", - 2 - ] - }, - "index": false + name: "amounts"; + type: { + array: ["u64", 2]; + }; + index: false; }, { - "name": "activeBinId", - "type": "i32", - "index": false + name: "activeBinId"; + type: "i32"; + index: false; } - ] + ]; }, { - "name": "Swap", - "fields": [ + name: "Swap"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "from", - "type": "publicKey", - "index": false + name: "from"; + type: "publicKey"; + index: false; }, { - "name": "startBinId", - "type": "i32", - "index": false + name: "startBinId"; + type: "i32"; + index: false; }, { - "name": "endBinId", - "type": "i32", - "index": false + name: "endBinId"; + type: "i32"; + index: false; }, { - "name": "amountIn", - "type": "u64", - "index": false + name: "amountIn"; + type: "u64"; + index: false; }, { - "name": "amountOut", - "type": "u64", - "index": false + name: "amountOut"; + type: "u64"; + index: false; }, { - "name": "swapForY", - "type": "bool", - "index": false + name: "swapForY"; + type: "bool"; + index: false; }, { - "name": "fee", - "type": "u64", - "index": false + name: "fee"; + type: "u64"; + index: false; }, { - "name": "protocolFee", - "type": "u64", - "index": false + name: "protocolFee"; + type: "u64"; + index: false; }, { - "name": "feeBps", - "type": "u128", - "index": false + name: "feeBps"; + type: "u128"; + index: false; }, { - "name": "hostFee", - "type": "u64", - "index": false + name: "hostFee"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "ClaimReward", - "fields": [ + name: "ClaimReward"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position"; + type: "publicKey"; + index: false; }, { - "name": "owner", - "type": "publicKey", - "index": false + name: "owner"; + type: "publicKey"; + index: false; }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex"; + type: "u64"; + index: false; }, { - "name": "totalReward", - "type": "u64", - "index": false + name: "totalReward"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "FundReward", - "fields": [ + name: "FundReward"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "funder", - "type": "publicKey", - "index": false + name: "funder"; + type: "publicKey"; + index: false; }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex"; + type: "u64"; + index: false; }, { - "name": "amount", - "type": "u64", - "index": false + name: "amount"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "InitializeReward", - "fields": [ + name: "InitializeReward"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "rewardMint", - "type": "publicKey", - "index": false + name: "rewardMint"; + type: "publicKey"; + index: false; }, { - "name": "funder", - "type": "publicKey", - "index": false + name: "funder"; + type: "publicKey"; + index: false; }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex"; + type: "u64"; + index: false; }, { - "name": "rewardDuration", - "type": "u64", - "index": false + name: "rewardDuration"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "UpdateRewardDuration", - "fields": [ + name: "UpdateRewardDuration"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex"; + type: "u64"; + index: false; }, { - "name": "oldRewardDuration", - "type": "u64", - "index": false + name: "oldRewardDuration"; + type: "u64"; + index: false; }, { - "name": "newRewardDuration", - "type": "u64", - "index": false + name: "newRewardDuration"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "UpdateRewardFunder", - "fields": [ + name: "UpdateRewardFunder"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex"; + type: "u64"; + index: false; }, { - "name": "oldFunder", - "type": "publicKey", - "index": false + name: "oldFunder"; + type: "publicKey"; + index: false; }, { - "name": "newFunder", - "type": "publicKey", - "index": false + name: "newFunder"; + type: "publicKey"; + index: false; } - ] + ]; }, { - "name": "PositionClose", - "fields": [ + name: "PositionClose"; + fields: [ { - "name": "position", - "type": "publicKey", - "index": false + name: "position"; + type: "publicKey"; + index: false; }, { - "name": "owner", - "type": "publicKey", - "index": false + name: "owner"; + type: "publicKey"; + index: false; } - ] + ]; }, { - "name": "ClaimFee", - "fields": [ + name: "ClaimFee"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position"; + type: "publicKey"; + index: false; }, { - "name": "owner", - "type": "publicKey", - "index": false + name: "owner"; + type: "publicKey"; + index: false; }, { - "name": "feeX", - "type": "u64", - "index": false + name: "feeX"; + type: "u64"; + index: false; }, { - "name": "feeY", - "type": "u64", - "index": false + name: "feeY"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "LbPairCreate", - "fields": [ + name: "LbPairCreate"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "binStep", - "type": "u16", - "index": false + name: "binStep"; + type: "u16"; + index: false; }, { - "name": "tokenX", - "type": "publicKey", - "index": false + name: "tokenX"; + type: "publicKey"; + index: false; }, { - "name": "tokenY", - "type": "publicKey", - "index": false + name: "tokenY"; + type: "publicKey"; + index: false; } - ] + ]; }, { - "name": "PositionCreate", - "fields": [ + name: "PositionCreate"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position"; + type: "publicKey"; + index: false; }, { - "name": "owner", - "type": "publicKey", - "index": false + name: "owner"; + type: "publicKey"; + index: false; } - ] + ]; }, { - "name": "FeeParameterUpdate", - "fields": [ + name: "FeeParameterUpdate"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "protocolShare", - "type": "u16", - "index": false + name: "protocolShare"; + type: "u16"; + index: false; }, { - "name": "baseFactor", - "type": "u16", - "index": false + name: "baseFactor"; + type: "u16"; + index: false; } - ] + ]; }, { - "name": "IncreaseObservation", - "fields": [ + name: "IncreaseObservation"; + fields: [ { - "name": "oracle", - "type": "publicKey", - "index": false + name: "oracle"; + type: "publicKey"; + index: false; }, { - "name": "newObservationLength", - "type": "u64", - "index": false + name: "newObservationLength"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "WithdrawIneligibleReward", - "fields": [ + name: "WithdrawIneligibleReward"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "rewardMint", - "type": "publicKey", - "index": false + name: "rewardMint"; + type: "publicKey"; + index: false; }, { - "name": "amount", - "type": "u64", - "index": false + name: "amount"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "UpdatePositionOperator", - "fields": [ + name: "UpdatePositionOperator"; + fields: [ { - "name": "position", - "type": "publicKey", - "index": false + name: "position"; + type: "publicKey"; + index: false; }, { - "name": "oldOperator", - "type": "publicKey", - "index": false + name: "oldOperator"; + type: "publicKey"; + index: false; }, { - "name": "newOperator", - "type": "publicKey", - "index": false + name: "newOperator"; + type: "publicKey"; + index: false; } - ] + ]; }, { "name": "UpdatePositionLockReleasePoint", "fields": [ { - "name": "position", - "type": "publicKey", - "index": false + name: "position"; + type: "publicKey"; + index: false; }, { "name": "currentPoint", @@ -4834,293 +4574,293 @@ export type LbClmm = { "index": false }, { - "name": "sender", - "type": "publicKey", - "index": false + name: "sender"; + type: "publicKey"; + index: false; } - ] + ]; }, { - "name": "GoToABin", - "fields": [ + name: "GoToABin"; + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair"; + type: "publicKey"; + index: false; }, { - "name": "fromBinId", - "type": "i32", - "index": false + name: "fromBinId"; + type: "i32"; + index: false; }, { - "name": "toBinId", - "type": "i32", - "index": false + name: "toBinId"; + type: "i32"; + index: false; } - ] + ]; } - ], - "errors": [ + ]; + errors: [ { - "code": 6000, - "name": "InvalidStartBinIndex", - "msg": "Invalid start bin index" + code: 6000; + name: "InvalidStartBinIndex"; + msg: "Invalid start bin index"; }, { - "code": 6001, - "name": "InvalidBinId", - "msg": "Invalid bin id" + code: 6001; + name: "InvalidBinId"; + msg: "Invalid bin id"; }, { - "code": 6002, - "name": "InvalidInput", - "msg": "Invalid input data" + code: 6002; + name: "InvalidInput"; + msg: "Invalid input data"; }, { - "code": 6003, - "name": "ExceededAmountSlippageTolerance", - "msg": "Exceeded amount slippage tolerance" + code: 6003; + name: "ExceededAmountSlippageTolerance"; + msg: "Exceeded amount slippage tolerance"; }, { - "code": 6004, - "name": "ExceededBinSlippageTolerance", - "msg": "Exceeded bin slippage tolerance" + code: 6004; + name: "ExceededBinSlippageTolerance"; + msg: "Exceeded bin slippage tolerance"; }, { - "code": 6005, - "name": "CompositionFactorFlawed", - "msg": "Composition factor flawed" + code: 6005; + name: "CompositionFactorFlawed"; + msg: "Composition factor flawed"; }, { - "code": 6006, - "name": "NonPresetBinStep", - "msg": "Non preset bin step" + code: 6006; + name: "NonPresetBinStep"; + msg: "Non preset bin step"; }, { - "code": 6007, - "name": "ZeroLiquidity", - "msg": "Zero liquidity" + code: 6007; + name: "ZeroLiquidity"; + msg: "Zero liquidity"; }, { - "code": 6008, - "name": "InvalidPosition", - "msg": "Invalid position" + code: 6008; + name: "InvalidPosition"; + msg: "Invalid position"; }, { - "code": 6009, - "name": "BinArrayNotFound", - "msg": "Bin array not found" + code: 6009; + name: "BinArrayNotFound"; + msg: "Bin array not found"; }, { - "code": 6010, - "name": "InvalidTokenMint", - "msg": "Invalid token mint" + code: 6010; + name: "InvalidTokenMint"; + msg: "Invalid token mint"; }, { - "code": 6011, - "name": "InvalidAccountForSingleDeposit", - "msg": "Invalid account for single deposit" + code: 6011; + name: "InvalidAccountForSingleDeposit"; + msg: "Invalid account for single deposit"; }, { - "code": 6012, - "name": "PairInsufficientLiquidity", - "msg": "Pair insufficient liquidity" + code: 6012; + name: "PairInsufficientLiquidity"; + msg: "Pair insufficient liquidity"; }, { - "code": 6013, - "name": "InvalidFeeOwner", - "msg": "Invalid fee owner" + code: 6013; + name: "InvalidFeeOwner"; + msg: "Invalid fee owner"; }, { - "code": 6014, - "name": "InvalidFeeWithdrawAmount", - "msg": "Invalid fee withdraw amount" + code: 6014; + name: "InvalidFeeWithdrawAmount"; + msg: "Invalid fee withdraw amount"; }, { - "code": 6015, - "name": "InvalidAdmin", - "msg": "Invalid admin" + code: 6015; + name: "InvalidAdmin"; + msg: "Invalid admin"; }, { - "code": 6016, - "name": "IdenticalFeeOwner", - "msg": "Identical fee owner" + code: 6016; + name: "IdenticalFeeOwner"; + msg: "Identical fee owner"; }, { - "code": 6017, - "name": "InvalidBps", - "msg": "Invalid basis point" + code: 6017; + name: "InvalidBps"; + msg: "Invalid basis point"; }, { - "code": 6018, - "name": "MathOverflow", - "msg": "Math operation overflow" + code: 6018; + name: "MathOverflow"; + msg: "Math operation overflow"; }, { - "code": 6019, - "name": "TypeCastFailed", - "msg": "Type cast error" + code: 6019; + name: "TypeCastFailed"; + msg: "Type cast error"; }, { - "code": 6020, - "name": "InvalidRewardIndex", - "msg": "Invalid reward index" + code: 6020; + name: "InvalidRewardIndex"; + msg: "Invalid reward index"; }, { - "code": 6021, - "name": "InvalidRewardDuration", - "msg": "Invalid reward duration" + code: 6021; + name: "InvalidRewardDuration"; + msg: "Invalid reward duration"; }, { - "code": 6022, - "name": "RewardInitialized", - "msg": "Reward already initialized" + code: 6022; + name: "RewardInitialized"; + msg: "Reward already initialized"; }, { - "code": 6023, - "name": "RewardUninitialized", - "msg": "Reward not initialized" + code: 6023; + name: "RewardUninitialized"; + msg: "Reward not initialized"; }, { - "code": 6024, - "name": "IdenticalFunder", - "msg": "Identical funder" + code: 6024; + name: "IdenticalFunder"; + msg: "Identical funder"; }, { - "code": 6025, - "name": "RewardCampaignInProgress", - "msg": "Reward campaign in progress" + code: 6025; + name: "RewardCampaignInProgress"; + msg: "Reward campaign in progress"; }, { - "code": 6026, - "name": "IdenticalRewardDuration", - "msg": "Reward duration is the same" + code: 6026; + name: "IdenticalRewardDuration"; + msg: "Reward duration is the same"; }, { - "code": 6027, - "name": "InvalidBinArray", - "msg": "Invalid bin array" + code: 6027; + name: "InvalidBinArray"; + msg: "Invalid bin array"; }, { - "code": 6028, - "name": "NonContinuousBinArrays", - "msg": "Bin arrays must be continuous" + code: 6028; + name: "NonContinuousBinArrays"; + msg: "Bin arrays must be continuous"; }, { - "code": 6029, - "name": "InvalidRewardVault", - "msg": "Invalid reward vault" + code: 6029; + name: "InvalidRewardVault"; + msg: "Invalid reward vault"; }, { - "code": 6030, - "name": "NonEmptyPosition", - "msg": "Position is not empty" + code: 6030; + name: "NonEmptyPosition"; + msg: "Position is not empty"; }, { - "code": 6031, - "name": "UnauthorizedAccess", - "msg": "Unauthorized access" + code: 6031; + name: "UnauthorizedAccess"; + msg: "Unauthorized access"; }, { - "code": 6032, - "name": "InvalidFeeParameter", - "msg": "Invalid fee parameter" + code: 6032; + name: "InvalidFeeParameter"; + msg: "Invalid fee parameter"; }, { - "code": 6033, - "name": "MissingOracle", - "msg": "Missing oracle account" + code: 6033; + name: "MissingOracle"; + msg: "Missing oracle account"; }, { - "code": 6034, - "name": "InsufficientSample", - "msg": "Insufficient observation sample" + code: 6034; + name: "InsufficientSample"; + msg: "Insufficient observation sample"; }, { - "code": 6035, - "name": "InvalidLookupTimestamp", - "msg": "Invalid lookup timestamp" + code: 6035; + name: "InvalidLookupTimestamp"; + msg: "Invalid lookup timestamp"; }, { - "code": 6036, - "name": "BitmapExtensionAccountIsNotProvided", - "msg": "Bitmap extension account is not provided" + code: 6036; + name: "BitmapExtensionAccountIsNotProvided"; + msg: "Bitmap extension account is not provided"; }, { - "code": 6037, - "name": "CannotFindNonZeroLiquidityBinArrayId", - "msg": "Cannot find non-zero liquidity binArrayId" + code: 6037; + name: "CannotFindNonZeroLiquidityBinArrayId"; + msg: "Cannot find non-zero liquidity binArrayId"; }, { - "code": 6038, - "name": "BinIdOutOfBound", - "msg": "Bin id out of bound" + code: 6038; + name: "BinIdOutOfBound"; + msg: "Bin id out of bound"; }, { - "code": 6039, - "name": "InsufficientOutAmount", - "msg": "Insufficient amount in for minimum out" + code: 6039; + name: "InsufficientOutAmount"; + msg: "Insufficient amount in for minimum out"; }, { - "code": 6040, - "name": "InvalidPositionWidth", - "msg": "Invalid position width" + code: 6040; + name: "InvalidPositionWidth"; + msg: "Invalid position width"; }, { - "code": 6041, - "name": "ExcessiveFeeUpdate", - "msg": "Excessive fee update" + code: 6041; + name: "ExcessiveFeeUpdate"; + msg: "Excessive fee update"; }, { - "code": 6042, - "name": "PoolDisabled", - "msg": "Pool disabled" + code: 6042; + name: "PoolDisabled"; + msg: "Pool disabled"; }, { - "code": 6043, - "name": "InvalidPoolType", - "msg": "Invalid pool type" + code: 6043; + name: "InvalidPoolType"; + msg: "Invalid pool type"; }, { - "code": 6044, - "name": "ExceedMaxWhitelist", - "msg": "Whitelist for wallet is full" + code: 6044; + name: "ExceedMaxWhitelist"; + msg: "Whitelist for wallet is full"; }, { - "code": 6045, - "name": "InvalidIndex", - "msg": "Invalid index" + code: 6045; + name: "InvalidIndex"; + msg: "Invalid index"; }, { - "code": 6046, - "name": "RewardNotEnded", - "msg": "Reward not ended" + code: 6046; + name: "RewardNotEnded"; + msg: "Reward not ended"; }, { - "code": 6047, - "name": "MustWithdrawnIneligibleReward", - "msg": "Must withdraw ineligible reward" + code: 6047; + name: "MustWithdrawnIneligibleReward"; + msg: "Must withdraw ineligible reward"; }, { - "code": 6048, - "name": "UnauthorizedAddress", - "msg": "Unauthorized address" + code: 6048; + name: "UnauthorizedAddress"; + msg: "Unauthorized address"; }, { - "code": 6049, - "name": "OperatorsAreTheSame", - "msg": "Cannot update because operators are the same" + code: 6049; + name: "OperatorsAreTheSame"; + msg: "Cannot update because operators are the same"; }, { - "code": 6050, - "name": "WithdrawToWrongTokenAccount", - "msg": "Withdraw to wrong token account" + code: 6050; + name: "WithdrawToWrongTokenAccount"; + msg: "Withdraw to wrong token account"; }, { - "code": 6051, - "name": "WrongRentReceiver", - "msg": "Wrong rent receiver" + code: 6051; + name: "WrongRentReceiver"; + msg: "Wrong rent receiver"; }, { "code": 6052, @@ -5157,7 +4897,7 @@ export type LbClmm = { "name": "InvalidActivationType", "msg": "Invalid activation type" } - ] + ]; }; export const IDL: LbClmm = { @@ -5165,1457 +4905,1454 @@ export const IDL: LbClmm = { "name": "lb_clmm", "constants": [ { - "name": "BASIS_POINT_MAX", - "type": "i32", - "value": "10000" + name: "BASIS_POINT_MAX", + type: "i32", + value: "10000", }, { - "name": "MAX_BIN_PER_ARRAY", - "type": { - "defined": "usize" + name: "MAX_BIN_PER_ARRAY", + type: { + defined: "usize", }, - "value": "70" + value: "70", }, { - "name": "MAX_BIN_PER_POSITION", - "type": { - "defined": "usize" + name: "MAX_BIN_PER_POSITION", + type: { + defined: "usize", }, - "value": "70" + value: "70", }, { - "name": "MIN_BIN_ID", - "type": "i32", - "value": "- 443636" + name: "MIN_BIN_ID", + type: "i32", + value: "- 443636", }, { - "name": "MAX_BIN_ID", - "type": "i32", - "value": "443636" + name: "MAX_BIN_ID", + type: "i32", + value: "443636", }, { - "name": "MAX_FEE_RATE", - "type": "u64", - "value": "100_000_000" + name: "MAX_FEE_RATE", + type: "u64", + value: "100_000_000", }, { - "name": "FEE_PRECISION", - "type": "u64", - "value": "1_000_000_000" + name: "FEE_PRECISION", + type: "u64", + value: "1_000_000_000", }, { - "name": "MAX_PROTOCOL_SHARE", - "type": "u16", - "value": "2_500" + name: "MAX_PROTOCOL_SHARE", + type: "u16", + value: "2_500", }, { - "name": "HOST_FEE_BPS", - "type": "u16", - "value": "2_000" + name: "HOST_FEE_BPS", + type: "u16", + value: "2_000", }, { - "name": "NUM_REWARDS", - "type": { - "defined": "usize" + name: "NUM_REWARDS", + type: { + defined: "usize", }, - "value": "2" + value: "2", }, { - "name": "MIN_REWARD_DURATION", - "type": "u64", - "value": "1" + name: "MIN_REWARD_DURATION", + type: "u64", + value: "1", }, { - "name": "MAX_REWARD_DURATION", - "type": "u64", - "value": "31536000" + name: "MAX_REWARD_DURATION", + type: "u64", + value: "31536000", }, { - "name": "EXTENSION_BINARRAY_BITMAP_SIZE", - "type": { - "defined": "usize" + name: "EXTENSION_BINARRAY_BITMAP_SIZE", + type: { + defined: "usize", }, - "value": "12" + value: "12", }, { - "name": "BIN_ARRAY_BITMAP_SIZE", - "type": "i32", - "value": "512" + name: "BIN_ARRAY_BITMAP_SIZE", + type: "i32", + value: "512", }, { - "name": "MAX_REWARD_BIN_SPLIT", - "type": { - "defined": "usize" + name: "MAX_REWARD_BIN_SPLIT", + type: { + defined: "usize", }, - "value": "15" + value: "15", }, { - "name": "BIN_ARRAY", - "type": "bytes", - "value": "[98, 105, 110, 95, 97, 114, 114, 97, 121]" + name: "BIN_ARRAY", + type: "bytes", + value: "[98, 105, 110, 95, 97, 114, 114, 97, 121]", }, { - "name": "ORACLE", - "type": "bytes", - "value": "[111, 114, 97, 99, 108, 101]" + name: "ORACLE", + type: "bytes", + value: "[111, 114, 97, 99, 108, 101]", }, { - "name": "BIN_ARRAY_BITMAP_SEED", - "type": "bytes", - "value": "[98, 105, 116, 109, 97, 112]" + name: "BIN_ARRAY_BITMAP_SEED", + type: "bytes", + value: "[98, 105, 116, 109, 97, 112]", }, { - "name": "PRESET_PARAMETER", - "type": "bytes", - "value": "[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]" + name: "PRESET_PARAMETER", + type: "bytes", + value: + "[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]", }, { - "name": "POSITION", - "type": "bytes", - "value": "[112, 111, 115, 105, 116, 105, 111, 110]" - } + name: "POSITION", + type: "bytes", + value: "[112, 111, 115, 105, 116, 105, 111, 110]", + }, ], - "instructions": [ + instructions: [ { - "name": "initializeLbPair", - "accounts": [ + name: "initializeLbPair", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "tokenMintX", - "isMut": false, - "isSigner": false + name: "tokenMintX", + isMut: false, + isSigner: false, }, { - "name": "tokenMintY", - "isMut": false, - "isSigner": false + name: "tokenMintY", + isMut: false, + isSigner: false, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle", + isMut: true, + isSigner: false, }, { - "name": "presetParameter", - "isMut": false, - "isSigner": false + name: "presetParameter", + isMut: false, + isSigner: false, }, { - "name": "funder", - "isMut": true, - "isSigner": true + name: "funder", + isMut: true, + isSigner: true, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "activeId", - "type": "i32" + name: "activeId", + type: "i32", }, { - "name": "binStep", - "type": "u16" - } - ] + name: "binStep", + type: "u16", + }, + ], }, { "name": "initializePermissionLbPair", "accounts": [ { - "name": "base", - "isMut": false, - "isSigner": true + name: "base", + isMut: false, + isSigner: true, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "tokenMintX", - "isMut": false, - "isSigner": false + name: "tokenMintX", + isMut: false, + isSigner: false, }, { - "name": "tokenMintY", - "isMut": false, - "isSigner": false + name: "tokenMintY", + isMut: false, + isSigner: false, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle", + isMut: true, + isSigner: false, }, { - "name": "admin", - "isMut": true, - "isSigner": true + name: "admin", + isMut: true, + isSigner: true, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "ixData", - "type": { - "defined": "InitPermissionPairIx" - } - } - ] + name: "ixData", + type: { + defined: "InitPermissionPairIx", + }, + }, + ], }, { - "name": "initializeBinArrayBitmapExtension", - "accounts": [ + name: "initializeBinArrayBitmapExtension", + accounts: [ { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair", + isMut: false, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "docs": [ - "Initialize an account to store if a bin array is initialized." - ] + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + docs: [ + "Initialize an account to store if a bin array is initialized.", + ], }, { - "name": "funder", - "isMut": true, - "isSigner": true + name: "funder", + isMut: true, + isSigner: true, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "rent", - "isMut": false, - "isSigner": false - } + name: "rent", + isMut: false, + isSigner: false, + }, ], - "args": [] + args: [], }, { - "name": "initializeBinArray", - "accounts": [ + name: "initializeBinArray", + accounts: [ { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair", + isMut: false, + isSigner: false, }, { - "name": "binArray", - "isMut": true, - "isSigner": false + name: "binArray", + isMut: true, + isSigner: false, }, { - "name": "funder", - "isMut": true, - "isSigner": true + name: "funder", + isMut: true, + isSigner: true, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } + name: "systemProgram", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "index", - "type": "i64" - } - ] + name: "index", + type: "i64", + }, + ], }, { - "name": "addLiquidity", - "accounts": [ + name: "addLiquidity", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX", + isMut: true, + isSigner: false, }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY", + isMut: true, + isSigner: false, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameter" - } - } - ] + name: "liquidityParameter", + type: { + defined: "LiquidityParameter", + }, + }, + ], }, { - "name": "addLiquidityByWeight", - "accounts": [ + name: "addLiquidityByWeight", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX", + isMut: true, + isSigner: false, }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY", + isMut: true, + isSigner: false, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameterByWeight" - } - } - ] + name: "liquidityParameter", + type: { + defined: "LiquidityParameterByWeight", + }, + }, + ], }, { - "name": "addLiquidityByStrategy", - "accounts": [ + name: "addLiquidityByStrategy", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX", + isMut: true, + isSigner: false, }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY", + isMut: true, + isSigner: false, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameterByStrategy" - } - } - ] + name: "liquidityParameter", + type: { + defined: "LiquidityParameterByStrategy", + }, + }, + ], }, { - "name": "addLiquidityByStrategyOneSide", - "accounts": [ + name: "addLiquidityByStrategyOneSide", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "userToken", - "isMut": true, - "isSigner": false + name: "userToken", + isMut: true, + isSigner: false, }, { - "name": "reserve", - "isMut": true, - "isSigner": false + name: "reserve", + isMut: true, + isSigner: false, }, { - "name": "tokenMint", - "isMut": false, - "isSigner": false + name: "tokenMint", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameterByStrategyOneSide" - } - } - ] + name: "liquidityParameter", + type: { + defined: "LiquidityParameterByStrategyOneSide", + }, + }, + ], }, { - "name": "addLiquidityOneSide", - "accounts": [ + name: "addLiquidityOneSide", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "userToken", - "isMut": true, - "isSigner": false + name: "userToken", + isMut: true, + isSigner: false, }, { - "name": "reserve", - "isMut": true, - "isSigner": false + name: "reserve", + isMut: true, + isSigner: false, }, { - "name": "tokenMint", - "isMut": false, - "isSigner": false + name: "tokenMint", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityOneSideParameter" - } - } - ] + name: "liquidityParameter", + type: { + defined: "LiquidityOneSideParameter", + }, + }, + ], }, { - "name": "removeLiquidity", - "accounts": [ + name: "removeLiquidity", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX", + isMut: true, + isSigner: false, }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY", + isMut: true, + isSigner: false, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "binLiquidityRemoval", - "type": { - "vec": { - "defined": "BinLiquidityReduction" - } - } - } - ] + name: "binLiquidityRemoval", + type: { + vec: { + defined: "BinLiquidityReduction", + }, + }, + }, + ], }, { - "name": "initializePosition", - "accounts": [ + name: "initializePosition", + accounts: [ { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer", + isMut: true, + isSigner: true, }, { - "name": "position", - "isMut": true, - "isSigner": true + name: "position", + isMut: true, + isSigner: true, }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair", + isMut: false, + isSigner: false, }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner", + isMut: false, + isSigner: true, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "lowerBinId", - "type": "i32" + name: "lowerBinId", + type: "i32", }, { - "name": "width", - "type": "i32" - } - ] + name: "width", + type: "i32", + }, + ], }, { - "name": "initializePositionPda", - "accounts": [ + name: "initializePositionPda", + accounts: [ { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer", + isMut: true, + isSigner: true, }, { - "name": "base", - "isMut": false, - "isSigner": true + name: "base", + isMut: false, + isSigner: true, }, { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair", + isMut: false, + isSigner: false, }, { - "name": "owner", - "isMut": false, - "isSigner": true, - "docs": [ - "owner" - ] + name: "owner", + isMut: false, + isSigner: true, + docs: ["owner"], }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "lowerBinId", - "type": "i32" + name: "lowerBinId", + type: "i32", }, { - "name": "width", - "type": "i32" - } - ] + name: "width", + type: "i32", + }, + ], }, { - "name": "initializePositionByOperator", - "accounts": [ + name: "initializePositionByOperator", + accounts: [ { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer", + isMut: true, + isSigner: true, }, { - "name": "base", - "isMut": false, - "isSigner": true + name: "base", + isMut: false, + isSigner: true, }, { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair", + isMut: false, + isSigner: false, }, { - "name": "operator", - "isMut": false, - "isSigner": true, - "docs": [ - "operator" - ] + name: "operator", + isMut: false, + isSigner: true, + docs: ["operator"], }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "lowerBinId", - "type": "i32" + name: "lowerBinId", + type: "i32", }, { - "name": "width", - "type": "i32" + name: "width", + type: "i32", }, { - "name": "owner", - "type": "publicKey" + name: "owner", + type: "publicKey", }, { - "name": "feeOwner", - "type": "publicKey" - } - ] + name: "feeOwner", + type: "publicKey", + }, + ], }, { - "name": "updatePositionOperator", - "accounts": [ + name: "updatePositionOperator", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner", + isMut: false, + isSigner: true, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "operator", - "type": "publicKey" - } - ] + name: "operator", + type: "publicKey", + }, + ], }, { - "name": "swap", - "accounts": [ + name: "swap", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: false, + isSigner: false, + isOptional: true, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "userTokenIn", - "isMut": true, - "isSigner": false + name: "userTokenIn", + isMut: true, + isSigner: false, }, { - "name": "userTokenOut", - "isMut": true, - "isSigner": false + name: "userTokenOut", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle", + isMut: true, + isSigner: false, }, { - "name": "hostFeeIn", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "hostFeeIn", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "user", - "isMut": false, - "isSigner": true + name: "user", + isMut: false, + isSigner: true, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "amountIn", - "type": "u64" + name: "amountIn", + type: "u64", }, { - "name": "minAmountOut", - "type": "u64" - } - ] + name: "minAmountOut", + type: "u64", + }, + ], }, { - "name": "swapExactOut", - "accounts": [ + name: "swapExactOut", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: false, + isSigner: false, + isOptional: true, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "userTokenIn", - "isMut": true, - "isSigner": false + name: "userTokenIn", + isMut: true, + isSigner: false, }, { - "name": "userTokenOut", - "isMut": true, - "isSigner": false + name: "userTokenOut", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle", + isMut: true, + isSigner: false, }, { - "name": "hostFeeIn", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "hostFeeIn", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "user", - "isMut": false, - "isSigner": true + name: "user", + isMut: false, + isSigner: true, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "maxInAmount", - "type": "u64" + name: "maxInAmount", + type: "u64", }, { - "name": "outAmount", - "type": "u64" - } - ] + name: "outAmount", + type: "u64", + }, + ], }, { - "name": "swapWithPriceImpact", - "accounts": [ + name: "swapWithPriceImpact", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: false, + isSigner: false, + isOptional: true, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "userTokenIn", - "isMut": true, - "isSigner": false + name: "userTokenIn", + isMut: true, + isSigner: false, }, { - "name": "userTokenOut", - "isMut": true, - "isSigner": false + name: "userTokenOut", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle", + isMut: true, + isSigner: false, }, { - "name": "hostFeeIn", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "hostFeeIn", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "user", - "isMut": false, - "isSigner": true + name: "user", + isMut: false, + isSigner: true, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "amountIn", - "type": "u64" + name: "amountIn", + type: "u64", }, { - "name": "activeId", - "type": { - "option": "i32" - } + name: "activeId", + type: { + option: "i32", + }, }, { - "name": "maxPriceImpactBps", - "type": "u16" - } - ] + name: "maxPriceImpactBps", + type: "u16", + }, + ], }, { - "name": "withdrawProtocolFee", - "accounts": [ + name: "withdrawProtocolFee", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "receiverTokenX", - "isMut": true, - "isSigner": false + name: "receiverTokenX", + isMut: true, + isSigner: false, }, { - "name": "receiverTokenY", - "isMut": true, - "isSigner": false + name: "receiverTokenY", + isMut: true, + isSigner: false, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false - } + name: "tokenYProgram", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "amountX", - "type": "u64" + name: "amountX", + type: "u64", }, { - "name": "amountY", - "type": "u64" - } - ] + name: "amountY", + type: "u64", + }, + ], }, { - "name": "initializeReward", - "accounts": [ + name: "initializeReward", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "rewardVault", - "isMut": true, - "isSigner": false + name: "rewardVault", + isMut: true, + isSigner: false, }, { - "name": "rewardMint", - "isMut": false, - "isSigner": false + name: "rewardMint", + isMut: false, + isSigner: false, }, { "name": "admin", @@ -6623,582 +6360,582 @@ export const IDL: LbClmm = { "isSigner": true }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "rent", - "isMut": false, - "isSigner": false + name: "rent", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex", + type: "u64", }, { - "name": "rewardDuration", - "type": "u64" + name: "rewardDuration", + type: "u64", }, { - "name": "funder", - "type": "publicKey" - } - ] + name: "funder", + type: "publicKey", + }, + ], }, { - "name": "fundReward", - "accounts": [ + name: "fundReward", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "rewardVault", - "isMut": true, - "isSigner": false + name: "rewardVault", + isMut: true, + isSigner: false, }, { - "name": "rewardMint", - "isMut": false, - "isSigner": false + name: "rewardMint", + isMut: false, + isSigner: false, }, { - "name": "funderTokenAccount", - "isMut": true, - "isSigner": false + name: "funderTokenAccount", + isMut: true, + isSigner: false, }, { - "name": "funder", - "isMut": false, - "isSigner": true + name: "funder", + isMut: false, + isSigner: true, }, { - "name": "binArray", - "isMut": true, - "isSigner": false + name: "binArray", + isMut: true, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex", + type: "u64", }, { - "name": "amount", - "type": "u64" + name: "amount", + type: "u64", }, { - "name": "carryForward", - "type": "bool" - } - ] + name: "carryForward", + type: "bool", + }, + ], }, { - "name": "updateRewardFunder", - "accounts": [ + name: "updateRewardFunder", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin", + isMut: false, + isSigner: true, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex", + type: "u64", }, { - "name": "newFunder", - "type": "publicKey" - } - ] + name: "newFunder", + type: "publicKey", + }, + ], }, { - "name": "updateRewardDuration", - "accounts": [ + name: "updateRewardDuration", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin", + isMut: false, + isSigner: true, }, { - "name": "binArray", - "isMut": true, - "isSigner": false + name: "binArray", + isMut: true, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "rewardIndex", - "type": "u64" + name: "rewardIndex", + type: "u64", }, { - "name": "newDuration", - "type": "u64" - } - ] + name: "newDuration", + type: "u64", + }, + ], }, { - "name": "claimReward", - "accounts": [ + name: "claimReward", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "rewardVault", - "isMut": true, - "isSigner": false + name: "rewardVault", + isMut: true, + isSigner: false, }, { - "name": "rewardMint", - "isMut": false, - "isSigner": false + name: "rewardMint", + isMut: false, + isSigner: false, }, { - "name": "userTokenAccount", - "isMut": true, - "isSigner": false + name: "userTokenAccount", + isMut: true, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "rewardIndex", - "type": "u64" - } - ] + name: "rewardIndex", + type: "u64", + }, + ], }, { - "name": "claimFee", - "accounts": [ + name: "claimFee", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX", + isMut: true, + isSigner: false, }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [] + args: [], }, { "name": "closePosition", "accounts": [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "rentReceiver", - "isMut": true, - "isSigner": false + name: "rentReceiver", + isMut: true, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [] + args: [], }, { - "name": "updateFeeParameters", - "accounts": [ + name: "updateFeeParameters", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin", + isMut: false, + isSigner: true, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "feeParameter", - "type": { - "defined": "FeeParameter" - } - } - ] + name: "feeParameter", + type: { + defined: "FeeParameter", + }, + }, + ], }, { - "name": "increaseOracleLength", - "accounts": [ + name: "increaseOracleLength", + accounts: [ { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle", + isMut: true, + isSigner: false, }, { - "name": "funder", - "isMut": true, - "isSigner": true + name: "funder", + isMut: true, + isSigner: true, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "lengthToAdd", - "type": "u64" - } - ] + name: "lengthToAdd", + type: "u64", + }, + ], }, { - "name": "initializePresetParameter", - "accounts": [ + name: "initializePresetParameter", + accounts: [ { - "name": "presetParameter", - "isMut": true, - "isSigner": false + name: "presetParameter", + isMut: true, + isSigner: false, }, { - "name": "admin", - "isMut": true, - "isSigner": true + name: "admin", + isMut: true, + isSigner: true, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "rent", - "isMut": false, - "isSigner": false - } + name: "rent", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "ix", - "type": { - "defined": "InitPresetParametersIx" - } - } - ] + name: "ix", + type: { + defined: "InitPresetParametersIx", + }, + }, + ], }, { - "name": "closePresetParameter", - "accounts": [ + name: "closePresetParameter", + accounts: [ { - "name": "presetParameter", - "isMut": true, - "isSigner": false + name: "presetParameter", + isMut: true, + isSigner: false, }, { - "name": "admin", - "isMut": true, - "isSigner": true + name: "admin", + isMut: true, + isSigner: true, }, { - "name": "rentReceiver", - "isMut": true, - "isSigner": false - } + name: "rentReceiver", + isMut: true, + isSigner: false, + }, ], - "args": [] + args: [], }, { - "name": "removeAllLiquidity", - "accounts": [ + name: "removeAllLiquidity", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX", + isMut: true, + isSigner: false, }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY", + isMut: true, + isSigner: false, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [] + args: [], }, { "name": "removeLiquiditySingleSide", @@ -7271,208 +7008,208 @@ export const IDL: LbClmm = { "name": "togglePairStatus", "accounts": [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "admin", - "isMut": false, - "isSigner": true - } + name: "admin", + isMut: false, + isSigner: true, + }, ], - "args": [] + args: [], }, { - "name": "updateWhitelistedWallet", - "accounts": [ + name: "updateWhitelistedWallet", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "creator", - "isMut": false, - "isSigner": true - } + name: "creator", + isMut: false, + isSigner: true, + }, ], - "args": [ + args: [ { - "name": "wallet", - "type": "publicKey" - } - ] + name: "wallet", + type: "publicKey", + }, + ], }, { - "name": "migratePosition", - "accounts": [ + name: "migratePosition", + accounts: [ { - "name": "positionV2", - "isMut": true, - "isSigner": true + name: "positionV2", + isMut: true, + isSigner: true, }, { - "name": "positionV1", - "isMut": true, - "isSigner": false + name: "positionV1", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "owner", - "isMut": true, - "isSigner": true + name: "owner", + isMut: true, + isSigner: true, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "rentReceiver", - "isMut": true, - "isSigner": false + name: "rentReceiver", + isMut: true, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [] + args: [], }, { - "name": "migrateBinArray", - "accounts": [ + name: "migrateBinArray", + accounts: [ { - "name": "lbPair", - "isMut": false, - "isSigner": false - } + name: "lbPair", + isMut: false, + isSigner: false, + }, ], - "args": [] + args: [], }, { - "name": "updateFeesAndRewards", - "accounts": [ + name: "updateFeesAndRewards", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "owner", - "isMut": false, - "isSigner": true - } + name: "owner", + isMut: false, + isSigner: true, + }, ], - "args": [] + args: [], }, { - "name": "withdrawIneligibleReward", - "accounts": [ + name: "withdrawIneligibleReward", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "rewardVault", - "isMut": true, - "isSigner": false + name: "rewardVault", + isMut: true, + isSigner: false, }, { - "name": "rewardMint", - "isMut": false, - "isSigner": false + name: "rewardMint", + isMut: false, + isSigner: false, }, { - "name": "funderTokenAccount", - "isMut": true, - "isSigner": false + name: "funderTokenAccount", + isMut: true, + isSigner: false, }, { - "name": "funder", - "isMut": false, - "isSigner": true + name: "funder", + isMut: false, + isSigner: true, }, { - "name": "binArray", - "isMut": true, - "isSigner": false + name: "binArray", + isMut: true, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "rewardIndex", - "type": "u64" - } - ] + name: "rewardIndex", + type: "u64", + }, + ], }, { "name": "setActivationPoint", "accounts": [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "admin", - "isMut": true, - "isSigner": true - } + name: "admin", + isMut: true, + isSigner: true, + }, ], - "args": [ + args: [ { "name": "activationPoint", "type": "u64" @@ -7483,32 +7220,32 @@ export const IDL: LbClmm = { "name": "setLockReleasePoint", "accounts": [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": false, - "isSigner": false + name: "lbPair", + isMut: false, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { "name": "newLockReleasePoint", "type": "u64" @@ -7516,238 +7253,238 @@ export const IDL: LbClmm = { ] }, { - "name": "removeLiquidityByRange", - "accounts": [ + name: "removeLiquidityByRange", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false + name: "userTokenX", + isMut: true, + isSigner: false, }, { - "name": "userTokenY", - "isMut": true, - "isSigner": false + name: "userTokenY", + isMut: true, + isSigner: false, }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + name: "reserveX", + isMut: true, + isSigner: false, }, { - "name": "reserveY", - "isMut": true, - "isSigner": false + name: "reserveY", + isMut: true, + isSigner: false, }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false + name: "tokenXMint", + isMut: false, + isSigner: false, }, { - "name": "tokenYMint", - "isMut": false, - "isSigner": false + name: "tokenYMint", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false + name: "tokenXProgram", + isMut: false, + isSigner: false, }, { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false + name: "tokenYProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "fromBinId", - "type": "i32" + name: "fromBinId", + type: "i32", }, { - "name": "toBinId", - "type": "i32" + name: "toBinId", + type: "i32", }, { - "name": "bpsToRemove", - "type": "u16" - } - ] + name: "bpsToRemove", + type: "u16", + }, + ], }, { - "name": "addLiquidityOneSidePrecise", - "accounts": [ + name: "addLiquidityOneSidePrecise", + accounts: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, }, { - "name": "userToken", - "isMut": true, - "isSigner": false + name: "userToken", + isMut: true, + isSigner: false, }, { - "name": "reserve", - "isMut": true, - "isSigner": false + name: "reserve", + isMut: true, + isSigner: false, }, { - "name": "tokenMint", - "isMut": false, - "isSigner": false + name: "tokenMint", + isMut: false, + isSigner: false, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "binArrayLower", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "parameter", - "type": { - "defined": "AddLiquiditySingleSidePreciseParameter" - } - } - ] + name: "parameter", + type: { + defined: "AddLiquiditySingleSidePreciseParameter", + }, + }, + ], }, { - "name": "goToABin", - "accounts": [ + name: "goToABin", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "binArrayBitmapExtension", + isMut: false, + isSigner: false, + isOptional: true, }, { - "name": "fromBinArray", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "fromBinArray", + isMut: false, + isSigner: false, + isOptional: true, }, { - "name": "toBinArray", - "isMut": false, - "isSigner": false, - "isOptional": true + name: "toBinArray", + isMut: false, + isSigner: false, + isOptional: true, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "eventAuthority", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } + name: "program", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "binId", - "type": "i32" - } - ] + name: "binId", + type: "i32", + }, + ], }, { "name": "setPreActivationDuration", "accounts": [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "creator", - "isMut": false, - "isSigner": true - } + name: "creator", + isMut: false, + isSigner: true, + }, ], - "args": [ + args: [ { "name": "preActivationDuration", "type": "u16" @@ -7755,20 +7492,20 @@ export const IDL: LbClmm = { ] }, { - "name": "setPreActivationSwapAddress", - "accounts": [ + name: "setPreActivationSwapAddress", + accounts: [ { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "creator", - "isMut": false, - "isSigner": true - } + name: "creator", + isMut: false, + isSigner: true, + }, ], - "args": [ + args: [ { "name": "preActivationSwapAddress", "type": "publicKey" @@ -7776,139 +7513,190 @@ export const IDL: LbClmm = { ] } ], - "accounts": [ + accounts: [ { - "name": "binArrayBitmapExtension", - "type": { - "kind": "struct", - "fields": [ + name: "binArrayBitmapExtension", + type: { + kind: "struct", + fields: [ { - "name": "lbPair", - "type": "publicKey" + name: "lbPair", + type: "publicKey", }, { - "name": "positiveBinArrayBitmap", - "docs": [ - "Packed initialized bin array state for start_bin_index is positive" + name: "positiveBinArrayBitmap", + docs: [ + "Packed initialized bin array state for start_bin_index is positive", ], - "type": { - "array": [ + type: { + array: [ { - "array": [ - "u64", - 8 - ] + array: ["u64", 8], }, - 12 - ] - } + 12, + ], + }, }, { - "name": "negativeBinArrayBitmap", - "docs": [ - "Packed initialized bin array state for start_bin_index is negative" + name: "negativeBinArrayBitmap", + docs: [ + "Packed initialized bin array state for start_bin_index is negative", ], - "type": { - "array": [ + type: { + array: [ { - "array": [ - "u64", - 8 - ] + array: ["u64", 8], }, - 12 - ] - } - } - ] - } + 12, + ], + }, + }, + ], + }, }, { - "name": "binArray", - "docs": [ + name: "binArray", + docs: [ "An account to contain a range of bin. For example: Bin 100 <-> 200.", "For example:", "BinArray index: 0 contains bin 0 <-> 599", - "index: 2 contains bin 600 <-> 1199, ..." + "index: 2 contains bin 600 <-> 1199, ...", ], - "type": { - "kind": "struct", - "fields": [ + type: { + kind: "struct", + fields: [ { - "name": "index", - "type": "i64" + name: "index", + type: "i64", }, { - "name": "version", - "docs": [ - "Version of binArray" - ], - "type": "u8" + name: "version", + docs: ["Version of binArray"], + type: "u8", }, { - "name": "padding", - "type": { - "array": [ - "u8", - 7 - ] - } + name: "padding", + type: { + array: ["u8", 7], + }, }, { - "name": "lbPair", - "type": "publicKey" + name: "lbPair", + type: "publicKey", }, { - "name": "bins", - "type": { - "array": [ + name: "bins", + type: { + array: [ { - "defined": "Bin" + defined: "Bin", }, - 70 - ] - } - } - ] - } + 70, + ], + }, + }, + ], + }, }, { - "name": "lbPair", - "type": { - "kind": "struct", - "fields": [ + name: "lbPair", + type: { + kind: "struct", + fields: [ { - "name": "parameters", - "type": { - "defined": "StaticParameters" - } + name: "parameters", + type: { + defined: "StaticParameters", + }, }, { - "name": "vParameters", - "type": { - "defined": "VariableParameters" - } + name: "vParameters", + type: { + defined: "VariableParameters", + }, }, { - "name": "bumpSeed", - "type": { - "array": [ - "u8", - 1 - ] - } + name: "bumpSeed", + type: { + array: ["u8", 1], + }, }, { - "name": "binStepSeed", - "docs": [ - "Bin step signer seed" + name: "binStepSeed", + docs: ["Bin step signer seed"], + type: { + array: ["u8", 2], + }, + }, + { + name: "pairType", + docs: ["Type of the pair"], + type: "u8", + }, + { + name: "activeId", + docs: ["Active bin id"], + type: "i32", + }, + { + name: "binStep", + docs: ["Bin step. Represent the price increment / decrement."], + type: "u16", + }, + { + name: "status", + docs: ["Status of the pair. Check PairStatus enum."], + type: "u8", + }, + { + name: "requireBaseFactorSeed", + type: "u8", + }, + { + name: "baseFactorSeed", + type: { + array: ["u8", 2], + }, + }, + { + name: "padding1", + type: { + array: ["u8", 2], + }, + }, + { + name: "tokenXMint", + docs: ["Token X mint"], + type: "publicKey", + }, + { + name: "tokenYMint", + docs: ["Token Y mint"], + type: "publicKey", + }, + { + name: "reserveX", + docs: ["LB token X vault"], + type: "publicKey", + }, + { + name: "reserveY", + docs: ["LB token Y vault"], + type: "publicKey", + }, + { + name: "protocolFee", + docs: ["Uncollected protocol fee"], + type: { + defined: "ProtocolFee", + }, + }, + { + name: "feeOwner", + docs: [ + "Fee owner. Deprecated. Can be used as buffer in the future.", ], - "type": { - "array": [ - "u8", - 2 - ] - } + type: "publicKey", }, { "name": "pairType", @@ -8028,119 +7816,96 @@ export const IDL: LbClmm = { "type": { "array": [ { - "defined": "RewardInfo" + defined: "RewardInfo", }, - 2 - ] - } + 2, + ], + }, }, { - "name": "oracle", - "docs": [ - "Oracle pubkey" - ], - "type": "publicKey" + name: "oracle", + docs: ["Oracle pubkey"], + type: "publicKey", }, { - "name": "binArrayBitmap", - "docs": [ - "Packed initialized bin array state" - ], - "type": { - "array": [ - "u64", - 16 - ] - } + name: "binArrayBitmap", + docs: ["Packed initialized bin array state"], + type: { + array: ["u64", 16], + }, }, { - "name": "lastUpdatedAt", - "docs": [ - "Last time the pool fee parameter was updated" - ], - "type": "i64" + name: "lastUpdatedAt", + docs: ["Last time the pool fee parameter was updated"], + type: "i64", }, { - "name": "whitelistedWallet", - "docs": [ - "Whitelisted wallet" - ], - "type": "publicKey" + name: "whitelistedWallet", + docs: ["Whitelisted wallet"], + type: "publicKey", }, { "name": "preActivationSwapAddress", "docs": [ "Address allowed to swap when the current point is greater than or equal to the pre-activation point. The pre-activation point is calculated as `activation_point - pre_activation_duration`." ], - "type": "publicKey" + type: "publicKey", }, { - "name": "baseKey", - "docs": [ - "Base keypair. Only required for permission pair" - ], - "type": "publicKey" + name: "baseKey", + docs: ["Base keypair. Only required for permission pair"], + type: "publicKey", }, { "name": "activationPoint", "docs": [ "Time point to enable the pair. Only applicable for permission pair." ], - "type": "u64" + type: "u64", }, { "name": "preActivationDuration", "docs": [ "Duration before activation activation_point. Used to calculate pre-activation time point for pre_activation_swap_address" ], - "type": "u64" + type: "u64", }, { "name": "padding2", "docs": [ "_padding 2 is reclaimed free space from swap_cap_deactivate_point and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!" ], - "type": { - "array": [ - "u8", - 8 - ] - } + type: { + array: ["u8", 8], + }, }, { "name": "lockDuration", "docs": [ "Liquidity lock duration for positions which created before activate. Only applicable for permission pair." ], - "type": "u64" + type: "u64", }, { - "name": "creator", - "docs": [ - "Pool creator" - ], - "type": "publicKey" + name: "creator", + docs: ["Pool creator"], + type: "publicKey", }, { - "name": "reserved", - "docs": [ - "Reserved space for future use" - ], - "type": { - "array": [ - "u8", - 24 - ] - } - } - ] - } + name: "reserved", + docs: ["Reserved space for future use"], + type: { + array: ["u8", 24], + }, + }, + ], + }, }, { - "name": "oracle", - "type": { - "kind": "struct", - "fields": [ + name: "oracle", + type: { + kind: "struct", + fields: [ { "name": "idx", "docs": [ @@ -8149,255 +7914,198 @@ export const IDL: LbClmm = { "type": "u64" }, { - "name": "activeSize", - "docs": [ - "Size of active sample. Active sample is initialized observation." + name: "activeSize", + docs: [ + "Size of active sample. Active sample is initialized observation.", ], - "type": "u64" + type: "u64", }, { - "name": "length", - "docs": [ - "Number of observations" - ], - "type": "u64" - } - ] - } + name: "length", + docs: ["Number of observations"], + type: "u64", + }, + ], + }, }, { - "name": "position", - "type": { - "kind": "struct", - "fields": [ + name: "position", + type: { + kind: "struct", + fields: [ { - "name": "lbPair", - "docs": [ - "The LB pair of this position" - ], - "type": "publicKey" + name: "lbPair", + docs: ["The LB pair of this position"], + type: "publicKey", }, { - "name": "owner", - "docs": [ - "Owner of the position. Client rely on this to to fetch their positions." + name: "owner", + docs: [ + "Owner of the position. Client rely on this to to fetch their positions.", ], - "type": "publicKey" + type: "publicKey", }, { - "name": "liquidityShares", - "docs": [ - "Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept." + name: "liquidityShares", + docs: [ + "Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.", ], - "type": { - "array": [ - "u64", - 70 - ] - } + type: { + array: ["u64", 70], + }, }, { - "name": "rewardInfos", - "docs": [ - "Farming reward information" - ], - "type": { - "array": [ + name: "rewardInfos", + docs: ["Farming reward information"], + type: { + array: [ { - "defined": "UserRewardInfo" + defined: "UserRewardInfo", }, - 70 - ] - } + 70, + ], + }, }, { - "name": "feeInfos", - "docs": [ - "Swap fee to claim information" - ], - "type": { - "array": [ + name: "feeInfos", + docs: ["Swap fee to claim information"], + type: { + array: [ { - "defined": "FeeInfo" + defined: "FeeInfo", }, - 70 - ] - } + 70, + ], + }, }, { - "name": "lowerBinId", - "docs": [ - "Lower bin ID" - ], - "type": "i32" + name: "lowerBinId", + docs: ["Lower bin ID"], + type: "i32", }, { - "name": "upperBinId", - "docs": [ - "Upper bin ID" - ], - "type": "i32" + name: "upperBinId", + docs: ["Upper bin ID"], + type: "i32", }, { - "name": "lastUpdatedAt", - "docs": [ - "Last updated timestamp" - ], - "type": "i64" + name: "lastUpdatedAt", + docs: ["Last updated timestamp"], + type: "i64", }, { - "name": "totalClaimedFeeXAmount", - "docs": [ - "Total claimed token fee X" - ], - "type": "u64" + name: "totalClaimedFeeXAmount", + docs: ["Total claimed token fee X"], + type: "u64", }, { - "name": "totalClaimedFeeYAmount", - "docs": [ - "Total claimed token fee Y" - ], - "type": "u64" + name: "totalClaimedFeeYAmount", + docs: ["Total claimed token fee Y"], + type: "u64", }, { - "name": "totalClaimedRewards", - "docs": [ - "Total claimed rewards" - ], - "type": { - "array": [ - "u64", - 2 - ] - } + name: "totalClaimedRewards", + docs: ["Total claimed rewards"], + type: { + array: ["u64", 2], + }, }, { - "name": "reserved", - "docs": [ - "Reserved space for future use" - ], - "type": { - "array": [ - "u8", - 160 - ] - } - } - ] - } + name: "reserved", + docs: ["Reserved space for future use"], + type: { + array: ["u8", 160], + }, + }, + ], + }, }, { - "name": "positionV2", - "type": { - "kind": "struct", - "fields": [ + name: "positionV2", + type: { + kind: "struct", + fields: [ { - "name": "lbPair", - "docs": [ - "The LB pair of this position" - ], - "type": "publicKey" + name: "lbPair", + docs: ["The LB pair of this position"], + type: "publicKey", }, { - "name": "owner", - "docs": [ - "Owner of the position. Client rely on this to to fetch their positions." + name: "owner", + docs: [ + "Owner of the position. Client rely on this to to fetch their positions.", ], - "type": "publicKey" + type: "publicKey", }, { - "name": "liquidityShares", - "docs": [ - "Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept." + name: "liquidityShares", + docs: [ + "Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.", ], - "type": { - "array": [ - "u128", - 70 - ] - } + type: { + array: ["u128", 70], + }, }, { - "name": "rewardInfos", - "docs": [ - "Farming reward information" - ], - "type": { - "array": [ + name: "rewardInfos", + docs: ["Farming reward information"], + type: { + array: [ { - "defined": "UserRewardInfo" + defined: "UserRewardInfo", }, - 70 - ] - } + 70, + ], + }, }, { - "name": "feeInfos", - "docs": [ - "Swap fee to claim information" - ], - "type": { - "array": [ + name: "feeInfos", + docs: ["Swap fee to claim information"], + type: { + array: [ { - "defined": "FeeInfo" + defined: "FeeInfo", }, - 70 - ] - } + 70, + ], + }, }, { - "name": "lowerBinId", - "docs": [ - "Lower bin ID" - ], - "type": "i32" + name: "lowerBinId", + docs: ["Lower bin ID"], + type: "i32", }, { - "name": "upperBinId", - "docs": [ - "Upper bin ID" - ], - "type": "i32" + name: "upperBinId", + docs: ["Upper bin ID"], + type: "i32", }, { - "name": "lastUpdatedAt", - "docs": [ - "Last updated timestamp" - ], - "type": "i64" + name: "lastUpdatedAt", + docs: ["Last updated timestamp"], + type: "i64", }, { - "name": "totalClaimedFeeXAmount", - "docs": [ - "Total claimed token fee X" - ], - "type": "u64" + name: "totalClaimedFeeXAmount", + docs: ["Total claimed token fee X"], + type: "u64", }, { - "name": "totalClaimedFeeYAmount", - "docs": [ - "Total claimed token fee Y" - ], - "type": "u64" + name: "totalClaimedFeeYAmount", + docs: ["Total claimed token fee Y"], + type: "u64", }, { - "name": "totalClaimedRewards", - "docs": [ - "Total claimed rewards" - ], - "type": { - "array": [ - "u64", - 2 - ] - } + name: "totalClaimedRewards", + docs: ["Total claimed rewards"], + type: { + array: ["u64", 2], + }, }, { - "name": "operator", - "docs": [ - "Operator of position" - ], - "type": "publicKey" + name: "operator", + docs: ["Operator of position"], + type: "publicKey", }, { "name": "lockReleasePoint", @@ -8407,106 +8115,99 @@ export const IDL: LbClmm = { "type": "u64" }, { - "name": "subjectedToBootstrapLiquidityLocking", - "docs": [ - "Is the position subjected to liquidity locking for the launch pool." + name: "subjectedToBootstrapLiquidityLocking", + docs: [ + "Is the position subjected to liquidity locking for the launch pool.", ], - "type": "u8" + type: "u8", }, { - "name": "feeOwner", - "docs": [ - "Address is able to claim fee in this position, only valid for bootstrap_liquidity_position" + name: "feeOwner", + docs: [ + "Address is able to claim fee in this position, only valid for bootstrap_liquidity_position", ], - "type": "publicKey" + type: "publicKey", }, { - "name": "reserved", - "docs": [ - "Reserved space for future use" - ], - "type": { - "array": [ - "u8", - 87 - ] - } - } - ] - } + name: "reserved", + docs: ["Reserved space for future use"], + type: { + array: ["u8", 87], + }, + }, + ], + }, }, { - "name": "presetParameter", - "type": { - "kind": "struct", - "fields": [ + name: "presetParameter", + type: { + kind: "struct", + fields: [ { - "name": "binStep", - "docs": [ - "Bin step. Represent the price increment / decrement." - ], - "type": "u16" + name: "binStep", + docs: ["Bin step. Represent the price increment / decrement."], + type: "u16", }, { - "name": "baseFactor", - "docs": [ - "Used for base fee calculation. base_fee_rate = base_factor * bin_step" + name: "baseFactor", + docs: [ + "Used for base fee calculation. base_fee_rate = base_factor * bin_step", ], - "type": "u16" + type: "u16", }, { - "name": "filterPeriod", - "docs": [ - "Filter period determine high frequency trading time window." + name: "filterPeriod", + docs: [ + "Filter period determine high frequency trading time window.", ], - "type": "u16" + type: "u16", }, { - "name": "decayPeriod", - "docs": [ - "Decay period determine when the volatile fee start decay / decrease." + name: "decayPeriod", + docs: [ + "Decay period determine when the volatile fee start decay / decrease.", ], - "type": "u16" + type: "u16", }, { - "name": "reductionFactor", - "docs": [ - "Reduction factor controls the volatile fee rate decrement rate." + name: "reductionFactor", + docs: [ + "Reduction factor controls the volatile fee rate decrement rate.", ], - "type": "u16" + type: "u16", }, { - "name": "variableFeeControl", - "docs": [ - "Used to scale the variable fee component depending on the dynamic of the market" + name: "variableFeeControl", + docs: [ + "Used to scale the variable fee component depending on the dynamic of the market", ], - "type": "u32" + type: "u32", }, { - "name": "maxVolatilityAccumulator", - "docs": [ - "Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate." + name: "maxVolatilityAccumulator", + docs: [ + "Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.", ], - "type": "u32" + type: "u32", }, { - "name": "minBinId", - "docs": [ - "Min bin id supported by the pool based on the configured bin step." + name: "minBinId", + docs: [ + "Min bin id supported by the pool based on the configured bin step.", ], - "type": "i32" + type: "i32", }, { - "name": "maxBinId", - "docs": [ - "Max bin id supported by the pool based on the configured bin step." + name: "maxBinId", + docs: [ + "Max bin id supported by the pool based on the configured bin step.", ], - "type": "i32" + type: "i32", }, { - "name": "protocolShare", - "docs": [ - "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" + name: "protocolShare", + docs: [ + "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee", ], "type": "u16" } @@ -8514,364 +8215,305 @@ export const IDL: LbClmm = { } } ], - "types": [ + types: [ { - "name": "LiquidityParameterByStrategyOneSide", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityParameterByStrategyOneSide", + type: { + kind: "struct", + fields: [ { - "name": "amount", - "docs": [ - "Amount of X token or Y token to deposit" - ], - "type": "u64" + name: "amount", + docs: ["Amount of X token or Y token to deposit"], + type: "u64", }, { - "name": "activeId", - "docs": [ - "Active bin that integrator observe off-chain" - ], - "type": "i32" + name: "activeId", + docs: ["Active bin that integrator observe off-chain"], + type: "i32", }, { - "name": "maxActiveBinSlippage", - "docs": [ - "max active bin slippage allowed" - ], - "type": "i32" + name: "maxActiveBinSlippage", + docs: ["max active bin slippage allowed"], + type: "i32", }, { - "name": "strategyParameters", - "docs": [ - "strategy parameters" - ], - "type": { - "defined": "StrategyParameters" - } - } - ] - } + name: "strategyParameters", + docs: ["strategy parameters"], + type: { + defined: "StrategyParameters", + }, + }, + ], + }, }, { - "name": "LiquidityParameterByStrategy", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityParameterByStrategy", + type: { + kind: "struct", + fields: [ { - "name": "amountX", - "docs": [ - "Amount of X token to deposit" - ], - "type": "u64" + name: "amountX", + docs: ["Amount of X token to deposit"], + type: "u64", }, { - "name": "amountY", - "docs": [ - "Amount of Y token to deposit" - ], - "type": "u64" + name: "amountY", + docs: ["Amount of Y token to deposit"], + type: "u64", }, { - "name": "activeId", - "docs": [ - "Active bin that integrator observe off-chain" - ], - "type": "i32" + name: "activeId", + docs: ["Active bin that integrator observe off-chain"], + type: "i32", }, { - "name": "maxActiveBinSlippage", - "docs": [ - "max active bin slippage allowed" - ], - "type": "i32" + name: "maxActiveBinSlippage", + docs: ["max active bin slippage allowed"], + type: "i32", }, { - "name": "strategyParameters", - "docs": [ - "strategy parameters" - ], - "type": { - "defined": "StrategyParameters" - } - } - ] - } + name: "strategyParameters", + docs: ["strategy parameters"], + type: { + defined: "StrategyParameters", + }, + }, + ], + }, }, { - "name": "StrategyParameters", - "type": { - "kind": "struct", - "fields": [ + name: "StrategyParameters", + type: { + kind: "struct", + fields: [ { - "name": "minBinId", - "docs": [ - "min bin id" - ], - "type": "i32" + name: "minBinId", + docs: ["min bin id"], + type: "i32", }, { - "name": "maxBinId", - "docs": [ - "max bin id" - ], - "type": "i32" + name: "maxBinId", + docs: ["max bin id"], + type: "i32", }, { - "name": "strategyType", - "docs": [ - "strategy type" - ], - "type": { - "defined": "StrategyType" - } + name: "strategyType", + docs: ["strategy type"], + type: { + defined: "StrategyType", + }, }, { - "name": "parameteres", - "docs": [ - "parameters" - ], - "type": { - "array": [ - "u8", - 64 - ] - } - } - ] - } + name: "parameteres", + docs: ["parameters"], + type: { + array: ["u8", 64], + }, + }, + ], + }, }, { - "name": "LiquidityOneSideParameter", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityOneSideParameter", + type: { + kind: "struct", + fields: [ { - "name": "amount", - "docs": [ - "Amount of X token or Y token to deposit" - ], - "type": "u64" + name: "amount", + docs: ["Amount of X token or Y token to deposit"], + type: "u64", }, { - "name": "activeId", - "docs": [ - "Active bin that integrator observe off-chain" - ], - "type": "i32" + name: "activeId", + docs: ["Active bin that integrator observe off-chain"], + type: "i32", }, { - "name": "maxActiveBinSlippage", - "docs": [ - "max active bin slippage allowed" - ], - "type": "i32" + name: "maxActiveBinSlippage", + docs: ["max active bin slippage allowed"], + type: "i32", }, { - "name": "binLiquidityDist", - "docs": [ - "Liquidity distribution to each bins" - ], - "type": { - "vec": { - "defined": "BinLiquidityDistributionByWeight" - } - } - } - ] - } + name: "binLiquidityDist", + docs: ["Liquidity distribution to each bins"], + type: { + vec: { + defined: "BinLiquidityDistributionByWeight", + }, + }, + }, + ], + }, }, { - "name": "BinLiquidityDistributionByWeight", - "type": { - "kind": "struct", - "fields": [ + name: "BinLiquidityDistributionByWeight", + type: { + kind: "struct", + fields: [ { - "name": "binId", - "docs": [ - "Define the bin ID wish to deposit to." - ], - "type": "i32" + name: "binId", + docs: ["Define the bin ID wish to deposit to."], + type: "i32", }, { - "name": "weight", - "docs": [ - "weight of liquidity distributed for this bin id" - ], - "type": "u16" - } - ] - } + name: "weight", + docs: ["weight of liquidity distributed for this bin id"], + type: "u16", + }, + ], + }, }, { - "name": "LiquidityParameterByWeight", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityParameterByWeight", + type: { + kind: "struct", + fields: [ { - "name": "amountX", - "docs": [ - "Amount of X token to deposit" - ], - "type": "u64" + name: "amountX", + docs: ["Amount of X token to deposit"], + type: "u64", }, { - "name": "amountY", - "docs": [ - "Amount of Y token to deposit" - ], - "type": "u64" + name: "amountY", + docs: ["Amount of Y token to deposit"], + type: "u64", }, { - "name": "activeId", - "docs": [ - "Active bin that integrator observe off-chain" - ], - "type": "i32" + name: "activeId", + docs: ["Active bin that integrator observe off-chain"], + type: "i32", }, { - "name": "maxActiveBinSlippage", - "docs": [ - "max active bin slippage allowed" - ], - "type": "i32" + name: "maxActiveBinSlippage", + docs: ["max active bin slippage allowed"], + type: "i32", }, { - "name": "binLiquidityDist", - "docs": [ - "Liquidity distribution to each bins" - ], - "type": { - "vec": { - "defined": "BinLiquidityDistributionByWeight" - } - } - } - ] - } + name: "binLiquidityDist", + docs: ["Liquidity distribution to each bins"], + type: { + vec: { + defined: "BinLiquidityDistributionByWeight", + }, + }, + }, + ], + }, }, { - "name": "AddLiquiditySingleSidePreciseParameter", - "type": { - "kind": "struct", - "fields": [ + name: "AddLiquiditySingleSidePreciseParameter", + type: { + kind: "struct", + fields: [ { - "name": "bins", - "type": { - "vec": { - "defined": "CompressedBinDepositAmount" - } - } + name: "bins", + type: { + vec: { + defined: "CompressedBinDepositAmount", + }, + }, }, { - "name": "decompressMultiplier", - "type": "u64" - } - ] - } + name: "decompressMultiplier", + type: "u64", + }, + ], + }, }, { - "name": "CompressedBinDepositAmount", - "type": { - "kind": "struct", - "fields": [ + name: "CompressedBinDepositAmount", + type: { + kind: "struct", + fields: [ { - "name": "binId", - "type": "i32" + name: "binId", + type: "i32", }, { - "name": "amount", - "type": "u32" - } - ] - } + name: "amount", + type: "u32", + }, + ], + }, }, { - "name": "BinLiquidityDistribution", - "type": { - "kind": "struct", - "fields": [ + name: "BinLiquidityDistribution", + type: { + kind: "struct", + fields: [ { - "name": "binId", - "docs": [ - "Define the bin ID wish to deposit to." - ], - "type": "i32" + name: "binId", + docs: ["Define the bin ID wish to deposit to."], + type: "i32", }, { - "name": "distributionX", - "docs": [ - "DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin." + name: "distributionX", + docs: [ + "DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.", ], - "type": "u16" + type: "u16", }, { - "name": "distributionY", - "docs": [ - "DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin." + name: "distributionY", + docs: [ + "DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.", ], - "type": "u16" - } - ] - } + type: "u16", + }, + ], + }, }, { - "name": "LiquidityParameter", - "type": { - "kind": "struct", - "fields": [ + name: "LiquidityParameter", + type: { + kind: "struct", + fields: [ { - "name": "amountX", - "docs": [ - "Amount of X token to deposit" - ], - "type": "u64" + name: "amountX", + docs: ["Amount of X token to deposit"], + type: "u64", }, { - "name": "amountY", - "docs": [ - "Amount of Y token to deposit" - ], - "type": "u64" + name: "amountY", + docs: ["Amount of Y token to deposit"], + type: "u64", }, { - "name": "binLiquidityDist", - "docs": [ - "Liquidity distribution to each bins" - ], - "type": { - "vec": { - "defined": "BinLiquidityDistribution" - } - } - } - ] - } + name: "binLiquidityDist", + docs: ["Liquidity distribution to each bins"], + type: { + vec: { + defined: "BinLiquidityDistribution", + }, + }, + }, + ], + }, }, { - "name": "InitPermissionPairIx", - "type": { - "kind": "struct", - "fields": [ + name: "InitPermissionPairIx", + type: { + kind: "struct", + fields: [ { - "name": "activeId", - "type": "i32" + name: "activeId", + type: "i32", }, { - "name": "binStep", - "type": "u16" + name: "binStep", + type: "u16", }, { - "name": "baseFactor", - "type": "u16" + name: "baseFactor", + type: "u16", }, { - "name": "minBinId", - "type": "i32" + name: "minBinId", + type: "i32", }, { - "name": "maxBinId", - "type": "i32" + name: "maxBinId", + type: "i32", }, { "name": "lockDuration", @@ -8882,85 +8524,83 @@ export const IDL: LbClmm = { "type": "u8" } ] - } - }, - { - "name": "InitPresetParametersIx", - "type": { - "kind": "struct", - "fields": [ - { - "name": "binStep", - "docs": [ - "Bin step. Represent the price increment / decrement." - ], - "type": "u16" + } + }, + { + name: "InitPresetParametersIx", + type: { + kind: "struct", + fields: [ + { + name: "binStep", + docs: ["Bin step. Represent the price increment / decrement."], + type: "u16", }, { - "name": "baseFactor", - "docs": [ - "Used for base fee calculation. base_fee_rate = base_factor * bin_step" + name: "baseFactor", + docs: [ + "Used for base fee calculation. base_fee_rate = base_factor * bin_step", ], - "type": "u16" + type: "u16", }, { - "name": "filterPeriod", - "docs": [ - "Filter period determine high frequency trading time window." + name: "filterPeriod", + docs: [ + "Filter period determine high frequency trading time window.", ], - "type": "u16" + type: "u16", }, { - "name": "decayPeriod", - "docs": [ - "Decay period determine when the volatile fee start decay / decrease." + name: "decayPeriod", + docs: [ + "Decay period determine when the volatile fee start decay / decrease.", ], - "type": "u16" + type: "u16", }, { - "name": "reductionFactor", - "docs": [ - "Reduction factor controls the volatile fee rate decrement rate." + name: "reductionFactor", + docs: [ + "Reduction factor controls the volatile fee rate decrement rate.", ], - "type": "u16" + type: "u16", }, { - "name": "variableFeeControl", - "docs": [ - "Used to scale the variable fee component depending on the dynamic of the market" + name: "variableFeeControl", + docs: [ + "Used to scale the variable fee component depending on the dynamic of the market", ], - "type": "u32" + type: "u32", }, { - "name": "maxVolatilityAccumulator", - "docs": [ - "Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate." + name: "maxVolatilityAccumulator", + docs: [ + "Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.", ], - "type": "u32" + type: "u32", }, { - "name": "minBinId", - "docs": [ - "Min bin id supported by the pool based on the configured bin step." + name: "minBinId", + docs: [ + "Min bin id supported by the pool based on the configured bin step.", ], - "type": "i32" + type: "i32", }, { - "name": "maxBinId", - "docs": [ - "Max bin id supported by the pool based on the configured bin step." + name: "maxBinId", + docs: [ + "Max bin id supported by the pool based on the configured bin step.", ], - "type": "i32" + type: "i32", }, { - "name": "protocolShare", - "docs": [ - "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" + name: "protocolShare", + docs: [ + "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee", ], - "type": "u16" - } - ] - } + type: "u16", + }, + ], + }, }, { "name": "FeeParameter", @@ -8968,21 +8608,19 @@ export const IDL: LbClmm = { "kind": "struct", "fields": [ { - "name": "protocolShare", - "docs": [ - "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" + name: "protocolShare", + docs: [ + "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee", ], - "type": "u16" + type: "u16", }, { - "name": "baseFactor", - "docs": [ - "Base factor for base fee rate" - ], - "type": "u16" - } - ] - } + name: "baseFactor", + docs: ["Base factor for base fee rate"], + type: "u16", + }, + ], + }, }, { "name": "BinLiquidityReduction", @@ -9006,453 +8644,406 @@ export const IDL: LbClmm = { "kind": "struct", "fields": [ { - "name": "amountX", - "docs": [ - "Amount of token X in the bin. This already excluded protocol fees." + name: "amountX", + docs: [ + "Amount of token X in the bin. This already excluded protocol fees.", ], - "type": "u64" + type: "u64", }, { - "name": "amountY", - "docs": [ - "Amount of token Y in the bin. This already excluded protocol fees." + name: "amountY", + docs: [ + "Amount of token Y in the bin. This already excluded protocol fees.", ], - "type": "u64" + type: "u64", }, { - "name": "price", - "docs": [ - "Bin price" - ], - "type": "u128" + name: "price", + docs: ["Bin price"], + type: "u128", }, { - "name": "liquiditySupply", - "docs": [ - "Liquidities of the bin. This is the same as LP mint supply. q-number" + name: "liquiditySupply", + docs: [ + "Liquidities of the bin. This is the same as LP mint supply. q-number", ], - "type": "u128" + type: "u128", }, { - "name": "rewardPerTokenStored", - "docs": [ - "reward_a_per_token_stored" - ], - "type": { - "array": [ - "u128", - 2 - ] - } + name: "rewardPerTokenStored", + docs: ["reward_a_per_token_stored"], + type: { + array: ["u128", 2], + }, }, { - "name": "feeAmountXPerTokenStored", - "docs": [ - "Swap fee amount of token X per liquidity deposited." - ], - "type": "u128" + name: "feeAmountXPerTokenStored", + docs: ["Swap fee amount of token X per liquidity deposited."], + type: "u128", }, { - "name": "feeAmountYPerTokenStored", - "docs": [ - "Swap fee amount of token Y per liquidity deposited." - ], - "type": "u128" + name: "feeAmountYPerTokenStored", + docs: ["Swap fee amount of token Y per liquidity deposited."], + type: "u128", }, { - "name": "amountXIn", - "docs": [ - "Total token X swap into the bin. Only used for tracking purpose." + name: "amountXIn", + docs: [ + "Total token X swap into the bin. Only used for tracking purpose.", ], - "type": "u128" + type: "u128", }, { - "name": "amountYIn", - "docs": [ - "Total token Y swap into he bin. Only used for tracking purpose." + name: "amountYIn", + docs: [ + "Total token Y swap into he bin. Only used for tracking purpose.", ], - "type": "u128" - } - ] - } + type: "u128", + }, + ], + }, }, { - "name": "ProtocolFee", - "type": { - "kind": "struct", - "fields": [ + name: "ProtocolFee", + type: { + kind: "struct", + fields: [ { - "name": "amountX", - "type": "u64" + name: "amountX", + type: "u64", }, { - "name": "amountY", - "type": "u64" - } - ] - } + name: "amountY", + type: "u64", + }, + ], + }, }, { - "name": "RewardInfo", - "docs": [ - "Stores the state relevant for tracking liquidity mining rewards" - ], - "type": { - "kind": "struct", - "fields": [ + name: "RewardInfo", + docs: ["Stores the state relevant for tracking liquidity mining rewards"], + type: { + kind: "struct", + fields: [ { - "name": "mint", - "docs": [ - "Reward token mint." - ], - "type": "publicKey" + name: "mint", + docs: ["Reward token mint."], + type: "publicKey", }, { - "name": "vault", - "docs": [ - "Reward vault token account." - ], - "type": "publicKey" + name: "vault", + docs: ["Reward vault token account."], + type: "publicKey", }, { - "name": "funder", - "docs": [ - "Authority account that allows to fund rewards" - ], - "type": "publicKey" + name: "funder", + docs: ["Authority account that allows to fund rewards"], + type: "publicKey", }, { - "name": "rewardDuration", - "docs": [ - "TODO check whether we need to store it in pool" - ], - "type": "u64" + name: "rewardDuration", + docs: ["TODO check whether we need to store it in pool"], + type: "u64", }, { - "name": "rewardDurationEnd", - "docs": [ - "TODO check whether we need to store it in pool" - ], - "type": "u64" + name: "rewardDurationEnd", + docs: ["TODO check whether we need to store it in pool"], + type: "u64", }, { - "name": "rewardRate", - "docs": [ - "TODO check whether we need to store it in pool" - ], - "type": "u128" + name: "rewardRate", + docs: ["TODO check whether we need to store it in pool"], + type: "u128", }, { - "name": "lastUpdateTime", - "docs": [ - "The last time reward states were updated." - ], - "type": "u64" + name: "lastUpdateTime", + docs: ["The last time reward states were updated."], + type: "u64", }, { - "name": "cumulativeSecondsWithEmptyLiquidityReward", - "docs": [ - "Accumulated seconds where when farm distribute rewards, but the bin is empty. The reward will be accumulated for next reward time window." + name: "cumulativeSecondsWithEmptyLiquidityReward", + docs: [ + "Accumulated seconds where when farm distribute rewards, but the bin is empty. The reward will be accumulated for next reward time window.", ], - "type": "u64" - } - ] - } + type: "u64", + }, + ], + }, }, { - "name": "Observation", - "type": { - "kind": "struct", - "fields": [ + name: "Observation", + type: { + kind: "struct", + fields: [ { - "name": "cumulativeActiveBinId", - "docs": [ - "Cumulative active bin ID" - ], - "type": "i128" + name: "cumulativeActiveBinId", + docs: ["Cumulative active bin ID"], + type: "i128", }, { - "name": "createdAt", - "docs": [ - "Observation sample created timestamp" - ], - "type": "i64" + name: "createdAt", + docs: ["Observation sample created timestamp"], + type: "i64", }, { - "name": "lastUpdatedAt", - "docs": [ - "Observation sample last updated timestamp" - ], - "type": "i64" - } - ] - } + name: "lastUpdatedAt", + docs: ["Observation sample last updated timestamp"], + type: "i64", + }, + ], + }, }, { - "name": "StaticParameters", - "docs": [ - "Parameter that set by the protocol" - ], - "type": { - "kind": "struct", - "fields": [ + name: "StaticParameters", + docs: ["Parameter that set by the protocol"], + type: { + kind: "struct", + fields: [ { - "name": "baseFactor", - "docs": [ - "Used for base fee calculation. base_fee_rate = base_factor * bin_step" + name: "baseFactor", + docs: [ + "Used for base fee calculation. base_fee_rate = base_factor * bin_step", ], - "type": "u16" + type: "u16", }, { - "name": "filterPeriod", - "docs": [ - "Filter period determine high frequency trading time window." + name: "filterPeriod", + docs: [ + "Filter period determine high frequency trading time window.", ], - "type": "u16" + type: "u16", }, { - "name": "decayPeriod", - "docs": [ - "Decay period determine when the volatile fee start decay / decrease." + name: "decayPeriod", + docs: [ + "Decay period determine when the volatile fee start decay / decrease.", ], - "type": "u16" + type: "u16", }, { - "name": "reductionFactor", - "docs": [ - "Reduction factor controls the volatile fee rate decrement rate." + name: "reductionFactor", + docs: [ + "Reduction factor controls the volatile fee rate decrement rate.", ], - "type": "u16" + type: "u16", }, { - "name": "variableFeeControl", - "docs": [ - "Used to scale the variable fee component depending on the dynamic of the market" + name: "variableFeeControl", + docs: [ + "Used to scale the variable fee component depending on the dynamic of the market", ], - "type": "u32" + type: "u32", }, { - "name": "maxVolatilityAccumulator", - "docs": [ - "Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate." + name: "maxVolatilityAccumulator", + docs: [ + "Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.", ], - "type": "u32" + type: "u32", }, { - "name": "minBinId", - "docs": [ - "Min bin id supported by the pool based on the configured bin step." + name: "minBinId", + docs: [ + "Min bin id supported by the pool based on the configured bin step.", ], - "type": "i32" + type: "i32", }, { - "name": "maxBinId", - "docs": [ - "Max bin id supported by the pool based on the configured bin step." + name: "maxBinId", + docs: [ + "Max bin id supported by the pool based on the configured bin step.", ], - "type": "i32" + type: "i32", }, { - "name": "protocolShare", - "docs": [ - "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" + name: "protocolShare", + docs: [ + "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee", ], - "type": "u16" + type: "u16", }, { - "name": "padding", - "docs": [ - "Padding for bytemuck safe alignment" - ], - "type": { - "array": [ - "u8", - 6 - ] - } - } - ] - } + name: "padding", + docs: ["Padding for bytemuck safe alignment"], + type: { + array: ["u8", 6], + }, + }, + ], + }, }, { - "name": "VariableParameters", - "docs": [ - "Parameters that changes based on dynamic of the market" - ], - "type": { - "kind": "struct", - "fields": [ + name: "VariableParameters", + docs: ["Parameters that changes based on dynamic of the market"], + type: { + kind: "struct", + fields: [ { - "name": "volatilityAccumulator", - "docs": [ + name: "volatilityAccumulator", + docs: [ "Volatility accumulator measure the number of bin crossed since reference bin ID. Normally (without filter period taken into consideration), reference bin ID is the active bin of last swap.", - "It affects the variable fee rate" + "It affects the variable fee rate", ], - "type": "u32" + type: "u32", }, { - "name": "volatilityReference", - "docs": [ - "Volatility reference is decayed volatility accumulator. It is always <= volatility_accumulator" + name: "volatilityReference", + docs: [ + "Volatility reference is decayed volatility accumulator. It is always <= volatility_accumulator", ], - "type": "u32" + type: "u32", }, { - "name": "indexReference", - "docs": [ - "Active bin id of last swap." - ], - "type": "i32" + name: "indexReference", + docs: ["Active bin id of last swap."], + type: "i32", }, { - "name": "padding", - "docs": [ - "Padding for bytemuck safe alignment" - ], - "type": { - "array": [ - "u8", - 4 - ] - } + name: "padding", + docs: ["Padding for bytemuck safe alignment"], + type: { + array: ["u8", 4], + }, }, { - "name": "lastUpdateTimestamp", - "docs": [ - "Last timestamp the variable parameters was updated" - ], - "type": "i64" + name: "lastUpdateTimestamp", + docs: ["Last timestamp the variable parameters was updated"], + type: "i64", }, { - "name": "padding1", - "docs": [ - "Padding for bytemuck safe alignment" - ], - "type": { - "array": [ - "u8", - 8 - ] - } - } - ] - } + name: "padding1", + docs: ["Padding for bytemuck safe alignment"], + type: { + array: ["u8", 8], + }, + }, + ], + }, }, { - "name": "FeeInfo", - "type": { - "kind": "struct", - "fields": [ + name: "FeeInfo", + type: { + kind: "struct", + fields: [ { - "name": "feeXPerTokenComplete", - "type": "u128" + name: "feeXPerTokenComplete", + type: "u128", }, { - "name": "feeYPerTokenComplete", - "type": "u128" + name: "feeYPerTokenComplete", + type: "u128", }, { - "name": "feeXPending", - "type": "u64" + name: "feeXPending", + type: "u64", }, { - "name": "feeYPending", - "type": "u64" - } - ] - } + name: "feeYPending", + type: "u64", + }, + ], + }, }, { - "name": "UserRewardInfo", - "type": { - "kind": "struct", - "fields": [ + name: "UserRewardInfo", + type: { + kind: "struct", + fields: [ { - "name": "rewardPerTokenCompletes", - "type": { - "array": [ - "u128", - 2 - ] - } + name: "rewardPerTokenCompletes", + type: { + array: ["u128", 2], + }, }, { - "name": "rewardPendings", - "type": { - "array": [ - "u64", - 2 - ] - } - } - ] - } + name: "rewardPendings", + type: { + array: ["u64", 2], + }, + }, + ], + }, }, { - "name": "StrategyType", - "type": { - "kind": "enum", - "variants": [ + name: "StrategyType", + type: { + kind: "enum", + variants: [ { - "name": "SpotOneSide" + name: "SpotOneSide", }, { - "name": "CurveOneSide" + name: "CurveOneSide", }, { - "name": "BidAskOneSide" + name: "BidAskOneSide", }, { - "name": "SpotBalanced" + name: "SpotBalanced", }, { - "name": "CurveBalanced" + name: "CurveBalanced", }, { - "name": "BidAskBalanced" + name: "BidAskBalanced", }, { - "name": "SpotImBalanced" + name: "SpotImBalanced", }, { - "name": "CurveImBalanced" + name: "CurveImBalanced", }, { - "name": "BidAskImBalanced" - } - ] - } + name: "BidAskImBalanced", + }, + ], + }, }, { - "name": "Rounding", - "type": { - "kind": "enum", - "variants": [ + name: "Rounding", + type: { + kind: "enum", + variants: [ { - "name": "Up" + name: "Up", }, { - "name": "Down" - } - ] - } + name: "Down", + }, + ], + }, + }, + { + name: "LayoutVersion", + docs: ["Layout version"], + type: { + kind: "enum", + variants: [ + { + name: "V0", + }, + { + name: "V1", + }, + ], + }, }, { - "name": "LayoutVersion", - "docs": [ - "Layout version" + name: "PairType", + docs: [ + "Type of the Pair. 0 = Permissionless, 1 = Permission. Putting 0 as permissionless for backward compatibility.", ], - "type": { - "kind": "enum", - "variants": [ + type: { + kind: "enum", + variants: [ { - "name": "V0" + name: "Permissionless", }, { - "name": "V1" - } - ] - } + name: "Permission", + }, + ], + }, }, { "name": "ActivationType", @@ -9476,509 +9067,486 @@ export const IDL: LbClmm = { "docs": [ "Type of the Pair. 0 = Permissionless, 1 = Permission. Putting 0 as permissionless for backward compatibility." ], - "type": { - "kind": "enum", - "variants": [ + type: { + kind: "enum", + variants: [ { - "name": "Permissionless" + name: "Enabled", }, { - "name": "Permission" - } - ] - } - }, - { - "name": "PairStatus", - "docs": [ - "Pair status. 0 = Enabled, 1 = Disabled. Putting 0 as enabled for backward compatibility." - ], - "type": { - "kind": "enum", - "variants": [ - { - "name": "Enabled" + name: "Disabled", }, - { - "name": "Disabled" - } - ] - } - } + ], + }, + }, ], - "events": [ + events: [ { - "name": "CompositionFee", - "fields": [ + name: "CompositionFee", + fields: [ { - "name": "from", - "type": "publicKey", - "index": false + name: "from", + type: "publicKey", + index: false, }, { - "name": "binId", - "type": "i16", - "index": false + name: "binId", + type: "i16", + index: false, }, { - "name": "tokenXFeeAmount", - "type": "u64", - "index": false + name: "tokenXFeeAmount", + type: "u64", + index: false, }, { - "name": "tokenYFeeAmount", - "type": "u64", - "index": false + name: "tokenYFeeAmount", + type: "u64", + index: false, }, { - "name": "protocolTokenXFeeAmount", - "type": "u64", - "index": false + name: "protocolTokenXFeeAmount", + type: "u64", + index: false, }, { - "name": "protocolTokenYFeeAmount", - "type": "u64", - "index": false - } - ] + name: "protocolTokenYFeeAmount", + type: "u64", + index: false, + }, + ], }, { - "name": "AddLiquidity", - "fields": [ + name: "AddLiquidity", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "from", - "type": "publicKey", - "index": false + name: "from", + type: "publicKey", + index: false, }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position", + type: "publicKey", + index: false, }, { - "name": "amounts", - "type": { - "array": [ - "u64", - 2 - ] + name: "amounts", + type: { + array: ["u64", 2], }, - "index": false + index: false, }, { - "name": "activeBinId", - "type": "i32", - "index": false - } - ] + name: "activeBinId", + type: "i32", + index: false, + }, + ], }, { - "name": "RemoveLiquidity", - "fields": [ + name: "RemoveLiquidity", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "from", - "type": "publicKey", - "index": false + name: "from", + type: "publicKey", + index: false, }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position", + type: "publicKey", + index: false, }, { - "name": "amounts", - "type": { - "array": [ - "u64", - 2 - ] + name: "amounts", + type: { + array: ["u64", 2], }, - "index": false + index: false, }, { - "name": "activeBinId", - "type": "i32", - "index": false - } - ] + name: "activeBinId", + type: "i32", + index: false, + }, + ], }, { - "name": "Swap", - "fields": [ + name: "Swap", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "from", - "type": "publicKey", - "index": false + name: "from", + type: "publicKey", + index: false, }, { - "name": "startBinId", - "type": "i32", - "index": false + name: "startBinId", + type: "i32", + index: false, }, { - "name": "endBinId", - "type": "i32", - "index": false + name: "endBinId", + type: "i32", + index: false, }, { - "name": "amountIn", - "type": "u64", - "index": false + name: "amountIn", + type: "u64", + index: false, }, { - "name": "amountOut", - "type": "u64", - "index": false + name: "amountOut", + type: "u64", + index: false, }, { - "name": "swapForY", - "type": "bool", - "index": false + name: "swapForY", + type: "bool", + index: false, }, { - "name": "fee", - "type": "u64", - "index": false + name: "fee", + type: "u64", + index: false, }, { - "name": "protocolFee", - "type": "u64", - "index": false + name: "protocolFee", + type: "u64", + index: false, }, { - "name": "feeBps", - "type": "u128", - "index": false + name: "feeBps", + type: "u128", + index: false, }, { - "name": "hostFee", - "type": "u64", - "index": false - } - ] + name: "hostFee", + type: "u64", + index: false, + }, + ], }, { - "name": "ClaimReward", - "fields": [ + name: "ClaimReward", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position", + type: "publicKey", + index: false, }, { - "name": "owner", - "type": "publicKey", - "index": false + name: "owner", + type: "publicKey", + index: false, }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex", + type: "u64", + index: false, }, { - "name": "totalReward", - "type": "u64", - "index": false - } - ] + name: "totalReward", + type: "u64", + index: false, + }, + ], }, { - "name": "FundReward", - "fields": [ + name: "FundReward", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "funder", - "type": "publicKey", - "index": false + name: "funder", + type: "publicKey", + index: false, }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex", + type: "u64", + index: false, }, { - "name": "amount", - "type": "u64", - "index": false - } - ] + name: "amount", + type: "u64", + index: false, + }, + ], }, { - "name": "InitializeReward", - "fields": [ + name: "InitializeReward", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "rewardMint", - "type": "publicKey", - "index": false + name: "rewardMint", + type: "publicKey", + index: false, }, { - "name": "funder", - "type": "publicKey", - "index": false + name: "funder", + type: "publicKey", + index: false, }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex", + type: "u64", + index: false, }, { - "name": "rewardDuration", - "type": "u64", - "index": false - } - ] + name: "rewardDuration", + type: "u64", + index: false, + }, + ], }, { - "name": "UpdateRewardDuration", - "fields": [ + name: "UpdateRewardDuration", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex", + type: "u64", + index: false, }, { - "name": "oldRewardDuration", - "type": "u64", - "index": false + name: "oldRewardDuration", + type: "u64", + index: false, }, { - "name": "newRewardDuration", - "type": "u64", - "index": false - } - ] + name: "newRewardDuration", + type: "u64", + index: false, + }, + ], }, { - "name": "UpdateRewardFunder", - "fields": [ + name: "UpdateRewardFunder", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "rewardIndex", - "type": "u64", - "index": false + name: "rewardIndex", + type: "u64", + index: false, }, { - "name": "oldFunder", - "type": "publicKey", - "index": false + name: "oldFunder", + type: "publicKey", + index: false, }, { - "name": "newFunder", - "type": "publicKey", - "index": false - } - ] + name: "newFunder", + type: "publicKey", + index: false, + }, + ], }, { - "name": "PositionClose", - "fields": [ + name: "PositionClose", + fields: [ { - "name": "position", - "type": "publicKey", - "index": false + name: "position", + type: "publicKey", + index: false, }, { - "name": "owner", - "type": "publicKey", - "index": false - } - ] + name: "owner", + type: "publicKey", + index: false, + }, + ], }, { - "name": "ClaimFee", - "fields": [ + name: "ClaimFee", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position", + type: "publicKey", + index: false, }, { - "name": "owner", - "type": "publicKey", - "index": false + name: "owner", + type: "publicKey", + index: false, }, { - "name": "feeX", - "type": "u64", - "index": false + name: "feeX", + type: "u64", + index: false, }, { - "name": "feeY", - "type": "u64", - "index": false - } - ] + name: "feeY", + type: "u64", + index: false, + }, + ], }, { - "name": "LbPairCreate", - "fields": [ + name: "LbPairCreate", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "binStep", - "type": "u16", - "index": false + name: "binStep", + type: "u16", + index: false, }, { - "name": "tokenX", - "type": "publicKey", - "index": false + name: "tokenX", + type: "publicKey", + index: false, }, { - "name": "tokenY", - "type": "publicKey", - "index": false - } - ] + name: "tokenY", + type: "publicKey", + index: false, + }, + ], }, { - "name": "PositionCreate", - "fields": [ + name: "PositionCreate", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "position", - "type": "publicKey", - "index": false + name: "position", + type: "publicKey", + index: false, }, { - "name": "owner", - "type": "publicKey", - "index": false - } - ] + name: "owner", + type: "publicKey", + index: false, + }, + ], }, { - "name": "FeeParameterUpdate", - "fields": [ + name: "FeeParameterUpdate", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "protocolShare", - "type": "u16", - "index": false + name: "protocolShare", + type: "u16", + index: false, }, { - "name": "baseFactor", - "type": "u16", - "index": false - } - ] + name: "baseFactor", + type: "u16", + index: false, + }, + ], }, { - "name": "IncreaseObservation", - "fields": [ + name: "IncreaseObservation", + fields: [ { - "name": "oracle", - "type": "publicKey", - "index": false + name: "oracle", + type: "publicKey", + index: false, }, { - "name": "newObservationLength", - "type": "u64", - "index": false - } - ] + name: "newObservationLength", + type: "u64", + index: false, + }, + ], }, { - "name": "WithdrawIneligibleReward", - "fields": [ + name: "WithdrawIneligibleReward", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "rewardMint", - "type": "publicKey", - "index": false + name: "rewardMint", + type: "publicKey", + index: false, }, { - "name": "amount", - "type": "u64", - "index": false - } - ] + name: "amount", + type: "u64", + index: false, + }, + ], }, { - "name": "UpdatePositionOperator", - "fields": [ + name: "UpdatePositionOperator", + fields: [ { - "name": "position", - "type": "publicKey", - "index": false + name: "position", + type: "publicKey", + index: false, }, { - "name": "oldOperator", - "type": "publicKey", - "index": false + name: "oldOperator", + type: "publicKey", + index: false, }, { - "name": "newOperator", - "type": "publicKey", - "index": false - } - ] + name: "newOperator", + type: "publicKey", + index: false, + }, + ], }, { "name": "UpdatePositionLockReleasePoint", "fields": [ { - "name": "position", - "type": "publicKey", - "index": false + name: "position", + type: "publicKey", + index: false, }, { "name": "currentPoint", @@ -9996,293 +9564,293 @@ export const IDL: LbClmm = { "index": false }, { - "name": "sender", - "type": "publicKey", - "index": false - } - ] + name: "sender", + type: "publicKey", + index: false, + }, + ], }, { - "name": "GoToABin", - "fields": [ + name: "GoToABin", + fields: [ { - "name": "lbPair", - "type": "publicKey", - "index": false + name: "lbPair", + type: "publicKey", + index: false, }, { - "name": "fromBinId", - "type": "i32", - "index": false + name: "fromBinId", + type: "i32", + index: false, }, { - "name": "toBinId", - "type": "i32", - "index": false - } - ] - } + name: "toBinId", + type: "i32", + index: false, + }, + ], + }, ], - "errors": [ + errors: [ { - "code": 6000, - "name": "InvalidStartBinIndex", - "msg": "Invalid start bin index" + code: 6000, + name: "InvalidStartBinIndex", + msg: "Invalid start bin index", }, { - "code": 6001, - "name": "InvalidBinId", - "msg": "Invalid bin id" + code: 6001, + name: "InvalidBinId", + msg: "Invalid bin id", }, { - "code": 6002, - "name": "InvalidInput", - "msg": "Invalid input data" + code: 6002, + name: "InvalidInput", + msg: "Invalid input data", }, { - "code": 6003, - "name": "ExceededAmountSlippageTolerance", - "msg": "Exceeded amount slippage tolerance" + code: 6003, + name: "ExceededAmountSlippageTolerance", + msg: "Exceeded amount slippage tolerance", }, { - "code": 6004, - "name": "ExceededBinSlippageTolerance", - "msg": "Exceeded bin slippage tolerance" + code: 6004, + name: "ExceededBinSlippageTolerance", + msg: "Exceeded bin slippage tolerance", }, { - "code": 6005, - "name": "CompositionFactorFlawed", - "msg": "Composition factor flawed" + code: 6005, + name: "CompositionFactorFlawed", + msg: "Composition factor flawed", }, { - "code": 6006, - "name": "NonPresetBinStep", - "msg": "Non preset bin step" + code: 6006, + name: "NonPresetBinStep", + msg: "Non preset bin step", }, { - "code": 6007, - "name": "ZeroLiquidity", - "msg": "Zero liquidity" + code: 6007, + name: "ZeroLiquidity", + msg: "Zero liquidity", }, { - "code": 6008, - "name": "InvalidPosition", - "msg": "Invalid position" + code: 6008, + name: "InvalidPosition", + msg: "Invalid position", }, { - "code": 6009, - "name": "BinArrayNotFound", - "msg": "Bin array not found" + code: 6009, + name: "BinArrayNotFound", + msg: "Bin array not found", }, { - "code": 6010, - "name": "InvalidTokenMint", - "msg": "Invalid token mint" + code: 6010, + name: "InvalidTokenMint", + msg: "Invalid token mint", }, { - "code": 6011, - "name": "InvalidAccountForSingleDeposit", - "msg": "Invalid account for single deposit" + code: 6011, + name: "InvalidAccountForSingleDeposit", + msg: "Invalid account for single deposit", }, { - "code": 6012, - "name": "PairInsufficientLiquidity", - "msg": "Pair insufficient liquidity" + code: 6012, + name: "PairInsufficientLiquidity", + msg: "Pair insufficient liquidity", }, { - "code": 6013, - "name": "InvalidFeeOwner", - "msg": "Invalid fee owner" + code: 6013, + name: "InvalidFeeOwner", + msg: "Invalid fee owner", }, { - "code": 6014, - "name": "InvalidFeeWithdrawAmount", - "msg": "Invalid fee withdraw amount" + code: 6014, + name: "InvalidFeeWithdrawAmount", + msg: "Invalid fee withdraw amount", }, { - "code": 6015, - "name": "InvalidAdmin", - "msg": "Invalid admin" + code: 6015, + name: "InvalidAdmin", + msg: "Invalid admin", }, { - "code": 6016, - "name": "IdenticalFeeOwner", - "msg": "Identical fee owner" + code: 6016, + name: "IdenticalFeeOwner", + msg: "Identical fee owner", }, { - "code": 6017, - "name": "InvalidBps", - "msg": "Invalid basis point" + code: 6017, + name: "InvalidBps", + msg: "Invalid basis point", }, { - "code": 6018, - "name": "MathOverflow", - "msg": "Math operation overflow" + code: 6018, + name: "MathOverflow", + msg: "Math operation overflow", }, { - "code": 6019, - "name": "TypeCastFailed", - "msg": "Type cast error" + code: 6019, + name: "TypeCastFailed", + msg: "Type cast error", }, { - "code": 6020, - "name": "InvalidRewardIndex", - "msg": "Invalid reward index" + code: 6020, + name: "InvalidRewardIndex", + msg: "Invalid reward index", }, { - "code": 6021, - "name": "InvalidRewardDuration", - "msg": "Invalid reward duration" + code: 6021, + name: "InvalidRewardDuration", + msg: "Invalid reward duration", }, { - "code": 6022, - "name": "RewardInitialized", - "msg": "Reward already initialized" + code: 6022, + name: "RewardInitialized", + msg: "Reward already initialized", }, { - "code": 6023, - "name": "RewardUninitialized", - "msg": "Reward not initialized" + code: 6023, + name: "RewardUninitialized", + msg: "Reward not initialized", }, { - "code": 6024, - "name": "IdenticalFunder", - "msg": "Identical funder" + code: 6024, + name: "IdenticalFunder", + msg: "Identical funder", }, { - "code": 6025, - "name": "RewardCampaignInProgress", - "msg": "Reward campaign in progress" + code: 6025, + name: "RewardCampaignInProgress", + msg: "Reward campaign in progress", }, { - "code": 6026, - "name": "IdenticalRewardDuration", - "msg": "Reward duration is the same" + code: 6026, + name: "IdenticalRewardDuration", + msg: "Reward duration is the same", }, { - "code": 6027, - "name": "InvalidBinArray", - "msg": "Invalid bin array" + code: 6027, + name: "InvalidBinArray", + msg: "Invalid bin array", }, { - "code": 6028, - "name": "NonContinuousBinArrays", - "msg": "Bin arrays must be continuous" + code: 6028, + name: "NonContinuousBinArrays", + msg: "Bin arrays must be continuous", }, { - "code": 6029, - "name": "InvalidRewardVault", - "msg": "Invalid reward vault" + code: 6029, + name: "InvalidRewardVault", + msg: "Invalid reward vault", }, { - "code": 6030, - "name": "NonEmptyPosition", - "msg": "Position is not empty" + code: 6030, + name: "NonEmptyPosition", + msg: "Position is not empty", }, { - "code": 6031, - "name": "UnauthorizedAccess", - "msg": "Unauthorized access" + code: 6031, + name: "UnauthorizedAccess", + msg: "Unauthorized access", }, { - "code": 6032, - "name": "InvalidFeeParameter", - "msg": "Invalid fee parameter" + code: 6032, + name: "InvalidFeeParameter", + msg: "Invalid fee parameter", }, { - "code": 6033, - "name": "MissingOracle", - "msg": "Missing oracle account" + code: 6033, + name: "MissingOracle", + msg: "Missing oracle account", }, { - "code": 6034, - "name": "InsufficientSample", - "msg": "Insufficient observation sample" + code: 6034, + name: "InsufficientSample", + msg: "Insufficient observation sample", }, { - "code": 6035, - "name": "InvalidLookupTimestamp", - "msg": "Invalid lookup timestamp" + code: 6035, + name: "InvalidLookupTimestamp", + msg: "Invalid lookup timestamp", }, { - "code": 6036, - "name": "BitmapExtensionAccountIsNotProvided", - "msg": "Bitmap extension account is not provided" + code: 6036, + name: "BitmapExtensionAccountIsNotProvided", + msg: "Bitmap extension account is not provided", }, { - "code": 6037, - "name": "CannotFindNonZeroLiquidityBinArrayId", - "msg": "Cannot find non-zero liquidity binArrayId" + code: 6037, + name: "CannotFindNonZeroLiquidityBinArrayId", + msg: "Cannot find non-zero liquidity binArrayId", }, { - "code": 6038, - "name": "BinIdOutOfBound", - "msg": "Bin id out of bound" + code: 6038, + name: "BinIdOutOfBound", + msg: "Bin id out of bound", }, { - "code": 6039, - "name": "InsufficientOutAmount", - "msg": "Insufficient amount in for minimum out" + code: 6039, + name: "InsufficientOutAmount", + msg: "Insufficient amount in for minimum out", }, { - "code": 6040, - "name": "InvalidPositionWidth", - "msg": "Invalid position width" + code: 6040, + name: "InvalidPositionWidth", + msg: "Invalid position width", }, { - "code": 6041, - "name": "ExcessiveFeeUpdate", - "msg": "Excessive fee update" + code: 6041, + name: "ExcessiveFeeUpdate", + msg: "Excessive fee update", }, { - "code": 6042, - "name": "PoolDisabled", - "msg": "Pool disabled" + code: 6042, + name: "PoolDisabled", + msg: "Pool disabled", }, { - "code": 6043, - "name": "InvalidPoolType", - "msg": "Invalid pool type" + code: 6043, + name: "InvalidPoolType", + msg: "Invalid pool type", }, { - "code": 6044, - "name": "ExceedMaxWhitelist", - "msg": "Whitelist for wallet is full" + code: 6044, + name: "ExceedMaxWhitelist", + msg: "Whitelist for wallet is full", }, { - "code": 6045, - "name": "InvalidIndex", - "msg": "Invalid index" + code: 6045, + name: "InvalidIndex", + msg: "Invalid index", }, { - "code": 6046, - "name": "RewardNotEnded", - "msg": "Reward not ended" + code: 6046, + name: "RewardNotEnded", + msg: "Reward not ended", }, { - "code": 6047, - "name": "MustWithdrawnIneligibleReward", - "msg": "Must withdraw ineligible reward" + code: 6047, + name: "MustWithdrawnIneligibleReward", + msg: "Must withdraw ineligible reward", }, { - "code": 6048, - "name": "UnauthorizedAddress", - "msg": "Unauthorized address" + code: 6048, + name: "UnauthorizedAddress", + msg: "Unauthorized address", }, { - "code": 6049, - "name": "OperatorsAreTheSame", - "msg": "Cannot update because operators are the same" + code: 6049, + name: "OperatorsAreTheSame", + msg: "Cannot update because operators are the same", }, { - "code": 6050, - "name": "WithdrawToWrongTokenAccount", - "msg": "Withdraw to wrong token account" + code: 6050, + name: "WithdrawToWrongTokenAccount", + msg: "Withdraw to wrong token account", }, { - "code": 6051, - "name": "WrongRentReceiver", - "msg": "Wrong rent receiver" + code: 6051, + name: "WrongRentReceiver", + msg: "Wrong rent receiver", }, { "code": 6052, diff --git a/ts-client/src/dlmm/index.ts b/ts-client/src/dlmm/index.ts index 969679d4..572ce67f 100644 --- a/ts-client/src/dlmm/index.ts +++ b/ts-client/src/dlmm/index.ts @@ -112,6 +112,7 @@ import { AccountLayout, MintLayout, NATIVE_MINT, + RawMint, TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, } from "@solana/spl-token"; @@ -307,24 +308,25 @@ export class DLMM { const reserveXBalance = AccountLayout.decode(reserveAccountsInfo[0].data); const reserveYBalance = AccountLayout.decode(reserveAccountsInfo[1].data); - const tokenXDecimal = MintLayout.decode( - reserveAccountsInfo[2].data - ).decimals; - const tokenYDecimal = MintLayout.decode( - reserveAccountsInfo[3].data - ).decimals; + const mintXAccountInfo = reserveAccountsInfo[2]; + const mintYAccountInfo = reserveAccountsInfo[3]; + const tokenXDecimal = MintLayout.decode(mintXAccountInfo.data).decimals; + const tokenYDecimal = MintLayout.decode(mintYAccountInfo.data).decimals; const tokenX = { publicKey: lbPairAccInfo.tokenXMint, reserve: lbPairAccInfo.reserveX, amount: reserveXBalance.amount, decimal: tokenXDecimal, + owner: mintXAccountInfo.owner, }; const tokenY = { publicKey: lbPairAccInfo.tokenYMint, reserve: lbPairAccInfo.reserveY, amount: reserveYBalance.amount, decimal: tokenYDecimal, + owner: mintYAccountInfo.owner, }; + return new DLMM( dlmm, program, @@ -478,12 +480,14 @@ export class DLMM { reserve: lbPairState.reserveX, amount: reserveXBalance.amount, decimal: tokenXDecimal, + owner: tokenXMintAccountInfo.owner, }; const tokenY = { publicKey: lbPairState.tokenYMint, reserve: lbPairState.reserveY, amount: reserveYBalance.amount, decimal: tokenYDecimal, + owner: tokenYMintAccountInfo.owner, }; return new DLMM( lbPair, @@ -734,13 +738,15 @@ export class DLMM { [...reservePublicKeys, ...reservePublicKeysV2] ); + type LbPairMintInfo = { mint: RawMint; owner: PublicKey }; + const lbPairReserveMap = new Map< string, { reserveX: bigint; reserveY: bigint } >(); const lbPairMintMap = new Map< string, - { mintXDecimal: number; mintYDecimal: number } + { mintX: LbPairMintInfo; mintY: LbPairMintInfo } >(); lbPairArray.forEach((lbPair, idx) => { const index = idx * 4; @@ -768,8 +774,8 @@ export class DLMM { const mintY = MintLayout.decode(mintYBuffer.data); lbPairMintMap.set(lbPair.toBase58(), { - mintXDecimal: mintX.decimals, - mintYDecimal: mintY.decimals, + mintX: { mint: mintX, owner: mintXBuffer.owner }, + mintY: { mint: mintY, owner: mintYBuffer.owner }, }); }); @@ -779,7 +785,7 @@ export class DLMM { >(); const lbPairMintMapV2 = new Map< string, - { mintXDecimal: number; mintYDecimal: number } + { mintX: LbPairMintInfo; mintY: LbPairMintInfo } >(); lbPairArrayV2.forEach((lbPair, idx) => { const index = idx * 4; @@ -809,9 +815,16 @@ export class DLMM { ); const mintX = MintLayout.decode(mintXBufferV2.data); const mintY = MintLayout.decode(mintYBufferV2.data); + lbPairMintMapV2.set(lbPair.toBase58(), { - mintXDecimal: mintX.decimals, - mintYDecimal: mintY.decimals, + mintX: { + mint: mintX, + owner: mintXBufferV2.owner, + }, + mintY: { + mint: mintY, + owner: mintYBufferV2.owner, + }, }); }); @@ -856,9 +869,7 @@ export class DLMM { upperBinArrayPubKey.toBase58() ); const lbPairAcc = lbPairArraysMap.get(lbPair.toBase58()); - const { mintXDecimal, mintYDecimal } = lbPairMintMap.get( - lbPair.toBase58() - ); + const { mintX, mintY } = lbPairMintMap.get(lbPair.toBase58()); const reserveXBalance = lbPairReserveMap.get(lbPair.toBase58())?.reserveX ?? BigInt(0); const reserveYBalance = @@ -867,13 +878,15 @@ export class DLMM { publicKey: lbPairAcc.tokenXMint, reserve: lbPairAcc.reserveX, amount: reserveXBalance, - decimal: mintXDecimal, + decimal: mintX.mint.decimals, + owner: mintX.owner, }; const tokenY = { publicKey: lbPairAcc.tokenYMint, reserve: lbPairAcc.reserveY, amount: reserveYBalance, - decimal: mintYDecimal, + decimal: mintY.mint.decimals, + owner: mintY.owner, }; const positionData = await DLMM.processPosition( program, @@ -881,8 +894,8 @@ export class DLMM { lbPairAcc, onChainTimestamp, account, - mintXDecimal, - mintYDecimal, + mintX.mint.decimals, + mintY.mint.decimals, lowerBinArray, upperBinArray, PublicKey.default @@ -930,10 +943,13 @@ export class DLMM { upperBinArrayPubKey.toBase58() ); const lbPairAcc = lbPairArraysMapV2.get(lbPair.toBase58()); - const [baseTokenDecimal, quoteTokenDecimal] = await Promise.all([ - getTokenDecimals(program.provider.connection, lbPairAcc.tokenXMint), - getTokenDecimals(program.provider.connection, lbPairAcc.tokenYMint), - ]); + const [baseMintAccountInfo, quoteMintAccountInfo] = + await program.provider.connection.getMultipleAccountsInfo([ + lbPairAcc.tokenXMint, + lbPairAcc.tokenYMint, + ]); + const baseMint = MintLayout.decode(baseMintAccountInfo.data); + const quoteMint = MintLayout.decode(quoteMintAccountInfo.data); const reserveXBalance = lbPairReserveMapV2.get(lbPair.toBase58())?.reserveX ?? BigInt(0); const reserveYBalance = @@ -942,13 +958,15 @@ export class DLMM { publicKey: lbPairAcc.tokenXMint, reserve: lbPairAcc.reserveX, amount: reserveXBalance, - decimal: baseTokenDecimal, + decimal: baseMint.decimals, + owner: baseMintAccountInfo.owner, }; const tokenY = { publicKey: lbPairAcc.tokenYMint, reserve: lbPairAcc.reserveY, amount: reserveYBalance, - decimal: quoteTokenDecimal, + decimal: quoteMint.decimals, + owner: quoteMintAccountInfo.owner, }; const positionData = await DLMM.processPosition( program, @@ -956,8 +974,8 @@ export class DLMM { lbPairAcc, onChainTimestamp, account, - baseTokenDecimal, - quoteTokenDecimal, + baseMint.decimals, + quoteMint.decimals, lowerBinArray, upperBinArray, feeOwner @@ -1276,12 +1294,14 @@ export class DLMM { decimal: tokenXDecimal, publicKey: lbPairState.tokenXMint, reserve: lbPairState.reserveX, + owner: this.tokenX.owner, }; this.tokenY = { amount: reserveYBalance.amount, decimal: tokenYDecimal, publicKey: lbPairState.tokenYMint, reserve: lbPairState.reserveY, + owner: this.tokenY.owner, }; this.lbPair = lbPairState; @@ -2884,7 +2904,7 @@ export class DLMM { if (shouldClaimAndClose) { const claimSwapFeeIx = await this.program.methods - .claimFee() + .claimFee2() .accounts({ binArrayLower, binArrayUpper, @@ -2893,7 +2913,8 @@ export class DLMM { position, reserveX, reserveY, - tokenProgram: TOKEN_PROGRAM_ID, + tokenProgramX: this.tokenX.owner, + tokenProgramY: this.tokenY.owner, tokenXMint: this.tokenX.publicKey, tokenYMint: this.tokenY.publicKey, userTokenX: feeOwnerTokenX, @@ -5583,7 +5604,7 @@ export class DLMM { } const claimFeeTx = await this.program.methods - .claimFee() + .claimFee2() .accounts({ binArrayLower, binArrayUpper, @@ -5592,7 +5613,8 @@ export class DLMM { position: position.publicKey, reserveX, reserveY, - tokenProgram: TOKEN_PROGRAM_ID, + tokenProgramX: this.tokenX.owner, + tokenProgramY: this.tokenY.owner, tokenXMint: this.tokenX.publicKey, tokenYMint: this.tokenY.publicKey, userTokenX, diff --git a/ts-client/src/dlmm/types/index.ts b/ts-client/src/dlmm/types/index.ts index 261dab1a..6d047762 100644 --- a/ts-client/src/dlmm/types/index.ts +++ b/ts-client/src/dlmm/types/index.ts @@ -27,6 +27,7 @@ export interface TokenReserve { reserve: PublicKey; amount: bigint; decimal: number; + owner: PublicKey; } export type ClmmProgram = Program; From 674e81603abd33ce65be0868eda80e00a4929d17 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Mon, 10 Jun 2024 22:45:07 +0800 Subject: [PATCH 04/13] fix: ts sdk switch to initialize_lb_pair2 --- ts-client/src/dlmm/index.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/ts-client/src/dlmm/index.ts b/ts-client/src/dlmm/index.ts index 572ce67f..e4b11111 100644 --- a/ts-client/src/dlmm/index.ts +++ b/ts-client/src/dlmm/index.ts @@ -105,6 +105,7 @@ import { swapExactOutQuoteAtBin, getPriceOfBinByBinId, computeFee, + deriveTokenBadge, } from "./helpers"; import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; import Decimal from "decimal.js"; @@ -1218,8 +1219,20 @@ export class DLMM { ? deriveBinArrayBitmapExtension(lbPair, program.programId)[0] : null; + const [tokenXBadge, tokenYBadge] = [tokenX, tokenY].map((token) => { + return deriveTokenBadge(token, program.programId)[0]; + }); + + const [mintXAccountInfo, mintYAccountInfo, mintXBadge, mintYBadge] = + await program.provider.connection.getMultipleAccountsInfo([ + tokenX, + tokenY, + tokenXBadge, + tokenYBadge, + ]); + return program.methods - .initializeLbPair(activeId.toNumber(), binStep.toNumber()) + .initializeLbPair2(activeId.toNumber(), binStep.toNumber()) .accounts({ funder, lbPair, @@ -1229,7 +1242,10 @@ export class DLMM { binArrayBitmapExtension, tokenMintX: tokenX, tokenMintY: tokenY, - tokenProgram: TOKEN_PROGRAM_ID, + tokenBadgeX: mintXBadge ? tokenXBadge : program.programId, + tokenBadgeY: mintYBadge ? tokenYBadge : program.programId, + tokenProgramX: mintXAccountInfo.owner, + tokenProgramY: mintYAccountInfo.owner, oracle, presetParameter, systemProgram: SystemProgram.programId, From ea41172a8909a46b57221e4643a2452d062b2bb5 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Mon, 10 Jun 2024 23:01:11 +0800 Subject: [PATCH 05/13] doc: update README --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index acc3dd22..693b1dae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -340,6 +340,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fix position liquidity withdraw to position owner, instead of customized fee owner +### Changed + +- Bump to anchor 0.29.0 + +## @meteora-ag/dlmm [1.0.45] - PR #83 ## @mercurial-finance/dynamic-amm-sdk [1.0.32] - PR #58 From 79cf53a2a5d1342faed0e8204e71f1e6c1eb17f8 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Tue, 11 Jun 2024 11:27:12 +0800 Subject: [PATCH 06/13] fix: swap, claim reward, add and remove liquidity read token mint owner --- ts-client/src/dlmm/index.ts | 150 ++++++++++++++++++++++++------ ts-client/src/dlmm/types/index.ts | 5 + 2 files changed, 125 insertions(+), 30 deletions(-) diff --git a/ts-client/src/dlmm/index.ts b/ts-client/src/dlmm/index.ts index e4b11111..4b4453cc 100644 --- a/ts-client/src/dlmm/index.ts +++ b/ts-client/src/dlmm/index.ts @@ -8,6 +8,7 @@ import { SYSVAR_RENT_PUBKEY, SystemProgram, SYSVAR_CLOCK_PUBKEY, + AccountInfo, } from "@solana/web3.js"; import { IDL } from "./idl"; import { @@ -71,6 +72,7 @@ import { ClockLayout, PairStatus, PairType, + RewardMintInfo, } from "./types"; import { AnchorProvider, BN, Program } from "@coral-xyz/anchor"; import { @@ -146,6 +148,7 @@ export class DLMM { public tokenX: TokenReserve, public tokenY: TokenReserve, public clock: Clock, + public rewardMintInfo: RewardMintInfo[], private opt?: Opt ) {} @@ -289,6 +292,9 @@ export class DLMM { const clockAccountInfoBuffer = accountsInfo[2]?.data; if (!clockAccountInfoBuffer) throw new Error(`Clock account not found`); const clock = ClockLayout.decode(clockAccountInfoBuffer) as Clock; + const rewardPubkeys = lbPairAccInfo.rewardInfos + .filter((info) => !info.mint.equals(PublicKey.default)) + .map((info) => info.mint); const reserveAccountsInfo = await chunkedGetMultipleAccountInfos( program.provider.connection, @@ -297,6 +303,7 @@ export class DLMM { lbPairAccInfo.reserveY, lbPairAccInfo.tokenXMint, lbPairAccInfo.tokenYMint, + ...rewardPubkeys, ] ); let binArrayBitmapExtension: BinArrayBitmapExtensionAccount | null; @@ -313,6 +320,25 @@ export class DLMM { const mintYAccountInfo = reserveAccountsInfo[3]; const tokenXDecimal = MintLayout.decode(mintXAccountInfo.data).decimals; const tokenYDecimal = MintLayout.decode(mintYAccountInfo.data).decimals; + + let rewardInfos: RewardMintInfo[] = []; + + const rewardMintAccountsInfo = reserveAccountsInfo.slice(4); + + for (const reward of lbPairAccInfo.rewardInfos) { + if (reward.mint.equals(PublicKey.default)) { + rewardInfos.push({ + publicKey: PublicKey.default, + owner: SystemProgram.programId, + }); + } else { + rewardInfos.push({ + publicKey: reward.mint, + owner: rewardMintAccountsInfo.shift().owner, + }); + } + } + const tokenX = { publicKey: lbPairAccInfo.tokenXMint, reserve: lbPairAccInfo.reserveX, @@ -320,6 +346,7 @@ export class DLMM { decimal: tokenXDecimal, owner: mintXAccountInfo.owner, }; + const tokenY = { publicKey: lbPairAccInfo.tokenYMint, reserve: lbPairAccInfo.reserveY, @@ -336,6 +363,7 @@ export class DLMM { tokenX, tokenY, clock, + rewardInfos, opt ); } @@ -433,6 +461,27 @@ export class DLMM { ...tokenMintPublicKeys, ]); + const rewardMintPublicKeys = Array.from(lbPairArraysMap.values()).flatMap( + ({ rewardInfos }) => { + return rewardInfos + .filter((reward) => !reward.mint.equals(PublicKey.default)) + .map((reward) => reward.mint); + } + ); + + const rewardMintAccountsInfo = await chunkedGetMultipleAccountInfos( + program.provider.connection, + rewardMintPublicKeys + ); + + const rewardMintAccountInfoMap = rewardMintPublicKeys.reduce( + (map, key, idx) => { + map.set(key, rewardMintAccountsInfo[idx]); + return map; + }, + new Map>() + ); + const lbClmmImpl = await Promise.all( dlmmList.map(async (lbPair, index) => { const lbPairState = lbPairArraysMap.get(lbPair.toBase58()); @@ -470,12 +519,14 @@ export class DLMM { const reserveXBalance = AccountLayout.decode(reserveXAccountInfo.data); const reserveYBalance = AccountLayout.decode(reserveYAccountInfo.data); + const tokenXDecimal = MintLayout.decode( tokenXMintAccountInfo.data ).decimals; const tokenYDecimal = MintLayout.decode( tokenYMintAccountInfo.data ).decimals; + const tokenX = { publicKey: lbPairState.tokenXMint, reserve: lbPairState.reserveX, @@ -483,6 +534,7 @@ export class DLMM { decimal: tokenXDecimal, owner: tokenXMintAccountInfo.owner, }; + const tokenY = { publicKey: lbPairState.tokenYMint, reserve: lbPairState.reserveY, @@ -490,6 +542,23 @@ export class DLMM { decimal: tokenYDecimal, owner: tokenYMintAccountInfo.owner, }; + + let rewardInfos: RewardMintInfo[] = []; + + for (const reward of lbPairState.rewardInfos) { + if (reward.mint.equals(PublicKey.default)) { + rewardInfos.push({ + publicKey: PublicKey.default, + owner: SystemProgram.programId, + }); + } else { + rewardInfos.push({ + publicKey: reward.mint, + owner: rewardMintAccountInfoMap.get(reward.mint).owner, + }); + } + } + return new DLMM( lbPair, program, @@ -498,6 +567,7 @@ export class DLMM { tokenX, tokenY, clock, + rewardInfos, opt ); }) @@ -2115,8 +2185,8 @@ export class DLMM { binArrayUpper, binArrayBitmapExtension, sender: user, - tokenXProgram: TOKEN_PROGRAM_ID, - tokenYProgram: TOKEN_PROGRAM_ID, + tokenXProgram: this.tokenX.owner, + tokenYProgram: this.tokenY.owner, }; const programMethod = @@ -2312,8 +2382,8 @@ export class DLMM { binArrayUpper, binArrayBitmapExtension, sender: user, - tokenXProgram: TOKEN_PROGRAM_ID, - tokenYProgram: TOKEN_PROGRAM_ID, + tokenXProgram: this.tokenX.owner, + tokenYProgram: this.tokenY.owner, }; const oneSideLiquidityParams: LiquidityOneSideParameter = { @@ -2323,6 +2393,20 @@ export class DLMM { binLiquidityDist, }; + const [reserve, tokenMint, tokenProgram, userToken] = totalXAmount.isZero() + ? [ + this.lbPair.reserveY, + this.lbPair.tokenYMint, + this.tokenY.owner, + userTokenY, + ] + : [ + this.lbPair.reserveX, + this.lbPair.tokenXMint, + this.tokenX.owner, + userTokenX, + ]; + const oneSideAddLiquidityAccounts = { binArrayLower, binArrayUpper, @@ -2330,14 +2414,10 @@ export class DLMM { binArrayBitmapExtension: null, sender: user, position: positionPubKey, - reserve: totalXAmount.isZero() - ? this.lbPair.reserveY - : this.lbPair.reserveX, - tokenMint: totalXAmount.isZero() - ? this.lbPair.tokenYMint - : this.lbPair.tokenXMint, - tokenProgram: TOKEN_PROGRAM_ID, - userToken: totalXAmount.isZero() ? userTokenY : userTokenX, + reserve, + tokenMint, + tokenProgram, + userToken, }; const isOneSideDeposit = totalXAmount.isZero() || totalYAmount.isZero(); @@ -2542,8 +2622,8 @@ export class DLMM { binArrayUpper, binArrayBitmapExtension, sender: user, - tokenXProgram: TOKEN_PROGRAM_ID, - tokenYProgram: TOKEN_PROGRAM_ID, + tokenXProgram: this.tokenX.owner, + tokenYProgram: this.tokenY.owner, }; const programMethod = @@ -2736,8 +2816,8 @@ export class DLMM { binArrayUpper, binArrayBitmapExtension, sender: user, - tokenXProgram: TOKEN_PROGRAM_ID, - tokenYProgram: TOKEN_PROGRAM_ID, + tokenXProgram: this.tokenX.owner, + tokenYProgram: this.tokenY.owner, }; const oneSideLiquidityParams: LiquidityOneSideParameter = { @@ -2747,6 +2827,20 @@ export class DLMM { binLiquidityDist, }; + const [reserve, tokenMint, tokenProgram, userToken] = totalXAmount.isZero() + ? [ + this.lbPair.reserveY, + this.lbPair.tokenYMint, + this.tokenY.owner, + userTokenY, + ] + : [ + this.lbPair.reserveX, + this.lbPair.tokenXMint, + this.tokenX.owner, + userTokenX, + ]; + const oneSideAddLiquidityAccounts = { binArrayLower, binArrayUpper, @@ -2754,14 +2848,10 @@ export class DLMM { binArrayBitmapExtension: null, sender: user, position: positionPubKey, - reserve: totalXAmount.isZero() - ? this.lbPair.reserveY - : this.lbPair.reserveX, - tokenMint: totalXAmount.isZero() - ? this.lbPair.tokenYMint - : this.lbPair.tokenXMint, - tokenProgram: TOKEN_PROGRAM_ID, - userToken: totalXAmount.isZero() ? userTokenY : userTokenX, + reserve, + tokenMint, + tokenProgram, + userToken, }; const isOneSideDeposit = totalXAmount.isZero() || totalYAmount.isZero(); @@ -2960,7 +3050,7 @@ export class DLMM { binArrayUpper, rewardVault: rewardInfo.vault, rewardMint: rewardInfo.mint, - tokenProgram: TOKEN_PROGRAM_ID, + tokenProgram: this.rewardMintInfo[i].owner, userTokenAccount: ataPubKey, }) .instruction(); @@ -3023,8 +3113,8 @@ export class DLMM { binArrayLower, binArrayUpper, binArrayBitmapExtension, - tokenXProgram: TOKEN_PROGRAM_ID, - tokenYProgram: TOKEN_PROGRAM_ID, + tokenXProgram: this.tokenX.owner, + tokenYProgram: this.tokenY.owner, sender: user, }) .preInstructions(preInstructions) @@ -3679,8 +3769,8 @@ export class DLMM { reserveY, tokenXMint, tokenYMint, - tokenXProgram: TOKEN_PROGRAM_ID, // dont use 2022 first; lack familiarity - tokenYProgram: TOKEN_PROGRAM_ID, // dont use 2022 first; lack familiarity + tokenXProgram: this.tokenX.owner, + tokenYProgram: this.tokenY.owner, user, userTokenIn, userTokenOut, @@ -5534,7 +5624,7 @@ export class DLMM { binArrayUpper, rewardVault: rewardInfo.vault, rewardMint: rewardInfo.mint, - tokenProgram: TOKEN_PROGRAM_ID, + tokenProgram: this.rewardMintInfo[i].owner, userTokenAccount: ataPubKey, }) .preInstructions(shouldIncludePreIx ? preInstructions : []) diff --git a/ts-client/src/dlmm/types/index.ts b/ts-client/src/dlmm/types/index.ts index 6d047762..0024b732 100644 --- a/ts-client/src/dlmm/types/index.ts +++ b/ts-client/src/dlmm/types/index.ts @@ -30,6 +30,11 @@ export interface TokenReserve { owner: PublicKey; } +export interface RewardMintInfo { + publicKey: PublicKey; + owner: PublicKey; +} + export type ClmmProgram = Program; export type LbPair = IdlAccounts["lbPair"]; From 8b705ba9565a719ced13116cab929a77d737116e Mon Sep 17 00:00:00 2001 From: codewithgun Date: Tue, 11 Jun 2024 12:06:41 +0800 Subject: [PATCH 07/13] fix: cli support token 2022 --- cli/src/instructions/add_liquidity.rs | 20 +++++++-- cli/src/instructions/claim_fee.rs | 20 ++++++++- cli/src/instructions/claim_reward.rs | 15 +++++-- cli/src/instructions/fund_reward.rs | 15 +++++-- cli/src/instructions/initialize_lb_pair.rs | 41 ++++++++++++++++++- cli/src/instructions/remove_liquidity.rs | 15 +++++++ .../remove_liquidity_by_price_range.rs | 16 +++++++- cli/src/instructions/seed_liquidity.rs | 15 +++++++ cli/src/instructions/simulate_swap_demand.rs | 16 ++++++++ cli/src/instructions/utils.rs | 4 +- cli/src/instructions/withdraw_protocol_fee.rs | 17 +++++++- 11 files changed, 176 insertions(+), 18 deletions(-) diff --git a/cli/src/instructions/add_liquidity.rs b/cli/src/instructions/add_liquidity.rs index 6174a09e..75b64d16 100644 --- a/cli/src/instructions/add_liquidity.rs +++ b/cli/src/instructions/add_liquidity.rs @@ -38,6 +38,19 @@ pub async fn add_liquidity + Clone>( let lb_pair_state: LbPair = program.account(lb_pair).await?; + let token_programs = program + .async_rpc() + .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) + .await? + .into_iter() + .map(|account| Some(account?.owner)) + .collect::>>() + .context("Missing token mint account")?; + + let [token_x_program, token_y_program] = token_programs.as_slice() else { + bail!("Missing token program accounts"); + }; + let bin_liquidity_distribution = bin_liquidity_distribution .into_iter() .map(|(bin_id, dist_x, dist_y)| BinLiquidityDistribution { @@ -54,6 +67,7 @@ pub async fn add_liquidity + Clone>( transaction_config, lb_pair_state.token_x_mint, program.payer(), + *token_x_program, ) .await?; @@ -62,6 +76,7 @@ pub async fn add_liquidity + Clone>( transaction_config, lb_pair_state.token_y_mint, program.payer(), + *token_y_program, ) .await?; @@ -92,9 +107,8 @@ pub async fn add_liquidity + Clone>( sender: program.payer(), user_token_x, user_token_y, - // TODO: token 2022 - token_x_program: anchor_spl::token::ID, - token_y_program: anchor_spl::token::ID, + token_x_program: *token_x_program, + token_y_program: *token_y_program, event_authority, program: lb_clmm::ID, }; diff --git a/cli/src/instructions/claim_fee.rs b/cli/src/instructions/claim_fee.rs index 8f68cffd..dbbe31a3 100644 --- a/cli/src/instructions/claim_fee.rs +++ b/cli/src/instructions/claim_fee.rs @@ -18,11 +18,25 @@ pub async fn claim_fee + Clone>( let position_state: Position = program.account(position).await?; let lb_pair_state: LbPair = program.account(position_state.lb_pair).await?; + let token_programs = program + .async_rpc() + .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) + .await? + .into_iter() + .map(|account| Some(account?.owner)) + .collect::>>() + .context("Missing token mint account")?; + + let [token_x_program, token_y_program] = token_programs.as_slice() else { + bail!("Missing token program accounts"); + }; + let user_token_x = get_or_create_ata( program, transaction_config, lb_pair_state.token_x_mint, program.payer(), + *token_x_program, ) .await?; let user_token_y = get_or_create_ata( @@ -30,6 +44,7 @@ pub async fn claim_fee + Clone>( transaction_config, lb_pair_state.token_y_mint, program.payer(), + *token_y_program, ) .await?; @@ -37,7 +52,7 @@ pub async fn claim_fee + Clone>( let (event_authority, _bump) = derive_event_authority_pda(); - let accounts = accounts::ClaimFee { + let accounts = accounts::ClaimFee2 { bin_array_lower, bin_array_upper, lb_pair: position_state.lb_pair, @@ -45,13 +60,14 @@ pub async fn claim_fee + Clone>( position, reserve_x: lb_pair_state.reserve_x, reserve_y: lb_pair_state.reserve_y, - token_program: anchor_spl::token::ID, token_x_mint: lb_pair_state.token_x_mint, token_y_mint: lb_pair_state.token_y_mint, user_token_x, user_token_y, event_authority, program: lb_clmm::ID, + token_program_x: *token_x_program, + token_program_y: *token_y_program, }; let ix = instruction::ClaimFee {}; diff --git a/cli/src/instructions/claim_reward.rs b/cli/src/instructions/claim_reward.rs index 6bf38958..710cf8ef 100644 --- a/cli/src/instructions/claim_reward.rs +++ b/cli/src/instructions/claim_reward.rs @@ -28,11 +28,20 @@ pub async fn claim_reward + Clone>( let (reward_vault, _bump) = derive_reward_vault_pda(lb_pair, reward_index); let lb_pair_state: LbPair = program.account(lb_pair).await?; + let reward_info = lb_pair_state.reward_infos[reward_index as usize]; let reward_mint = reward_info.mint; - let user_token_account = - get_or_create_ata(program, transaction_config, reward_mint, program.payer()).await?; + let token_program = program.async_rpc().get_account(&reward_mint).await?.owner; + + let user_token_account = get_or_create_ata( + program, + transaction_config, + reward_mint, + program.payer(), + token_program, + ) + .await?; let [bin_array_lower, bin_array_upper] = get_bin_arrays_for_position(program, position).await?; @@ -44,7 +53,7 @@ pub async fn claim_reward + Clone>( lb_pair, reward_vault, reward_mint, - token_program: anchor_spl::token::ID, + token_program, position, user_token_account, sender: program.payer(), diff --git a/cli/src/instructions/fund_reward.rs b/cli/src/instructions/fund_reward.rs index 11aec20f..5635cf0e 100644 --- a/cli/src/instructions/fund_reward.rs +++ b/cli/src/instructions/fund_reward.rs @@ -32,11 +32,20 @@ pub async fn fund_reward + Clone>( &lb_clmm::ID, ); let lb_pair_state: LbPair = program.account(lb_pair).await?; + let reward_info = lb_pair_state.reward_infos[reward_index as usize]; let reward_mint = reward_info.mint; - let funder_token_account = - get_or_create_ata(program, transaction_config, reward_mint, program.payer()).await?; + let token_program = program.async_rpc().get_account(&reward_mint).await?.owner; + + let funder_token_account = get_or_create_ata( + program, + transaction_config, + reward_mint, + program.payer(), + reward_mint, + ) + .await?; let active_bin_array_idx = BinArray::bin_id_to_bin_array_index(lb_pair_state.active_id)?; let (bin_array, _bump) = derive_bin_array_pda(lb_pair, active_bin_array_idx as i64); @@ -50,7 +59,7 @@ pub async fn fund_reward + Clone>( funder: program.payer(), funder_token_account, bin_array, - token_program: anchor_spl::token::ID, + token_program, event_authority, program: lb_clmm::ID, }; diff --git a/cli/src/instructions/initialize_lb_pair.rs b/cli/src/instructions/initialize_lb_pair.rs index 0b1b61c0..bdf65f72 100644 --- a/cli/src/instructions/initialize_lb_pair.rs +++ b/cli/src/instructions/initialize_lb_pair.rs @@ -35,6 +35,40 @@ pub async fn initialize_lb_pair + Clone>( let token_mint_base: Mint = program.account(token_mint_x).await?; let token_mint_quote: Mint = program.account(token_mint_y).await?; + let token_programs = program + .async_rpc() + .get_multiple_accounts(&[token_mint_x, token_mint_y]) + .await? + .into_iter() + .map(|account| Some(account?.owner)) + .collect::>>() + .context("Missing token mint account")?; + + let [token_x_program, token_y_program] = token_programs.as_slice() else { + bail!("Missing token program accounts"); + }; + + let token_badge_keys = [token_mint_x, token_mint_y] + .into_iter() + .map(|key| derive_token_badge_pda(key).0) + .collect::>(); + + let token_badge_accounts = program + .async_rpc() + .get_multiple_accounts(&token_badge_keys) + .await?; + + let token_badges = token_badge_accounts + .into_iter() + .zip(token_badge_keys) + .into_iter() + .map(|(account, key)| Some(account.map_or(lb_clmm::ID, |_| key))) + .collect::>(); + + let [token_x_badge, token_y_badge] = token_badges.as_slice() else { + bail!("Invalid derived token badge"); + }; + let price_per_lamport = price_per_token_to_per_lamport( initial_price, token_mint_base.decimals, @@ -65,7 +99,7 @@ pub async fn initialize_lb_pair + Clone>( let (event_authority, _bump) = derive_event_authority_pda(); - let accounts = accounts::InitializeLbPair { + let accounts = accounts::InitializeLbPair2 { lb_pair, bin_array_bitmap_extension: None, reserve_x, @@ -77,7 +111,10 @@ pub async fn initialize_lb_pair + Clone>( preset_parameter, rent: anchor_client::solana_sdk::sysvar::rent::ID, system_program: anchor_client::solana_sdk::system_program::ID, - token_program: anchor_spl::token::ID, + token_program_x: *token_x_program, + token_program_y: *token_y_program, + token_badge_x: *token_x_badge, + token_badge_y: *token_y_badge, event_authority, program: lb_clmm::ID, }; diff --git a/cli/src/instructions/remove_liquidity.rs b/cli/src/instructions/remove_liquidity.rs index 795ab347..93285c46 100644 --- a/cli/src/instructions/remove_liquidity.rs +++ b/cli/src/instructions/remove_liquidity.rs @@ -34,6 +34,19 @@ pub async fn remove_liquidity + Clone>( let lb_pair_state: LbPair = program.account(lb_pair).await?; + let token_programs = program + .async_rpc() + .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) + .await? + .into_iter() + .map(|account| Some(account?.owner)) + .collect::>>() + .context("Missing token mint account")?; + + let [token_x_program, token_y_program] = token_programs.as_slice() else { + bail!("Missing token program accounts"); + }; + let [bin_array_lower, bin_array_upper] = get_bin_arrays_for_position(program, position).await?; let user_token_x = get_or_create_ata( @@ -41,6 +54,7 @@ pub async fn remove_liquidity + Clone>( transaction_config, lb_pair_state.token_x_mint, program.payer(), + *token_x_program, ) .await?; @@ -49,6 +63,7 @@ pub async fn remove_liquidity + Clone>( transaction_config, lb_pair_state.token_y_mint, program.payer(), + *token_y_program, ) .await?; diff --git a/cli/src/instructions/remove_liquidity_by_price_range.rs b/cli/src/instructions/remove_liquidity_by_price_range.rs index 22a966f0..34e5eb21 100644 --- a/cli/src/instructions/remove_liquidity_by_price_range.rs +++ b/cli/src/instructions/remove_liquidity_by_price_range.rs @@ -45,6 +45,19 @@ pub async fn remove_liquidity_by_price_range + Cl let token_mint_base: Mint = program.account(lb_pair_state.token_x_mint).await?; let token_mint_quote: Mint = program.account(lb_pair_state.token_y_mint).await?; + let token_programs = program + .async_rpc() + .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) + .await? + .into_iter() + .map(|account| Some(account?.owner)) + .collect::>>() + .context("Missing token mint account")?; + + let [token_x_program, token_y_program] = token_programs.as_slice() else { + bail!("Missing token program accounts"); + }; + let min_price_per_lamport = price_per_token_to_per_lamport( min_price, token_mint_base.decimals, @@ -65,7 +78,6 @@ pub async fn remove_liquidity_by_price_range + Cl assert!(min_active_id < max_active_id); - println!("go here"); let width = MAX_BIN_PER_POSITION as i32; for i in min_active_id..=max_active_id { let (position, _bump) = derive_position_pda(lb_pair, base_position_key, i, width); @@ -92,6 +104,7 @@ pub async fn remove_liquidity_by_price_range + Cl transaction_config, lb_pair_state.token_x_mint, program.payer(), + *token_x_program, ) .await?; @@ -100,6 +113,7 @@ pub async fn remove_liquidity_by_price_range + Cl transaction_config, lb_pair_state.token_y_mint, program.payer(), + *token_y_program, ) .await?; let (event_authority, _bump) = derive_event_authority_pda(); diff --git a/cli/src/instructions/seed_liquidity.rs b/cli/src/instructions/seed_liquidity.rs index 087f8e94..214d6f04 100644 --- a/cli/src/instructions/seed_liquidity.rs +++ b/cli/src/instructions/seed_liquidity.rs @@ -49,6 +49,19 @@ pub async fn seed_liquidity + Clone>( let lb_pair_state: LbPair = program.account(lb_pair).await?; let bin_step = lb_pair_state.bin_step; + let token_programs = program + .async_rpc() + .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) + .await? + .into_iter() + .map(|account| Some(account?.owner)) + .collect::>>() + .context("Missing token mint account")?; + + let [token_x_program, token_y_program] = token_programs.as_slice() else { + bail!("Missing token program accounts"); + }; + let token_mint_base: Mint = program.account(lb_pair_state.token_x_mint).await?; let token_mint_quote: Mint = program.account(lb_pair_state.token_y_mint).await?; @@ -94,6 +107,7 @@ pub async fn seed_liquidity + Clone>( transaction_config, lb_pair_state.token_x_mint, program.payer(), + *token_x_program, ) .await?; @@ -102,6 +116,7 @@ pub async fn seed_liquidity + Clone>( transaction_config, lb_pair_state.token_y_mint, program.payer(), + *token_y_program, ) .await?; diff --git a/cli/src/instructions/simulate_swap_demand.rs b/cli/src/instructions/simulate_swap_demand.rs index c389de13..2b458607 100644 --- a/cli/src/instructions/simulate_swap_demand.rs +++ b/cli/src/instructions/simulate_swap_demand.rs @@ -30,6 +30,20 @@ pub async fn simulate_swap_demand + Clone>( } = params; let lb_pair_state: LbPair = program.account(lb_pair).await?; + + let token_programs = program + .async_rpc() + .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) + .await? + .into_iter() + .map(|account| Some(account?.owner)) + .collect::>>() + .context("Missing token mint account")?; + + let [token_x_program, token_y_program] = token_programs.as_slice() else { + bail!("Missing token program accounts"); + }; + let token_mint_base: Mint = program.account(lb_pair_state.token_x_mint).await?; let token_mint_quote: Mint = program.account(lb_pair_state.token_y_mint).await?; @@ -38,6 +52,7 @@ pub async fn simulate_swap_demand + Clone>( transaction_config, lb_pair_state.token_x_mint, program.payer(), + *token_x_program, ) .await?; get_or_create_ata( @@ -45,6 +60,7 @@ pub async fn simulate_swap_demand + Clone>( transaction_config, lb_pair_state.token_y_mint, program.payer(), + *token_y_program, ) .await?; diff --git a/cli/src/instructions/utils.rs b/cli/src/instructions/utils.rs index 96d64841..5d5af928 100644 --- a/cli/src/instructions/utils.rs +++ b/cli/src/instructions/utils.rs @@ -9,7 +9,6 @@ use std::ops::Deref; use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; use anchor_client::solana_sdk::pubkey::Pubkey; use anchor_spl::associated_token::get_associated_token_address; -use anchor_spl::token::spl_token; use anyhow::*; pub async fn get_or_create_ata + Clone>( @@ -17,6 +16,7 @@ pub async fn get_or_create_ata + Clone>( transaction_config: RpcSendTransactionConfig, token_mint: Pubkey, wallet_address: Pubkey, + token_program: Pubkey, ) -> Result { let user_ata = get_associated_token_address(&wallet_address, &token_mint); @@ -32,7 +32,7 @@ pub async fn get_or_create_ata + Clone>( &program.payer(), &wallet_address, &token_mint, - &spl_token::ID, + &token_program, )); builder diff --git a/cli/src/instructions/withdraw_protocol_fee.rs b/cli/src/instructions/withdraw_protocol_fee.rs index 8d43a87c..4cbe6e71 100644 --- a/cli/src/instructions/withdraw_protocol_fee.rs +++ b/cli/src/instructions/withdraw_protocol_fee.rs @@ -32,6 +32,19 @@ pub async fn withdraw_protocol_fee + Clone>( let lb_pair_state: LbPair = program.account(lb_pair).await?; + let token_programs = program + .async_rpc() + .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) + .await? + .into_iter() + .map(|account| Some(account?.owner)) + .collect::>>() + .context("Missing token mint account")?; + + let [token_x_program, token_y_program] = token_programs.as_slice() else { + bail!("Missing token program accounts"); + }; + let receiver_token_x = get_associated_token_address(&program.payer(), &lb_pair_state.token_x_mint); @@ -44,8 +57,8 @@ pub async fn withdraw_protocol_fee + Clone>( reserve_y: lb_pair_state.reserve_y, token_x_mint: lb_pair_state.token_x_mint, token_y_mint: lb_pair_state.token_y_mint, - token_x_program: anchor_spl::token::ID, - token_y_program: anchor_spl::token::ID, + token_x_program: *token_x_program, + token_y_program: *token_y_program, fee_owner: program.payer(), receiver_token_x, receiver_token_y, From 690e87128222b80707b8d1de68845ad3de82de70 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Tue, 11 Jun 2024 13:48:49 +0800 Subject: [PATCH 08/13] fix: market make support token 2022 --- market_making/src/core.rs | 36 +++++++++++++++++++++++------------- market_making/src/state.rs | 8 ++++---- market_making/src/utils.rs | 4 ++-- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/market_making/src/core.rs b/market_making/src/core.rs index e71fb8cf..2bcd0464 100644 --- a/market_making/src/core.rs +++ b/market_making/src/core.rs @@ -21,7 +21,6 @@ use anchor_lang::AccountDeserialize; use anchor_lang::InstructionData; use anchor_lang::ToAccountMetas; use anchor_spl::associated_token::get_associated_token_address; -use anchor_spl::token::spl_token; use anchor_spl::token::Mint; use anchor_spl::token::TokenAccount; use anyhow::Ok; @@ -140,10 +139,10 @@ impl Core { let accounts = program.rpc().get_multiple_accounts(&token_mints)?; let mut tokens = HashMap::new(); - for (i, &token_pk) in token_mints.iter().enumerate() { - let account = - Mint::try_deserialize(&mut accounts[i].clone().unwrap().data.as_ref()).unwrap(); - tokens.insert(token_pk, account); + for (token_pk, account) in token_mints.into_iter().zip(accounts.into_iter()) { + let account = account.unwrap(); + let mint = Mint::try_deserialize(&mut account.data.as_ref()).unwrap(); + tokens.insert(token_pk, (mint, account.owner)); } let mut state = self.state.lock().unwrap(); state.tokens = tokens; @@ -171,15 +170,25 @@ impl Core { pub async fn init_user_ata(&self) -> Result<()> { let payer = read_keypair_file(self.wallet.clone().unwrap()) .map_err(|_| Error::msg("Requires a keypair file"))?; - let program: Program> = create_program( - self.provider.to_string(), - self.provider.to_string(), - spl_token::ID, - Arc::new(Keypair::new()), - )?; + + let mints = { + let state = self.state.lock().unwrap(); + state.tokens.clone() + }; + let token_mints = self.get_all_token_mints(); + for &token_mint_pk in token_mints.iter() { - get_or_create_ata(&program, token_mint_pk, payer.pubkey(), &payer).await?; + if let Some(&(_, program_id)) = mints.get(&token_mint_pk) { + let program: Program> = create_program( + self.provider.to_string(), + self.provider.to_string(), + program_id, + Arc::new(Keypair::new()), + )?; + get_or_create_ata(&program, token_mint_pk, payer.pubkey(), &payer, program_id) + .await?; + } } Ok(()) } @@ -635,10 +644,11 @@ impl Core { positions } - pub fn get_all_tokens(&self) -> HashMap { + pub fn get_all_tokens(&self) -> HashMap { let state = self.state.lock().unwrap(); state.tokens.clone() } + pub async fn check_shift_price_range(&self) -> Result<()> { let all_positions = self.get_all_positions(); for position in all_positions.iter() { diff --git a/market_making/src/state.rs b/market_making/src/state.rs index 5fc4c76d..fb570282 100644 --- a/market_making/src/state.rs +++ b/market_making/src/state.rs @@ -19,7 +19,7 @@ use std::str::FromStr; pub struct AllPosition { pub all_positions: HashMap, // hashmap of pool pubkey and a position - pub tokens: HashMap, // cached token info + pub tokens: HashMap, // cached token info } impl AllPosition { @@ -235,7 +235,7 @@ impl SinglePosition { } } -pub fn get_decimals(token_mint_pk: Pubkey, all_tokens: &HashMap) -> u8 { - let token = all_tokens.get(&token_mint_pk).unwrap(); - return token.decimals; +pub fn get_decimals(token_mint_pk: Pubkey, all_tokens: &HashMap) -> u8 { + let (mint, _) = all_tokens.get(&token_mint_pk).unwrap(); + mint.decimals } diff --git a/market_making/src/utils.rs b/market_making/src/utils.rs index 6267822a..7d74ab45 100644 --- a/market_making/src/utils.rs +++ b/market_making/src/utils.rs @@ -14,7 +14,6 @@ use anchor_client::{ use anchor_lang::event::EVENT_IX_TAG_LE; use anchor_lang::{AnchorDeserialize, AnchorSerialize, Discriminator}; use anchor_spl::associated_token::get_associated_token_address; -use anchor_spl::token::spl_token; use anyhow::*; use lb_clmm::events::Swap as SwapEvent; use solana_transaction_status::option_serializer::OptionSerializer; @@ -50,6 +49,7 @@ pub async fn get_or_create_ata + Clone>( token_mint: Pubkey, wallet_address: Pubkey, payer: &Keypair, + program_id: Pubkey, ) -> Result { let user_ata = get_associated_token_address(&wallet_address, &token_mint); @@ -65,7 +65,7 @@ pub async fn get_or_create_ata + Clone>( &payer.pubkey(), &wallet_address, &token_mint, - &spl_token::ID, + &program_id, )); let signature = send_tx(vec![payer], payer.pubkey(), program, &builder)?; From 09c72b6d822b3e98df61f87fec3f55b9e499f9a7 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Tue, 11 Jun 2024 14:23:32 +0800 Subject: [PATCH 09/13] feat: initialize permission lb pair support token2022 --- .../initialize_permission_lb_pair.rs | 10 ++++- ts-client/src/dlmm/idl.ts | 38 ++++++++++++++++++- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/programs/lb_clmm/src/instructions/initialize_permission_lb_pair.rs b/programs/lb_clmm/src/instructions/initialize_permission_lb_pair.rs index 984550ff..2cf57b84 100644 --- a/programs/lb_clmm/src/instructions/initialize_permission_lb_pair.rs +++ b/programs/lb_clmm/src/instructions/initialize_permission_lb_pair.rs @@ -7,6 +7,7 @@ use crate::state::lb_pair::LbPair; use crate::state::lb_pair::PairType; use crate::state::oracle::Oracle; use crate::state::preset_parameters::PresetParameter; +use crate::state::token_badge::TokenBadge; use crate::utils::seeds::BIN_ARRAY_BITMAP_SEED; use crate::utils::seeds::ORACLE; use anchor_lang::prelude::*; @@ -70,6 +71,7 @@ pub struct InitializePermissionLbPair<'info> { payer = admin, token::mint = token_mint_x, token::authority = lb_pair, + token::token_program = token_program_x, )] pub reserve_x: Box>, #[account( @@ -82,6 +84,7 @@ pub struct InitializePermissionLbPair<'info> { payer = admin, token::mint = token_mint_y, token::authority = lb_pair, + token::token_program = token_program_y, )] pub reserve_y: Box>, @@ -103,7 +106,12 @@ pub struct InitializePermissionLbPair<'info> { )] pub admin: Signer<'info>, - pub token_program: Interface<'info, TokenInterface>, + pub token_badge_x: Option>, + pub token_badge_y: Option>, + + pub token_program_x: Interface<'info, TokenInterface>, + pub token_program_y: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, pub rent: Sysvar<'info, Rent>, } diff --git a/ts-client/src/dlmm/idl.ts b/ts-client/src/dlmm/idl.ts index 266cbae6..0321c18f 100644 --- a/ts-client/src/dlmm/idl.ts +++ b/ts-client/src/dlmm/idl.ts @@ -250,7 +250,24 @@ export type LbClmm = { isSigner: true; }, { - name: "tokenProgram"; + name: "tokenBadgeX"; + isMut: false; + isSigner: false; + isOptional: true; + }, + { + name: "tokenBadgeY"; + isMut: false; + isSigner: false; + isOptional: true; + }, + { + name: "tokenProgramX"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgramY"; isMut: false; isSigner: false; }, @@ -5153,7 +5170,24 @@ export const IDL: LbClmm = { isSigner: true, }, { - name: "tokenProgram", + name: "tokenBadgeX", + isMut: false, + isSigner: false, + isOptional: true, + }, + { + name: "tokenBadgeY", + isMut: false, + isSigner: false, + isOptional: true, + }, + { + name: "tokenProgramX", + isMut: false, + isSigner: false, + }, + { + name: "tokenProgramY", isMut: false, isSigner: false, }, From 4b1e9eb267074c9955f240e56617393b2e8b0ef1 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Tue, 11 Jun 2024 14:27:01 +0800 Subject: [PATCH 10/13] fix: rust cli initialize permisison lb pair --- .../initialize_permission_lb_pair.rs | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/cli/src/instructions/initialize_permission_lb_pair.rs b/cli/src/instructions/initialize_permission_lb_pair.rs index 3a320f8d..957e61ab 100644 --- a/cli/src/instructions/initialize_permission_lb_pair.rs +++ b/cli/src/instructions/initialize_permission_lb_pair.rs @@ -48,6 +48,40 @@ pub async fn initialize_permission_lb_pair + Clon let token_mint_base: Mint = program.account(token_mint_x).await?; let token_mint_quote: Mint = program.account(token_mint_y).await?; + let token_programs = program + .async_rpc() + .get_multiple_accounts(&[token_mint_x, token_mint_y]) + .await? + .into_iter() + .map(|account| Some(account?.owner)) + .collect::>>() + .context("Missing token mint account")?; + + let [token_x_program, token_y_program] = token_programs.as_slice() else { + bail!("Missing token program accounts"); + }; + + let token_badge_keys = [token_mint_x, token_mint_y] + .into_iter() + .map(|key| derive_token_badge_pda(key).0) + .collect::>(); + + let token_badge_accounts = program + .async_rpc() + .get_multiple_accounts(&token_badge_keys) + .await?; + + let token_badges = token_badge_accounts + .into_iter() + .zip(token_badge_keys) + .into_iter() + .map(|(account, key)| Some(account.map_or(lb_clmm::ID, |_| key))) + .collect::>(); + + let [token_x_badge, token_y_badge] = token_badges.as_slice() else { + bail!("Invalid derived token badge"); + }; + let price_per_lamport = price_per_token_to_per_lamport( initial_price, token_mint_base.decimals, @@ -82,7 +116,10 @@ pub async fn initialize_permission_lb_pair + Clon admin: program.payer(), rent: anchor_client::solana_sdk::sysvar::rent::ID, system_program: anchor_client::solana_sdk::system_program::ID, - token_program: anchor_spl::token::ID, + token_badge_x: *token_x_badge, + token_badge_y: *token_y_badge, + token_program_x: *token_x_program, + token_program_y: *token_y_program, event_authority, program: lb_clmm::ID, base: base_keypair.pubkey(), From 6428ad3909692ffcdf25dda43f227a9870479c63 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Tue, 11 Jun 2024 14:29:59 +0800 Subject: [PATCH 11/13] fix: ts sdk initialize permission lb pair support token2022 --- target/idl/lb_clmm.json | 19 ++++++++++++++++++- target/types/lb_clmm.ts | 38 +++++++++++++++++++++++++++++++++++-- ts-client/src/dlmm/index.ts | 17 ++++++++++++++++- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/target/idl/lb_clmm.json b/target/idl/lb_clmm.json index 19f70f50..fc767ffa 100644 --- a/target/idl/lb_clmm.json +++ b/target/idl/lb_clmm.json @@ -250,7 +250,24 @@ "isSigner": true }, { - "name": "tokenProgram", + "name": "tokenBadgeX", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenBadgeY", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", "isMut": false, "isSigner": false }, diff --git a/target/types/lb_clmm.ts b/target/types/lb_clmm.ts index 116d1fe3..46c9b230 100644 --- a/target/types/lb_clmm.ts +++ b/target/types/lb_clmm.ts @@ -250,7 +250,24 @@ export type LbClmm = { "isSigner": true }, { - "name": "tokenProgram", + "name": "tokenBadgeX", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenBadgeY", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", "isMut": false, "isSigner": false }, @@ -5226,7 +5243,24 @@ export const IDL: LbClmm = { "isSigner": true }, { - "name": "tokenProgram", + "name": "tokenBadgeX", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenBadgeY", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", "isMut": false, "isSigner": false }, diff --git a/ts-client/src/dlmm/index.ts b/ts-client/src/dlmm/index.ts index 4b4453cc..d34e3cc0 100644 --- a/ts-client/src/dlmm/index.ts +++ b/ts-client/src/dlmm/index.ts @@ -1219,6 +1219,18 @@ export class DLMM { activationType, }; + const [tokenXBadge, tokenYBadge] = [tokenX, tokenY].map((token) => { + return deriveTokenBadge(token, program.programId)[0]; + }); + + const [mintXAccountInfo, mintYAccountInfo, mintXBadge, mintYBadge] = + await program.provider.connection.getMultipleAccountsInfo([ + tokenX, + tokenY, + tokenXBadge, + tokenYBadge, + ]); + return program.methods .initializePermissionLbPair(ixData) .accounts({ @@ -1229,7 +1241,10 @@ export class DLMM { binArrayBitmapExtension, tokenMintX: tokenX, tokenMintY: tokenY, - tokenProgram: TOKEN_PROGRAM_ID, + tokenBadgeX: mintXBadge ? tokenXBadge : program.programId, + tokenBadgeY: mintYBadge ? tokenYBadge : program.programId, + tokenProgramX: mintXAccountInfo.owner, + tokenProgramY: mintYAccountInfo.owner, oracle, systemProgram: SystemProgram.programId, admin: creatorKey, From b65bd204ac62df0518af2c081cc66b740c6fa4d1 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Wed, 4 Sep 2024 17:10:35 +0800 Subject: [PATCH 12/13] fix: resync program interface after rebase --- Cargo.lock | 3024 +++++--------- Cargo.toml | 10 +- artifacts/lb_clmm.so | Bin 1486400 -> 1457024 bytes cli/Cargo.toml | 9 +- cli/src/instructions/add_liquidity.rs | 97 +- cli/src/instructions/claim_fee.rs | 103 +- cli/src/instructions/claim_reward.rs | 59 +- cli/src/instructions/fund_reward.rs | 38 +- cli/src/instructions/initialize_position.rs | 2 +- cli/src/instructions/remove_liquidity.rs | 95 +- .../remove_liquidity_by_price_range.rs | 313 +- cli/src/instructions/seed_liquidity.rs | 186 +- cli/src/instructions/simulate_swap_demand.rs | 2 +- cli/src/instructions/swap_exact_in.rs | 82 +- .../instructions/swap_with_price_impact.rs | 103 +- cli/src/instructions/utils.rs | 98 +- cli/src/instructions/withdraw_protocol_fee.rs | 54 +- cli/src/math.rs | 103 - commons/Cargo.toml | 2 +- market_making/Cargo.toml | 3 - market_making/src/pair_config.rs | 19 - programs/lb_clmm/Cargo.toml | 21 +- programs/lb_clmm/src/errors.rs | 31 +- .../lb_clmm/src/instructions/add_liquidity.rs | 7 +- .../add_liquidity_by_weight_one_side.rs | 5 +- .../lb_clmm/src/instructions/claim_reward.rs | 5 +- .../lb_clmm/src/instructions/fund_reward.rs | 13 +- .../src/instructions/initialize_reward.rs | 5 +- programs/lb_clmm/src/instructions/mod.rs | 6 +- ...tion.rs => set_pre_activation_duration.rs} | 0 programs/lb_clmm/src/instructions/swap.rs | 9 +- .../src/instructions/v2/add_liquidity2.rs | 73 + .../v2/add_liquidity_by_strategy2.rs | 13 + .../src/instructions/{ => v2}/claim_fee2.rs | 22 +- .../src/instructions/v2/claim_reward2.rs | 49 + .../{ => v2}/initialize_lb_pair2.rs | 0 .../{ => v2}/initialize_token_badge.rs | 3 +- programs/lb_clmm/src/instructions/v2/mod.rs | 9 + .../src/instructions/v2/remove_liquidity2.rs | 13 + .../v2/remove_liquidity_by_range2.rs | 13 + programs/lb_clmm/src/instructions/v2/swap2.rs | 81 + .../withdraw_ineligible_reward.rs | 17 +- .../src/instructions/withdraw_protocol_fee.rs | 16 +- programs/lb_clmm/src/lib.rs | 155 +- programs/lb_clmm/src/state/lb_pair.rs | 11 - programs/lb_clmm/src/utils/mod.rs | 2 + .../src/utils/remaining_accounts_util.rs | 87 + programs/lb_clmm/src/utils/transfer_memo.rs | 7 + target/idl/lb_clmm.json | 1556 +++++--- target/types/lb_clmm.ts | 3528 +++++++++++++---- ts-client/package.json | 7 +- ts-client/pnpm-lock.yaml | 33 +- 52 files changed, 6421 insertions(+), 3778 deletions(-) rename programs/lb_clmm/src/instructions/{set_pre_activation_sduration.rs => set_pre_activation_duration.rs} (100%) create mode 100644 programs/lb_clmm/src/instructions/v2/add_liquidity2.rs create mode 100644 programs/lb_clmm/src/instructions/v2/add_liquidity_by_strategy2.rs rename programs/lb_clmm/src/instructions/{ => v2}/claim_fee2.rs (82%) create mode 100644 programs/lb_clmm/src/instructions/v2/claim_reward2.rs rename programs/lb_clmm/src/instructions/{ => v2}/initialize_lb_pair2.rs (100%) rename programs/lb_clmm/src/instructions/{ => v2}/initialize_token_badge.rs (94%) create mode 100644 programs/lb_clmm/src/instructions/v2/mod.rs create mode 100644 programs/lb_clmm/src/instructions/v2/remove_liquidity2.rs create mode 100644 programs/lb_clmm/src/instructions/v2/remove_liquidity_by_range2.rs create mode 100644 programs/lb_clmm/src/instructions/v2/swap2.rs create mode 100644 programs/lb_clmm/src/utils/remaining_accounts_util.rs create mode 100644 programs/lb_clmm/src/utils/transfer_memo.rs diff --git a/Cargo.lock b/Cargo.lock index 1cfd3c9d..5417018f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,12 +12,27 @@ dependencies = [ "regex", ] +[[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 = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "aead" version = "0.4.3" @@ -56,42 +71,37 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.15", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", - "getrandom 0.2.10", + "getrandom 0.2.15", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -114,8 +124,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5f619f1d04f53621925ba8a2e633ba5a6081f2ae14758cbb67f38fd823e0a3e" dependencies = [ "anchor-syn", - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -126,9 +136,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f2a3e1df4685f18d12a943a9f2a7456305401af21a07c9fe076ef9ecd6e400" dependencies = [ "anchor-syn", - "bs58 0.5.0", - "proc-macro2 1.0.63", - "quote 1.0.29", + "bs58 0.5.1", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -139,7 +149,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9423945cb55627f0b30903288e78baf6f62c6c8ab28fb344b6b25f1ffee3dca7" dependencies = [ "anchor-syn", - "quote 1.0.29", + "quote", "syn 1.0.109", ] @@ -150,7 +160,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93ed12720033cc3c3bf3cfa293349c2275cd5ab99936e33dd4bf283aaad3e241" dependencies = [ "anchor-syn", - "quote 1.0.29", + "quote", "syn 1.0.109", ] @@ -161,8 +171,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eef4dc0371eba2d8c8b54794b0b0eb786a234a559b77593d6f80825b6d2c77a2" dependencies = [ "anchor-syn", - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -173,7 +183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b18c4f191331e078d4a6a080954d1576241c29c56638783322a18d308ab27e4f" dependencies = [ "anchor-syn", - "quote 1.0.29", + "quote", "syn 1.0.109", ] @@ -203,7 +213,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5de10d6e9620d3bcea56c56151cad83c5992f50d5960b3a9bebc4a50390ddc3c" dependencies = [ "anchor-syn", - "quote 1.0.29", + "quote", "syn 1.0.109", ] @@ -215,8 +225,8 @@ checksum = "f4e2e5be518ec6053d90a2a7f26843dbee607583c779e6c8395951b9739bdfbe" dependencies = [ "anchor-syn", "borsh-derive-internal 0.10.3", - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -226,8 +236,8 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ecc31d19fa54840e74b7a979d44bcea49d70459de846088a1d71e87ba53c419" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -251,7 +261,7 @@ dependencies = [ "bincode", "borsh 0.10.3", "bytemuck", - "getrandom 0.2.10", + "getrandom 0.2.15", "solana-program", "thiserror", ] @@ -263,10 +273,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" dependencies = [ "anchor-lang", + "mpl-token-metadata", "solana-program", - "spl-associated-token-account 2.2.0", - "spl-token 4.0.0", - "spl-token-2022 0.9.0", + "spl-associated-token-account", + "spl-memo", + "spl-token", + "spl-token-2022", ] [[package]] @@ -276,13 +288,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9101b84702fed2ea57bd22992f75065da5648017135b844283a2f6d74f27825" dependencies = [ "anyhow", - "bs58 0.5.0", + "bs58 0.5.1", "heck 0.3.3", - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "syn 1.0.109", "thiserror", ] @@ -313,57 +325,58 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "ark-bn254" @@ -406,7 +419,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools", - "num-bigint 0.4.3", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version", @@ -419,7 +432,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ - "quote 1.0.29", + "quote", "syn 1.0.109", ] @@ -429,10 +442,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint 0.4.3", + "num-bigint 0.4.6", "num-traits", - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -458,7 +471,7 @@ dependencies = [ "ark-serialize-derive", "ark-std", "digest 0.10.7", - "num-bigint 0.4.3", + "num-bigint 0.4.6", ] [[package]] @@ -467,8 +480,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -482,23 +495,17 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "array-bytes" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ad284aeb45c13f2fb4f084de4a420ebf447423bdf9386c0540ce33cb3ef4b8c" - [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii" @@ -528,8 +535,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", "synstructure", ] @@ -540,8 +547,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -564,9 +571,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.3.15" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" +checksum = "fec134f64e2bc57411226dfc4e52dec859ddfc7e711fc5e07b612584f000e4aa" dependencies = [ "brotli", "flate2", @@ -587,13 +594,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -609,9 +616,24 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +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 = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.4", + "object", + "rustc-demangle", +] [[package]] name = "base64" @@ -627,9 +649,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -647,25 +669,19 @@ dependencies = [ ] [[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" +name = "bitflags" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] [[package]] name = "bitmaps" @@ -690,9 +706,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199c42ab6972d92c9f8995f086273d25c42fc0f7b2a1fcefba465c1352d25ba5" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", @@ -747,6 +763,16 @@ dependencies = [ "hashbrown 0.13.2", ] +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive 1.5.1", + "cfg_aliases", +] + [[package]] name = "borsh-derive" version = "0.9.3" @@ -756,7 +782,7 @@ dependencies = [ "borsh-derive-internal 0.9.3", "borsh-schema-derive-internal 0.9.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.63", + "proc-macro2", "syn 1.0.109", ] @@ -769,18 +795,32 @@ dependencies = [ "borsh-derive-internal 0.10.3", "borsh-schema-derive-internal 0.10.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.63", + "proc-macro2", "syn 1.0.109", ] +[[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 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.77", + "syn_derive", +] + [[package]] name = "borsh-derive-internal" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -790,8 +830,8 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -801,8 +841,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -812,16 +852,16 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] [[package]] name = "brotli" -version = "3.4.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -830,9 +870,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -846,18 +886,18 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "tinyvec", ] [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bv" @@ -871,9 +911,9 @@ dependencies = [ [[package]] name = "bytecheck" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -882,67 +922,46 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] [[package]] name = "bytemuck" -version = "1.16.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" +checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.4.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" +checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" +name = "bytes" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "caps" @@ -956,11 +975,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" dependencies = [ "jobserver", + "libc", + "shlex", ] [[package]] @@ -969,11 +990,17 @@ 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.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -981,16 +1008,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.1", -] - -[[package]] -name = "chrono-humanize" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" -dependencies = [ - "chrono", + "windows-targets 0.52.6", ] [[package]] @@ -1010,7 +1028,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.3.2", "strsim 0.8.0", "textwrap 0.11.0", "unicode-width", @@ -1024,20 +1042,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_lex 0.2.4", "indexmap 1.9.3", "once_cell", "strsim 0.10.0", "termcolor", - "textwrap 0.16.0", + "textwrap 0.16.1", ] [[package]] name = "clap" -version = "4.4.7" +version = "4.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" dependencies = [ "clap_builder", "clap_derive", @@ -1045,26 +1063,26 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" dependencies = [ "anstream", "anstyle", - "clap_lex 0.6.0", - "strsim 0.10.0", + "clap_lex 0.7.2", + "strsim 0.11.1", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -1078,9 +1096,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "cli" @@ -1091,23 +1109,22 @@ dependencies = [ "anchor-spl", "anyhow", "bincode", - "clap 4.4.7", + "clap 4.5.16", "commons", "lb_clmm", - "mpl-token-metadata", - "proptest", "rand 0.8.5", "rust_decimal", "shellexpand", - "spl-associated-token-account 1.1.3", + "spl-associated-token-account", + "spl-transfer-hook-interface", "tokio", ] [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "combine" @@ -1135,24 +1152,24 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] [[package]] name = "console" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.45.0", + "windows-sys 0.52.0", ] [[package]] @@ -1183,15 +1200,15 @@ checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -1199,70 +1216,61 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1315,9 +1323,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.1" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -1325,27 +1333,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.1" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.63", - "quote 1.0.29", - "strsim 0.10.0", - "syn 2.0.23", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.77", ] [[package]] name = "darling_macro" -version = "0.20.1" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", - "quote 1.0.29", - "syn 2.0.23", + "quote", + "syn 2.0.77", ] [[package]] @@ -1356,14 +1364,13 @@ checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" dependencies = [ "cfg-if", "num_cpus", - "rayon", ] [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "der" @@ -1383,16 +1390,19 @@ dependencies = [ "asn1-rs", "displaydoc", "nom", - "num-bigint 0.4.3", + "num-bigint 0.4.6", "num-traits", "rusticata-macros", ] [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] [[package]] name = "derivation-path" @@ -1406,8 +1416,8 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -1443,15 +1453,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "dir-diff" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ad16bf5f84253b50d6557681c58c3ab67c47c77d39fed9aeb56e947290bd10" -dependencies = [ - "walkdir", -] - [[package]] name = "dirs" version = "5.0.1" @@ -1475,36 +1476,36 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] -name = "dlopen" -version = "0.1.8" +name = "dlopen2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e80ad39f814a9abe68583cd50a2d45c8a67561c3361ab8da240587dda80937" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" dependencies = [ - "dlopen_derive", - "lazy_static", + "dlopen2_derive", "libc", + "once_cell", "winapi", ] [[package]] -name = "dlopen_derive" -version = "0.1.4" +name = "dlopen2_derive" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f236d9e1b1fbd81cea0f9cbdc8dcc7e8ebcd80e6659cd7cb2ad5f6c05946c581" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ - "libc", - "quote 0.6.13", - "syn 0.15.44", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -1545,26 +1546,14 @@ dependencies = [ "derivation-path", "ed25519-dalek", "hmac 0.12.1", - "sha2 0.10.7", -] - -[[package]] -name = "educe" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" -dependencies = [ - "enum-ordinalize", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", + "sha2 0.10.8", ] [[package]] name = "either" -version = "1.8.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" @@ -1574,44 +1563,31 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] [[package]] name = "enum-iterator" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7add3873b5dd076766ee79c8e406ad1a472c385476b9e38849f8eec24f1be689" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" dependencies = [ "enum-iterator-derive", ] [[package]] name = "enum-iterator-derive" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" -dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", -] - -[[package]] -name = "enum-ordinalize" -version = "3.1.15" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ - "num-bigint 0.4.3", - "num-traits", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -1629,29 +1605,18 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] @@ -1662,12 +1627,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" -version = "1.9.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "feature-probe" @@ -1675,26 +1637,14 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" -[[package]] -name = "filetime" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", -] - [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.8.0", ] [[package]] @@ -1705,9 +1655,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1720,9 +1670,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1735,9 +1685,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1745,15 +1695,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1762,38 +1712,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1843,9 +1793,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1854,6 +1804,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + [[package]] name = "goblin" version = "0.5.4" @@ -1867,9 +1823,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -1877,10 +1833,10 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.5.0", "slab", "tokio", - "tokio-util 0.7.2", + "tokio-util", "tracing", ] @@ -1899,7 +1855,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.8", ] [[package]] @@ -1908,7 +1864,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.8", ] [[package]] @@ -1917,14 +1873,14 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.6", ] [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" @@ -1937,9 +1893,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -1952,9 +1908,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "histogram" @@ -1994,9 +1950,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -2005,9 +1961,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -2016,9 +1972,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -2034,9 +1990,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -2058,22 +2014,23 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.23.2" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ + "futures-util", "http", "hyper", - "rustls 0.20.9", + "rustls", "tokio", "tokio-rustls", ] [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2100,9 +2057,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2124,12 +2081,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "index_list" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70891286cb8e844fdfcf1178b47569699f9e20b5ecc4b45a6240a64771444638" - [[package]] name = "indexmap" version = "1.9.3" @@ -2142,19 +2093,19 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.5", ] [[package]] name = "indicatif" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" dependencies = [ "console", "instant", @@ -2165,30 +2116,25 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.2", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.10.5" @@ -2200,24 +2146,24 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -2239,54 +2185,51 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lb_clmm" -version = "0.8.0" +version = "0.9.0" dependencies = [ "anchor-lang", "anchor-spl", - "assert_matches", - "async-trait", "bytemuck", - "mpl-token-metadata", "num-integer", "num-traits", "num_enum 0.7.1", - "proptest", - "rand 0.7.3", "ruint", "solana-program", - "solana-program-test", - "solana-sdk", - "uint", + "spl-transfer-hook-interface", ] [[package]] name = "libc" -version = "0.2.147" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] -name = "libm" -version = "0.2.7" +name = "libredox" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - -[[package]] +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] name = "libsecp256k1" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2335,55 +2278,37 @@ dependencies = [ ] [[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "lock_api" -version = "0.4.10" +name = "light-poseidon" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "a5b439809cdfc0d86ecc7317f1724df13dfa665df48991b79e90e689411451f7" dependencies = [ - "autocfg", - "scopeguard", + "ark-bn254", + "ark-ff", + "thiserror", ] [[package]] -name = "log" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" - -[[package]] -name = "lru" -version = "0.7.8" +name = "linux-raw-sys" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" -dependencies = [ - "hashbrown 0.12.3", -] +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] -name = "lz4" -version = "1.24.0" +name = "lock_api" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "libc", - "lz4-sys", + "autocfg", + "scopeguard", ] [[package]] -name = "lz4-sys" -version = "1.9.4" +name = "log" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" -dependencies = [ - "cc", - "libc", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "market_making" @@ -2393,9 +2318,8 @@ dependencies = [ "anchor-lang", "anchor-spl", "anyhow", - "bs58 0.5.0", - "chrono", - "clap 4.4.7", + "bs58 0.5.1", + "clap 4.5.16", "env_logger", "hyper", "lb_clmm", @@ -2403,18 +2327,16 @@ dependencies = [ "routerify", "serde", "serde_json", - "shellexpand", "solana-transaction-status", - "spl-associated-token-account 1.1.3", + "spl-associated-token-account", "tokio", - "ureq", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -2436,9 +2358,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -2469,61 +2391,39 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] -name = "mio" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" -dependencies = [ - "libc", - "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", -] - -[[package]] -name = "modular-bitfield" -version = "0.11.2" +name = "miniz_oxide" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "modular-bitfield-impl", - "static_assertions", + "adler2", ] [[package]] -name = "modular-bitfield-impl" -version = "0.11.2" +name = "mio" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", + "hermit-abi 0.3.9", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] name = "mpl-token-metadata" -version = "3.0.1" +version = "3.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "651388b8ccae4805f240ebd495172eb44ea10153e018623b628df7034e042a96" +checksum = "ba8ee05284d79b367ae8966d558e1a305a781fc80c9df51f37775169117ba64f" dependencies = [ "borsh 0.10.3", "num-derive 0.3.3", @@ -2538,7 +2438,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.7.1", @@ -2555,15 +2455,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi", -] - [[package]] name = "num" version = "0.2.1" @@ -2591,11 +2482,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2610,14 +2500,20 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -2627,26 +2523,25 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -2667,12 +2562,11 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -2681,19 +2575,10 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi 0.3.9", "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2712,18 +2597,6 @@ dependencies = [ "num_enum_derive 0.7.1", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -2731,9 +2604,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -2743,9 +2616,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -2754,6 +2627,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" +[[package]] +name = "object" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +dependencies = [ + "memchr", +] + [[package]] name = "oid-registry" version = "0.6.1" @@ -2765,15 +2647,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl-probe" @@ -2781,25 +2663,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "opentelemetry" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" -dependencies = [ - "async-trait", - "crossbeam-channel", - "futures-channel", - "futures-executor", - "futures-util", - "js-sys", - "lazy_static", - "percent-encoding", - "pin-project", - "rand 0.8.5", - "thiserror", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -2812,82 +2675,34 @@ version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" -[[package]] -name = "ouroboros" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" -dependencies = [ - "aliasable", - "ouroboros_macro", -] - -[[package]] -name = "ouroboros_macro" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" -dependencies = [ - "Inflector", - "proc-macro-error", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core 0.9.8", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", - "windows-targets 0.48.1", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" @@ -2918,9 +2733,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "percentage" @@ -2931,31 +2746,11 @@ dependencies = [ "num", ] -[[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" -dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", -] - [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -2976,9 +2771,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plain" @@ -3000,15 +2795,24 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.5.1" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" + +[[package]] +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bccab0e7fd7cc19f820a1c8c91720af652d0c88dc9664dd72aef2614f04af3b" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro-crate" @@ -3026,7 +2830,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit 0.22.20", ] [[package]] @@ -3036,9 +2849,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", + "proc-macro2", + "quote", "version_check", ] @@ -3048,49 +2860,20 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "version_check", ] [[package]] name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.63" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] -[[package]] -name = "proptest" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" -dependencies = [ - "bit-set", - "bitflags", - "byteorder", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax 0.6.29", - "rusty-fork", - "tempfile", - "unarray", -] - [[package]] name = "ptr_meta" version = "0.1.4" @@ -3106,8 +2889,8 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -3121,77 +2904,71 @@ dependencies = [ ] [[package]] -name = "quick-error" -version = "1.2.3" +name = "qualifier_attr" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] [[package]] name = "quinn" -version = "0.9.4" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e8b432585672228923edbbf64b8b12c14e1112f62e88737655b4a083dbcd78e" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.20.9", + "rustls", "thiserror", "tokio", "tracing", - "webpki", ] [[package]] name = "quinn-proto" -version = "0.9.6" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b0b33c13a79f669c85defaf4c275dc86a0c0372807d0ca3d78e0bb87274863" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" dependencies = [ "bytes", "rand 0.8.5", "ring 0.16.20", "rustc-hash", - "rustls 0.20.9", + "rustls", "rustls-native-certs", "slab", "thiserror", "tinyvec", "tracing", - "webpki", ] [[package]] name = "quinn-udp" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" dependencies = [ + "bytes", "libc", - "quinn-proto", "socket2", "tracing", - "windows-sys 0.42.0", -] - -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", + "windows-sys 0.48.0", ] [[package]] name = "quote" -version = "1.0.29" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ - "proc-macro2 1.0.63", + "proc-macro2", ] [[package]] @@ -3259,7 +3036,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.15", ] [[package]] @@ -3271,15 +3048,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core 0.6.4", -] - [[package]] name = "rand_xoshiro" version = "0.6.0" @@ -3291,9 +3059,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3301,14 +3069,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] @@ -3325,94 +3091,70 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "bitflags", + "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", + "getrandom 0.2.15", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.9.0" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89089e897c013b3deb627116ae56a6955a72b8bed395c9526af31c9fe528b484" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.7.3", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.3.0" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa250384981ea14565685dea16a9ccc4d1c541a13f82b9c168572264d1df8c56" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.3", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab07dc67230e4a4718e70fd5c20055a4334b121f1f9db8fe63ef39ce9b8c846" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rend" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ "bytecheck", ] [[package]] name = "reqwest" -version = "0.11.17" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13293b639a097af28fc8a90f22add145a9c954e49d77da06263d58cf44d5fb91" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "async-compression", - "base64 0.21.4", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -3429,20 +3171,22 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.20.9", + "rustls", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", + "system-configuration", "tokio", "tokio-rustls", - "tokio-util 0.7.2", + "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.22.6", + "webpki-roots 0.25.4", "winreg", ] @@ -3463,26 +3207,28 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.3" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babe80d5c16becf6594aa32ad2be8fe08498e7ae60b77de8df700e67f191d7e" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", - "getrandom 0.2.10", + "cfg-if", + "getrandom 0.2.15", "libc", "spin 0.9.8", "untrusted 0.9.0", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "rkyv" -version = "0.7.42" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" dependencies = [ "bitvec", "bytecheck", + "bytes", "hashbrown 0.12.3", "ptr_meta", "rend", @@ -3494,12 +3240,12 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.42" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -3518,23 +3264,23 @@ dependencies = [ [[package]] name = "rpassword" -version = "7.2.0" +version = "7.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" dependencies = [ "libc", "rtoolbox", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "rtoolbox" -version = "0.0.1" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" dependencies = [ "libc", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -3549,18 +3295,18 @@ dependencies = [ [[package]] name = "ruint-macro" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e666a5496a0b2186dbcd0ff6106e29e093c15591bde62c20d3842007c6978a09" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rust_decimal" -version = "1.32.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" dependencies = [ "arrayvec", - "borsh 0.10.3", + "borsh 1.5.1", "bytes", "num-traits", "rand 0.8.5", @@ -3571,9 +3317,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -3581,17 +3327,11 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] @@ -3607,38 +3347,25 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.23" +version = "0.38.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" dependencies = [ - "bitflags", + "bitflags 2.6.0", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustls" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" -dependencies = [ - "log", - "ring 0.16.20", - "sct", - "webpki", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.3", + "ring 0.17.8", "rustls-webpki", "sct", ] @@ -3657,11 +3384,11 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.4", + "base64 0.21.7", ] [[package]] @@ -3670,57 +3397,36 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.3", + "ring 0.17.8", "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" - -[[package]] -name = "rusty-fork" -version = "0.3.0" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" - -[[package]] -name = "same-file" -version = "1.0.6" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scroll" @@ -3737,9 +3443,9 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -3748,7 +3454,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.3", + "ring 0.17.8", "untrusted 0.9.0", ] @@ -3760,11 +3466,11 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3773,9 +3479,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -3783,46 +3489,47 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.167" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daf513456463b42aa1d94cff7e0c24d682b429f020b9afa4f5ba5c40a22b237" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.11" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a16be4fe5320ade08736447e3198294a5ea9a6d44dde6f35f0a5e06859c427a" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.167" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b69b106b68bc8054f0e974e70d19984040f8a5cf9215ca82626ea4853f82c4b9" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] name = "serde_json" -version = "1.0.100" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f1e14e89be7aa4c4b78bdbdc9eb5bf8517829a600ae8eaa39a6e1d960b5185c" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -3856,16 +3563,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ "darling", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] -name = "sha-1" -version = "0.10.1" +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -3887,9 +3594,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -3918,15 +3625,6 @@ dependencies = [ "keccak", ] -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - [[package]] name = "shell-words" version = "1.1.0" @@ -3942,11 +3640,17 @@ dependencies = [ "dirs", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -3984,28 +3688,28 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.4.9" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] name = "solana-account-decoder" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850d5d9dc8fa6ea42f4e61c78e296bbbce5a3531ff4cb3c58ef36ee31781049c" +checksum = "8ec4cebccef07b65c46854b62237a29e7ccc92ef21ef1c90be346f9de0c4e7a4" dependencies = [ "Inflector", - "base64 0.21.4", + "base64 0.21.7", "bincode", "bs58 0.4.0", "bv", @@ -4013,129 +3717,24 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-address-lookup-table-program", "solana-config-program", "solana-sdk", - "spl-token 3.5.0", - "spl-token-2022 0.6.1", + "spl-token", + "spl-token-2022", + "spl-token-metadata-interface", "thiserror", "zstd", ] -[[package]] -name = "solana-address-lookup-table-program" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7f867cde478a078d4c4ceb113f4f9ac7e29c2efea98f80a2b30cdcd7be83c5" -dependencies = [ - "bincode", - "bytemuck", - "log", - "num-derive 0.3.3", - "num-traits", - "rustc_version", - "serde", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-program", - "solana-program-runtime", - "solana-sdk", - "thiserror", -] - -[[package]] -name = "solana-banks-client" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a46f22d9f8a0b253165260f44c360dd6a2a49b2731f18cbfda818e3ae0ad9112" -dependencies = [ - "borsh 0.10.3", - "futures", - "solana-banks-interface", - "solana-program", - "solana-sdk", - "tarpc", - "thiserror", - "tokio", - "tokio-serde", -] - -[[package]] -name = "solana-banks-interface" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068d206e9fb611684b61c95b7692d099a89b28e6e376fa0f17620198539de371" -dependencies = [ - "serde", - "solana-sdk", - "tarpc", -] - -[[package]] -name = "solana-banks-server" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e04de401b9177ef6016f24693b871e9f7c47b49a98e3ee1b794f2ae2cfa2438" -dependencies = [ - "bincode", - "crossbeam-channel", - "futures", - "solana-banks-interface", - "solana-client", - "solana-runtime", - "solana-sdk", - "solana-send-transaction-service", - "tarpc", - "tokio", - "tokio-serde", -] - -[[package]] -name = "solana-bpf-loader-program" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eaf42dbfe8a42b80e24f2c087a3935d6e7bb49886313b006d88fb04fdc2a02f" -dependencies = [ - "bincode", - "byteorder", - "libsecp256k1", - "log", - "rand 0.7.3", - "solana-measure", - "solana-program-runtime", - "solana-sdk", - "solana-zk-token-sdk", - "solana_rbpf", - "thiserror", -] - -[[package]] -name = "solana-bucket-map" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e050e58ea0c422f9db10d987b2a10992f103209454f70d54f6208b14ec5546a0" -dependencies = [ - "bv", - "log", - "memmap2", - "modular-bitfield", - "num_enum 0.6.1", - "rand 0.7.3", - "solana-measure", - "solana-sdk", - "tempfile", -] - [[package]] name = "solana-clap-utils" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c99636da9a4acad58d0e8142e36395ece48fc41c396e297e702b6a789b190f" +checksum = "089f1edd0e325e5664f33b11df131ff47ed93cd74d75a2d434c8b7f9e976267a" dependencies = [ "chrono", "clap 2.34.0", "rpassword", - "solana-perf", "solana-remote-wallet", "solana-sdk", "thiserror", @@ -4146,19 +3745,19 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acc7a437165d8fcfac3c63963e394f0ea497b5d2a75159bb3a1ed75dbeb36a7e" +checksum = "6d4eb6c673b6a8768ba687d620d02ec544d86525ce6d7e3858e9730463ed41b4" dependencies = [ "async-trait", "bincode", + "dashmap", "futures", "futures-util", - "indexmap 1.9.3", + "indexmap 2.5.0", "indicatif", "log", "quinn", - "rand 0.7.3", "rayon", "solana-connection-cache", "solana-measure", @@ -4177,21 +3776,11 @@ dependencies = [ "tokio", ] -[[package]] -name = "solana-compute-budget-program" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c90fdaafdc41a4ba0a760af5491bd79f02d1d1eae6926b7796561681c843e4" -dependencies = [ - "solana-program-runtime", - "solana-sdk", -] - [[package]] name = "solana-config-program" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f9f2201c7e526581511fa6525e281518be5cabaee82bd5b29fe4b78744148d" +checksum = "98d262cd78922735637ef0ccf179e43bc0acd430f9004cd7e987e95d04b44f47" dependencies = [ "bincode", "chrono", @@ -4203,16 +3792,17 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee52de352e10e53b252df0815d685a9c6f3e8d3baa0f65e214dfcd247db0e21" +checksum = "84f1aa4f1d78bdf5f76f4f351d05c0b861025c8b4e46503d8c2aa8d97a7139d4" dependencies = [ "async-trait", "bincode", + "crossbeam-channel", "futures-util", - "indexmap 1.9.3", + "indexmap 2.5.0", "log", - "rand 0.7.3", + "rand 0.8.5", "rayon", "rcgen", "solana-measure", @@ -4224,11 +3814,11 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "361cc834e5fbbe1a73f1d904fcb8ab052a665e5be6061bd1ba7ab478d7d17c9c" +checksum = "92dc68e28d42991c6579079f9be29e2e30fb20474cbcd7be1d97e052081c8050" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.6", "blake3", "block-buffer 0.10.4", "bs58 0.4.0", @@ -4237,19 +3827,16 @@ dependencies = [ "cc", "either", "generic-array", - "getrandom 0.1.16", "im", "lazy_static", "log", "memmap2", - "once_cell", - "rand_core 0.6.4", "rustc_version", "serde", "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "solana-frozen-abi-macro", "subtle", "thiserror", @@ -4257,35 +3844,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575d875dc050689f9f88c542e292e295e2f081d4e96e0df297981e45cbad8824" +checksum = "999084a6d587bc79a059eb4c34c2e1419913612bb6224bb95660567c0f12449d" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "rustc_version", - "syn 2.0.23", -] - -[[package]] -name = "solana-loader-v4-program" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f1e56ce753307a1b169ad2ef3b9af024c93d4db6f6cd6659794c57635f32ff" -dependencies = [ - "log", - "rand 0.7.3", - "solana-measure", - "solana-program-runtime", - "solana-sdk", - "solana_rbpf", + "syn 2.0.77", ] [[package]] name = "solana-logger" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00faf7aa6a3f47c542bd45d2d7f13af9a382d993e647976a676fe1b0eec4eb2" +checksum = "84a56a1696678acd5237565c3092354c923f84dc1fbcd9b824c91fbfefc10740" dependencies = [ "env_logger", "lazy_static", @@ -4294,9 +3867,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e19c6e1b35df3c212619a7995ae3576fa92ab15ecfc065899f21385cbe45c95" +checksum = "cad3ae58ed767c409a792b045b4580c96b658b1672f4389f4dca7ca6a124693c" dependencies = [ "log", "solana-sdk", @@ -4304,9 +3877,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10e62760a5f87d836169eb3bb446bae174181db07d2c8016be36de49c04fd432" +checksum = "9b6764575759cf274c7579df7d3b8c45d4859706c9da4a1964110ab6e622c5e9" dependencies = [ "crossbeam-channel", "gethostname", @@ -4314,20 +3887,21 @@ dependencies = [ "log", "reqwest", "solana-sdk", + "thiserror", ] [[package]] name = "solana-net-utils" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308c4c36c634d418589cf1df121d143819feff81932de81640de3d64878934eb" +checksum = "8570303599bc8c05b66550b919344dfde14dc79b17fa0c1d743a9c6dd7bac040" dependencies = [ "bincode", "clap 3.2.25", "crossbeam-channel", "log", "nix", - "rand 0.7.3", + "rand 0.8.5", "serde", "serde_derive", "socket2", @@ -4340,25 +3914,27 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4d44a4998ba6d9b37e89399d9ce2812e84489dd4665df619fb23366e1c2ec1b" +checksum = "68c658d1eff3672cb97c3501b9838fe1afdcac65d456c3e74b4c46f5245c8b05" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.6", "bincode", "bv", "caps", "curve25519-dalek", - "dlopen", - "dlopen_derive", + "dlopen2", "fnv", "lazy_static", "libc", "log", "nix", - "rand 0.7.3", + "rand 0.8.5", "rayon", + "rustc_version", "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", "solana-metrics", "solana-rayon-threadlimit", "solana-sdk", @@ -4367,18 +3943,17 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9863ff5c6e828015bec331c26fb53e48352a264a9be682e7e078d2c3b3e93b46" +checksum = "5e9aa19fa728ed701584c398607f26c773ede20e1c38e4a6c3ae79ed56521374" dependencies = [ "ark-bn254", "ark-ec", "ark-ff", "ark-serialize", - "array-bytes", - "base64 0.21.4", + "base64 0.21.7", "bincode", - "bitflags", + "bitflags 2.6.0", "blake3", "borsh 0.10.3", "borsh 0.9.3", @@ -4389,27 +3964,27 @@ dependencies = [ "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.10", + "getrandom 0.2.15", "itertools", "js-sys", "lazy_static", "libc", "libsecp256k1", + "light-poseidon", "log", - "memoffset 0.9.0", - "num-bigint 0.4.3", + "memoffset 0.9.1", + "num-bigint 0.4.6", "num-derive 0.3.3", "num-traits", - "parking_lot 0.12.1", - "rand 0.7.3", - "rand_chacha 0.2.2", + "parking_lot", + "rand 0.8.5", "rustc_version", "rustversion", "serde", "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "sha3 0.10.8", "solana-frozen-abi", "solana-frozen-abi-macro", @@ -4422,11 +3997,11 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05813d4d2e141ab4449cf684cc5b05512dfaabb7251561c5bb1ccf1e4221b210" +checksum = "27f91b73c2c061b3e5f85345879a932460ff946ab363eb25166b751944e6f6dc" dependencies = [ - "base64 0.21.4", + "base64 0.21.7", "bincode", "eager", "enum-iterator", @@ -4436,7 +4011,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "percentage", - "rand 0.7.3", + "rand 0.8.5", "rustc_version", "serde", "solana-frozen-abi", @@ -4448,38 +4023,11 @@ dependencies = [ "thiserror", ] -[[package]] -name = "solana-program-test" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff9f8e67fdf7306ae8ff3bb546534ecf064e6ed38e0489fee3579fa1016bd645" -dependencies = [ - "assert_matches", - "async-trait", - "base64 0.21.4", - "bincode", - "chrono-humanize", - "crossbeam-channel", - "log", - "serde", - "solana-banks-client", - "solana-banks-interface", - "solana-banks-server", - "solana-bpf-loader-program", - "solana-logger", - "solana-program-runtime", - "solana-runtime", - "solana-sdk", - "solana-vote-program", - "thiserror", - "tokio", -] - [[package]] name = "solana-pubsub-client" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd0753cdde1710f50d58bd40a45e58f5368a25dabff6b18ba635c3d6959a558" +checksum = "78b3939e4174d01c3bd9ef1385122de065e11fc6d660649388fae61effc2e0fa" dependencies = [ "crossbeam-channel", "futures-util", @@ -4502,9 +4050,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d96abde446eaa903d16961cfd3a6e98dc0d680b9edd61c39938c61548d53e" +checksum = "fdd2ba399377ec18fe9bd45cb290bb92668df8adba1f884d4b6adab8e0c27ed5" dependencies = [ "async-mutex", "async-trait", @@ -4514,9 +4062,8 @@ dependencies = [ "log", "quinn", "quinn-proto", - "quinn-udp", "rcgen", - "rustls 0.20.9", + "rustls", "solana-connection-cache", "solana-measure", "solana-metrics", @@ -4530,9 +4077,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ab62fc62458271d746678a3f5625e1654e3cb42a8f318ef4f1ea25991bb085" +checksum = "ada8292386cdf61aff5f9d00670abeefa3310b391f1a50c760c34c1ea52ea1a1" dependencies = [ "lazy_static", "num_cpus", @@ -4540,16 +4087,16 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863f10b8c2a893d1ec85b3ae8020c714512a67302b80c24dde0016eea4034a7c" +checksum = "ad77919e1081817f5b38b29ac74d93348aa653b5f987ee53d281fba206b7bd26" dependencies = [ "console", "dialoguer", "log", "num-derive 0.3.3", "num-traits", - "parking_lot 0.12.1", + "parking_lot", "qstring", "semver", "solana-sdk", @@ -4559,12 +4106,12 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df04998cef2d0fe1291599b69acafc7f8cd87305d7f1525c8ae10aef1cc5411c" +checksum = "f681deb63fe05f365dddb4c3d2f596cf2cc54a81d6fb24746503c284b35266f8" dependencies = [ "async-trait", - "base64 0.21.4", + "base64 0.21.7", "bincode", "bs58 0.4.0", "indicatif", @@ -4585,11 +4132,11 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2912ddbff841fbce1e30b0b9a420993c63b6cc7866e5f0af3740fcd6d85bb8" +checksum = "be2823b1ffc18604c8f0ef6c6a4da24e4da6f420aea09f5afe57f6594044ebb8" dependencies = [ - "base64 0.21.4", + "base64 0.21.7", "bs58 0.4.0", "jsonrpc-core", "reqwest", @@ -4601,15 +4148,15 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 0.6.1", + "spl-token-2022", "thiserror", ] [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d31100f6cc340dd322f57d00a334fa0a96f628ba86b04fcda1f84307deb14c31" +checksum = "fc934849ef622beff13951b9a49a350e9d9d30a80dfa5f98043b516a08dfe64a" dependencies = [ "clap 2.34.0", "solana-clap-utils", @@ -4619,117 +4166,49 @@ dependencies = [ ] [[package]] -name = "solana-runtime" -version = "1.16.15" +name = "solana-sdk" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebf6db318fd94457b1e69a481dcf43c6fd4f44e264b35f2489f0a1c6f7736e50" +checksum = "774c2379f8aaa8b5877029410dacd4e663d167cb93b09b2f3c2647c63df4f2eb" dependencies = [ - "arrayref", + "assert_matches", + "base64 0.21.7", "bincode", - "blake3", - "bv", + "bitflags 2.6.0", + "borsh 0.10.3", + "bs58 0.4.0", "bytemuck", "byteorder", - "bzip2", - "crossbeam-channel", - "dashmap", - "dir-diff", - "flate2", - "fnv", - "im", - "index_list", + "chrono", + "derivation-path", + "digest 0.10.7", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "hmac 0.12.1", "itertools", + "js-sys", "lazy_static", + "libsecp256k1", "log", - "lru", - "lz4", "memmap2", - "modular-bitfield", "num-derive 0.3.3", "num-traits", - "num_cpus", "num_enum 0.6.1", - "once_cell", - "ouroboros", - "percentage", + "pbkdf2 0.11.0", + "qstring", + "qualifier_attr", "rand 0.7.3", - "rayon", - "regex", + "rand 0.8.5", "rustc_version", + "rustversion", "serde", + "serde_bytes", "serde_derive", - "solana-address-lookup-table-program", - "solana-bpf-loader-program", - "solana-bucket-map", - "solana-compute-budget-program", - "solana-config-program", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-loader-v4-program", - "solana-measure", - "solana-metrics", - "solana-perf", - "solana-program-runtime", - "solana-rayon-threadlimit", - "solana-sdk", - "solana-stake-program", - "solana-system-program", - "solana-vote-program", - "solana-zk-token-proof-program", - "solana-zk-token-sdk", - "static_assertions", - "strum", - "strum_macros", - "symlink", - "tar", - "tempfile", - "thiserror", - "zstd", -] - -[[package]] -name = "solana-sdk" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "621e6973766420162541b26e7974783d32d5471571610da30c5bb0b6263046c9" -dependencies = [ - "assert_matches", - "base64 0.21.4", - "bincode", - "bitflags", - "borsh 0.10.3", - "bs58 0.4.0", - "bytemuck", - "byteorder", - "chrono", - "derivation-path", - "digest 0.10.7", - "ed25519-dalek", - "ed25519-dalek-bip32", - "generic-array", - "hmac 0.12.1", - "itertools", - "js-sys", - "lazy_static", - "libsecp256k1", - "log", - "memmap2", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.6.1", - "pbkdf2 0.11.0", - "qstring", - "rand 0.7.3", - "rand_chacha 0.2.2", - "rustc_version", - "rustversion", - "serde", - "serde_bytes", - "serde_derive", - "serde_json", - "serde_with", - "sha2 0.10.7", - "sha3 0.10.8", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3 0.10.8", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", @@ -4742,60 +4221,29 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd177a74fb3a0a362f1292c027d668eff609ac189f08b78158324587a0a4f8d1" +checksum = "015ca49e4cec213f034468b5d1fd2faea554be32e2144c90c409304121d781e6" dependencies = [ "bs58 0.4.0", - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "rustversion", - "syn 2.0.23", -] - -[[package]] -name = "solana-send-transaction-service" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f275f96dd61f421bda5c9cde7698d85348824f7fa2a8c4544ad24692ac50cd8" -dependencies = [ - "crossbeam-channel", - "log", - "solana-client", - "solana-measure", - "solana-metrics", - "solana-runtime", - "solana-sdk", - "solana-tpu-client", -] - -[[package]] -name = "solana-stake-program" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5421decf09671329c4786ed209acfe986bb51272f91e13e4744b13a69c800680" -dependencies = [ - "bincode", - "log", - "rustc_version", - "solana-config-program", - "solana-program-runtime", - "solana-sdk", - "solana-vote-program", + "syn 2.0.77", ] [[package]] name = "solana-streamer" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3942a60afb0282b07ef0f3c32078145ab7545cbed2cac98f1ec4b9f63016df62" +checksum = "af376501d990f281b9249c5072ceef73bd5fc10700e877b27c1737b14cf447a2" dependencies = [ "async-channel", "bytes", "crossbeam-channel", "futures-util", "histogram", - "indexmap 1.9.3", + "indexmap 2.5.0", "itertools", "libc", "log", @@ -4805,10 +4253,9 @@ dependencies = [ "pkcs8", "quinn", "quinn-proto", - "quinn-udp", - "rand 0.7.3", + "rand 0.8.5", "rcgen", - "rustls 0.20.9", + "rustls", "solana-metrics", "solana-perf", "solana-sdk", @@ -4817,25 +4264,11 @@ dependencies = [ "x509-parser", ] -[[package]] -name = "solana-system-program" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6101d189dc10a96388c695ca1d9f23f74f0fd96330f6adefafd7d6999a20ff6e" -dependencies = [ - "bincode", - "log", - "serde", - "serde_derive", - "solana-program-runtime", - "solana-sdk", -] - [[package]] name = "solana-thin-client" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d712aaf7701a4504521fc09f1743c647edf596e3852a64f6d66b2e5a822388f8" +checksum = "749ba2ec60049a0c855fd971757465b82f5b99962f0c106f3bf83db2e8265637" dependencies = [ "bincode", "log", @@ -4848,17 +4281,16 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb32f7443f80cb45e244d514a706b030b5a71ef86b0436c1d39cbfff5491b4" +checksum = "8aa49abe807db6f2a4e6ff5e5ade1835940f1ee311bbb94bfd9d05abf959ea62" dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 1.9.3", + "indexmap 2.5.0", "indicatif", "log", - "rand 0.7.3", "rayon", "solana-connection-cache", "solana-measure", @@ -4873,14 +4305,14 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aed485ddb4268b4e4ec64012016cd54ba3a4142377a99706fc3ab7768eb2bea" +checksum = "884c541fae17c7cd3dd851f9e05a5adf3afd1b18122839fb4a3604feb4129386" dependencies = [ "Inflector", - "base64 0.21.4", + "base64 0.21.7", "bincode", - "borsh 0.9.3", + "borsh 0.10.3", "bs58 0.4.0", "lazy_static", "log", @@ -4888,20 +4320,19 @@ dependencies = [ "serde_derive", "serde_json", "solana-account-decoder", - "solana-address-lookup-table-program", "solana-sdk", - "spl-associated-token-account 1.1.3", - "spl-memo 3.0.1", - "spl-token 3.5.0", - "spl-token-2022 0.6.1", + "spl-associated-token-account", + "spl-memo", + "spl-token", + "spl-token-2022", "thiserror", ] [[package]] name = "solana-udp-client" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c92798affef44c1ae2a694006209608044e99106b7945966d53586f5a95d9e2" +checksum = "dfa91410ff195d0b7a4e46f4cef9cf3699961ee02654fe0ca590c01958ca59fe" dependencies = [ "async-trait", "solana-connection-cache", @@ -4914,9 +4345,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a80a20dfea2afed91761ab3fecc8f96b973a742dc7728f3e343711efe6e8e05f" +checksum = "45ced655d4e15fe1d52b4ecfb93c656dab933b2fd414a6879981e0ab1c854010" dependencies = [ "log", "rustc_version", @@ -4930,9 +4361,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8b719e077cc9e42b8965dd06ff6b5f09fa2a436f2297efdcf471c05d187a6c" +checksum = "aa36601af633b2854b2e38ceb7604f50f7e5739a150d57865ebb6e586ed142f6" dependencies = [ "bincode", "log", @@ -4950,29 +4381,14 @@ dependencies = [ "thiserror", ] -[[package]] -name = "solana-zk-token-proof-program" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5404829f9236ac760a943a4e2f16be6f180ce4a07e1bbb9d538dcfa62b98888c" -dependencies = [ - "bytemuck", - "getrandom 0.1.16", - "num-derive 0.3.3", - "num-traits", - "solana-program-runtime", - "solana-sdk", - "solana-zk-token-sdk", -] - [[package]] name = "solana-zk-token-sdk" -version = "1.16.15" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61aabdec9fe1b311dce5d21fa5bd58fbaa985e8003e0d0aedf3795113aacc1ea" +checksum = "40f5be2f291d3a1692fc878dc98a841032df7672ba0878bbef43677e705b19cd" dependencies = [ "aes-gcm-siv", - "base64 0.21.4", + "base64 0.21.7", "bincode", "bytemuck", "byteorder", @@ -4996,9 +4412,9 @@ dependencies = [ [[package]] name = "solana_rbpf" -version = "0.6.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d4ba1e58947346e360fabde0697029d36ba83c42f669199b16a8931313cf29" +checksum = "103318aa365ff7caa8cf534f2246b5eb7e5b34668736d52b1266b143f7a21196" dependencies = [ "byteorder", "combine", @@ -5035,22 +4451,6 @@ dependencies = [ "der", ] -[[package]] -name = "spl-associated-token-account" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978dba3bcbe88d0c2c58366c254d9ea41c5f73357e72fc0bdee4d6b5fc99c8f4" -dependencies = [ - "assert_matches", - "borsh 0.9.3", - "num-derive 0.3.3", - "num-traits", - "solana-program", - "spl-token 3.5.0", - "spl-token-2022 0.6.1", - "thiserror", -] - [[package]] name = "spl-associated-token-account" version = "2.2.0" @@ -5062,8 +4462,8 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", - "spl-token-2022 0.9.0", + "spl-token", + "spl-token-2022", "thiserror", ] @@ -5084,9 +4484,9 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ - "quote 1.0.29", + "quote", "spl-discriminator-syn", - "syn 2.0.23", + "syn 2.0.77", ] [[package]] @@ -5095,22 +4495,13 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "sha2 0.10.7", - "syn 2.0.23", + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.77", "thiserror", ] -[[package]] -name = "spl-memo" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" -dependencies = [ - "solana-program", -] - [[package]] name = "spl-memo" version = "4.0.0" @@ -5152,10 +4543,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "sha2 0.10.7", - "syn 2.0.23", + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.77", ] [[package]] @@ -5172,21 +4563,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-token" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", - "solana-program", - "thiserror", -] - [[package]] name = "spl-token" version = "4.0.0" @@ -5202,24 +4578,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "spl-token-2022" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0043b590232c400bad5ee9eb983ced003d15163c4c5d56b090ac6d9a57457b47" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", - "solana-program", - "solana-zk-token-sdk", - "spl-memo 3.0.1", - "spl-token 3.5.0", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "0.9.0" @@ -5233,9 +4591,9 @@ dependencies = [ "num_enum 0.7.1", "solana-program", "solana-zk-token-sdk", - "spl-memo 4.0.0", + "spl-memo", "spl-pod", - "spl-token 4.0.0", + "spl-token", "spl-token-metadata-interface", "spl-transfer-hook-interface", "spl-type-length-value", @@ -5285,12 +4643,6 @@ dependencies = [ "spl-program-error", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.8.0" @@ -5304,26 +4656,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "strum" -version = "0.24.1" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.63", - "quote 1.0.29", - "rustversion", - "syn 1.0.109", -] +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -5331,128 +4667,103 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" -[[package]] -name = "symlink" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" - [[package]] name = "syn" -version = "0.15.44" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] name = "syn" -version = "1.0.109" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "unicode-ident", ] [[package]] -name = "syn" -version = "2.0.23" +name = "syn_derive" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "unicode-ident", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", + "proc-macro2", + "quote", "syn 1.0.109", - "unicode-xid 0.2.4", + "unicode-xid", ] [[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tar" -version = "0.4.40" +name = "system-configuration" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "filetime", - "libc", - "xattr", + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", ] [[package]] -name = "tarpc" -version = "0.29.0" +name = "system-configuration-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38a012bed6fb9681d3bf71ffaa4f88f3b4b9ed3198cda6e4c8462d24d4bb80" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" dependencies = [ - "anyhow", - "fnv", - "futures", - "humantime", - "opentelemetry", - "pin-project", - "rand 0.8.5", - "serde", - "static_assertions", - "tarpc-plugins", - "thiserror", - "tokio", - "tokio-serde", - "tokio-util 0.6.10", - "tracing", - "tracing-opentelemetry", + "core-foundation-sys", + "libc", ] [[package]] -name = "tarpc-plugins" -version = "0.12.0" +name = "tap" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" -dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", -] +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.6.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ - "autocfg", "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "once_cell", "rustix", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "termcolor" -version = "1.1.3" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -5468,48 +4779,40 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.43" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" -dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", -] - -[[package]] -name = "thread_local" -version = "1.1.7" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ - "cfg-if", - "once_cell", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] name = "time" -version = "0.3.26" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a79d09ac6b08c1ab3906a2f7cc2e81a0e27c7ae89c63812df75e52bef0751e07" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "num-conv", + "powerfmt", "serde", "time-core", "time-macros", @@ -5517,16 +4820,17 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.12" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c65469ed6b3a4809d987a41eb1dc918e9bc1d92211cbad7ae82931846f7451" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] @@ -5551,9 +4855,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -5566,67 +4870,48 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.14.1" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d0183f6f6001549ab68f8c7585093bb732beefbcf6d23a10b9b95c73a1dd49" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", - "num_cpus", - "once_cell", - "parking_lot 0.11.2", + "parking_lot", "pin-project-lite", "signal-hook-registry", + "socket2", "tokio-macros", - "winapi", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 1.0.109", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] name = "tokio-rustls" -version = "0.23.4" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.20.9", + "rustls", "tokio", - "webpki", -] - -[[package]] -name = "tokio-serde" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" -dependencies = [ - "bincode", - "bytes", - "educe", - "futures-core", - "futures-sink", - "pin-project", - "serde", - "serde_json", ] [[package]] name = "tokio-stream" -version = "0.1.12" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -5635,49 +4920,32 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.17.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls 0.20.9", + "rustls", "tokio", "tokio-rustls", "tungstenite", - "webpki", - "webpki-roots 0.22.6", + "webpki-roots 0.25.4", ] [[package]] name = "tokio-util" -version = "0.6.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", "pin-project-lite", - "slab", "tokio", ] -[[package]] -name = "tokio-util" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - [[package]] name = "toml" version = "0.5.11" @@ -5689,26 +4957,37 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.5.0", + "toml_datetime", + "winnow 0.5.40", +] [[package]] name = "toml_edit" -version = "0.19.12" +version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c500344a19072298cd05a7224b3c0c629348b78692bf48466c5238656e315a78" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.5.0", "toml_datetime", - "winnow", + "winnow 0.6.18", ] [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -5728,9 +5007,9 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -5740,129 +5019,79 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" -dependencies = [ - "once_cell", - "opentelemetry", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "sharded-slab", - "thread_local", - "tracing-core", ] [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.17.3" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" dependencies = [ - "base64 0.13.1", "byteorder", "bytes", + "data-encoding", "http", "httparse", "log", "rand 0.8.5", - "rustls 0.20.9", - "sha-1", + "rustls", + "sha1", "thiserror", "url", "utf-8", - "webpki", - "webpki-roots 0.22.6", + "webpki-roots 0.24.0", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "uint" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9db035e67dfaf7edd9aebfe8676afcd63eed53c8a4044fed514c8cccf1835177" -dependencies = [ - "byteorder", - "crunchy", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "unicode-xid" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" [[package]] name = "universal-hash" @@ -5895,24 +5124,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "ureq" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" -dependencies = [ - "base64 0.21.4", - "flate2", - "log", - "once_cell", - "rustls 0.21.10", - "rustls-webpki", - "serde", - "serde_json", - "url", - "webpki-roots 0.25.3", -] - [[package]] name = "uriparse" version = "0.6.4" @@ -5925,9 +5136,9 @@ dependencies = [ [[package]] name = "url" -version = "2.4.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -5942,21 +5153,15 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" - -[[package]] -name = "valuable" -version = "0.1.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" [[package]] name = "vec_map" @@ -5966,9 +5171,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "void" @@ -5976,25 +5181,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "walkdir" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "want" version = "0.3.1" @@ -6018,34 +5204,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -6055,67 +5242,57 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ - "quote 1.0.29", + "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" -dependencies = [ - "ring 0.17.3", - "untrusted 0.9.0", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" dependencies = [ - "webpki", + "rustls-webpki", ] [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "winapi" @@ -6135,11 +5312,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -6150,35 +5327,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af6041b3f84485c21b57acdc0fee4f4f0c93f426053dc05fa5d6fc262537bbff" -dependencies = [ - "windows-targets 0.48.1", -] - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.42.2", + "windows-targets 0.52.6", ] [[package]] @@ -6187,7 +5340,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -6196,196 +5349,165 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] -name = "windows-targets" -version = "0.42.2" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.52.6", ] [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "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.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "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.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] -name = "windows_i686_gnu" -version = "0.52.0" +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_msvc" -version = "0.52.0" +name = "winnow" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] [[package]] name = "winnow" -version = "0.4.8" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9482fe6ceabdf32f3966bfdd350ba69256a97c30253dc616fe0005af24f164e" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] @@ -6416,21 +5538,33 @@ dependencies = [ ] [[package]] -name = "xattr" -version = "1.1.1" +name = "yasna" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc6ab6ec1907d1a901cdbcd2bd4cb9e7d64ce5c9739cbb97d3c391acd8c7fae" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" dependencies = [ - "libc", + "time", ] [[package]] -name = "yasna" -version = "0.5.2" +name = "zerocopy" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "time", + "byteorder", + "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.77", ] [[package]] @@ -6448,9 +5582,9 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.63", - "quote 1.0.29", - "syn 2.0.23", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -6474,9 +5608,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 5856da9c..a3fbb7cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,20 +9,18 @@ clap = "4.3.3" anyhow = "1.0.71" shellexpand = "3.1.0" rust_decimal = "1.31.0" -spl-associated-token-account = "1" -mpl-token-metadata = "3.0.1" rand = "0.8.5" -tokio = "~1.14.1" +tokio = "1.20.0" serde_json = "1.0.48" serde = "1.0.104" -solana-transaction-status = "1.16.12" +solana-transaction-status = "=1.17.3" +spl-associated-token-account = "2.2.0" +spl-transfer-hook-interface = "0.3.0" env_logger = "0.9.0" log = "0.4.17" bs58 = "0.5.0" -chrono = "0.4.31" hyper = "0.14.17" routerify = "3" -ureq = "2.0.0" bincode = "1.3.3" commons = { path = "./commons" } diff --git a/artifacts/lb_clmm.so b/artifacts/lb_clmm.so index 0c123d1f993a581945b73fd05c09ba23c229f4c5..b42e249fba930ef277584556d9eeadc5be946335 100755 GIT binary patch literal 1457024 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℘z^PlU~F78r$xJB)tfBsYZ_s@U&a0&hg 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 Uy5yayv-XP|Ec=g3-q+**Ke(fSrT_o{ literal 1486400 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 z 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 **y3Y5 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
$zbEE0DjGv@aJhgQamy7>@k0o^M3? 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�()-%&f>?=RgkP3VK`QNs*ymuZ{fxhq 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%0DbJM1P|g>u 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 Q=lz$%C;#D!w|V^k2cguh2mk;8 diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 039615a3..ddf45a63 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -10,18 +10,15 @@ authors = ["tian "] [dependencies] commons = { workspace = true } anchor-lang = { workspace = true } -anchor-spl = { workspace = true } +anchor-spl = { workspace = true, features = ["metadata"] } anchor-client = { workspace = true, features = ["async"] } clap = { workspace = true, features = ["derive"] } anyhow = { workspace = true } shellexpand = { workspace = true } rust_decimal = { workspace = true, features = ["maths"] } lb_clmm = { path = "../programs/lb_clmm", features = ["cpi"] } -spl-associated-token-account = { workspace = true } -mpl-token-metadata = { workspace = true } rand = { workspace = true } tokio = { workspace = true, features = ["full", "parking_lot"] } bincode = { workspace = true } - -[dev-dependencies] -proptest = "1.2.0" +spl-associated-token-account = { workspace = true } +spl-transfer-hook-interface = { workspace = true } diff --git a/cli/src/instructions/add_liquidity.rs b/cli/src/instructions/add_liquidity.rs index 75b64d16..fc52f811 100644 --- a/cli/src/instructions/add_liquidity.rs +++ b/cli/src/instructions/add_liquidity.rs @@ -2,14 +2,23 @@ use std::ops::Deref; use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; use anchor_client::solana_sdk::compute_budget::ComputeBudgetInstruction; +use anchor_client::solana_sdk::instruction::Instruction; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; +use anchor_lang::{InstructionData, ToAccountMetas}; use anyhow::*; use lb_clmm::accounts; use lb_clmm::instruction; use lb_clmm::instructions::add_liquidity::{BinLiquidityDistribution, LiquidityParameter}; - -use crate::instructions::utils::{get_bin_arrays_for_position, get_or_create_ata}; +use lb_clmm::state::position::PositionV2; +use lb_clmm::utils::remaining_accounts_util::{ + AccountsType, RemainingAccountsInfo, RemainingAccountsSlice, +}; + +use crate::instructions::utils::{ + get_bin_array_account_meta_by_bin_range, get_extra_account_metas_for_transfer_hook, + get_or_create_ata, +}; use lb_clmm::constants::BASIS_POINT_MAX; use lb_clmm::state::lb_pair::LbPair; use lb_clmm::utils::pda::{derive_bin_array_bitmap_extension, derive_event_authority_pda}; @@ -37,19 +46,19 @@ pub async fn add_liquidity + Clone>( } = params; let lb_pair_state: LbPair = program.account(lb_pair).await?; + let position_state: PositionV2 = program.account(position).await?; - let token_programs = program + let mint_x_owner = program .async_rpc() - .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) - .await? - .into_iter() - .map(|account| Some(account?.owner)) - .collect::>>() - .context("Missing token mint account")?; + .get_account(&lb_pair_state.token_x_mint) + .await + .map(|acc| acc.owner)?; - let [token_x_program, token_y_program] = token_programs.as_slice() else { - bail!("Missing token program accounts"); - }; + let mint_y_owner = program + .async_rpc() + .get_account(&lb_pair_state.token_y_mint) + .await + .map(|acc| acc.owner)?; let bin_liquidity_distribution = bin_liquidity_distribution .into_iter() @@ -60,14 +69,12 @@ pub async fn add_liquidity + Clone>( }) .collect::>(); - let [bin_array_lower, bin_array_upper] = get_bin_arrays_for_position(program, position).await?; - let user_token_x = get_or_create_ata( program, transaction_config, lb_pair_state.token_x_mint, program.payer(), - *token_x_program, + mint_x_owner, ) .await?; @@ -76,11 +83,10 @@ pub async fn add_liquidity + Clone>( transaction_config, lb_pair_state.token_y_mint, program.payer(), - *token_y_program, + mint_y_owner, ) .await?; - // TODO: id and price slippage let (bin_array_bitmap_extension, _bump) = derive_bin_array_bitmap_extension(lb_pair); let bin_array_bitmap_extension = if program .rpc() @@ -94,9 +100,7 @@ pub async fn add_liquidity + Clone>( let (event_authority, _bump) = derive_event_authority_pda(); - let accounts = accounts::ModifyLiquidity { - bin_array_lower, - bin_array_upper, + let mut ix_accounts = accounts::ModifyLiquidity2 { lb_pair, bin_array_bitmap_extension, position, @@ -107,27 +111,66 @@ pub async fn add_liquidity + Clone>( sender: program.payer(), user_token_x, user_token_y, - token_x_program: *token_x_program, - token_y_program: *token_y_program, + token_x_program: mint_x_owner, + token_y_program: mint_y_owner, event_authority, program: lb_clmm::ID, - }; + memo_program: anchor_spl::memo::ID, + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; + + let transfer_hook_x_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); - let ix = instruction::AddLiquidity { + let transfer_hook_y_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); + + let bin_arrays = get_bin_array_account_meta_by_bin_range( + lb_pair, + position_state.lower_bin_id, + position_state.upper_bin_id, + )?; + + ix_accounts.extend(transfer_hook_x_accounts); + ix_accounts.extend(transfer_hook_y_accounts); + ix_accounts.extend(bin_arrays); + + let ix_data = instruction::AddLiquidity2 { liquidity_parameter: LiquidityParameter { amount_x, amount_y, bin_liquidity_dist: bin_liquidity_distribution, }, - }; + remaining_accounts_info, + } + .data(); let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_limit(1_400_000); + let ix = Instruction { + program_id: lb_clmm::ID, + accounts: ix_accounts, + data: ix_data, + }; + let request_builder = program.request(); let signature = request_builder .instruction(compute_budget_ix) - .accounts(accounts) - .args(ix) + .instruction(ix) .send_with_spinner_and_config(transaction_config) .await; diff --git a/cli/src/instructions/claim_fee.rs b/cli/src/instructions/claim_fee.rs index dbbe31a3..def2fb2f 100644 --- a/cli/src/instructions/claim_fee.rs +++ b/cli/src/instructions/claim_fee.rs @@ -1,13 +1,24 @@ -use super::utils::{get_bin_arrays_for_position, get_or_create_ata}; +use crate::instructions::utils::get_bin_array_account_meta_by_bin_range; +use crate::instructions::utils::get_extra_account_metas_for_transfer_hook; + +use super::utils::get_or_create_ata; +use anchor_client::solana_sdk::instruction::Instruction; use anchor_client::{ solana_client::rpc_config::RpcSendTransactionConfig, solana_sdk::signer::Signer, Program, }; use anchor_lang::prelude::Pubkey; +use anchor_lang::InstructionData; +use anchor_lang::ToAccountMetas; +use anchor_spl::memo; use anyhow::*; use lb_clmm::accounts; use lb_clmm::instruction; -use lb_clmm::state::{lb_pair::LbPair, position::Position}; +use lb_clmm::state::lb_pair::LbPair; +use lb_clmm::state::position::PositionV2; use lb_clmm::utils::pda::derive_event_authority_pda; +use lb_clmm::utils::remaining_accounts_util::AccountsType; +use lb_clmm::utils::remaining_accounts_util::RemainingAccountsInfo; +use lb_clmm::utils::remaining_accounts_util::RemainingAccountsSlice; use std::ops::Deref; pub async fn claim_fee + Clone>( @@ -15,46 +26,42 @@ pub async fn claim_fee + Clone>( program: &Program, transaction_config: RpcSendTransactionConfig, ) -> Result<()> { - let position_state: Position = program.account(position).await?; + let position_state: PositionV2 = program.account(position).await?; let lb_pair_state: LbPair = program.account(position_state.lb_pair).await?; - let token_programs = program + let mint_x_owner = program .async_rpc() - .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) - .await? - .into_iter() - .map(|account| Some(account?.owner)) - .collect::>>() - .context("Missing token mint account")?; - - let [token_x_program, token_y_program] = token_programs.as_slice() else { - bail!("Missing token program accounts"); - }; + .get_account(&lb_pair_state.token_x_mint) + .await + .map(|acc| acc.owner)?; + + let mint_y_owner = program + .async_rpc() + .get_account(&lb_pair_state.token_y_mint) + .await + .map(|acc| acc.owner)?; let user_token_x = get_or_create_ata( program, transaction_config, lb_pair_state.token_x_mint, program.payer(), - *token_x_program, + mint_x_owner, ) .await?; + let user_token_y = get_or_create_ata( program, transaction_config, lb_pair_state.token_y_mint, program.payer(), - *token_y_program, + mint_y_owner, ) .await?; - let [bin_array_lower, bin_array_upper] = get_bin_arrays_for_position(program, position).await?; - let (event_authority, _bump) = derive_event_authority_pda(); - let accounts = accounts::ClaimFee2 { - bin_array_lower, - bin_array_upper, + let mut ix_accounts = accounts::ClaimFee2 { lb_pair: position_state.lb_pair, sender: program.payer(), position, @@ -66,16 +73,58 @@ pub async fn claim_fee + Clone>( user_token_y, event_authority, program: lb_clmm::ID, - token_program_x: *token_x_program, - token_program_y: *token_y_program, - }; + token_program_x: mint_x_owner, + token_program_y: mint_y_owner, + memo_program: memo::ID, + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; - let ix = instruction::ClaimFee {}; + let transfer_hook_x_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); + + let transfer_hook_y_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); + + let bin_arrays = get_bin_array_account_meta_by_bin_range( + position_state.lb_pair, + position_state.lower_bin_id, + position_state.upper_bin_id, + )?; + + ix_accounts.extend(transfer_hook_x_accounts); + ix_accounts.extend(transfer_hook_y_accounts); + ix_accounts.extend(bin_arrays); + + let ix_data = instruction::ClaimFee2 { + min_bin_id: position_state.lower_bin_id, + max_bin_id: position_state.upper_bin_id, + remaining_accounts_slice: remaining_accounts_info, + } + .data(); + + let ix = Instruction { + data: ix_data, + accounts: ix_accounts, + program_id: lb_clmm::ID, + }; let request_builder = program.request(); let signature = request_builder - .accounts(accounts) - .args(ix) + .instruction(ix) .send_with_spinner_and_config(transaction_config) .await; diff --git a/cli/src/instructions/claim_reward.rs b/cli/src/instructions/claim_reward.rs index 710cf8ef..8021b060 100644 --- a/cli/src/instructions/claim_reward.rs +++ b/cli/src/instructions/claim_reward.rs @@ -1,11 +1,21 @@ -use crate::instructions::utils::{get_bin_arrays_for_position, get_or_create_ata}; +use crate::instructions::utils::{ + get_bin_array_account_meta_by_bin_range, get_bin_arrays_for_position, + get_extra_account_metas_for_transfer_hook, get_or_create_ata, +}; use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; +use anchor_client::solana_sdk::instruction::Instruction; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; +use anchor_lang::{InstructionData, ToAccountMetas}; +use anchor_spl::memo; use anyhow::*; use lb_clmm::accounts; use lb_clmm::instruction; use lb_clmm::state::lb_pair::LbPair; +use lb_clmm::state::position::PositionV2; use lb_clmm::utils::pda::*; +use lb_clmm::utils::remaining_accounts_util::{ + AccountsType, RemainingAccountsInfo, RemainingAccountsSlice, +}; use std::ops::Deref; #[derive(Debug)] @@ -28,6 +38,7 @@ pub async fn claim_reward + Clone>( let (reward_vault, _bump) = derive_reward_vault_pda(lb_pair, reward_index); let lb_pair_state: LbPair = program.account(lb_pair).await?; + let position_state: PositionV2 = program.account(position).await?; let reward_info = lb_pair_state.reward_infos[reward_index as usize]; let reward_mint = reward_info.mint; @@ -43,13 +54,9 @@ pub async fn claim_reward + Clone>( ) .await?; - let [bin_array_lower, bin_array_upper] = get_bin_arrays_for_position(program, position).await?; - let (event_authority, _bump) = derive_event_authority_pda(); - let accounts = accounts::ClaimReward { - bin_array_lower, - bin_array_upper, + let mut ix_accounts = accounts::ClaimReward2 { lb_pair, reward_vault, reward_mint, @@ -59,14 +66,46 @@ pub async fn claim_reward + Clone>( sender: program.payer(), event_authority, program: lb_clmm::ID, - }; + memo_program: memo::ID, + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; + + let transfer_hook_reward_accounts = + get_extra_account_metas_for_transfer_hook(reward_mint, program.async_rpc()).await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookReward, + length: transfer_hook_reward_accounts.len() as u8, + }); - let ix = instruction::ClaimReward { reward_index }; + let bin_arrays = get_bin_array_account_meta_by_bin_range( + position_state.lb_pair, + position_state.lower_bin_id, + position_state.upper_bin_id, + )?; + + ix_accounts.extend(transfer_hook_reward_accounts); + ix_accounts.extend(bin_arrays); + + let ix_data = instruction::ClaimReward2 { + reward_index, + remaining_accounts_info, + min_bin_id: position_state.lower_bin_id, + max_bin_id: position_state.upper_bin_id, + } + .data(); + + let ix = Instruction { + program_id: lb_clmm::ID, + accounts: ix_accounts, + data: ix_data, + }; let request_builder = program.request(); let signature = request_builder - .accounts(accounts) - .args(ix) + .instruction(ix) .send_with_spinner_and_config(transaction_config) .await; diff --git a/cli/src/instructions/fund_reward.rs b/cli/src/instructions/fund_reward.rs index 5635cf0e..b5beb70e 100644 --- a/cli/src/instructions/fund_reward.rs +++ b/cli/src/instructions/fund_reward.rs @@ -1,12 +1,17 @@ -use crate::instructions::utils::get_or_create_ata; +use crate::instructions::utils::{get_extra_account_metas_for_transfer_hook, get_or_create_ata}; use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; +use anchor_client::solana_sdk::instruction::Instruction; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; +use anchor_lang::{InstructionData, ToAccountMetas}; use anyhow::*; use lb_clmm::accounts; use lb_clmm::instruction; use lb_clmm::state::bin::BinArray; use lb_clmm::state::lb_pair::LbPair; use lb_clmm::utils::pda::*; +use lb_clmm::utils::remaining_accounts_util::{ + AccountsType, RemainingAccountsInfo, RemainingAccountsSlice, +}; use std::ops::Deref; #[derive(Debug)] @@ -52,7 +57,7 @@ pub async fn fund_reward + Clone>( let (event_authority, _bump) = derive_event_authority_pda(); - let accounts = accounts::FundReward { + let mut ix_accounts = accounts::FundReward { lb_pair, reward_vault, reward_mint, @@ -62,18 +67,39 @@ pub async fn fund_reward + Clone>( token_program, event_authority, program: lb_clmm::ID, - }; + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; + + let transfer_hook_reward_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; - let ix = instruction::FundReward { + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookReward, + length: transfer_hook_reward_accounts.len() as u8, + }); + + ix_accounts.extend(transfer_hook_reward_accounts); + + let ix_data = instruction::FundReward { reward_index, amount: funding_amount, carry_forward: true, + remaining_accounts_info, + } + .data(); + + let ix = Instruction { + program_id: lb_clmm::ID, + accounts: ix_accounts, + data: ix_data, }; let request_builder = program.request(); let signature = request_builder - .accounts(accounts) - .args(ix) + .instruction(ix) .send_with_spinner_and_config(transaction_config) .await; diff --git a/cli/src/instructions/initialize_position.rs b/cli/src/instructions/initialize_position.rs index 85bf61c8..af00fac1 100644 --- a/cli/src/instructions/initialize_position.rs +++ b/cli/src/instructions/initialize_position.rs @@ -6,11 +6,11 @@ use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Prog use anchor_lang::prelude::AccountMeta; use anchor_lang::ToAccountMetas; +use anchor_spl::metadata::mpl_token_metadata::accounts::Metadata; use anyhow::*; use lb_clmm::accounts; use lb_clmm::instruction; use lb_clmm::utils::pda::derive_event_authority_pda; -use mpl_token_metadata::accounts::Metadata; use spl_associated_token_account::get_associated_token_address; #[derive(Debug)] diff --git a/cli/src/instructions/remove_liquidity.rs b/cli/src/instructions/remove_liquidity.rs index 93285c46..98dc0db9 100644 --- a/cli/src/instructions/remove_liquidity.rs +++ b/cli/src/instructions/remove_liquidity.rs @@ -3,17 +3,27 @@ use std::ops::Deref; use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; use anchor_client::solana_sdk::compute_budget::ComputeBudgetInstruction; +use anchor_client::solana_sdk::instruction::Instruction; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; - +use anchor_lang::InstructionData; +use anchor_lang::ToAccountMetas; +use anchor_spl::memo; use anyhow::*; use lb_clmm::accounts; use lb_clmm::constants::BASIS_POINT_MAX; use lb_clmm::instruction; use lb_clmm::instructions::remove_liquidity::BinLiquidityReduction; use lb_clmm::state::lb_pair::LbPair; +use lb_clmm::state::position::PositionV2; use lb_clmm::utils::pda::{derive_bin_array_bitmap_extension, derive_event_authority_pda}; +use lb_clmm::utils::remaining_accounts_util::{ + AccountsType, RemainingAccountsInfo, RemainingAccountsSlice, +}; -use crate::instructions::utils::{get_bin_arrays_for_position, get_or_create_ata}; +use crate::instructions::utils::{ + get_bin_array_account_meta_by_bin_range, get_extra_account_metas_for_transfer_hook, + get_or_create_ata, +}; pub struct RemoveLiquidityParameters { pub lb_pair: Pubkey, @@ -33,28 +43,26 @@ pub async fn remove_liquidity + Clone>( } = params; let lb_pair_state: LbPair = program.account(lb_pair).await?; + let position_state: PositionV2 = program.account(position).await?; - let token_programs = program + let mint_x_owner = program .async_rpc() - .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint]) - .await? - .into_iter() - .map(|account| Some(account?.owner)) - .collect::>>() - .context("Missing token mint account")?; - - let [token_x_program, token_y_program] = token_programs.as_slice() else { - bail!("Missing token program accounts"); - }; + .get_account(&lb_pair_state.token_x_mint) + .await + .map(|acc| acc.owner)?; - let [bin_array_lower, bin_array_upper] = get_bin_arrays_for_position(program, position).await?; + let mint_y_owner = program + .async_rpc() + .get_account(&lb_pair_state.token_y_mint) + .await + .map(|acc| acc.owner)?; let user_token_x = get_or_create_ata( program, transaction_config, lb_pair_state.token_x_mint, program.payer(), - *token_x_program, + mint_x_owner, ) .await?; @@ -63,7 +71,7 @@ pub async fn remove_liquidity + Clone>( transaction_config, lb_pair_state.token_y_mint, program.payer(), - *token_y_program, + mint_y_owner, ) .await?; @@ -81,9 +89,7 @@ pub async fn remove_liquidity + Clone>( let (event_authority, _bump) = derive_event_authority_pda(); - let accounts = accounts::ModifyLiquidity { - bin_array_lower, - bin_array_upper, + let mut ix_accounts = accounts::ModifyLiquidity2 { lb_pair, bin_array_bitmap_extension, position, @@ -94,11 +100,43 @@ pub async fn remove_liquidity + Clone>( sender: program.payer(), user_token_x, user_token_y, - token_x_program: anchor_spl::token::ID, - token_y_program: anchor_spl::token::ID, + token_x_program: mint_x_owner, + token_y_program: mint_y_owner, event_authority, program: lb_clmm::ID, - }; + memo_program: memo::ID, + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; + + let transfer_hook_x_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); + + let transfer_hook_y_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); + + let bin_arrays = get_bin_array_account_meta_by_bin_range( + position_state.lb_pair, + position_state.lower_bin_id, + position_state.upper_bin_id, + )?; + + ix_accounts.extend(transfer_hook_x_accounts); + ix_accounts.extend(transfer_hook_y_accounts); + ix_accounts.extend(bin_arrays); let bin_liquidity_removal = bin_liquidity_removal .into_iter() @@ -108,8 +146,16 @@ pub async fn remove_liquidity + Clone>( }) .collect::>(); - let ix = instruction::RemoveLiquidity { + let ix_data = instruction::RemoveLiquidity2 { bin_liquidity_removal, + remaining_accounts_info, + } + .data(); + + let ix = Instruction { + data: ix_data, + accounts: ix_accounts, + program_id: lb_clmm::ID, }; let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_limit(1_400_000); @@ -117,8 +163,7 @@ pub async fn remove_liquidity + Clone>( let request_builder = program.request(); let signature = request_builder .instruction(compute_budget_ix) - .accounts(accounts) - .args(ix) + .instruction(ix) .send_with_spinner_and_config(transaction_config) .await; diff --git a/cli/src/instructions/remove_liquidity_by_price_range.rs b/cli/src/instructions/remove_liquidity_by_price_range.rs index 34e5eb21..203af3df 100644 --- a/cli/src/instructions/remove_liquidity_by_price_range.rs +++ b/cli/src/instructions/remove_liquidity_by_price_range.rs @@ -1,4 +1,7 @@ -use crate::instructions::utils::get_or_create_ata; +use crate::instructions::utils::{ + get_bin_array_account_meta_by_bin_range, get_extra_account_metas_for_transfer_hook, + get_or_create_ata, +}; use crate::math::{get_id_from_price, price_per_token_to_per_lamport}; use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; use anchor_client::solana_sdk::compute_budget::ComputeBudgetInstruction; @@ -6,6 +9,7 @@ use anchor_client::solana_sdk::instruction::Instruction; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; use anchor_lang::InstructionData; use anchor_lang::ToAccountMetas; +use anchor_spl::memo; use anchor_spl::token::Mint; use anyhow::*; use lb_clmm::accounts; @@ -14,8 +18,11 @@ use lb_clmm::instruction; use lb_clmm::math::u128x128_math::Rounding; use lb_clmm::state::bin::BinArray; use lb_clmm::state::lb_pair::LbPair; -use lb_clmm::state::position::Position; +use lb_clmm::state::position::PositionV2; use lb_clmm::utils::pda::*; +use lb_clmm::utils::remaining_accounts_util::{ + AccountsType, RemainingAccountsInfo, RemainingAccountsSlice, +}; use std::ops::Deref; use std::result::Result::Ok; @@ -82,23 +89,8 @@ pub async fn remove_liquidity_by_price_range + Cl for i in min_active_id..=max_active_id { let (position, _bump) = derive_position_pda(lb_pair, base_position_key, i, width); - // if program.rpc().get_account_data(&position).is_ok() { - // let position_state: Position = program.account(position)?; - // println!("{position_state:?}"); - // } - // continue; - - match program.account::(position).await { + match program.account::(position).await { Ok(position_state) => { - let lower_bin_array_idx = - BinArray::bin_id_to_bin_array_index(position_state.lower_bin_id)?; - let upper_bin_array_idx = - lower_bin_array_idx.checked_add(1).context("MathOverflow")?; - - let (bin_array_lower, _bump) = - derive_bin_array_pda(lb_pair, lower_bin_array_idx.into()); - let (bin_array_upper, _bump) = - derive_bin_array_pda(lb_pair, upper_bin_array_idx.into()); let user_token_x = get_or_create_ata( program, transaction_config, @@ -116,69 +108,50 @@ pub async fn remove_liquidity_by_price_range + Cl *token_y_program, ) .await?; + let (event_authority, _bump) = derive_event_authority_pda(); + let remove_all_liquidity_ix = create_remove_all_liquidity_ix( + lb_pair, + position, + user_token_x, + user_token_y, + *token_x_program, + *token_y_program, + event_authority, + &lb_pair_state, + &position_state, + program, + ) + .await?; + + let claim_fee_ix = create_claim_fee_ix( + lb_pair, + position, + user_token_x, + user_token_y, + *token_x_program, + *token_y_program, + event_authority, + &lb_pair_state, + &position_state, + program, + ) + .await?; + + let close_position_ix = create_close_position_ix( + lb_pair, + position, + event_authority, + &position_state, + program, + )?; + let instructions = vec![ ComputeBudgetInstruction::set_compute_unit_limit(1_400_000), - Instruction { - program_id: lb_clmm::ID, - accounts: accounts::ModifyLiquidity { - bin_array_lower, - bin_array_upper, - lb_pair, - bin_array_bitmap_extension: None, - position, - reserve_x: lb_pair_state.reserve_x, - reserve_y: lb_pair_state.reserve_y, - token_x_mint: lb_pair_state.token_x_mint, - token_y_mint: lb_pair_state.token_y_mint, - sender: program.payer(), - user_token_x, - user_token_y, - token_x_program: anchor_spl::token::ID, - token_y_program: anchor_spl::token::ID, - event_authority, - program: lb_clmm::ID, - } - .to_account_metas(None), - data: instruction::RemoveAllLiquidity {}.data(), - }, - Instruction { - program_id: lb_clmm::ID, - accounts: accounts::ClaimFee { - bin_array_lower, - bin_array_upper, - lb_pair, - sender: program.payer(), - position, - reserve_x: lb_pair_state.reserve_x, - reserve_y: lb_pair_state.reserve_y, - token_program: anchor_spl::token::ID, - token_x_mint: lb_pair_state.token_x_mint, - token_y_mint: lb_pair_state.token_y_mint, - user_token_x, - user_token_y, - event_authority, - program: lb_clmm::ID, - } - .to_account_metas(None), - data: instruction::ClaimFee {}.data(), - }, - Instruction { - program_id: lb_clmm::ID, - accounts: accounts::ClosePosition { - lb_pair, - position, - bin_array_lower, - bin_array_upper, - rent_receiver: program.payer(), - sender: program.payer(), - event_authority, - program: lb_clmm::ID, - } - .to_account_metas(None), - data: instruction::ClosePosition {}.data(), - }, + remove_all_liquidity_ix, + claim_fee_ix, + close_position_ix, ]; let builder = program.request(); @@ -188,10 +161,194 @@ pub async fn remove_liquidity_by_price_range + Cl let signature = builder .send_with_spinner_and_config(transaction_config) .await?; - println!("close popsition min_bin_id {i} {signature}"); + println!("close position min_bin_id {i} {signature}"); } Err(_err) => continue, } } Ok(()) } + +fn create_close_position_ix + Clone>( + lb_pair: Pubkey, + position: Pubkey, + event_authority: Pubkey, + position_state: &PositionV2, + program: &Program, +) -> Result { + let lower_bin_array_idx = BinArray::bin_id_to_bin_array_index(position_state.lower_bin_id)?; + let upper_bin_array_idx = lower_bin_array_idx.checked_add(1).context("MathOverflow")?; + + let (bin_array_lower, _bump) = derive_bin_array_pda(lb_pair, lower_bin_array_idx.into()); + let (bin_array_upper, _bump) = derive_bin_array_pda(lb_pair, upper_bin_array_idx.into()); + + let ix_accounts = accounts::ClosePosition { + lb_pair, + position, + bin_array_lower, + bin_array_upper, + rent_receiver: program.payer(), + sender: program.payer(), + event_authority, + program: lb_clmm::ID, + } + .to_account_metas(None); + + let ix_data = instruction::ClaimFee {}.data(); + + Ok(Instruction { + program_id: lb_clmm::ID, + accounts: ix_accounts, + data: ix_data, + }) +} + +async fn create_claim_fee_ix + Clone>( + lb_pair: Pubkey, + position: Pubkey, + user_token_x: Pubkey, + user_token_y: Pubkey, + token_x_program: Pubkey, + token_y_program: Pubkey, + event_authority: Pubkey, + lb_pair_state: &LbPair, + position_state: &PositionV2, + program: &Program, +) -> Result { + let mut ix_accounts = accounts::ClaimFee2 { + lb_pair, + sender: program.payer(), + position, + reserve_x: lb_pair_state.reserve_x, + reserve_y: lb_pair_state.reserve_y, + token_x_mint: lb_pair_state.token_x_mint, + token_y_mint: lb_pair_state.token_y_mint, + token_program_x: token_x_program, + token_program_y: token_y_program, + user_token_x, + user_token_y, + event_authority, + program: lb_clmm::ID, + memo_program: memo::ID, + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; + + let transfer_hook_x_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); + + let transfer_hook_y_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); + + let bin_arrays = get_bin_array_account_meta_by_bin_range( + position_state.lb_pair, + position_state.lower_bin_id, + position_state.upper_bin_id, + )?; + + ix_accounts.extend(transfer_hook_x_accounts); + ix_accounts.extend(transfer_hook_y_accounts); + ix_accounts.extend(bin_arrays); + + let ix_data = instruction::ClaimFee2 { + min_bin_id: position_state.lower_bin_id, + max_bin_id: position_state.upper_bin_id, + remaining_accounts_slice: remaining_accounts_info, + } + .data(); + + Ok(Instruction { + program_id: lb_clmm::ID, + accounts: ix_accounts, + data: ix_data, + }) +} + +async fn create_remove_all_liquidity_ix + Clone>( + lb_pair: Pubkey, + position: Pubkey, + user_token_x: Pubkey, + user_token_y: Pubkey, + token_x_program: Pubkey, + token_y_program: Pubkey, + event_authority: Pubkey, + lb_pair_state: &LbPair, + position_state: &PositionV2, + program: &Program, +) -> Result { + let mut ix_accounts = accounts::ModifyLiquidity2 { + lb_pair, + bin_array_bitmap_extension: None, + position, + reserve_x: lb_pair_state.reserve_x, + reserve_y: lb_pair_state.reserve_y, + token_x_mint: lb_pair_state.token_x_mint, + token_y_mint: lb_pair_state.token_y_mint, + sender: program.payer(), + user_token_x, + user_token_y, + token_x_program, + token_y_program, + event_authority, + program: lb_clmm::ID, + memo_program: memo::ID, + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; + + let transfer_hook_x_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); + + let transfer_hook_y_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); + + let bin_arrays = get_bin_array_account_meta_by_bin_range( + position_state.lb_pair, + position_state.lower_bin_id, + position_state.upper_bin_id, + )?; + + ix_accounts.extend(transfer_hook_x_accounts); + ix_accounts.extend(transfer_hook_y_accounts); + ix_accounts.extend(bin_arrays); + + let ix_data = instruction::RemoveLiquidityByRange2 { + from_bin_id: position_state.lower_bin_id, + to_bin_id: position_state.upper_bin_id, + bps_to_remove: 10_000, + remaining_accounts_info, + } + .data(); + + Ok(Instruction { + program_id: lb_clmm::ID, + accounts: ix_accounts, + data: ix_data, + }) +} diff --git a/cli/src/instructions/seed_liquidity.rs b/cli/src/instructions/seed_liquidity.rs index 214d6f04..c5955aaa 100644 --- a/cli/src/instructions/seed_liquidity.rs +++ b/cli/src/instructions/seed_liquidity.rs @@ -1,6 +1,9 @@ use std::ops::Deref; -use crate::instructions::utils::get_or_create_ata; +use crate::instructions::utils::{ + get_bin_array_account_meta_by_bin_range, get_extra_account_metas_for_transfer_hook, + get_or_create_ata, +}; use crate::math::{ get_id_from_price, price_per_lamport_to_price_per_token, price_per_token_to_per_lamport, }; @@ -11,7 +14,8 @@ use anchor_client::solana_sdk::signature::Keypair; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; use anchor_lang::InstructionData; use anchor_lang::ToAccountMetas; -use anchor_spl::token::{Mint, TokenAccount}; +use anchor_spl::memo; +use anchor_spl::token_interface::{Mint, TokenAccount}; use anyhow::*; use lb_clmm::accounts; use lb_clmm::constants::{BASIS_POINT_MAX, MAX_BIN_PER_POSITION}; @@ -22,6 +26,9 @@ use lb_clmm::state::bin::BinArray; use lb_clmm::state::lb_pair::LbPair; use lb_clmm::state::position::PositionV2; use lb_clmm::utils::pda::*; +use lb_clmm::utils::remaining_accounts_util::{ + AccountsType, RemainingAccountsInfo, RemainingAccountsSlice, +}; use rust_decimal::prelude::{FromPrimitive, ToPrimitive}; use rust_decimal::{Decimal, MathematicalOps}; @@ -65,6 +72,14 @@ pub async fn seed_liquidity + Clone>( let token_mint_base: Mint = program.account(lb_pair_state.token_x_mint).await?; let token_mint_quote: Mint = program.account(lb_pair_state.token_y_mint).await?; + let transfer_hook_x_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; + + let transfer_hook_y_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.async_rpc()) + .await?; + // convert to wei amount let amount = amount .checked_mul(10u64.pow(token_mint_base.decimals as u32)) @@ -200,9 +215,6 @@ pub async fn seed_liquidity + Clone>( let mut instructions = vec![ComputeBudgetInstruction::set_compute_unit_limit(1_400_000)]; - let (bin_array_lower, _bump) = derive_bin_array_pda(lb_pair, lower_bin_array_idx.into()); - let (bin_array_upper, _bump) = derive_bin_array_pda(lb_pair, upper_bin_array_idx.into()); - let mut bin_amounts = vec![]; let mut position_total_amount = 0; @@ -232,35 +244,58 @@ pub async fn seed_liquidity + Clone>( }); } + let mut accounts = accounts::ModifyLiquidity2 { + lb_pair, + position, + bin_array_bitmap_extension: None, + sender: program.payer(), + event_authority, + program: lb_clmm::ID, + reserve_x: lb_pair_state.reserve_x, + reserve_y: lb_pair_state.reserve_y, + token_x_mint: lb_pair_state.token_x_mint, + token_y_mint: lb_pair_state.token_y_mint, + user_token_x, + user_token_y, + token_x_program: *token_x_program, + token_y_program: *token_y_program, + memo_program: memo::ID, + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); + + let bin_arrays = + get_bin_array_account_meta_by_bin_range(lb_pair, lower_bin_id, upper_bin_id)?; + + accounts.extend(transfer_hook_x_accounts.clone()); + accounts.extend(transfer_hook_y_accounts.clone()); + accounts.extend(bin_arrays); + + let data = instruction::AddLiquidity2 { + liquidity_parameter: LiquidityParameter { + amount_x: position_total_amount, + amount_y: 0, + bin_liquidity_dist, + }, + remaining_accounts_info, + } + .data(); + instructions.push(Instruction { program_id: lb_clmm::ID, - accounts: accounts::ModifyLiquidity { - lb_pair, - position, - bin_array_bitmap_extension: None, - bin_array_lower, - bin_array_upper, - sender: program.payer(), - event_authority, - program: lb_clmm::ID, - reserve_x: lb_pair_state.reserve_x, - reserve_y: lb_pair_state.reserve_y, - token_x_mint: lb_pair_state.token_x_mint, - token_y_mint: lb_pair_state.token_y_mint, - user_token_x, - user_token_y, - token_x_program: anchor_spl::token::ID, - token_y_program: anchor_spl::token::ID, - } - .to_account_metas(None), - data: instruction::AddLiquidity { - liquidity_parameter: LiquidityParameter { - amount_x: position_total_amount, - amount_y: 0, - bin_liquidity_dist, - }, - } - .data(), + accounts, + data, }); let builder = program.request(); @@ -288,45 +323,62 @@ pub async fn seed_liquidity + Clone>( let (position, _bump) = derive_position_pda(lb_pair, position_base_kp.pubkey(), lower_bin_id, width); - let lower_bin_array_idx = BinArray::bin_id_to_bin_array_index(lower_bin_id)?; - let upper_bin_array_idx = BinArray::bin_id_to_bin_array_index(upper_bin_id)?; + let mut accounts = accounts::ModifyLiquidity2 { + lb_pair, + position, + bin_array_bitmap_extension: None, + sender: program.payer(), + event_authority, + program: lb_clmm::ID, + reserve_x: lb_pair_state.reserve_x, + reserve_y: lb_pair_state.reserve_y, + token_x_mint: lb_pair_state.token_x_mint, + token_y_mint: lb_pair_state.token_y_mint, + user_token_x, + user_token_y, + token_x_program: *token_x_program, + token_y_program: *token_y_program, + memo_program: memo::ID, + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; - let (bin_array_lower, _bump) = derive_bin_array_pda(lb_pair, lower_bin_array_idx.into()); - let (bin_array_upper, _bump) = derive_bin_array_pda(lb_pair, upper_bin_array_idx.into()); + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); + + let bin_arrays = + get_bin_array_account_meta_by_bin_range(lb_pair, lower_bin_id, upper_bin_id)?; + + accounts.extend(transfer_hook_x_accounts.clone()); + accounts.extend(transfer_hook_y_accounts.clone()); + accounts.extend(bin_arrays); + + let data = instruction::AddLiquidity2 { + liquidity_parameter: LiquidityParameter { + amount_x: leftover, + amount_y: 0, + bin_liquidity_dist: vec![BinLiquidityDistribution { + bin_id: max_active_id, + distribution_x: 10000, + distribution_y: 0, + }], + }, + remaining_accounts_info, + } + .data(); let ix = Instruction { program_id: lb_clmm::ID, - accounts: accounts::ModifyLiquidity { - lb_pair, - position, - bin_array_bitmap_extension: None, - bin_array_lower, - bin_array_upper, - sender: program.payer(), - event_authority, - program: lb_clmm::ID, - reserve_x: lb_pair_state.reserve_x, - reserve_y: lb_pair_state.reserve_y, - token_x_mint: lb_pair_state.token_x_mint, - token_y_mint: lb_pair_state.token_y_mint, - user_token_x, - user_token_y, - token_x_program: anchor_spl::token::ID, - token_y_program: anchor_spl::token::ID, - } - .to_account_metas(None), - data: instruction::AddLiquidity { - liquidity_parameter: LiquidityParameter { - amount_x: leftover, - amount_y: 0, - bin_liquidity_dist: vec![BinLiquidityDistribution { - bin_id: max_active_id, - distribution_x: 10000, - distribution_y: 0, - }], - }, - } - .data(), + accounts, + data, }; let builder = program diff --git a/cli/src/instructions/simulate_swap_demand.rs b/cli/src/instructions/simulate_swap_demand.rs index 2b458607..00330ee7 100644 --- a/cli/src/instructions/simulate_swap_demand.rs +++ b/cli/src/instructions/simulate_swap_demand.rs @@ -3,7 +3,7 @@ use crate::swap; use crate::SwapExactInParameters; use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; -use anchor_spl::token::Mint; +use anchor_spl::token_interface::Mint; use anyhow::*; use lb_clmm::state::lb_pair::LbPair; use rand::Rng; diff --git a/cli/src/instructions/swap_exact_in.rs b/cli/src/instructions/swap_exact_in.rs index 96fd2c55..1e71dfd6 100644 --- a/cli/src/instructions/swap_exact_in.rs +++ b/cli/src/instructions/swap_exact_in.rs @@ -5,12 +5,14 @@ use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; use anchor_client::solana_sdk::clock::Clock; use anchor_client::solana_sdk::compute_budget::ComputeBudgetInstruction; +use anchor_client::solana_sdk::instruction::Instruction; use anchor_client::solana_sdk::sysvar::SysvarId; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; use anchor_lang::solana_program::instruction::AccountMeta; use anchor_lang::AccountDeserialize; use anchor_spl::associated_token::get_associated_token_address; +use anchor_spl::memo; use anyhow::*; use commons::quote::{get_bin_array_pubkeys_for_swap, quote_exact_in}; use lb_clmm::accounts; @@ -22,6 +24,13 @@ use lb_clmm::state::bin_array_bitmap_extension::BinArrayBitmapExtension; use lb_clmm::state::lb_pair::LbPair; use lb_clmm::utils::pda::*; +use anchor_lang::{InstructionData, ToAccountMetas}; +use lb_clmm::utils::remaining_accounts_util::{ + AccountsType, RemainingAccountsInfo, RemainingAccountsSlice, +}; + +use crate::instructions::utils::get_extra_account_metas_for_transfer_hook; + #[derive(Debug)] pub struct SwapExactInParameters { pub lb_pair: Pubkey, @@ -42,6 +51,18 @@ pub async fn swap + Clone>( let lb_pair_state: LbPair = program.account(lb_pair).await?; + let mint_x_owner = program + .async_rpc() + .get_account(&lb_pair_state.token_x_mint) + .await + .map(|acc| acc.owner)?; + + let mint_y_owner = program + .async_rpc() + .get_account(&lb_pair_state.token_y_mint) + .await + .map(|acc| acc.owner)?; + let (user_token_in, user_token_out) = if swap_for_y { ( get_associated_token_address(&program.payer(), &lb_pair_state.token_x_mint), @@ -105,10 +126,9 @@ pub async fn swap + Clone>( clock.slot, )?; - let (event_authority, _bump) = - Pubkey::find_program_address(&[b"__event_authority"], &lb_clmm::ID); + let (event_authority, _bump) = derive_event_authority_pda(); - let accounts = accounts::Swap { + let mut accounts = accounts::Swap2 { lb_pair, bin_array_bitmap_extension: bitmap_extension .map(|_| bitmap_extension_key) @@ -117,8 +137,8 @@ pub async fn swap + Clone>( reserve_y: lb_pair_state.reserve_y, token_x_mint: lb_pair_state.token_x_mint, token_y_mint: lb_pair_state.token_y_mint, - token_x_program: anchor_spl::token::ID, - token_y_program: anchor_spl::token::ID, + token_x_program: mint_x_owner, + token_y_program: mint_y_owner, user: program.payer(), user_token_in, user_token_out, @@ -126,29 +146,61 @@ pub async fn swap + Clone>( host_fee_in: Some(lb_clmm::ID), event_authority, program: lb_clmm::ID, - }; + memo_program: memo::ID, + } + .to_account_metas(None); - // 100 bps slippage - let min_amount_out = quote.amount_out * 9900 / BASIS_POINT_MAX as u64; + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; - let ix = instruction::Swap { - amount_in, - min_amount_out, - }; + let transfer_hook_x_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); + + let transfer_hook_y_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); let remaining_accounts = bin_arrays_for_swap .into_iter() .map(|key| AccountMeta::new(key, false)) .collect::>(); + accounts.extend(transfer_hook_x_accounts); + accounts.extend(transfer_hook_y_accounts); + accounts.extend(remaining_accounts); + + // 100 bps slippage + let min_amount_out = quote.amount_out * 9900 / BASIS_POINT_MAX as u64; + + let data = instruction::Swap2 { + amount_in, + min_amount_out, + remaining_accounts_info, + } + .data(); + + let ix = Instruction { + program_id: lb_clmm::ID, + data, + accounts, + }; + let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_limit(1_400_000); let request_builder = program.request(); let signature = request_builder .instruction(compute_budget_ix) - .accounts(accounts) - .accounts(remaining_accounts) - .args(ix) + .instruction(ix) .send_with_spinner_and_config(transaction_config) .await; diff --git a/cli/src/instructions/swap_with_price_impact.rs b/cli/src/instructions/swap_with_price_impact.rs index a54ec162..4d26100d 100644 --- a/cli/src/instructions/swap_with_price_impact.rs +++ b/cli/src/instructions/swap_with_price_impact.rs @@ -1,24 +1,30 @@ -use std::collections::HashMap; use std::ops::Deref; use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; use anchor_client::solana_sdk::compute_budget::ComputeBudgetInstruction; +use anchor_client::solana_sdk::instruction::Instruction; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; use anchor_lang::solana_program::instruction::AccountMeta; -use anchor_lang::AccountDeserialize; use anchor_spl::associated_token::get_associated_token_address; +use anchor_spl::memo; use anyhow::*; -use commons::quote::{get_bin_array_pubkeys_for_swap, quote_exact_in}; +use commons::quote::get_bin_array_pubkeys_for_swap; use lb_clmm::accounts; use lb_clmm::instruction; -use lb_clmm::state::bin::BinArray; use lb_clmm::state::bin_array_bitmap_extension::BinArrayBitmapExtension; use lb_clmm::state::lb_pair::LbPair; use lb_clmm::utils::pda::*; +use anchor_lang::{InstructionData, ToAccountMetas}; +use lb_clmm::utils::remaining_accounts_util::{ + AccountsType, RemainingAccountsInfo, RemainingAccountsSlice, +}; + +use crate::instructions::utils::get_extra_account_metas_for_transfer_hook; + #[derive(Debug)] pub struct SwapWithPriceImpactParameters { pub lb_pair: Pubkey, @@ -41,6 +47,18 @@ pub async fn swap_with_price_impact + Clone>( let lb_pair_state: LbPair = program.account(lb_pair).await?; + let mint_x_owner = program + .async_rpc() + .get_account(&lb_pair_state.token_x_mint) + .await + .map(|acc| acc.owner)?; + + let mint_y_owner = program + .async_rpc() + .get_account(&lb_pair_state.token_y_mint) + .await + .map(|acc| acc.owner)?; + let (user_token_in, user_token_out) = if swap_for_y { ( get_associated_token_address(&program.payer(), &lb_pair_state.token_x_mint), @@ -68,26 +86,9 @@ pub async fn swap_with_price_impact + Clone>( 3, )?; - let bin_arrays = program - .async_rpc() - .get_multiple_accounts(&bin_arrays_for_swap) - .await? - .into_iter() - .zip(bin_arrays_for_swap.iter()) - .map(|(account, &key)| { - let account = account?; - Some(( - key, - BinArray::try_deserialize(&mut account.data.as_ref()).ok()?, - )) - }) - .collect::>>() - .context("Failed to fetch bin arrays")?; - - let (event_authority, _bump) = - Pubkey::find_program_address(&[b"__event_authority"], &lb_clmm::ID); - - let accounts = accounts::Swap { + let (event_authority, _bump) = derive_event_authority_pda(); + + let mut accounts = accounts::Swap2 { lb_pair, bin_array_bitmap_extension: bitmap_extension .map(|_| bitmap_extension_key) @@ -96,8 +97,8 @@ pub async fn swap_with_price_impact + Clone>( reserve_y: lb_pair_state.reserve_y, token_x_mint: lb_pair_state.token_x_mint, token_y_mint: lb_pair_state.token_y_mint, - token_x_program: anchor_spl::token::ID, - token_y_program: anchor_spl::token::ID, + token_x_program: mint_x_owner, + token_y_program: mint_y_owner, user: program.payer(), user_token_in, user_token_out, @@ -105,27 +106,59 @@ pub async fn swap_with_price_impact + Clone>( host_fee_in: Some(lb_clmm::ID), event_authority, program: lb_clmm::ID, - }; + memo_program: memo::ID, + } + .to_account_metas(None); - let ix = instruction::SwapWithPriceImpact { - amount_in, - active_id: Some(lb_pair_state.active_id), - max_price_impact_bps: price_impact_bps, - }; + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; + + let transfer_hook_x_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); + + let transfer_hook_y_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); let remaining_accounts = bin_arrays_for_swap .into_iter() .map(|key| AccountMeta::new(key, false)) .collect::>(); + accounts.extend(transfer_hook_x_accounts); + accounts.extend(transfer_hook_y_accounts); + accounts.extend(remaining_accounts); + + let data = instruction::SwapWithPriceImpact2 { + amount_in, + active_id: Some(lb_pair_state.active_id), + max_price_impact_bps: price_impact_bps, + remaining_accounts_info, + } + .data(); + + let ix = Instruction { + program_id: lb_clmm::ID, + data, + accounts, + }; + let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_limit(1_400_000); let request_builder = program.request(); let signature = request_builder .instruction(compute_budget_ix) - .accounts(accounts) - .accounts(remaining_accounts) - .args(ix) + .instruction(ix) .send_with_spinner_and_config(transaction_config) .await; diff --git a/cli/src/instructions/utils.rs b/cli/src/instructions/utils.rs index 5d5af928..f569af7f 100644 --- a/cli/src/instructions/utils.rs +++ b/cli/src/instructions/utils.rs @@ -1,16 +1,20 @@ +use anchor_client::solana_client::nonblocking::rpc_client::RpcClient; +use anchor_client::solana_client::rpc_client::RpcClient as BlockingRpcClient; +use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; +use anchor_client::solana_sdk::instruction::AccountMeta; +use anchor_client::solana_sdk::pubkey::Pubkey; use anchor_client::solana_sdk::signer::Signer; use anchor_client::Program; +use anchor_spl::associated_token::get_associated_token_address; +use anchor_spl::token_2022::spl_token_2022::extension::{transfer_hook, StateWithExtensions}; +use anyhow::*; use lb_clmm::state::bin::BinArray; use lb_clmm::state::position::Position; use lb_clmm::utils::pda::derive_bin_array_pda; use spl_associated_token_account::instruction::create_associated_token_account; +use spl_transfer_hook_interface::offchain::resolve_extra_account_metas; use std::ops::Deref; -use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; -use anchor_client::solana_sdk::pubkey::Pubkey; -use anchor_spl::associated_token::get_associated_token_address; -use anyhow::*; - pub async fn get_or_create_ata + Clone>( program: &Program, transaction_config: RpcSendTransactionConfig, @@ -59,3 +63,87 @@ pub async fn get_bin_arrays_for_position + Clone> Ok([lower_bin_array, upper_bin_array]) } + +pub fn get_bin_array_account_meta_by_bin_range( + lb_pair: Pubkey, + lower_bin_id: i32, + upper_bin_id: i32, +) -> Result> { + let mut bin_array_index = BinArray::bin_id_to_bin_array_index(lower_bin_id)?; + let mut bin_arrays = vec![]; + loop { + let (bin_array, _bump) = derive_bin_array_pda(lb_pair, bin_array_index.into()); + bin_arrays.push(bin_array); + + let (bin_array_lower_bound, bin_array_upper_bound) = + BinArray::get_bin_array_lower_upper_bin_id(bin_array_index)?; + + if upper_bin_id >= bin_array_lower_bound && upper_bin_id <= bin_array_upper_bound { + break; + } else { + bin_array_index += 1; + } + } + + Ok(bin_arrays + .into_iter() + .map(|key| AccountMeta::new(key, false)) + .collect()) +} + +pub async fn get_extra_account_metas_for_transfer_hook( + mint: Pubkey, + rpc_client: RpcClient, +) -> Result> { + let mint_account = rpc_client.get_account(&mint).await?; + if mint_account.owner.eq(&anchor_spl::token::ID) { + return Ok(vec![]); + } + + let mint_state = + StateWithExtensions::::unpack( + mint_account.data.as_ref(), + )?; + + if let Some(transfer_hook_program_id) = transfer_hook::get_program_id(&mint_state) { + let mut transfer_ix = + anchor_spl::token_2022::spl_token_2022::instruction::transfer_checked( + &mint_account.owner, + &Pubkey::default(), + &mint, + &Pubkey::default(), + &Pubkey::default(), + &[], + 0, + mint_state.base.decimals, + )?; + + let blocking_rpc_client = BlockingRpcClient::new(rpc_client.url()); + + let data_fetcher = |address: Pubkey| { + let account = blocking_rpc_client + .get_account(&address) + .map(|account| account.data); + async move { + std::result::Result::Ok::>, Box>( + account.ok(), + ) + } + }; + + resolve_extra_account_metas( + &mut transfer_ix, + data_fetcher, + &mint, + &transfer_hook_program_id, + ) + .await + .map_err(|e| anyhow!(e))?; + + // Skip 0 -> 4, source, mint, destination, authority + let transfer_hook_required_accounts = transfer_ix.accounts[5..].to_vec(); + return Ok(transfer_hook_required_accounts); + } + + Ok(vec![]) +} diff --git a/cli/src/instructions/withdraw_protocol_fee.rs b/cli/src/instructions/withdraw_protocol_fee.rs index 4cbe6e71..4791e931 100644 --- a/cli/src/instructions/withdraw_protocol_fee.rs +++ b/cli/src/instructions/withdraw_protocol_fee.rs @@ -3,15 +3,24 @@ use std::ops::Deref; use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig; use anchor_client::solana_sdk::compute_budget::ComputeBudgetInstruction; +use anchor_client::solana_sdk::instruction::Instruction; use anchor_client::{solana_sdk::pubkey::Pubkey, solana_sdk::signer::Signer, Program}; use anchor_spl::associated_token::get_associated_token_address; +use anchor_spl::memo; use anyhow::*; use lb_clmm::accounts; use lb_clmm::instruction; use lb_clmm::state::lb_pair::LbPair; +use anchor_lang::{InstructionData, ToAccountMetas}; +use lb_clmm::utils::remaining_accounts_util::{ + AccountsType, RemainingAccountsInfo, RemainingAccountsSlice, +}; + +use crate::instructions::utils::get_extra_account_metas_for_transfer_hook; + #[derive(Debug)] pub struct WithdrawProtocolFeeParams { pub lb_pair: Pubkey, @@ -51,7 +60,7 @@ pub async fn withdraw_protocol_fee + Clone>( let receiver_token_y = get_associated_token_address(&program.payer(), &lb_pair_state.token_y_mint); - let accounts = accounts::WithdrawProtocolFee { + let mut accounts = accounts::WithdrawProtocolFee { lb_pair, reserve_x: lb_pair_state.reserve_x, reserve_y: lb_pair_state.reserve_y, @@ -62,17 +71,52 @@ pub async fn withdraw_protocol_fee + Clone>( fee_owner: program.payer(), receiver_token_x, receiver_token_y, - }; + memo_program: memo::ID, + } + .to_account_metas(None); + + let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] }; + + let transfer_hook_x_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookX, + length: transfer_hook_x_accounts.len() as u8, + }); - let ix = instruction::WithdrawProtocolFee { amount_x, amount_y }; + let transfer_hook_y_accounts = + get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.async_rpc()) + .await?; + + remaining_accounts_info.slices.push(RemainingAccountsSlice { + accounts_type: AccountsType::TransferHookY, + length: transfer_hook_y_accounts.len() as u8, + }); + + accounts.extend(transfer_hook_x_accounts); + accounts.extend(transfer_hook_y_accounts); + + let data = instruction::WithdrawProtocolFee { + amount_x, + amount_y, + remaining_accounts_info, + } + .data(); + + let ix = Instruction { + accounts, + data, + program_id: lb_clmm::ID, + }; let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_limit(1_400_000); let request_builder = program.request(); let signature = request_builder .instruction(compute_budget_ix) - .accounts(accounts) - .args(ix) + .instruction(ix) .send_with_spinner_and_config(transaction_config) .await; diff --git a/cli/src/math.rs b/cli/src/math.rs index fc621f2c..5add2766 100644 --- a/cli/src/math.rs +++ b/cli/src/math.rs @@ -122,106 +122,3 @@ pub fn price_per_lamport_to_price_per_token( .checked_mul(price_per_lamport)? .checked_div(one_ui_quote_token_amount) } - -#[cfg(test)] -mod tests { - use super::*; - use lb_clmm::math::{price_math::get_price_from_id, u64x64_math::SCALE_OFFSET}; - use proptest::proptest; - - proptest! { - #[test] - fn test_get_id_from_price_range( - bin_step in 1..=BASIS_POINT_MAX as u16, - price in 0.000000000000000001f64..=u64::MAX as f64 - ) { - let price = Decimal::from_f64(price); - assert!(price.is_some()); - let id = get_id_from_price(bin_step, &price.unwrap(), Rounding::Up); - assert!(id.is_some()); - } - } - - #[test] - fn test_q64x64_price_to_decimal() { - let q64x64_price: u128 = 408988714829317079040; - let decimal_price = q64x64_price_to_decimal(q64x64_price); - - assert!(decimal_price.is_some()); - assert_eq!( - decimal_price.unwrap().to_string(), - "22.17132265700000104402533907" - ); - } - - #[test] - fn test_price_per_lamport_to_price_per_token() { - let price_per_lamport = 0.211713226574294_f64; - let base_token_decimal = 8u8; - let quote_token_decimal = 6u8; - - let price_per_token = price_per_lamport_to_price_per_token( - price_per_lamport, - base_token_decimal, - quote_token_decimal, - ); - assert!(price_per_token.is_some()); - - let recomputed_price_per_lamport = price_per_token.unwrap() - * Decimal::TEN.powu(quote_token_decimal.into()) - / Decimal::TEN.powu(base_token_decimal.into()); - - let recomputed_price_per_lamport = recomputed_price_per_lamport.to_f64(); - assert!(recomputed_price_per_lamport.is_some()); - assert_eq!(Some(price_per_lamport), recomputed_price_per_lamport); - } - - #[test] - fn test_price_per_token_to_per_lamport() { - let price_per_token = 9.95769; - let base_token_decimal = 8u8; - let quote_token_decimal = 6u8; - - let price_per_lamport = price_per_token_to_per_lamport( - price_per_token, - base_token_decimal, - quote_token_decimal, - ); - assert!(price_per_lamport.is_some()); - - let recomputed_price_per_token = price_per_lamport.unwrap() - * Decimal::TEN.powu(base_token_decimal.into()) - / Decimal::TEN.powu(quote_token_decimal.into()); - - let recomputed_price_per_token = recomputed_price_per_token.to_f64(); - assert!(recomputed_price_per_token.is_some()); - - assert_eq!(Some(price_per_token), recomputed_price_per_token); - } - - #[test] - fn test_get_id_from_price() { - let bin_step = 15; - let quote_decimal = 6u8; - let price = Decimal::from_f64(208.929000).unwrap(); - - let computed_id = get_id_from_price(bin_step, &price, Rounding::Up); - assert!(computed_id.is_some()); - - let program_computed_price = get_price_from_id(computed_id.unwrap(), bin_step); - assert!(program_computed_price.is_ok()); - - let computed_price_fixed = Decimal::from_u128(program_computed_price.unwrap()); - assert!(computed_price_fixed.is_some()); - - let fixed_to_dec_scale_off = Decimal::TWO.powu(SCALE_OFFSET.into()); - - let computed_price_dec = (computed_price_fixed.unwrap() - * Decimal::TEN.powu(quote_decimal.into()) - / fixed_to_dec_scale_off) - .floor(); - - let computed_price = computed_price_dec.to_u64(); - assert_eq!(computed_price, Some(208929004)); - } -} diff --git a/commons/Cargo.toml b/commons/Cargo.toml index 32ec375c..0c3ade61 100644 --- a/commons/Cargo.toml +++ b/commons/Cargo.toml @@ -12,4 +12,4 @@ anchor-client = { workspace = true, features = ["async"] } anyhow = { workspace = true } lb_clmm = { path = "../programs/lb_clmm", features = ["cpi"] } tokio = { workspace = true, features = ["full", "parking_lot"] } -bincode = "1.3.3" +bincode = { workspace = true } diff --git a/market_making/Cargo.toml b/market_making/Cargo.toml index 7c78c9b3..684e87b7 100644 --- a/market_making/Cargo.toml +++ b/market_making/Cargo.toml @@ -9,14 +9,12 @@ authors = ["andrew "] tokio = { workspace = true, features = ["full"] } hyper = { workspace = true, features = ["full"] } routerify = { workspace = true } -ureq = { workspace = true, features = ["json"] } anchor-client = { workspace = true, features = ["async"] } anchor-spl = { workspace = true } anchor-lang = { workspace = true } env_logger = { workspace = true } log = { workspace = true } clap = { workspace = true, features = ["derive"] } -shellexpand = { workspace = true } anyhow = { workspace = true } lb_clmm = { path = "../programs/lb_clmm", features = ["cpi"] } serde_json = { workspace = true } @@ -24,4 +22,3 @@ serde = { workspace = true, features = ["derive"] } spl-associated-token-account = { workspace = true } solana-transaction-status = { workspace = true } bs58 = { workspace = true } -chrono = { workspace = true } diff --git a/market_making/src/pair_config.rs b/market_making/src/pair_config.rs index 647c3f48..a4bdad4f 100644 --- a/market_making/src/pair_config.rs +++ b/market_making/src/pair_config.rs @@ -41,22 +41,3 @@ pub fn get_config_from_file(path: &str) -> Result> { let config: Vec = serde_json::from_str(&data)?; Ok(config) } - -#[cfg(test)] -mod config_test { - use super::*; - use std::env; - #[test] - fn test_get_get_config_from_file() { - let mut owned_string: String = env::current_dir() - .unwrap() - .into_os_string() - .into_string() - .unwrap(); - let borrowed_string: &str = "/src/pair_config.json"; - owned_string.push_str(borrowed_string); - - let config = get_config_from_file(&owned_string).unwrap(); - println!("{:?}", config); - } -} diff --git a/programs/lb_clmm/Cargo.toml b/programs/lb_clmm/Cargo.toml index c1f1623e..a6d1af31 100644 --- a/programs/lb_clmm/Cargo.toml +++ b/programs/lb_clmm/Cargo.toml @@ -1,10 +1,6 @@ [package] name = "lb_clmm" -<<<<<<< HEAD -version = "0.8.0" -======= -version = "0.7.0" ->>>>>>> 19dbfda (feat: token 2022 + bump anchor to 0.29.0 to support extension type) +version = "0.9.0" description = "Created with Anchor" edition = "2021" @@ -25,20 +21,11 @@ staging = [] [dependencies] anchor-lang = { version = "0.29.0", features = ["event-cpi"] } -anchor-spl = "0.29.0" -uint = "0.8.5" +anchor-spl = { version = "0.29.0", features = ["memo"] } bytemuck = { version = "1.13.1", features = ["derive", "min_const_generics"] } ruint = "1.3.0" num-traits = "0.2.16" num-integer = "0.1.45" -mpl-token-metadata = "3.0.1" -solana-program = "1.16.0" +solana-program = "=1.17.3" num_enum = "0.7.1" - -[dev-dependencies] -proptest = "1.2.0" -rand = "0.7.3" -solana-program-test = "1.16.0" -solana-sdk = "1.16.0" -async-trait = "0.1.52" -assert_matches = "1.5.0" +spl-transfer-hook-interface = "0.3.0" diff --git a/programs/lb_clmm/src/errors.rs b/programs/lb_clmm/src/errors.rs index 9fd1aafe..e6e2d648 100644 --- a/programs/lb_clmm/src/errors.rs +++ b/programs/lb_clmm/src/errors.rs @@ -180,15 +180,36 @@ pub enum LBError { #[msg("Invalid activation type")] InvalidActivationType, - #[msg("Invalid lock release slot")] - InvalidLockReleaseSlot, - - #[msg("Bin range is not empty")] - BinRangeIsNotEmpty, + #[msg("Not support token_2022 mint extension")] + NotSupportMint, #[msg("Unsupported mint extension")] UnsupportedMintExtension, + #[msg("Unsupported native mint token2022")] + UnsupportNativeMintToken2022, + #[msg("Unmatch token mint")] UnmatchTokenMint, + + #[msg("Unsupported token mint")] + UnsupportedTokenMint, + + #[msg("Insufficient remaining accounts")] + InsufficientRemainingAccounts, + + #[msg("Invalid remaining account slice")] + InvalidRemainingAccountSlice, + + #[msg("Duplicated remaining account types")] + DuplicatedRemainingAccountTypes, + + #[msg("Missing remaining account for transfer hook")] + MissingRemainingAccountForTransferHook, + + #[msg("Remaining account was passed for transfer hook but there's no hook program")] + NoTransferHookProgram, + + #[msg("Zero funded amount")] + ZeroFundedAmount, } diff --git a/programs/lb_clmm/src/instructions/add_liquidity.rs b/programs/lb_clmm/src/instructions/add_liquidity.rs index 9186c0e7..83d9ea41 100644 --- a/programs/lb_clmm/src/instructions/add_liquidity.rs +++ b/programs/lb_clmm/src/instructions/add_liquidity.rs @@ -3,7 +3,8 @@ use crate::state::bin_array_bitmap_extension::BinArrayBitmapExtension; use crate::state::position::PositionV2; use crate::state::{bin::BinArray, lb_pair::LbPair}; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::token::Token; +use anchor_spl::token_interface::{Mint, TokenAccount}; pub struct CompositeDepositInfo { pub liquidity_share: u128, @@ -87,8 +88,8 @@ pub struct ModifyLiquidity<'info> { pub bin_array_upper: AccountLoader<'info, BinArray>, pub sender: Signer<'info>, - pub token_x_program: Interface<'info, TokenInterface>, - pub token_y_program: Interface<'info, TokenInterface>, + pub token_x_program: Program<'info, Token>, + pub token_y_program: Program<'info, Token>, } pub fn handle<'a, 'b, 'c, 'info>( diff --git a/programs/lb_clmm/src/instructions/add_liquidity_by_weight_one_side.rs b/programs/lb_clmm/src/instructions/add_liquidity_by_weight_one_side.rs index 7f7cf3d0..c6a51fcf 100644 --- a/programs/lb_clmm/src/instructions/add_liquidity_by_weight_one_side.rs +++ b/programs/lb_clmm/src/instructions/add_liquidity_by_weight_one_side.rs @@ -7,7 +7,8 @@ use crate::state::bin_array_bitmap_extension::BinArrayBitmapExtension; use crate::state::position::PositionV2; use crate::state::{bin::BinArray, lb_pair::LbPair}; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::token::Token; +use anchor_spl::token_interface::{Mint, TokenAccount}; use super::add_liquidity_by_weight::BinLiquidityDistributionByWeight; @@ -135,7 +136,7 @@ pub struct ModifyLiquidityOneSide<'info> { pub bin_array_upper: AccountLoader<'info, BinArray>, pub sender: Signer<'info>, - pub token_program: Interface<'info, TokenInterface>, + pub token_program: Program<'info, Token>, } pub fn handle<'a, 'b, 'c, 'info>( diff --git a/programs/lb_clmm/src/instructions/claim_reward.rs b/programs/lb_clmm/src/instructions/claim_reward.rs index ad94894b..fbe6b0ae 100644 --- a/programs/lb_clmm/src/instructions/claim_reward.rs +++ b/programs/lb_clmm/src/instructions/claim_reward.rs @@ -1,7 +1,8 @@ use crate::authorize_modify_position; use crate::state::{bin::BinArray, lb_pair::LbPair, position::PositionV2}; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::token::Token; +use anchor_spl::token_interface::{Mint, TokenAccount}; #[event_cpi] #[derive(Accounts)] @@ -37,7 +38,7 @@ pub struct ClaimReward<'info> { #[account(mut)] pub user_token_account: Box>, - pub token_program: Interface<'info, TokenInterface>, + pub token_program: Program<'info, Token>, } // TODO: Should we pass in range of bin we are going to collect reward ? It could help us in heap / compute unit issue by chunking into multiple tx. diff --git a/programs/lb_clmm/src/instructions/fund_reward.rs b/programs/lb_clmm/src/instructions/fund_reward.rs index 0f58b2d8..f5c2d610 100644 --- a/programs/lb_clmm/src/instructions/fund_reward.rs +++ b/programs/lb_clmm/src/instructions/fund_reward.rs @@ -1,6 +1,12 @@ -use crate::state::{bin::BinArray, lb_pair::LbPair}; +use crate::{ + state::{bin::BinArray, lb_pair::LbPair}, + utils::remaining_accounts_util::RemainingAccountsInfo, +}; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::{ + token::Token, + token_interface::{Mint, TokenAccount}, +}; #[event_cpi] #[derive(Accounts)] @@ -23,7 +29,7 @@ pub struct FundReward<'info> { )] pub bin_array: AccountLoader<'info, BinArray>, - pub token_program: Interface<'info, TokenInterface>, + pub token_program: Program<'info, Token>, } pub fn handle( @@ -31,6 +37,7 @@ pub fn handle( index: u64, amount: u64, carry_forward: bool, + remaining_accounts_info: RemainingAccountsInfo, ) -> Result<()> { Ok(()) } diff --git a/programs/lb_clmm/src/instructions/initialize_reward.rs b/programs/lb_clmm/src/instructions/initialize_reward.rs index 44894515..52e68830 100644 --- a/programs/lb_clmm/src/instructions/initialize_reward.rs +++ b/programs/lb_clmm/src/instructions/initialize_reward.rs @@ -2,7 +2,8 @@ use crate::errors::LBError; use crate::state::lb_pair::LbPair; use crate::{assert_eq_admin, state::token_badge::TokenBadge}; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::token::Token; +use anchor_spl::token_interface::{Mint, TokenAccount}; #[event_cpi] #[derive(Accounts)] @@ -34,7 +35,7 @@ pub struct InitializeReward<'info> { )] pub admin: Signer<'info>, - pub token_program: Interface<'info, TokenInterface>, + pub token_program: Program<'info, Token>, pub system_program: Program<'info, System>, pub rent: Sysvar<'info, Rent>, } diff --git a/programs/lb_clmm/src/instructions/mod.rs b/programs/lb_clmm/src/instructions/mod.rs index dca31402..c708875c 100644 --- a/programs/lb_clmm/src/instructions/mod.rs +++ b/programs/lb_clmm/src/instructions/mod.rs @@ -5,7 +5,6 @@ pub mod add_liquidity_by_weight; pub mod add_liquidity_by_weight_one_side; pub mod add_liquidity_single_side_precise; pub mod claim_fee; -pub mod claim_fee2; pub mod claim_reward; pub mod close_position; pub mod close_preset_parameter; @@ -14,14 +13,12 @@ pub mod increase_oracle_length; pub mod initialize_bin_array; pub mod initialize_bin_array_bitmap_extension; pub mod initialize_lb_pair; -pub mod initialize_lb_pair2; pub mod initialize_permission_lb_pair; pub mod initialize_position; pub mod initialize_position_by_operator; pub mod initialize_position_pda; pub mod initialize_preset_parameters; pub mod initialize_reward; -pub mod initialize_token_badge; pub mod migrate_bin_array; pub mod migrate_position; pub mod position_authorize; @@ -29,7 +26,7 @@ pub mod remove_all_liquidity; pub mod remove_liquidity; pub mod set_activation_point; pub mod set_lock_release_point; -pub mod set_pre_activation_sduration; +pub mod set_pre_activation_duration; pub mod set_pre_activation_swap_address; pub mod swap; pub mod toggle_pair_status; @@ -39,5 +36,6 @@ pub mod update_position_operator; pub mod update_reward_duration; pub mod update_reward_funder; pub mod update_whitelisted_wallet; +pub mod v2; pub mod withdraw_ineligible_reward; pub mod withdraw_protocol_fee; diff --git a/programs/lb_clmm/src/instructions/set_pre_activation_sduration.rs b/programs/lb_clmm/src/instructions/set_pre_activation_duration.rs similarity index 100% rename from programs/lb_clmm/src/instructions/set_pre_activation_sduration.rs rename to programs/lb_clmm/src/instructions/set_pre_activation_duration.rs diff --git a/programs/lb_clmm/src/instructions/swap.rs b/programs/lb_clmm/src/instructions/swap.rs index ff4deece..748a5dc7 100644 --- a/programs/lb_clmm/src/instructions/swap.rs +++ b/programs/lb_clmm/src/instructions/swap.rs @@ -3,7 +3,10 @@ use crate::state::bin_array_bitmap_extension::BinArrayBitmapExtension; use crate::state::lb_pair::*; use crate::state::oracle::Oracle; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::{ + token::Token, + token_interface::{Mint, TokenAccount}, +}; #[event_cpi] #[derive(Accounts)] @@ -50,8 +53,8 @@ pub struct Swap<'info> { pub host_fee_in: Option>>, pub user: Signer<'info>, - pub token_x_program: Interface<'info, TokenInterface>, - pub token_y_program: Interface<'info, TokenInterface>, + pub token_x_program: Program<'info, Token>, + pub token_y_program: Program<'info, Token>, } pub fn handle_exact_in<'a, 'b, 'c, 'info>( diff --git a/programs/lb_clmm/src/instructions/v2/add_liquidity2.rs b/programs/lb_clmm/src/instructions/v2/add_liquidity2.rs new file mode 100644 index 00000000..24604706 --- /dev/null +++ b/programs/lb_clmm/src/instructions/v2/add_liquidity2.rs @@ -0,0 +1,73 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + memo::Memo, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{ + authorize_modify_position, + state::{ + bin_array_bitmap_extension::BinArrayBitmapExtension, lb_pair::LbPair, position::PositionV2, + }, + utils::remaining_accounts_util::RemainingAccountsInfo, + LiquidityParameter, +}; + +#[event_cpi] +#[derive(Accounts)] +pub struct ModifyLiquidity2<'info> { + #[account( + mut, + has_one = lb_pair, + constraint = authorize_modify_position(&position, sender.key())? + )] + pub position: AccountLoader<'info, PositionV2>, + + #[account( + mut, + has_one = reserve_x, + has_one = reserve_y, + has_one = token_x_mint, + has_one = token_y_mint, + )] + pub lb_pair: AccountLoader<'info, LbPair>, + + #[account( + mut, + has_one = lb_pair, + )] + pub bin_array_bitmap_extension: Option>, + + #[account( + mut, + token::mint = token_x_mint + )] + pub user_token_x: Box>, + #[account( + mut, + token::mint = token_y_mint + )] + pub user_token_y: Box>, + + #[account(mut)] + pub reserve_x: Box>, + #[account(mut)] + pub reserve_y: Box>, + + pub token_x_mint: Box>, + pub token_y_mint: Box>, + + pub sender: Signer<'info>, + pub token_x_program: Interface<'info, TokenInterface>, + pub token_y_program: Interface<'info, TokenInterface>, + + pub memo_program: Program<'info, Memo>, +} + +pub fn handle( + ctx: Context, + liquidity_parameter: LiquidityParameter, + remaining_account_info: RemainingAccountsInfo, +) -> Result<()> { + Ok(()) +} diff --git a/programs/lb_clmm/src/instructions/v2/add_liquidity_by_strategy2.rs b/programs/lb_clmm/src/instructions/v2/add_liquidity_by_strategy2.rs new file mode 100644 index 00000000..1089e244 --- /dev/null +++ b/programs/lb_clmm/src/instructions/v2/add_liquidity_by_strategy2.rs @@ -0,0 +1,13 @@ +use crate::{ + utils::remaining_accounts_util::RemainingAccountsInfo, LiquidityParameterByStrategy, + ModifyLiquidity2, +}; +use anchor_lang::prelude::*; + +pub fn handle( + ctx: Context, + liquidity_parameter: &LiquidityParameterByStrategy, + remaining_accounts_info: RemainingAccountsInfo, +) -> Result<()> { + Ok(()) +} diff --git a/programs/lb_clmm/src/instructions/claim_fee2.rs b/programs/lb_clmm/src/instructions/v2/claim_fee2.rs similarity index 82% rename from programs/lb_clmm/src/instructions/claim_fee2.rs rename to programs/lb_clmm/src/instructions/v2/claim_fee2.rs index f6177f74..9de379fa 100644 --- a/programs/lb_clmm/src/instructions/claim_fee2.rs +++ b/programs/lb_clmm/src/instructions/v2/claim_fee2.rs @@ -1,8 +1,10 @@ use crate::authorize_claim_fee_position; use crate::errors::LBError; use crate::state::{bin::BinArray, lb_pair::LbPair, position::PositionV2}; +use crate::utils::remaining_accounts_util::RemainingAccountsSlice; use crate::PositionLiquidityFlowValidator; use anchor_lang::prelude::*; +use anchor_spl::memo::Memo; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface, TransferChecked}; #[event_cpi] @@ -24,17 +26,6 @@ pub struct ClaimFee2<'info> { )] pub position: AccountLoader<'info, PositionV2>, - #[account( - mut, - has_one = lb_pair - )] - pub bin_array_lower: AccountLoader<'info, BinArray>, - #[account( - mut, - has_one = lb_pair - )] - pub bin_array_upper: AccountLoader<'info, BinArray>, - pub sender: Signer<'info>, #[account(mut)] @@ -52,8 +43,15 @@ pub struct ClaimFee2<'info> { pub token_program_x: Interface<'info, TokenInterface>, pub token_program_y: Interface<'info, TokenInterface>, + + pub memo_program: Program<'info, Memo>, } -pub fn handle(ctx: Context) -> Result<()> { +pub fn handle( + ctx: Context, + min_bin_id: i32, + max_bin_id: i32, + remaining_accounts_slice: &[RemainingAccountsSlice], +) -> Result<()> { Ok(()) } diff --git a/programs/lb_clmm/src/instructions/v2/claim_reward2.rs b/programs/lb_clmm/src/instructions/v2/claim_reward2.rs new file mode 100644 index 00000000..3846c35f --- /dev/null +++ b/programs/lb_clmm/src/instructions/v2/claim_reward2.rs @@ -0,0 +1,49 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + memo::Memo, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{ + authorize_modify_position, + state::{lb_pair::LbPair, position::PositionV2}, + utils::remaining_accounts_util::RemainingAccountsInfo, +}; + +#[event_cpi] +#[derive(Accounts)] +#[instruction(reward_index: u64)] +pub struct ClaimReward2<'info> { + #[account(mut)] + pub lb_pair: AccountLoader<'info, LbPair>, + + #[account( + mut, + has_one = lb_pair, + constraint = authorize_modify_position(&position, sender.key())? + )] + pub position: AccountLoader<'info, PositionV2>, + + pub sender: Signer<'info>, + + #[account(mut)] + pub reward_vault: Box>, + pub reward_mint: Box>, + + #[account(mut)] + pub user_token_account: Box>, + + pub token_program: Interface<'info, TokenInterface>, + + pub memo_program: Program<'info, Memo>, +} + +pub fn handle( + ctx: Context, + index: u64, + min_bin_id: i32, + max_bin_id: i32, + remaining_accounts_info: RemainingAccountsInfo, +) -> Result<()> { + Ok(()) +} diff --git a/programs/lb_clmm/src/instructions/initialize_lb_pair2.rs b/programs/lb_clmm/src/instructions/v2/initialize_lb_pair2.rs similarity index 100% rename from programs/lb_clmm/src/instructions/initialize_lb_pair2.rs rename to programs/lb_clmm/src/instructions/v2/initialize_lb_pair2.rs diff --git a/programs/lb_clmm/src/instructions/initialize_token_badge.rs b/programs/lb_clmm/src/instructions/v2/initialize_token_badge.rs similarity index 94% rename from programs/lb_clmm/src/instructions/initialize_token_badge.rs rename to programs/lb_clmm/src/instructions/v2/initialize_token_badge.rs index fd4c708a..7c113b2c 100644 --- a/programs/lb_clmm/src/instructions/initialize_token_badge.rs +++ b/programs/lb_clmm/src/instructions/v2/initialize_token_badge.rs @@ -1,6 +1,5 @@ -use crate::assert_eq_admin; use crate::errors::LBError; -use crate::state::*; +use crate::{assert_eq_admin, state::*}; use anchor_lang::prelude::*; use anchor_spl::token_interface::Mint; use token_badge::TokenBadge; diff --git a/programs/lb_clmm/src/instructions/v2/mod.rs b/programs/lb_clmm/src/instructions/v2/mod.rs new file mode 100644 index 00000000..ea69b2c2 --- /dev/null +++ b/programs/lb_clmm/src/instructions/v2/mod.rs @@ -0,0 +1,9 @@ +pub mod add_liquidity2; +pub mod add_liquidity_by_strategy2; +pub mod claim_fee2; +pub mod claim_reward2; +pub mod initialize_lb_pair2; +pub mod initialize_token_badge; +pub mod remove_liquidity2; +pub mod remove_liquidity_by_range2; +pub mod swap2; diff --git a/programs/lb_clmm/src/instructions/v2/remove_liquidity2.rs b/programs/lb_clmm/src/instructions/v2/remove_liquidity2.rs new file mode 100644 index 00000000..bfdb2238 --- /dev/null +++ b/programs/lb_clmm/src/instructions/v2/remove_liquidity2.rs @@ -0,0 +1,13 @@ +use anchor_lang::prelude::*; + +use crate::{ + utils::remaining_accounts_util::RemainingAccountsSlice, BinLiquidityReduction, ModifyLiquidity2, +}; + +pub fn handle( + ctx: Context, + bin_liquidity_reduction: Vec, + remaining_accounts_slice: &[RemainingAccountsSlice], +) -> Result<()> { + Ok(()) +} diff --git a/programs/lb_clmm/src/instructions/v2/remove_liquidity_by_range2.rs b/programs/lb_clmm/src/instructions/v2/remove_liquidity_by_range2.rs new file mode 100644 index 00000000..f2d49487 --- /dev/null +++ b/programs/lb_clmm/src/instructions/v2/remove_liquidity_by_range2.rs @@ -0,0 +1,13 @@ +use crate::utils::remaining_accounts_util::RemainingAccountsInfo; +use crate::ModifyLiquidity2; +use anchor_lang::prelude::*; + +pub fn handle( + ctx: Context, + min_bin_id: i32, + max_bin_id: i32, + bps: u16, + remaining_accounts_info: RemainingAccountsInfo, +) -> Result<()> { + Ok(()) +} diff --git a/programs/lb_clmm/src/instructions/v2/swap2.rs b/programs/lb_clmm/src/instructions/v2/swap2.rs new file mode 100644 index 00000000..079d4934 --- /dev/null +++ b/programs/lb_clmm/src/instructions/v2/swap2.rs @@ -0,0 +1,81 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + memo::Memo, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{ + errors::LBError, + state::{bin_array_bitmap_extension::BinArrayBitmapExtension, lb_pair::LbPair, oracle::Oracle}, + utils::remaining_accounts_util::RemainingAccountsInfo, +}; + +#[event_cpi] +#[derive(Accounts)] +pub struct Swap2<'info> { + #[account( + mut, + has_one = reserve_x, + has_one = reserve_y, + has_one = token_x_mint, + has_one = token_y_mint, + has_one = oracle, + )] + pub lb_pair: AccountLoader<'info, LbPair>, + + #[account( + has_one = lb_pair, + )] + pub bin_array_bitmap_extension: Option>, + + #[account(mut)] + pub reserve_x: Box>, + #[account(mut)] + pub reserve_y: Box>, + + #[account( + mut, + constraint = user_token_in.mint != user_token_out.mint @ LBError::InvalidTokenMint, + constraint = user_token_in.mint == token_x_mint.key() || user_token_in.mint == token_y_mint.key() @ LBError::InvalidTokenMint, + )] + pub user_token_in: Box>, + #[account( + mut, + constraint = user_token_out.mint == token_x_mint.key() || user_token_out.mint == token_y_mint.key() @ LBError::InvalidTokenMint, + )] + pub user_token_out: Box>, + + pub token_x_mint: Box>, + pub token_y_mint: Box>, + + #[account(mut)] + pub oracle: AccountLoader<'info, Oracle>, + + #[account(mut)] + pub host_fee_in: Option>>, + + pub user: Signer<'info>, + pub token_x_program: Interface<'info, TokenInterface>, + pub token_y_program: Interface<'info, TokenInterface>, + + pub memo_program: Program<'info, Memo>, +} + +pub fn handle_exact_in2( + ctx: Context, + amount_in: u64, + min_amount_out: u64, + remaining_account_info: RemainingAccountsInfo, +) -> Result<()> { + Ok(()) +} + +pub fn handle_exact_in_with_price_impact2( + ctx: Context, + amount_in: u64, + active_id: Option, + max_price_impact_bps: u16, + remaining_account_info: RemainingAccountsInfo, +) -> Result<()> { + Ok(()) +} diff --git a/programs/lb_clmm/src/instructions/withdraw_ineligible_reward.rs b/programs/lb_clmm/src/instructions/withdraw_ineligible_reward.rs index bf676989..2260a960 100644 --- a/programs/lb_clmm/src/instructions/withdraw_ineligible_reward.rs +++ b/programs/lb_clmm/src/instructions/withdraw_ineligible_reward.rs @@ -1,6 +1,12 @@ -use crate::state::{bin::BinArray, lb_pair::LbPair}; +use crate::{ + state::{bin::BinArray, lb_pair::LbPair}, + utils::remaining_accounts_util::RemainingAccountsInfo, +}; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::{ + memo::Memo, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; #[event_cpi] #[derive(Accounts)] @@ -25,8 +31,13 @@ pub struct WithdrawIneligibleReward<'info> { pub bin_array: AccountLoader<'info, BinArray>, pub token_program: Interface<'info, TokenInterface>, + pub memo_program: Program<'info, Memo>, } -pub fn handle(ctx: Context, index: u64) -> Result<()> { +pub fn handle( + ctx: Context, + index: u64, + remaining_accounts_info: RemainingAccountsInfo, +) -> Result<()> { Ok(()) } diff --git a/programs/lb_clmm/src/instructions/withdraw_protocol_fee.rs b/programs/lb_clmm/src/instructions/withdraw_protocol_fee.rs index 818144bb..5a1d7ff1 100644 --- a/programs/lb_clmm/src/instructions/withdraw_protocol_fee.rs +++ b/programs/lb_clmm/src/instructions/withdraw_protocol_fee.rs @@ -1,6 +1,9 @@ -use crate::state::lb_pair::LbPair; +use crate::{state::lb_pair::LbPair, utils::remaining_accounts_util::RemainingAccountsInfo}; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::{ + memo::Memo, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; #[derive(Accounts)] pub struct WithdrawProtocolFee<'info> { @@ -30,8 +33,15 @@ pub struct WithdrawProtocolFee<'info> { pub token_x_program: Interface<'info, TokenInterface>, pub token_y_program: Interface<'info, TokenInterface>, + + pub memo_program: Program<'info, Memo>, } -pub fn handle(ctx: Context, amount_x: u64, amount_y: u64) -> Result<()> { +pub fn handle( + ctx: Context, + amount_x: u64, + amount_y: u64, + remaining_accounts_info: RemainingAccountsInfo, +) -> Result<()> { Ok(()) } diff --git a/programs/lb_clmm/src/lib.rs b/programs/lb_clmm/src/lib.rs index a53d4536..00f3eb1b 100644 --- a/programs/lb_clmm/src/lib.rs +++ b/programs/lb_clmm/src/lib.rs @@ -18,7 +18,6 @@ use instructions::add_liquidity_by_weight::*; use instructions::add_liquidity_by_weight_one_side::*; use instructions::add_liquidity_single_side_precise::*; use instructions::claim_fee::*; -use instructions::claim_fee2::*; use instructions::claim_reward::*; use instructions::close_position::*; use instructions::close_preset_parameter::*; @@ -27,21 +26,19 @@ use instructions::increase_oracle_length::*; use instructions::initialize_bin_array::*; use instructions::initialize_bin_array_bitmap_extension::*; use instructions::initialize_lb_pair::*; -use instructions::initialize_lb_pair2::*; use instructions::initialize_permission_lb_pair::*; use instructions::initialize_position::*; use instructions::initialize_position_by_operator::*; use instructions::initialize_position_pda::*; use instructions::initialize_preset_parameters::*; use instructions::initialize_reward::*; -use instructions::initialize_token_badge::*; use instructions::migrate_bin_array::*; use instructions::migrate_position::*; use instructions::position_authorize::*; use instructions::remove_liquidity::*; use instructions::set_activation_point::*; use instructions::set_lock_release_point::*; -use instructions::set_pre_activation_sduration::*; +use instructions::set_pre_activation_duration::*; use instructions::set_pre_activation_swap_address::*; use instructions::swap::*; use instructions::toggle_pair_status::*; @@ -51,8 +48,17 @@ use instructions::update_position_operator::*; use instructions::update_reward_duration::*; use instructions::update_reward_funder::*; use instructions::update_whitelisted_wallet::*; +use instructions::v2::add_liquidity2::*; +use instructions::v2::claim_fee2::*; +use instructions::v2::claim_reward2::*; +use instructions::v2::initialize_lb_pair2::*; +use instructions::v2::initialize_token_badge::*; +use instructions::v2::remove_liquidity2::*; +use instructions::v2::remove_liquidity_by_range2::*; +use instructions::v2::swap2::*; use instructions::withdraw_ineligible_reward::*; use instructions::withdraw_protocol_fee::*; +use utils::remaining_accounts_util::RemainingAccountsInfo; #[cfg(feature = "localnet")] declare_id!("LbVRzDTvBDEcrthxfZ4RL6yiq3uZw8bS6MwtdY6UhFQ"); @@ -119,9 +125,6 @@ pub fn assert_eq_launch_pool_admin(admin: Pubkey) -> bool { #[program] pub mod lb_clmm { - - use self::instructions::add_liquidity_single_side_precise::CompressedBinDepositAmount; - use super::*; pub fn initialize_lb_pair( @@ -241,8 +244,14 @@ pub mod lb_clmm { ctx: Context, amount_x: u64, amount_y: u64, + remaining_accounts_info: RemainingAccountsInfo, ) -> Result<()> { - instructions::withdraw_protocol_fee::handle(ctx, amount_x, amount_y) + instructions::withdraw_protocol_fee::handle( + ctx, + amount_x, + amount_y, + remaining_accounts_info, + ) } pub fn initialize_reward( @@ -259,8 +268,15 @@ pub mod lb_clmm { reward_index: u64, amount: u64, carry_forward: bool, + remaining_accounts_info: RemainingAccountsInfo, ) -> Result<()> { - instructions::fund_reward::handle(ctx, reward_index, amount, carry_forward) + instructions::fund_reward::handle( + ctx, + reward_index, + amount, + carry_forward, + remaining_accounts_info, + ) } pub fn update_reward_funder( @@ -283,7 +299,6 @@ pub mod lb_clmm { instructions::claim_reward::handle(ctx, reward_index) } - #[deprecated = "Please use claim_fee2 instead. Which support both token and token 2022 program"] pub fn claim_fee(ctx: Context) -> Result<()> { instructions::claim_fee::handle(ctx) } @@ -350,8 +365,9 @@ pub mod lb_clmm { pub fn withdraw_ineligible_reward( ctx: Context, reward_index: u64, + remaining_accounts_info: RemainingAccountsInfo, ) -> Result<()> { - instructions::withdraw_ineligible_reward::handle(ctx, reward_index) + instructions::withdraw_ineligible_reward::handle(ctx, reward_index, remaining_accounts_info) } pub fn set_activation_point( @@ -379,7 +395,7 @@ pub mod lb_clmm { ctx: Context, pre_activation_duration: u16, ) -> Result<()> { - instructions::set_pre_activation_sduration::handle(ctx, pre_activation_duration) + instructions::set_pre_activation_duration::handle(ctx, pre_activation_duration) } pub fn set_pre_activation_swap_address( @@ -411,12 +427,23 @@ pub mod lb_clmm { ) } - pub fn claim_fee2(ctx: Context) -> Result<()> { - instructions::claim_fee2::handle(ctx) + pub fn initialize_token_badge(ctx: Context) -> Result<()> { + instructions::v2::initialize_token_badge::handle(ctx) } - pub fn initialize_token_badge(ctx: Context) -> Result<()> { - instructions::initialize_token_badge::handle(ctx) + // V2 instructions, support both spl-token and token2022 + pub fn claim_fee2( + ctx: Context, + min_bin_id: i32, + max_bin_id: i32, + remaining_accounts_slice: RemainingAccountsInfo, + ) -> Result<()> { + instructions::v2::claim_fee2::handle( + ctx, + min_bin_id, + max_bin_id, + &remaining_accounts_slice.slices, + ) } pub fn initialize_lb_pair2( @@ -424,6 +451,100 @@ pub mod lb_clmm { active_id: i32, bin_step: u16, ) -> Result<()> { - instructions::initialize_lb_pair2::handle(ctx, active_id, bin_step) + instructions::v2::initialize_lb_pair2::handle(ctx, active_id, bin_step) + } + + pub fn add_liquidity2( + ctx: Context, + liquidity_parameter: LiquidityParameter, + remaining_accounts_info: RemainingAccountsInfo, + ) -> Result<()> { + instructions::v2::add_liquidity2::handle(ctx, liquidity_parameter, remaining_accounts_info) + } + + pub fn add_liquidity_by_strategy2( + ctx: Context, + liquidity_parameter: LiquidityParameterByStrategy, + remaining_accounts_info: RemainingAccountsInfo, + ) -> Result<()> { + instructions::v2::add_liquidity_by_strategy2::handle( + ctx, + &liquidity_parameter, + remaining_accounts_info, + ) + } + + pub fn claim_reward2<'c: 'info, 'info>( + ctx: Context, + reward_index: u64, + min_bin_id: i32, + max_bin_id: i32, + remaining_accounts_info: RemainingAccountsInfo, + ) -> Result<()> { + instructions::v2::claim_reward2::handle( + ctx, + reward_index, + min_bin_id, + max_bin_id, + remaining_accounts_info, + ) + } + + pub fn remove_liquidity2( + ctx: Context, + bin_liquidity_removal: Vec, + remaining_accounts_info: RemainingAccountsInfo, + ) -> Result<()> { + instructions::v2::remove_liquidity2::handle( + ctx, + bin_liquidity_removal, + &remaining_accounts_info.slices, + ) + } + + pub fn remove_liquidity_by_range2( + ctx: Context, + from_bin_id: i32, + to_bin_id: i32, + bps_to_remove: u16, + remaining_accounts_info: RemainingAccountsInfo, + ) -> Result<()> { + instructions::v2::remove_liquidity_by_range2::handle( + ctx, + from_bin_id, + to_bin_id, + bps_to_remove, + remaining_accounts_info, + ) + } + + pub fn swap2( + ctx: Context, + amount_in: u64, + min_amount_out: u64, + remaining_accounts_info: RemainingAccountsInfo, + ) -> Result<()> { + instructions::v2::swap2::handle_exact_in2( + ctx, + amount_in, + min_amount_out, + remaining_accounts_info, + ) + } + + pub fn swap_with_price_impact2( + ctx: Context, + amount_in: u64, + active_id: Option, + max_price_impact_bps: u16, + remaining_accounts_info: RemainingAccountsInfo, + ) -> Result<()> { + instructions::v2::swap2::handle_exact_in_with_price_impact2( + ctx, + amount_in, + active_id, + max_price_impact_bps, + remaining_accounts_info, + ) } } diff --git a/programs/lb_clmm/src/state/lb_pair.rs b/programs/lb_clmm/src/state/lb_pair.rs index 4fe00e7c..5efe6ec6 100644 --- a/programs/lb_clmm/src/state/lb_pair.rs +++ b/programs/lb_clmm/src/state/lb_pair.rs @@ -484,17 +484,6 @@ impl LbPair { Ok(total_fee_rate_cap) } - #[cfg(test)] - /// Maximum fee rate - fn get_max_total_fee(&self) -> Result { - let max_total_fee_rate = self - .get_base_fee()? - .safe_add(self.compute_variable_fee(self.parameters.max_volatility_accumulator)?)?; - - let total_fee_rate_cap = std::cmp::min(max_total_fee_rate, MAX_FEE_RATE.into()); - Ok(total_fee_rate_cap) - } - /// Compute composition fee. Composition_fee = fee_amount * (1 + total fee rate) pub fn compute_composition_fee(&self, swap_amount: u64) -> Result { let total_fee_rate = self.get_total_fee()?; diff --git a/programs/lb_clmm/src/utils/mod.rs b/programs/lb_clmm/src/utils/mod.rs index 699521bc..1b91d15d 100644 --- a/programs/lb_clmm/src/utils/mod.rs +++ b/programs/lb_clmm/src/utils/mod.rs @@ -1,3 +1,5 @@ pub mod pda; +pub mod remaining_accounts_util; pub mod seeds; pub mod token; +pub mod transfer_memo; diff --git a/programs/lb_clmm/src/utils/remaining_accounts_util.rs b/programs/lb_clmm/src/utils/remaining_accounts_util.rs new file mode 100644 index 00000000..699e9c12 --- /dev/null +++ b/programs/lb_clmm/src/utils/remaining_accounts_util.rs @@ -0,0 +1,87 @@ +use crate::errors::LBError; +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, PartialEq, Eq, Debug)] +pub enum AccountsType { + TransferHookX, + TransferHookY, + TransferHookReward, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +pub struct RemainingAccountsSlice { + pub accounts_type: AccountsType, + pub length: u8, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone)] +pub struct RemainingAccountsInfo { + pub slices: Vec, +} + +impl RemainingAccountsInfo { + pub fn len(&self) -> u8 { + self.slices.iter().map(|s| s.length).sum() + } +} + +#[derive(Debug, Default)] +pub struct ParsedRemainingAccounts<'a, 'info> { + pub transfer_hook_x: Option<&'a [AccountInfo<'info>]>, + pub transfer_hook_y: Option<&'a [AccountInfo<'info>]>, + pub transfer_hook_reward: Option<&'a [AccountInfo<'info>]>, +} + +/// Parse remaining accounts by consume all the transfer hooks related accounts. +pub fn parse_remaining_accounts<'a, 'info>( + remaining_accounts: &mut &'a [AccountInfo<'info>], + remaining_accounts_slice: &[RemainingAccountsSlice], + valid_accounts_type_list: &[AccountsType], +) -> Result> { + let mut parsed_remaining_accounts = ParsedRemainingAccounts::default(); + + if remaining_accounts_slice.is_empty() { + return Ok(ParsedRemainingAccounts::default()); + } + + for slice in remaining_accounts_slice.iter() { + if !valid_accounts_type_list.contains(&slice.accounts_type) { + return Err(LBError::InvalidRemainingAccountSlice.into()); + } + + if slice.length == 0 { + continue; + } + + if remaining_accounts.len() < slice.length as usize { + return Err(LBError::InsufficientRemainingAccounts.into()); + } + + let end_idx = slice.length as usize; + let accounts = &remaining_accounts[0..end_idx]; + *remaining_accounts = &remaining_accounts[end_idx..]; + + match slice.accounts_type { + AccountsType::TransferHookX => { + if parsed_remaining_accounts.transfer_hook_x.is_some() { + return Err(LBError::DuplicatedRemainingAccountTypes.into()); + } + parsed_remaining_accounts.transfer_hook_x = Some(accounts); + } + AccountsType::TransferHookY => { + if parsed_remaining_accounts.transfer_hook_y.is_some() { + return Err(LBError::DuplicatedRemainingAccountTypes.into()); + } + parsed_remaining_accounts.transfer_hook_y = Some(accounts); + } + AccountsType::TransferHookReward => { + if parsed_remaining_accounts.transfer_hook_reward.is_some() { + return Err(LBError::DuplicatedRemainingAccountTypes.into()); + } + parsed_remaining_accounts.transfer_hook_reward = Some(accounts); + } + } + } + + Ok(parsed_remaining_accounts) +} diff --git a/programs/lb_clmm/src/utils/transfer_memo.rs b/programs/lb_clmm/src/utils/transfer_memo.rs new file mode 100644 index 00000000..f0b1660a --- /dev/null +++ b/programs/lb_clmm/src/utils/transfer_memo.rs @@ -0,0 +1,7 @@ +pub const WITHDRAW_PROTOCOL_FEE_MEMO: &[u8] = b"DLMM WithdrawProtocolFee"; +pub const REMOVE_LIQUIDITY_MEMO: &[u8] = b"DLMM RemoveLiquidity"; +pub const CLAIM_FEES_MEMO: &[u8] = b"DLMM ClaimFees"; +pub const CLAIM_REWARDS_MEMO: &[u8] = b"DLMM ClaimRewards"; +pub const SWAP_MEMO: &[u8] = b"DLMM Swap"; +pub const WITHDRAW_INELIGIBLE_REWARD_MEMO: &[u8] = b"DLMM WithdrawIneligibleReward"; +pub const HOST_FEE_MEMO: &[u8] = b"DLMM HostFee"; diff --git a/target/idl/lb_clmm.json b/target/idl/lb_clmm.json index fc767ffa..cf220618 100644 --- a/target/idl/lb_clmm.json +++ b/target/idl/lb_clmm.json @@ -1,5 +1,5 @@ { - "version": "0.8.0", + "version": "0.9.0", "name": "lb_clmm", "constants": [ { @@ -1205,19 +1205,13 @@ ] }, { - "name": "swapExactOut", + "name": "withdrawProtocolFee", "accounts": [ { "name": "lbPair", "isMut": true, "isSigner": false }, - { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true - }, { "name": "reserveX", "isMut": true, @@ -1228,16 +1222,6 @@ "isMut": true, "isSigner": false }, - { - "name": "userTokenIn", - "isMut": true, - "isSigner": false - }, - { - "name": "userTokenOut", - "isMut": true, - "isSigner": false - }, { "name": "tokenXMint", "isMut": false, @@ -1249,110 +1233,17 @@ "isSigner": false }, { - "name": "oracle", - "isMut": true, - "isSigner": false - }, - { - "name": "hostFeeIn", - "isMut": true, - "isSigner": false, - "isOptional": true - }, - { - "name": "user", - "isMut": false, - "isSigner": true - }, - { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "eventAuthority", - "isMut": false, - "isSigner": false - }, - { - "name": "program", - "isMut": false, - "isSigner": false - } - ], - "args": [ - { - "name": "maxInAmount", - "type": "u64" - }, - { - "name": "outAmount", - "type": "u64" - } - ] - }, - { - "name": "swapWithPriceImpact", - "accounts": [ - { - "name": "lbPair", - "isMut": true, - "isSigner": false - }, - { - "name": "binArrayBitmapExtension", - "isMut": false, - "isSigner": false, - "isOptional": true - }, - { - "name": "reserveX", - "isMut": true, - "isSigner": false - }, - { - "name": "reserveY", - "isMut": true, - "isSigner": false - }, - { - "name": "userTokenIn", - "isMut": true, - "isSigner": false - }, - { - "name": "userTokenOut", + "name": "receiverTokenX", "isMut": true, "isSigner": false }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenYMint", - "isMut": false, - "isSigner": false - }, - { - "name": "oracle", + "name": "receiverTokenY", "isMut": true, "isSigner": false }, { - "name": "hostFeeIn", - "isMut": true, - "isSigner": false, - "isOptional": true - }, - { - "name": "user", + "name": "feeOwner", "isMut": false, "isSigner": true }, @@ -1361,82 +1252,6 @@ "isMut": false, "isSigner": false }, - { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "eventAuthority", - "isMut": false, - "isSigner": false - }, - { - "name": "program", - "isMut": false, - "isSigner": false - } - ], - "args": [ - { - "name": "amountIn", - "type": "u64" - }, - { - "name": "activeId", - "type": { - "option": "i32" - } - }, - { - "name": "maxPriceImpactBps", - "type": "u16" - } - ] - }, - { - "name": "withdrawProtocolFee", - "accounts": [ - { - "name": "lbPair", - "isMut": true, - "isSigner": false - }, - { - "name": "reserveX", - "isMut": true, - "isSigner": false - }, - { - "name": "reserveY", - "isMut": true, - "isSigner": false - }, - { - "name": "tokenXMint", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenYMint", - "isMut": false, - "isSigner": false - }, - { - "name": "receiverTokenX", - "isMut": true, - "isSigner": false - }, - { - "name": "receiverTokenY", - "isMut": true, - "isSigner": false - }, - { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false - }, { "name": "tokenYProgram", "isMut": false, @@ -2062,36 +1877,61 @@ "args": [] }, { - "name": "removeLiquiditySingleSide", + "name": "togglePairStatus", "accounts": [ { - "name": "position", + "name": "lbPair", "isMut": true, "isSigner": false }, + { + "name": "admin", + "isMut": false, + "isSigner": true + } + ], + "args": [] + }, + { + "name": "updateWhitelistedWallet", + "accounts": [ { "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + "name": "creator", + "isMut": false, + "isSigner": true + } + ], + "args": [ + { + "name": "idx", + "type": "u8" }, { - "name": "userToken", + "name": "wallet", + "type": "publicKey" + } + ] + }, + { + "name": "migratePosition", + "accounts": [ + { + "name": "positionV2", "isMut": true, - "isSigner": false + "isSigner": true }, { - "name": "reserve", + "name": "positionV1", "isMut": true, "isSigner": false }, { - "name": "tokenMint", + "name": "lbPair", "isMut": false, "isSigner": false }, @@ -2106,15 +1946,20 @@ "isSigner": false }, { - "name": "sender", - "isMut": false, + "name": "owner", + "isMut": true, "isSigner": true }, { - "name": "tokenProgram", + "name": "systemProgram", "isMut": false, "isSigner": false }, + { + "name": "rentReceiver", + "isMut": true, + "isSigner": false + }, { "name": "eventAuthority", "isMut": false, @@ -2129,105 +1974,12 @@ "args": [] }, { - "name": "togglePairStatus", + "name": "migrateBinArray", "accounts": [ { "name": "lbPair", - "isMut": true, - "isSigner": false - }, - { - "name": "admin", "isMut": false, - "isSigner": true - } - ], - "args": [] - }, - { - "name": "updateWhitelistedWallet", - "accounts": [ - { - "name": "lbPair", - "isMut": true, - "isSigner": false - }, - { - "name": "creator", - "isMut": false, - "isSigner": true - } - ], - "args": [ - { - "name": "wallet", - "type": "publicKey" - } - ] - }, - { - "name": "migratePosition", - "accounts": [ - { - "name": "positionV2", - "isMut": true, - "isSigner": true - }, - { - "name": "positionV1", - "isMut": true, - "isSigner": false - }, - { - "name": "lbPair", - "isMut": false, - "isSigner": false - }, - { - "name": "binArrayLower", - "isMut": true, - "isSigner": false - }, - { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false - }, - { - "name": "owner", - "isMut": true, - "isSigner": true - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "rentReceiver", - "isMut": true, - "isSigner": false - }, - { - "name": "eventAuthority", - "isMut": false, - "isSigner": false - }, - { - "name": "program", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "migrateBinArray", - "accounts": [ - { - "name": "lbPair", - "isMut": false, - "isSigner": false + "isSigner": false } ], "args": [] @@ -2377,7 +2129,7 @@ ] }, { - "name": "removeLiquidityByRange", + "name": "addLiquidityOneSidePrecise", "accounts": [ { "name": "position", @@ -2396,32 +2148,17 @@ "isOptional": true }, { - "name": "userTokenX", - "isMut": true, - "isSigner": false - }, - { - "name": "userTokenY", - "isMut": true, - "isSigner": false - }, - { - "name": "reserveX", + "name": "userToken", "isMut": true, "isSigner": false }, { - "name": "reserveY", + "name": "reserve", "isMut": true, "isSigner": false }, { - "name": "tokenXMint", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenYMint", + "name": "tokenMint", "isMut": false, "isSigner": false }, @@ -2441,12 +2178,7 @@ "isSigner": true }, { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenYProgram", + "name": "tokenProgram", "isMut": false, "isSigner": false }, @@ -2463,27 +2195,58 @@ ], "args": [ { - "name": "fromBinId", - "type": "i32" - }, + "name": "parameter", + "type": { + "defined": "AddLiquiditySingleSidePreciseParameter" + } + } + ] + }, + { + "name": "setPreActivationDuration", + "accounts": [ { - "name": "toBinId", - "type": "i32" + "name": "lbPair", + "isMut": true, + "isSigner": false }, { - "name": "bpsToRemove", + "name": "creator", + "isMut": false, + "isSigner": true + } + ], + "args": [ + { + "name": "preActivationDuration", "type": "u16" } ] }, { - "name": "addLiquidityOneSidePrecise", + "name": "setPreActivationSwapAddress", "accounts": [ { - "name": "position", + "name": "lbPair", "isMut": true, "isSigner": false }, + { + "name": "creator", + "isMut": false, + "isSigner": true + } + ], + "args": [ + { + "name": "preActivationSwapAddress", + "type": "publicKey" + } + ] + }, + { + "name": "swapExactOut", + "accounts": [ { "name": "lbPair", "isMut": true, @@ -2491,42 +2254,63 @@ }, { "name": "binArrayBitmapExtension", - "isMut": true, + "isMut": false, "isSigner": false, "isOptional": true }, { - "name": "userToken", + "name": "reserveX", "isMut": true, "isSigner": false }, { - "name": "reserve", + "name": "reserveY", "isMut": true, "isSigner": false }, { - "name": "tokenMint", - "isMut": false, + "name": "userTokenIn", + "isMut": true, "isSigner": false }, { - "name": "binArrayLower", + "name": "userTokenOut", "isMut": true, "isSigner": false }, { - "name": "binArrayUpper", + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "oracle", "isMut": true, "isSigner": false }, { - "name": "sender", + "name": "hostFeeIn", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "user", "isMut": false, "isSigner": true }, { - "name": "tokenProgram", + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", "isMut": false, "isSigner": false }, @@ -2543,15 +2327,17 @@ ], "args": [ { - "name": "parameter", - "type": { - "defined": "AddLiquiditySingleSidePreciseParameter" - } + "name": "maxInAmount", + "type": "u64" + }, + { + "name": "outAmount", + "type": "u64" } ] }, { - "name": "goToABin", + "name": "swapWithPriceImpact", "accounts": [ { "name": "lbPair", @@ -2565,58 +2351,117 @@ "isOptional": true }, { - "name": "fromBinArray", - "isMut": false, - "isSigner": false, - "isOptional": true + "name": "reserveX", + "isMut": true, + "isSigner": false }, { - "name": "toBinArray", - "isMut": false, - "isSigner": false, - "isOptional": true + "name": "reserveY", + "isMut": true, + "isSigner": false }, { - "name": "eventAuthority", - "isMut": false, + "name": "userTokenIn", + "isMut": true, "isSigner": false }, { - "name": "program", + "name": "userTokenOut", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", "isMut": false, "isSigner": false - } - ], - "args": [ + }, { - "name": "binId", - "type": "i32" - } - ] - }, - { - "name": "setPreActivationSlotDuration", - "accounts": [ + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, { - "name": "lbPair", + "name": "oracle", "isMut": true, "isSigner": false }, { - "name": "creator", - "isMut": false, - "isSigner": true - } + "name": "hostFeeIn", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "user", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } ], "args": [ { - "name": "preActivationDuration", + "name": "amountIn", + "type": "u64" + }, + { + "name": "activeId", + "type": { + "option": "i32" + } + }, + { + "name": "maxPriceImpactBps", "type": "u16" } ] }, { - "name": "setPreActivationSwapAddress", + "name": "initializeTokenBadge", + "accounts": [ + { + "name": "tokenMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenBadge", + "isMut": true, + "isSigner": false + }, + { + "name": "admin", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "claimFee2", "accounts": [ { "name": "lbPair", @@ -2624,20 +2469,641 @@ "isSigner": false }, { - "name": "creator", + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "initializeLbPair2", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenMintX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenMintY", + "isMut": false, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "oracle", + "isMut": true, + "isSigner": false + }, + { + "name": "presetParameter", "isMut": false, + "isSigner": false + }, + { + "name": "funder", + "isMut": true, "isSigner": true + }, + { + "name": "tokenBadgeX", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenBadgeY", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false } ], "args": [ { - "name": "preActivationSwapAddress", - "type": "publicKey" + "name": "activeId", + "type": "i32" + }, + { + "name": "binStep", + "type": "u16" } ] }, { - "name": "claimFee2", + "name": "addLiquidity2", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameter" + } + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "addLiquidityByStrategy2", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameterByStrategy" + } + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "claimReward2", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "rewardVault", + "isMut": true, + "isSigner": false + }, + { + "name": "rewardMint", + "isMut": false, + "isSigner": false + }, + { + "name": "userTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "rewardIndex", + "type": "u64" + }, + { + "name": "minBinId", + "type": "i32" + }, + { + "name": "maxBinId", + "type": "i32" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "removeLiquidity2", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "binLiquidityRemoval", + "type": { + "vec": { + "defined": "BinLiquidityReduction" + } + } + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "removeLiquidityByRange2", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "fromBinId", + "type": "i32" + }, + { + "name": "toBinId", + "type": "i32" + }, + { + "name": "bpsToRemove", + "type": "u16" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "swap2", "accounts": [ { "name": "lbPair", @@ -2645,62 +3111,69 @@ "isSigner": false }, { - "name": "position", + "name": "binArrayBitmapExtension", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "reserveX", "isMut": true, "isSigner": false }, { - "name": "binArrayLower", + "name": "reserveY", "isMut": true, "isSigner": false }, { - "name": "binArrayUpper", + "name": "userTokenIn", "isMut": true, "isSigner": false }, { - "name": "sender", - "isMut": false, - "isSigner": true + "name": "userTokenOut", + "isMut": true, + "isSigner": false }, { - "name": "reserveX", - "isMut": true, + "name": "tokenXMint", + "isMut": false, "isSigner": false }, { - "name": "reserveY", - "isMut": true, + "name": "tokenYMint", + "isMut": false, "isSigner": false }, { - "name": "userTokenX", + "name": "oracle", "isMut": true, "isSigner": false }, { - "name": "userTokenY", + "name": "hostFeeIn", "isMut": true, - "isSigner": false + "isSigner": false, + "isOptional": true }, { - "name": "tokenXMint", + "name": "user", "isMut": false, - "isSigner": false + "isSigner": true }, { - "name": "tokenYMint", + "name": "tokenXProgram", "isMut": false, "isSigner": false }, { - "name": "tokenProgramX", + "name": "tokenYProgram", "isMut": false, "isSigner": false }, { - "name": "tokenProgramY", + "name": "memoProgram", "isMut": false, "isSigner": false }, @@ -2715,36 +3188,25 @@ "isSigner": false } ], - "args": [] - }, - { - "name": "initializeTokenBadge", - "accounts": [ - { - "name": "tokenMint", - "isMut": false, - "isSigner": false - }, + "args": [ { - "name": "tokenBadge", - "isMut": true, - "isSigner": false + "name": "amountIn", + "type": "u64" }, { - "name": "admin", - "isMut": true, - "isSigner": true + "name": "minAmountOut", + "type": "u64" }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } } - ], - "args": [] + ] }, { - "name": "initializeLbPair2", + "name": "swapWithPriceImpact2", "accounts": [ { "name": "lbPair", @@ -2753,74 +3215,68 @@ }, { "name": "binArrayBitmapExtension", - "isMut": true, + "isMut": false, "isSigner": false, "isOptional": true }, { - "name": "tokenMintX", - "isMut": false, + "name": "reserveX", + "isMut": true, "isSigner": false }, { - "name": "tokenMintY", - "isMut": false, + "name": "reserveY", + "isMut": true, "isSigner": false }, { - "name": "reserveX", + "name": "userTokenIn", "isMut": true, "isSigner": false }, { - "name": "reserveY", + "name": "userTokenOut", "isMut": true, "isSigner": false }, { - "name": "oracle", - "isMut": true, + "name": "tokenXMint", + "isMut": false, "isSigner": false }, { - "name": "presetParameter", + "name": "tokenYMint", "isMut": false, "isSigner": false }, { - "name": "funder", + "name": "oracle", "isMut": true, - "isSigner": true - }, - { - "name": "tokenBadgeX", - "isMut": false, - "isSigner": false, - "isOptional": true + "isSigner": false }, { - "name": "tokenBadgeY", - "isMut": false, + "name": "hostFeeIn", + "isMut": true, "isSigner": false, "isOptional": true }, { - "name": "tokenProgramX", + "name": "user", "isMut": false, - "isSigner": false + "isSigner": true }, { - "name": "tokenProgramY", + "name": "tokenXProgram", "isMut": false, "isSigner": false }, { - "name": "systemProgram", + "name": "tokenYProgram", "isMut": false, "isSigner": false }, { - "name": "rent", + "name": "memoProgram", "isMut": false, "isSigner": false }, @@ -2836,20 +3292,32 @@ } ], "args": [ + { + "name": "amountIn", + "type": "u64" + }, { "name": "activeId", - "type": "i32" + "type": { + "option": "i32" + } }, { - "name": "binStep", + "name": "maxPriceImpactBps", "type": "u16" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } } ] } ], "accounts": [ { - "name": "binArrayBitmapExtension", + "name": "BinArrayBitmapExtension", "type": { "kind": "struct", "fields": [ @@ -2895,7 +3363,7 @@ } }, { - "name": "binArray", + "name": "BinArray", "docs": [ "An account to contain a range of bin. For example: Bin 100 <-> 200.", "For example:", @@ -2944,7 +3412,7 @@ } }, { - "name": "lbPair", + "name": "LbPair", "type": { "kind": "struct", "fields": [ @@ -3082,7 +3550,7 @@ { "name": "padding1", "docs": [ - "Fee owner. Deprecated. Can be used as buffer in the future." + "_padding_1, previous Fee owner, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!" ], "type": { "array": [ @@ -3208,7 +3676,7 @@ } }, { - "name": "oracle", + "name": "Oracle", "type": { "kind": "struct", "fields": [ @@ -3237,7 +3705,7 @@ } }, { - "name": "position", + "name": "Position", "type": { "kind": "struct", "fields": [ @@ -3358,7 +3826,7 @@ } }, { - "name": "positionV2", + "name": "PositionV2", "type": { "kind": "struct", "fields": [ @@ -3507,7 +3975,7 @@ } }, { - "name": "presetParameter", + "name": "PresetParameter", "type": { "kind": "struct", "fields": [ @@ -4064,38 +4532,38 @@ } }, { - "name": "FeeParameter", + "name": "BinLiquidityReduction", "type": { "kind": "struct", "fields": [ { - "name": "protocolShare", - "docs": [ - "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" - ], - "type": "u16" + "name": "binId", + "type": "i32" }, { - "name": "baseFactor", - "docs": [ - "Base factor for base fee rate" - ], + "name": "bpsToRemove", "type": "u16" } ] } }, { - "name": "BinLiquidityReduction", + "name": "FeeParameter", "type": { "kind": "struct", "fields": [ { - "name": "binId", - "type": "i32" + "name": "protocolShare", + "docs": [ + "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee" + ], + "type": "u16" }, { - "name": "bpsToRemove", + "name": "baseFactor", + "docs": [ + "Base factor for base fee rate" + ], "type": "u16" } ] @@ -4489,6 +4957,40 @@ ] } }, + { + "name": "RemainingAccountsSlice", + "type": { + "kind": "struct", + "fields": [ + { + "name": "accountsType", + "type": { + "defined": "AccountsType" + } + }, + { + "name": "length", + "type": "u8" + } + ] + } + }, + { + "name": "RemainingAccountsInfo", + "type": { + "kind": "struct", + "fields": [ + { + "name": "slices", + "type": { + "vec": { + "defined": "RemainingAccountsSlice" + } + } + } + ] + } + }, { "name": "StrategyType", "type": { @@ -4605,6 +5107,23 @@ } ] } + }, + { + "name": "AccountsType", + "type": { + "kind": "enum", + "variants": [ + { + "name": "TransferHookX" + }, + { + "name": "TransferHookY" + }, + { + "name": "TransferHookReward" + } + ] + } } ], "events": [ @@ -5102,26 +5621,6 @@ "index": false } ] - }, - { - "name": "GoToABin", - "fields": [ - { - "name": "lbPair", - "type": "publicKey", - "index": false - }, - { - "name": "fromBinId", - "type": "i32", - "index": false - }, - { - "name": "toBinId", - "type": "i32", - "index": false - } - ] } ], "errors": [ @@ -5387,46 +5886,93 @@ }, { "code": 6052, - "name": "AlreadyPassActivationSlot", + "name": "AlreadyPassActivationPoint", "msg": "Already activated" }, { "code": 6053, - "name": "LastSlotCannotBeSmallerThanActivateSlot", - "msg": "Last slot cannot be smaller than activate slot" - }, - { - "code": 6054, "name": "ExceedMaxSwappedAmount", "msg": "Swapped amount is exceeded max swapped amount" }, { - "code": 6055, + "code": 6054, "name": "InvalidStrategyParameters", "msg": "Invalid strategy parameters" }, { - "code": 6056, + "code": 6055, "name": "LiquidityLocked", "msg": "Liquidity locked" }, + { + "code": 6056, + "name": "BinRangeIsNotEmpty", + "msg": "Bin range is not empty" + }, { "code": 6057, - "name": "InvalidLockReleaseSlot", - "msg": "Invalid lock release slot" + "name": "NotExactAmountOut", + "msg": "Amount out is not matched with exact amount out" }, { "code": 6058, - "name": "BinRangeIsNotEmpty", - "msg": "Bin range is not empty" + "name": "InvalidActivationType", + "msg": "Invalid activation type" }, { "code": 6059, - "name": "NotExactAmountOut", - "msg": "Amount out is not matched with exact amount out" + "name": "NotSupportMint", + "msg": "Not support token_2022 mint extension" + }, + { + "code": 6060, + "name": "UnsupportedMintExtension", + "msg": "Unsupported mint extension" + }, + { + "code": 6061, + "name": "UnsupportNativeMintToken2022", + "msg": "Unsupported native mint token2022" + }, + { + "code": 6062, + "name": "UnmatchTokenMint", + "msg": "Unmatch token mint" + }, + { + "code": 6063, + "name": "UnsupportedTokenMint", + "msg": "Unsupported token mint" + }, + { + "code": 6064, + "name": "InsufficientRemainingAccounts", + "msg": "Insufficient remaining accounts" + }, + { + "code": 6065, + "name": "InvalidRemainingAccountSlice", + "msg": "Invalid remaining account slice" + }, + { + "code": 6066, + "name": "DuplicatedRemainingAccountTypes", + "msg": "Duplicated remaining account types" + }, + { + "code": 6067, + "name": "MissingRemainingAccountForTransferHook", + "msg": "Missing remaining account for transfer hook" + }, + { + "code": 6068, + "name": "NoTransferHookProgram", + "msg": "Remaining account was passed for transfer hook but there's no hook program" + }, + { + "code": 6069, + "name": "ZeroFundedAmount", + "msg": "Zero funded amount" } - ], - "metadata": { - "address": "GrAkKfEpTKQuVHG2Y97Y2FF4i7y7Q5AHLK94JBy7Y5yv" - } + ] } \ No newline at end of file diff --git a/target/types/lb_clmm.ts b/target/types/lb_clmm.ts index 46c9b230..5bdbef99 100644 --- a/target/types/lb_clmm.ts +++ b/target/types/lb_clmm.ts @@ -1,5 +1,5 @@ export type LbClmm = { - "version": "0.8.0", + "version": "0.9.0", "name": "lb_clmm", "constants": [ { @@ -2433,6 +2433,886 @@ export type LbClmm = { "type": "u16" } ] + }, + { + "name": "initializeTokenBadge", + "accounts": [ + { + "name": "tokenMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenBadge", + "isMut": true, + "isSigner": false + }, + { + "name": "admin", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "claimFee2", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "initializeLbPair2", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenMintX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenMintY", + "isMut": false, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "oracle", + "isMut": true, + "isSigner": false + }, + { + "name": "presetParameter", + "isMut": false, + "isSigner": false + }, + { + "name": "funder", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenBadgeX", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenBadgeY", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "activeId", + "type": "i32" + }, + { + "name": "binStep", + "type": "u16" + } + ] + }, + { + "name": "addLiquidity2", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameter" + } + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "addLiquidityByStrategy2", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameterByStrategy" + } + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "claimReward2", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "rewardVault", + "isMut": true, + "isSigner": false + }, + { + "name": "rewardMint", + "isMut": false, + "isSigner": false + }, + { + "name": "userTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "rewardIndex", + "type": "u64" + }, + { + "name": "minBinId", + "type": "i32" + }, + { + "name": "maxBinId", + "type": "i32" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "removeLiquidity2", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "binLiquidityRemoval", + "type": { + "vec": { + "defined": "BinLiquidityReduction" + } + } + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "removeLiquidityByRange2", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "fromBinId", + "type": "i32" + }, + { + "name": "toBinId", + "type": "i32" + }, + { + "name": "bpsToRemove", + "type": "u16" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "swap2", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenIn", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenOut", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "oracle", + "isMut": true, + "isSigner": false + }, + { + "name": "hostFeeIn", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "user", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "amountIn", + "type": "u64" + }, + { + "name": "minAmountOut", + "type": "u64" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] + }, + { + "name": "swapWithPriceImpact2", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenIn", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenOut", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "oracle", + "isMut": true, + "isSigner": false + }, + { + "name": "hostFeeIn", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "user", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "amountIn", + "type": "u64" + }, + { + "name": "activeId", + "type": { + "option": "i32" + } + }, + { + "name": "maxPriceImpactBps", + "type": "u16" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] } ], "accounts": [ @@ -4077,6 +4957,40 @@ export type LbClmm = { ] } }, + { + "name": "RemainingAccountsSlice", + "type": { + "kind": "struct", + "fields": [ + { + "name": "accountsType", + "type": { + "defined": "AccountsType" + } + }, + { + "name": "length", + "type": "u8" + } + ] + } + }, + { + "name": "RemainingAccountsInfo", + "type": { + "kind": "struct", + "fields": [ + { + "name": "slices", + "type": { + "vec": { + "defined": "RemainingAccountsSlice" + } + } + } + ] + } + }, { "name": "StrategyType", "type": { @@ -4193,6 +5107,23 @@ export type LbClmm = { } ] } + }, + { + "name": "AccountsType", + "type": { + "kind": "enum", + "variants": [ + { + "name": "TransferHookX" + }, + { + "name": "TransferHookY" + }, + { + "name": "TransferHookReward" + } + ] + } } ], "events": [ @@ -4987,12 +5918,67 @@ export type LbClmm = { "code": 6058, "name": "InvalidActivationType", "msg": "Invalid activation type" + }, + { + "code": 6059, + "name": "NotSupportMint", + "msg": "Not support token_2022 mint extension" + }, + { + "code": 6060, + "name": "UnsupportedMintExtension", + "msg": "Unsupported mint extension" + }, + { + "code": 6061, + "name": "UnsupportNativeMintToken2022", + "msg": "Unsupported native mint token2022" + }, + { + "code": 6062, + "name": "UnmatchTokenMint", + "msg": "Unmatch token mint" + }, + { + "code": 6063, + "name": "UnsupportedTokenMint", + "msg": "Unsupported token mint" + }, + { + "code": 6064, + "name": "InsufficientRemainingAccounts", + "msg": "Insufficient remaining accounts" + }, + { + "code": 6065, + "name": "InvalidRemainingAccountSlice", + "msg": "Invalid remaining account slice" + }, + { + "code": 6066, + "name": "DuplicatedRemainingAccountTypes", + "msg": "Duplicated remaining account types" + }, + { + "code": 6067, + "name": "MissingRemainingAccountForTransferHook", + "msg": "Missing remaining account for transfer hook" + }, + { + "code": 6068, + "name": "NoTransferHookProgram", + "msg": "Remaining account was passed for transfer hook but there's no hook program" + }, + { + "code": 6069, + "name": "ZeroFundedAmount", + "msg": "Zero funded amount" } ] }; export const IDL: LbClmm = { - "version": "0.8.0", + "version": "0.9.0", "name": "lb_clmm", "constants": [ { @@ -5069,47 +6055,660 @@ export const IDL: LbClmm = { "value": "12" }, { - "name": "BIN_ARRAY_BITMAP_SIZE", - "type": "i32", - "value": "512" + "name": "BIN_ARRAY_BITMAP_SIZE", + "type": "i32", + "value": "512" + }, + { + "name": "MAX_REWARD_BIN_SPLIT", + "type": { + "defined": "usize" + }, + "value": "15" + }, + { + "name": "BIN_ARRAY", + "type": "bytes", + "value": "[98, 105, 110, 95, 97, 114, 114, 97, 121]" + }, + { + "name": "ORACLE", + "type": "bytes", + "value": "[111, 114, 97, 99, 108, 101]" + }, + { + "name": "BIN_ARRAY_BITMAP_SEED", + "type": "bytes", + "value": "[98, 105, 116, 109, 97, 112]" + }, + { + "name": "PRESET_PARAMETER", + "type": "bytes", + "value": "[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]" + }, + { + "name": "POSITION", + "type": "bytes", + "value": "[112, 111, 115, 105, 116, 105, 111, 110]" + } + ], + "instructions": [ + { + "name": "initializeLbPair", + "accounts": [ + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenMintX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenMintY", + "isMut": false, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "oracle", + "isMut": true, + "isSigner": false + }, + { + "name": "presetParameter", + "isMut": false, + "isSigner": false + }, + { + "name": "funder", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "activeId", + "type": "i32" + }, + { + "name": "binStep", + "type": "u16" + } + ] + }, + { + "name": "initializePermissionLbPair", + "accounts": [ + { + "name": "base", + "isMut": false, + "isSigner": true + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenMintX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenMintY", + "isMut": false, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "oracle", + "isMut": true, + "isSigner": false + }, + { + "name": "admin", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenBadgeX", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenBadgeY", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenProgramX", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgramY", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ixData", + "type": { + "defined": "InitPermissionPairIx" + } + } + ] + }, + { + "name": "initializeBinArrayBitmapExtension", + "accounts": [ + { + "name": "lbPair", + "isMut": false, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "docs": [ + "Initialize an account to store if a bin array is initialized." + ] + }, + { + "name": "funder", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - "name": "MAX_REWARD_BIN_SPLIT", - "type": { - "defined": "usize" - }, - "value": "15" + "name": "initializeBinArray", + "accounts": [ + { + "name": "lbPair", + "isMut": false, + "isSigner": false + }, + { + "name": "binArray", + "isMut": true, + "isSigner": false + }, + { + "name": "funder", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "index", + "type": "i64" + } + ] }, { - "name": "BIN_ARRAY", - "type": "bytes", - "value": "[98, 105, 110, 95, 97, 114, 114, 97, 121]" + "name": "addLiquidity", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "binArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameter" + } + } + ] }, { - "name": "ORACLE", - "type": "bytes", - "value": "[111, 114, 97, 99, 108, 101]" + "name": "addLiquidityByWeight", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "binArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameterByWeight" + } + } + ] }, { - "name": "BIN_ARRAY_BITMAP_SEED", - "type": "bytes", - "value": "[98, 105, 116, 109, 97, 112]" + "name": "addLiquidityByStrategy", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenY", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "binArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameterByStrategy" + } + } + ] }, { - "name": "PRESET_PARAMETER", - "type": "bytes", - "value": "[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]" + "name": "addLiquidityByStrategyOneSide", + "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userToken", + "isMut": true, + "isSigner": false + }, + { + "name": "reserve", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenMint", + "isMut": false, + "isSigner": false + }, + { + "name": "binArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameterByStrategyOneSide" + } + } + ] }, { - "name": "POSITION", - "type": "bytes", - "value": "[112, 111, 115, 105, 116, 105, 111, 110]" - } - ], - "instructions": [ - { - "name": "initializeLbPair", + "name": "addLiquidityOneSide", "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, { "name": "lbPair", "isMut": true, @@ -5122,38 +6721,33 @@ export const IDL: LbClmm = { "isOptional": true }, { - "name": "tokenMintX", - "isMut": false, + "name": "userToken", + "isMut": true, "isSigner": false }, { - "name": "tokenMintY", - "isMut": false, + "name": "reserve", + "isMut": true, "isSigner": false }, { - "name": "reserveX", - "isMut": true, + "name": "tokenMint", + "isMut": false, "isSigner": false }, { - "name": "reserveY", + "name": "binArrayLower", "isMut": true, "isSigner": false }, { - "name": "oracle", + "name": "binArrayUpper", "isMut": true, "isSigner": false }, { - "name": "presetParameter", + "name": "sender", "isMut": false, - "isSigner": false - }, - { - "name": "funder", - "isMut": true, "isSigner": true }, { @@ -5161,16 +6755,6 @@ export const IDL: LbClmm = { "isMut": false, "isSigner": false }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, { "name": "eventAuthority", "isMut": false, @@ -5184,22 +6768,20 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "activeId", - "type": "i32" - }, - { - "name": "binStep", - "type": "u16" + "name": "liquidityParameter", + "type": { + "defined": "LiquidityOneSideParameter" + } } ] }, { - "name": "initializePermissionLbPair", + "name": "removeLiquidity", "accounts": [ { - "name": "base", - "isMut": false, - "isSigner": true + "name": "position", + "isMut": true, + "isSigner": false }, { "name": "lbPair", @@ -5213,13 +6795,13 @@ export const IDL: LbClmm = { "isOptional": true }, { - "name": "tokenMintX", - "isMut": false, + "name": "userTokenX", + "isMut": true, "isSigner": false }, { - "name": "tokenMintY", - "isMut": false, + "name": "userTokenY", + "isMut": true, "isSigner": false }, { @@ -5233,37 +6815,85 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "oracle", + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "binArrayLower", "isMut": true, "isSigner": false }, { - "name": "admin", + "name": "binArrayUpper", "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, "isSigner": true }, { - "name": "tokenBadgeX", + "name": "tokenXProgram", "isMut": false, - "isSigner": false, - "isOptional": true + "isSigner": false }, { - "name": "tokenBadgeY", + "name": "tokenYProgram", "isMut": false, - "isSigner": false, - "isOptional": true + "isSigner": false }, { - "name": "tokenProgramX", + "name": "eventAuthority", "isMut": false, "isSigner": false }, { - "name": "tokenProgramY", + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "binLiquidityRemoval", + "type": { + "vec": { + "defined": "BinLiquidityReduction" + } + } + } + ] + }, + { + "name": "initializePosition", + "accounts": [ + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "position", + "isMut": true, + "isSigner": true + }, + { + "name": "lbPair", "isMut": false, "isSigner": false }, + { + "name": "owner", + "isMut": false, + "isSigner": true + }, { "name": "systemProgram", "isMut": false, @@ -5287,34 +6917,46 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "ixData", - "type": { - "defined": "InitPermissionPairIx" - } + "name": "lowerBinId", + "type": "i32" + }, + { + "name": "width", + "type": "i32" } ] }, { - "name": "initializeBinArrayBitmapExtension", + "name": "initializePositionPda", "accounts": [ + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "base", + "isMut": false, + "isSigner": true + }, + { + "name": "position", + "isMut": true, + "isSigner": false + }, { "name": "lbPair", "isMut": false, "isSigner": false }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, + "name": "owner", + "isMut": false, + "isSigner": true, "docs": [ - "Initialize an account to store if a bin array is initialized." + "owner" ] }, - { - "name": "funder", - "isMut": true, - "isSigner": true - }, { "name": "systemProgram", "isMut": false, @@ -5324,49 +6966,134 @@ export const IDL: LbClmm = { "name": "rent", "isMut": false, "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false } ], - "args": [] + "args": [ + { + "name": "lowerBinId", + "type": "i32" + }, + { + "name": "width", + "type": "i32" + } + ] }, { - "name": "initializeBinArray", + "name": "initializePositionByOperator", "accounts": [ + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "base", + "isMut": false, + "isSigner": true + }, + { + "name": "position", + "isMut": true, + "isSigner": false + }, { "name": "lbPair", "isMut": false, "isSigner": false }, { - "name": "binArray", + "name": "operator", + "isMut": false, + "isSigner": true, + "docs": [ + "operator" + ] + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "lowerBinId", + "type": "i32" + }, + { + "name": "width", + "type": "i32" + }, + { + "name": "owner", + "type": "publicKey" + }, + { + "name": "feeOwner", + "type": "publicKey" + } + ] + }, + { + "name": "updatePositionOperator", + "accounts": [ + { + "name": "position", "isMut": true, "isSigner": false }, { - "name": "funder", - "isMut": true, + "name": "owner", + "isMut": false, "isSigner": true }, { - "name": "systemProgram", + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", "isMut": false, "isSigner": false } ], "args": [ { - "name": "index", - "type": "i64" + "name": "operator", + "type": "publicKey" } ] }, { - "name": "addLiquidity", + "name": "swap", "accounts": [ - { - "name": "position", - "isMut": true, - "isSigner": false - }, { "name": "lbPair", "isMut": true, @@ -5374,27 +7101,27 @@ export const IDL: LbClmm = { }, { "name": "binArrayBitmapExtension", - "isMut": true, + "isMut": false, "isSigner": false, "isOptional": true }, { - "name": "userTokenX", + "name": "reserveX", "isMut": true, "isSigner": false }, { - "name": "userTokenY", + "name": "reserveY", "isMut": true, "isSigner": false }, { - "name": "reserveX", + "name": "userTokenIn", "isMut": true, "isSigner": false }, { - "name": "reserveY", + "name": "userTokenOut", "isMut": true, "isSigner": false }, @@ -5409,17 +7136,18 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "binArrayLower", + "name": "oracle", "isMut": true, "isSigner": false }, { - "name": "binArrayUpper", + "name": "hostFeeIn", "isMut": true, - "isSigner": false + "isSigner": false, + "isOptional": true }, { - "name": "sender", + "name": "user", "isMut": false, "isSigner": true }, @@ -5446,84 +7174,121 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameter" - } + "name": "amountIn", + "type": "u64" + }, + { + "name": "minAmountOut", + "type": "u64" } ] }, { - "name": "addLiquidityByWeight", + "name": "withdrawProtocolFee", "accounts": [ { - "name": "position", + "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "lbPair", + "name": "reserveX", "isMut": true, "isSigner": false }, { - "name": "binArrayBitmapExtension", + "name": "reserveY", "isMut": true, - "isSigner": false, - "isOptional": true + "isSigner": false }, { - "name": "userTokenX", - "isMut": true, + "name": "tokenXMint", + "isMut": false, "isSigner": false }, { - "name": "userTokenY", - "isMut": true, + "name": "tokenYMint", + "isMut": false, "isSigner": false }, { - "name": "reserveX", + "name": "receiverTokenX", "isMut": true, "isSigner": false }, { - "name": "reserveY", + "name": "receiverTokenY", "isMut": true, "isSigner": false }, { - "name": "tokenXMint", + "name": "feeOwner", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", "isMut": false, "isSigner": false }, { - "name": "tokenYMint", + "name": "tokenYProgram", "isMut": false, "isSigner": false + } + ], + "args": [ + { + "name": "amountX", + "type": "u64" }, { - "name": "binArrayLower", + "name": "amountY", + "type": "u64" + } + ] + }, + { + "name": "initializeReward", + "accounts": [ + { + "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "binArrayUpper", + "name": "rewardVault", "isMut": true, "isSigner": false }, { - "name": "sender", + "name": "rewardMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenBadge", "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "admin", + "isMut": true, "isSigner": true }, { - "name": "tokenXProgram", + "name": "tokenProgram", "isMut": false, "isSigner": false }, { - "name": "tokenYProgram", + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", "isMut": false, "isSigner": false }, @@ -5540,86 +7305,95 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameterByWeight" - } + "name": "rewardIndex", + "type": "u64" + }, + { + "name": "rewardDuration", + "type": "u64" + }, + { + "name": "funder", + "type": "publicKey" } ] }, { - "name": "addLiquidityByStrategy", + "name": "fundReward", "accounts": [ - { - "name": "position", - "isMut": true, - "isSigner": false - }, { "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "binArrayBitmapExtension", + "name": "rewardVault", "isMut": true, - "isSigner": false, - "isOptional": true + "isSigner": false }, { - "name": "userTokenX", - "isMut": true, + "name": "rewardMint", + "isMut": false, "isSigner": false }, { - "name": "userTokenY", + "name": "funderTokenAccount", "isMut": true, "isSigner": false }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + "name": "funder", + "isMut": false, + "isSigner": true }, { - "name": "reserveY", + "name": "binArray", "isMut": true, "isSigner": false }, { - "name": "tokenXMint", + "name": "tokenProgram", "isMut": false, "isSigner": false }, { - "name": "tokenYMint", + "name": "eventAuthority", "isMut": false, "isSigner": false }, { - "name": "binArrayLower", - "isMut": true, + "name": "program", + "isMut": false, "isSigner": false - }, + } + ], + "args": [ { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + "name": "rewardIndex", + "type": "u64" }, { - "name": "sender", - "isMut": false, - "isSigner": true + "name": "amount", + "type": "u64" }, { - "name": "tokenXProgram", - "isMut": false, + "name": "carryForward", + "type": "bool" + } + ] + }, + { + "name": "updateRewardFunder", + "accounts": [ + { + "name": "lbPair", + "isMut": true, "isSigner": false }, { - "name": "tokenYProgram", + "name": "admin", "isMut": false, - "isSigner": false + "isSigner": true }, { "name": "eventAuthority", @@ -5634,47 +7408,68 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameterByStrategy" - } + "name": "rewardIndex", + "type": "u64" + }, + { + "name": "newFunder", + "type": "publicKey" } ] }, { - "name": "addLiquidityByStrategyOneSide", + "name": "updateRewardDuration", "accounts": [ { - "name": "position", + "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "lbPair", + "name": "admin", + "isMut": false, + "isSigner": true + }, + { + "name": "binArray", "isMut": true, "isSigner": false }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + "name": "eventAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "program", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "rewardIndex", + "type": "u64" }, { - "name": "userToken", + "name": "newDuration", + "type": "u64" + } + ] + }, + { + "name": "claimReward", + "accounts": [ + { + "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "reserve", + "name": "position", "isMut": true, "isSigner": false }, - { - "name": "tokenMint", - "isMut": false, - "isSigner": false - }, { "name": "binArrayLower", "isMut": true, @@ -5690,6 +7485,21 @@ export const IDL: LbClmm = { "isMut": false, "isSigner": true }, + { + "name": "rewardVault", + "isMut": true, + "isSigner": false + }, + { + "name": "rewardMint", + "isMut": false, + "isSigner": false + }, + { + "name": "userTokenAccount", + "isMut": true, + "isSigner": false + }, { "name": "tokenProgram", "isMut": false, @@ -5708,61 +7518,68 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityParameterByStrategyOneSide" - } + "name": "rewardIndex", + "type": "u64" } ] }, { - "name": "addLiquidityOneSide", + "name": "claimFee", "accounts": [ { - "name": "position", + "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "lbPair", + "name": "position", "isMut": true, "isSigner": false }, { - "name": "binArrayBitmapExtension", + "name": "binArrayLower", "isMut": true, - "isSigner": false, - "isOptional": true + "isSigner": false }, { - "name": "userToken", + "name": "binArrayUpper", "isMut": true, "isSigner": false }, { - "name": "reserve", + "name": "sender", + "isMut": false, + "isSigner": true + }, + { + "name": "reserveX", "isMut": true, "isSigner": false }, { - "name": "tokenMint", - "isMut": false, + "name": "reserveY", + "isMut": true, "isSigner": false }, { - "name": "binArrayLower", + "name": "userTokenX", "isMut": true, "isSigner": false }, { - "name": "binArrayUpper", + "name": "userTokenY", "isMut": true, "isSigner": false }, { - "name": "sender", + "name": "tokenXMint", "isMut": false, - "isSigner": true + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false }, { "name": "tokenProgram", @@ -5780,17 +7597,10 @@ export const IDL: LbClmm = { "isSigner": false } ], - "args": [ - { - "name": "liquidityParameter", - "type": { - "defined": "LiquidityOneSideParameter" - } - } - ] + "args": [] }, { - "name": "removeLiquidity", + "name": "closePosition", "accounts": [ { "name": "position", @@ -5803,66 +7613,51 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true - }, - { - "name": "userTokenX", + "name": "binArrayLower", "isMut": true, "isSigner": false }, { - "name": "userTokenY", + "name": "binArrayUpper", "isMut": true, "isSigner": false }, { - "name": "reserveX", - "isMut": true, - "isSigner": false + "name": "sender", + "isMut": false, + "isSigner": true }, { - "name": "reserveY", + "name": "rentReceiver", "isMut": true, "isSigner": false }, { - "name": "tokenXMint", + "name": "eventAuthority", "isMut": false, "isSigner": false }, { - "name": "tokenYMint", + "name": "program", "isMut": false, "isSigner": false - }, - { - "name": "binArrayLower", - "isMut": true, - "isSigner": false - }, + } + ], + "args": [] + }, + { + "name": "updateFeeParameters", + "accounts": [ { - "name": "binArrayUpper", + "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "sender", + "name": "admin", "isMut": false, "isSigner": true }, - { - "name": "tokenXProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenYProgram", - "isMut": false, - "isSigner": false - }, { "name": "eventAuthority", "isMut": false, @@ -5876,83 +7671,106 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "binLiquidityRemoval", + "name": "feeParameter", "type": { - "vec": { - "defined": "BinLiquidityReduction" - } + "defined": "FeeParameter" } } ] }, { - "name": "initializePosition", + "name": "increaseOracleLength", "accounts": [ { - "name": "payer", + "name": "oracle", "isMut": true, - "isSigner": true + "isSigner": false }, { - "name": "position", + "name": "funder", "isMut": true, "isSigner": true }, { - "name": "lbPair", + "name": "systemProgram", "isMut": false, "isSigner": false }, { - "name": "owner", + "name": "eventAuthority", "isMut": false, - "isSigner": true + "isSigner": false }, { - "name": "systemProgram", + "name": "program", "isMut": false, "isSigner": false - }, + } + ], + "args": [ { - "name": "rent", - "isMut": false, + "name": "lengthToAdd", + "type": "u64" + } + ] + }, + { + "name": "initializePresetParameter", + "accounts": [ + { + "name": "presetParameter", + "isMut": true, "isSigner": false }, { - "name": "eventAuthority", + "name": "admin", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", "isMut": false, "isSigner": false }, { - "name": "program", + "name": "rent", "isMut": false, "isSigner": false } ], "args": [ { - "name": "lowerBinId", - "type": "i32" - }, - { - "name": "width", - "type": "i32" + "name": "ix", + "type": { + "defined": "InitPresetParametersIx" + } } ] }, { - "name": "initializePositionPda", + "name": "closePresetParameter", "accounts": [ { - "name": "payer", + "name": "presetParameter", "isMut": true, - "isSigner": true + "isSigner": false }, { - "name": "base", - "isMut": false, + "name": "admin", + "isMut": true, "isSigner": true }, + { + "name": "rentReceiver", + "isMut": true, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "removeAllLiquidity", + "accounts": [ { "name": "position", "isMut": true, @@ -5960,87 +7778,67 @@ export const IDL: LbClmm = { }, { "name": "lbPair", - "isMut": false, + "isMut": true, "isSigner": false }, { - "name": "owner", - "isMut": false, - "isSigner": true, - "docs": [ - "owner" - ] + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true }, { - "name": "systemProgram", - "isMut": false, + "name": "userTokenX", + "isMut": true, "isSigner": false }, { - "name": "rent", - "isMut": false, + "name": "userTokenY", + "isMut": true, "isSigner": false }, { - "name": "eventAuthority", - "isMut": false, + "name": "reserveX", + "isMut": true, "isSigner": false }, { - "name": "program", - "isMut": false, + "name": "reserveY", + "isMut": true, "isSigner": false - } - ], - "args": [ - { - "name": "lowerBinId", - "type": "i32" }, { - "name": "width", - "type": "i32" - } - ] - }, - { - "name": "initializePositionByOperator", - "accounts": [ - { - "name": "payer", - "isMut": true, - "isSigner": true + "name": "tokenXMint", + "isMut": false, + "isSigner": false }, { - "name": "base", + "name": "tokenYMint", "isMut": false, - "isSigner": true + "isSigner": false }, { - "name": "position", + "name": "binArrayLower", "isMut": true, "isSigner": false }, { - "name": "lbPair", - "isMut": false, + "name": "binArrayUpper", + "isMut": true, "isSigner": false }, { - "name": "operator", + "name": "sender", "isMut": false, - "isSigner": true, - "docs": [ - "operator" - ] + "isSigner": true }, { - "name": "systemProgram", + "name": "tokenXProgram", "isMut": false, "isSigner": false }, { - "name": "rent", + "name": "tokenYProgram", "isMut": false, "isSigner": false }, @@ -6055,58 +7853,26 @@ export const IDL: LbClmm = { "isSigner": false } ], - "args": [ - { - "name": "lowerBinId", - "type": "i32" - }, - { - "name": "width", - "type": "i32" - }, - { - "name": "owner", - "type": "publicKey" - }, - { - "name": "feeOwner", - "type": "publicKey" - } - ] + "args": [] }, { - "name": "updatePositionOperator", + "name": "togglePairStatus", "accounts": [ { - "name": "position", + "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "owner", + "name": "admin", "isMut": false, "isSigner": true - }, - { - "name": "eventAuthority", - "isMut": false, - "isSigner": false - }, - { - "name": "program", - "isMut": false, - "isSigner": false } ], - "args": [ - { - "name": "operator", - "type": "publicKey" - } - ] + "args": [] }, { - "name": "swap", + "name": "updateWhitelistedWallet", "accounts": [ { "name": "lbPair", @@ -6114,65 +7880,63 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "binArrayBitmapExtension", + "name": "creator", "isMut": false, - "isSigner": false, - "isOptional": true - }, + "isSigner": true + } + ], + "args": [ { - "name": "reserveX", - "isMut": true, - "isSigner": false + "name": "idx", + "type": "u8" }, { - "name": "reserveY", - "isMut": true, - "isSigner": false - }, + "name": "wallet", + "type": "publicKey" + } + ] + }, + { + "name": "migratePosition", + "accounts": [ { - "name": "userTokenIn", + "name": "positionV2", "isMut": true, - "isSigner": false + "isSigner": true }, { - "name": "userTokenOut", + "name": "positionV1", "isMut": true, "isSigner": false }, { - "name": "tokenXMint", + "name": "lbPair", "isMut": false, "isSigner": false }, { - "name": "tokenYMint", - "isMut": false, + "name": "binArrayLower", + "isMut": true, "isSigner": false }, { - "name": "oracle", + "name": "binArrayUpper", "isMut": true, "isSigner": false }, { - "name": "hostFeeIn", + "name": "owner", "isMut": true, - "isSigner": false, - "isOptional": true - }, - { - "name": "user", - "isMut": false, "isSigner": true }, { - "name": "tokenXProgram", + "name": "systemProgram", "isMut": false, "isSigner": false }, { - "name": "tokenYProgram", - "isMut": false, + "name": "rentReceiver", + "isMut": true, "isSigner": false }, { @@ -6186,125 +7950,144 @@ export const IDL: LbClmm = { "isSigner": false } ], - "args": [ - { - "name": "amountIn", - "type": "u64" - }, + "args": [] + }, + { + "name": "migrateBinArray", + "accounts": [ { - "name": "minAmountOut", - "type": "u64" + "name": "lbPair", + "isMut": false, + "isSigner": false } - ] + ], + "args": [] }, { - "name": "withdrawProtocolFee", + "name": "updateFeesAndRewards", "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, { "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "reserveX", + "name": "binArrayLower", "isMut": true, "isSigner": false }, { - "name": "reserveY", + "name": "binArrayUpper", "isMut": true, "isSigner": false }, { - "name": "tokenXMint", + "name": "owner", "isMut": false, + "isSigner": true + } + ], + "args": [] + }, + { + "name": "withdrawIneligibleReward", + "accounts": [ + { + "name": "lbPair", + "isMut": true, "isSigner": false }, { - "name": "tokenYMint", + "name": "rewardVault", + "isMut": true, + "isSigner": false + }, + { + "name": "rewardMint", "isMut": false, "isSigner": false }, { - "name": "receiverTokenX", + "name": "funderTokenAccount", "isMut": true, "isSigner": false }, { - "name": "receiverTokenY", + "name": "funder", + "isMut": false, + "isSigner": true + }, + { + "name": "binArray", "isMut": true, "isSigner": false }, { - "name": "feeOwner", + "name": "tokenProgram", "isMut": false, - "isSigner": true + "isSigner": false }, { - "name": "tokenXProgram", + "name": "eventAuthority", "isMut": false, "isSigner": false }, { - "name": "tokenYProgram", + "name": "program", "isMut": false, "isSigner": false } ], "args": [ { - "name": "amountX", - "type": "u64" - }, - { - "name": "amountY", + "name": "rewardIndex", "type": "u64" } ] }, { - "name": "initializeReward", + "name": "setActivationPoint", "accounts": [ { "name": "lbPair", "isMut": true, "isSigner": false }, - { - "name": "rewardVault", - "isMut": true, - "isSigner": false - }, - { - "name": "rewardMint", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenBadge", - "isMut": false, - "isSigner": false, - "isOptional": true - }, { "name": "admin", "isMut": true, "isSigner": true - }, + } + ], + "args": [ { - "name": "tokenProgram", - "isMut": false, + "name": "activationPoint", + "type": "u64" + } + ] + }, + { + "name": "setLockReleasePoint", + "accounts": [ + { + "name": "position", + "isMut": true, "isSigner": false }, { - "name": "systemProgram", + "name": "lbPair", "isMut": false, "isSigner": false }, { - "name": "rent", + "name": "sender", "isMut": false, - "isSigner": false + "isSigner": true }, { "name": "eventAuthority", @@ -6319,52 +8102,60 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "rewardIndex", - "type": "u64" - }, - { - "name": "rewardDuration", + "name": "newLockReleasePoint", "type": "u64" - }, - { - "name": "funder", - "type": "publicKey" } ] }, { - "name": "fundReward", + "name": "addLiquidityOneSidePrecise", "accounts": [ { - "name": "lbPair", + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "lbPair", + "isMut": true, + "isSigner": false + }, + { + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "userToken", "isMut": true, "isSigner": false }, { - "name": "rewardVault", + "name": "reserve", "isMut": true, "isSigner": false }, { - "name": "rewardMint", + "name": "tokenMint", "isMut": false, "isSigner": false }, { - "name": "funderTokenAccount", + "name": "binArrayLower", "isMut": true, "isSigner": false }, { - "name": "funder", - "isMut": false, - "isSigner": true - }, - { - "name": "binArray", + "name": "binArrayUpper", "isMut": true, "isSigner": false }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, { "name": "tokenProgram", "isMut": false, @@ -6383,21 +8174,15 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "rewardIndex", - "type": "u64" - }, - { - "name": "amount", - "type": "u64" - }, - { - "name": "carryForward", - "type": "bool" + "name": "parameter", + "type": { + "defined": "AddLiquiditySingleSidePreciseParameter" + } } ] }, { - "name": "updateRewardFunder", + "name": "setPreActivationDuration", "accounts": [ { "name": "lbPair", @@ -6405,34 +8190,41 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "admin", + "name": "creator", "isMut": false, "isSigner": true - }, + } + ], + "args": [ { - "name": "eventAuthority", - "isMut": false, + "name": "preActivationDuration", + "type": "u16" + } + ] + }, + { + "name": "setPreActivationSwapAddress", + "accounts": [ + { + "name": "lbPair", + "isMut": true, "isSigner": false }, { - "name": "program", + "name": "creator", "isMut": false, - "isSigner": false + "isSigner": true } ], "args": [ { - "name": "rewardIndex", - "type": "u64" - }, - { - "name": "newFunder", + "name": "preActivationSwapAddress", "type": "publicKey" } ] }, { - "name": "updateRewardDuration", + "name": "swapExactOut", "accounts": [ { "name": "lbPair", @@ -6440,13 +8232,65 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "admin", + "name": "binArrayBitmapExtension", "isMut": false, - "isSigner": true + "isSigner": false, + "isOptional": true }, { - "name": "binArray", + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenIn", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenOut", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, + "isSigner": false + }, + { + "name": "oracle", + "isMut": true, + "isSigner": false + }, + { + "name": "hostFeeIn", "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "user", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, "isSigner": false }, { @@ -6462,17 +8306,17 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "rewardIndex", + "name": "maxInAmount", "type": "u64" }, { - "name": "newDuration", + "name": "outAmount", "type": "u64" } ] }, { - "name": "claimReward", + "name": "swapWithPriceImpact", "accounts": [ { "name": "lbPair", @@ -6480,42 +8324,64 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "position", + "name": "binArrayBitmapExtension", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "reserveX", "isMut": true, "isSigner": false }, { - "name": "binArrayLower", + "name": "reserveY", "isMut": true, "isSigner": false }, { - "name": "binArrayUpper", + "name": "userTokenIn", "isMut": true, "isSigner": false }, { - "name": "sender", - "isMut": false, - "isSigner": true + "name": "userTokenOut", + "isMut": true, + "isSigner": false }, { - "name": "rewardVault", - "isMut": true, + "name": "tokenXMint", + "isMut": false, "isSigner": false }, { - "name": "rewardMint", + "name": "tokenYMint", "isMut": false, "isSigner": false }, { - "name": "userTokenAccount", + "name": "oracle", "isMut": true, "isSigner": false }, { - "name": "tokenProgram", + "name": "hostFeeIn", + "isMut": true, + "isSigner": false, + "isOptional": true + }, + { + "name": "user", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", "isMut": false, "isSigner": false }, @@ -6532,31 +8398,57 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "rewardIndex", + "name": "amountIn", "type": "u64" + }, + { + "name": "activeId", + "type": { + "option": "i32" + } + }, + { + "name": "maxPriceImpactBps", + "type": "u16" } ] }, { - "name": "claimFee", + "name": "initializeTokenBadge", "accounts": [ { - "name": "lbPair", - "isMut": true, + "name": "tokenMint", + "isMut": false, "isSigner": false }, { - "name": "position", + "name": "tokenBadge", "isMut": true, "isSigner": false }, { - "name": "binArrayLower", + "name": "admin", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "claimFee2", + "accounts": [ + { + "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "binArrayUpper", + "name": "position", "isMut": true, "isSigner": false }, @@ -6596,54 +8488,18 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "eventAuthority", + "name": "tokenProgramX", "isMut": false, "isSigner": false }, { - "name": "program", + "name": "tokenProgramY", "isMut": false, "isSigner": false - } - ], - "args": [] - }, - { - "name": "closePosition", - "accounts": [ - { - "name": "position", - "isMut": true, - "isSigner": false - }, - { - "name": "lbPair", - "isMut": true, - "isSigner": false - }, - { - "name": "binArrayLower", - "isMut": true, - "isSigner": false - }, - { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false - }, - { - "name": "sender", - "isMut": false, - "isSigner": true }, { - "name": "rentReceiver", - "isMut": true, + "name": "memoProgram", + "isMut": false, "isSigner": false }, { @@ -6660,7 +8516,7 @@ export const IDL: LbClmm = { "args": [] }, { - "name": "updateFeeParameters", + "name": "initializeLbPair2", "accounts": [ { "name": "lbPair", @@ -6668,122 +8524,102 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "admin", - "isMut": false, - "isSigner": true + "name": "binArrayBitmapExtension", + "isMut": true, + "isSigner": false, + "isOptional": true }, { - "name": "eventAuthority", + "name": "tokenMintX", "isMut": false, "isSigner": false }, { - "name": "program", + "name": "tokenMintY", "isMut": false, "isSigner": false - } - ], - "args": [ + }, { - "name": "feeParameter", - "type": { - "defined": "FeeParameter" - } - } - ] - }, - { - "name": "increaseOracleLength", - "accounts": [ + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, { "name": "oracle", "isMut": true, "isSigner": false }, + { + "name": "presetParameter", + "isMut": false, + "isSigner": false + }, { "name": "funder", "isMut": true, "isSigner": true }, { - "name": "systemProgram", + "name": "tokenBadgeX", "isMut": false, - "isSigner": false + "isSigner": false, + "isOptional": true }, { - "name": "eventAuthority", + "name": "tokenBadgeY", "isMut": false, - "isSigner": false + "isSigner": false, + "isOptional": true }, { - "name": "program", + "name": "tokenProgramX", "isMut": false, "isSigner": false - } - ], - "args": [ + }, { - "name": "lengthToAdd", - "type": "u64" - } - ] - }, - { - "name": "initializePresetParameter", - "accounts": [ + "name": "tokenProgramY", + "isMut": false, + "isSigner": false + }, { - "name": "presetParameter", - "isMut": true, + "name": "systemProgram", + "isMut": false, "isSigner": false }, { - "name": "admin", - "isMut": true, - "isSigner": true + "name": "rent", + "isMut": false, + "isSigner": false }, { - "name": "systemProgram", + "name": "eventAuthority", "isMut": false, "isSigner": false }, { - "name": "rent", + "name": "program", "isMut": false, "isSigner": false } ], "args": [ { - "name": "ix", - "type": { - "defined": "InitPresetParametersIx" - } - } - ] - }, - { - "name": "closePresetParameter", - "accounts": [ - { - "name": "presetParameter", - "isMut": true, - "isSigner": false - }, - { - "name": "admin", - "isMut": true, - "isSigner": true + "name": "activeId", + "type": "i32" }, { - "name": "rentReceiver", - "isMut": true, - "isSigner": false + "name": "binStep", + "type": "u16" } - ], - "args": [] + ] }, { - "name": "removeAllLiquidity", + "name": "addLiquidity2", "accounts": [ { "name": "position", @@ -6831,16 +8667,6 @@ export const IDL: LbClmm = { "isMut": false, "isSigner": false }, - { - "name": "binArrayLower", - "isMut": true, - "isSigner": false - }, - { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false - }, { "name": "sender", "isMut": false, @@ -6857,165 +8683,149 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "eventAuthority", + "name": "memoProgram", "isMut": false, "isSigner": false }, { - "name": "program", + "name": "eventAuthority", "isMut": false, "isSigner": false - } - ], - "args": [] - }, - { - "name": "togglePairStatus", - "accounts": [ - { - "name": "lbPair", - "isMut": true, - "isSigner": false }, { - "name": "admin", + "name": "program", "isMut": false, - "isSigner": true - } - ], - "args": [] - }, - { - "name": "updateWhitelistedWallet", - "accounts": [ - { - "name": "lbPair", - "isMut": true, "isSigner": false - }, - { - "name": "creator", - "isMut": false, - "isSigner": true } ], "args": [ { - "name": "idx", - "type": "u8" + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameter" + } }, { - "name": "wallet", - "type": "publicKey" + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } } ] }, { - "name": "migratePosition", + "name": "addLiquidityByStrategy2", "accounts": [ { - "name": "positionV2", - "isMut": true, - "isSigner": true - }, - { - "name": "positionV1", + "name": "position", "isMut": true, "isSigner": false }, { "name": "lbPair", - "isMut": false, + "isMut": true, "isSigner": false }, { - "name": "binArrayLower", + "name": "binArrayBitmapExtension", "isMut": true, - "isSigner": false + "isSigner": false, + "isOptional": true }, { - "name": "binArrayUpper", + "name": "userTokenX", "isMut": true, "isSigner": false }, { - "name": "owner", + "name": "userTokenY", "isMut": true, - "isSigner": true + "isSigner": false }, { - "name": "systemProgram", - "isMut": false, + "name": "reserveX", + "isMut": true, "isSigner": false }, { - "name": "rentReceiver", + "name": "reserveY", "isMut": true, "isSigner": false }, { - "name": "eventAuthority", + "name": "tokenXMint", "isMut": false, "isSigner": false }, { - "name": "program", + "name": "tokenYMint", "isMut": false, "isSigner": false - } - ], - "args": [] - }, - { - "name": "migrateBinArray", - "accounts": [ + }, { - "name": "lbPair", + "name": "sender", "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "updateFeesAndRewards", - "accounts": [ + "isSigner": true + }, { - "name": "position", - "isMut": true, + "name": "tokenXProgram", + "isMut": false, "isSigner": false }, { - "name": "lbPair", - "isMut": true, + "name": "tokenYProgram", + "isMut": false, "isSigner": false }, { - "name": "binArrayLower", - "isMut": true, + "name": "memoProgram", + "isMut": false, "isSigner": false }, { - "name": "binArrayUpper", - "isMut": true, + "name": "eventAuthority", + "isMut": false, "isSigner": false }, { - "name": "owner", + "name": "program", "isMut": false, - "isSigner": true + "isSigner": false } ], - "args": [] + "args": [ + { + "name": "liquidityParameter", + "type": { + "defined": "LiquidityParameterByStrategy" + } + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } + } + ] }, { - "name": "withdrawIneligibleReward", + "name": "claimReward2", "accounts": [ { "name": "lbPair", "isMut": true, "isSigner": false }, + { + "name": "position", + "isMut": true, + "isSigner": false + }, + { + "name": "sender", + "isMut": false, + "isSigner": true + }, { "name": "rewardVault", "isMut": true, @@ -7027,22 +8837,17 @@ export const IDL: LbClmm = { "isSigner": false }, { - "name": "funderTokenAccount", + "name": "userTokenAccount", "isMut": true, "isSigner": false }, { - "name": "funder", + "name": "tokenProgram", "isMut": false, - "isSigner": true - }, - { - "name": "binArray", - "isMut": true, "isSigner": false }, { - "name": "tokenProgram", + "name": "memoProgram", "isMut": false, "isSigner": false }, @@ -7061,40 +8866,69 @@ export const IDL: LbClmm = { { "name": "rewardIndex", "type": "u64" + }, + { + "name": "minBinId", + "type": "i32" + }, + { + "name": "maxBinId", + "type": "i32" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } } ] }, { - "name": "setActivationPoint", + "name": "removeLiquidity2", "accounts": [ + { + "name": "position", + "isMut": true, + "isSigner": false + }, { "name": "lbPair", "isMut": true, "isSigner": false }, { - "name": "admin", + "name": "binArrayBitmapExtension", "isMut": true, - "isSigner": true - } - ], - "args": [ + "isSigner": false, + "isOptional": true + }, { - "name": "activationPoint", - "type": "u64" - } - ] - }, - { - "name": "setLockReleasePoint", - "accounts": [ + "name": "userTokenX", + "isMut": true, + "isSigner": false + }, { - "name": "position", + "name": "userTokenY", "isMut": true, "isSigner": false }, { - "name": "lbPair", + "name": "reserveX", + "isMut": true, + "isSigner": false + }, + { + "name": "reserveY", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", "isMut": false, "isSigner": false }, @@ -7103,6 +8937,21 @@ export const IDL: LbClmm = { "isMut": false, "isSigner": true }, + { + "name": "tokenXProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, { "name": "eventAuthority", "isMut": false, @@ -7116,13 +8965,23 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "newLockReleasePoint", - "type": "u64" + "name": "binLiquidityRemoval", + "type": { + "vec": { + "defined": "BinLiquidityReduction" + } + } + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } } ] }, { - "name": "addLiquidityOneSidePrecise", + "name": "removeLiquidityByRange2", "accounts": [ { "name": "position", @@ -7141,28 +9000,33 @@ export const IDL: LbClmm = { "isOptional": true }, { - "name": "userToken", + "name": "userTokenX", "isMut": true, "isSigner": false }, { - "name": "reserve", + "name": "userTokenY", "isMut": true, "isSigner": false }, { - "name": "tokenMint", - "isMut": false, + "name": "reserveX", + "isMut": true, "isSigner": false }, { - "name": "binArrayLower", + "name": "reserveY", "isMut": true, "isSigner": false }, { - "name": "binArrayUpper", - "isMut": true, + "name": "tokenXMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenYMint", + "isMut": false, "isSigner": false }, { @@ -7171,74 +9035,54 @@ export const IDL: LbClmm = { "isSigner": true }, { - "name": "tokenProgram", + "name": "tokenXProgram", "isMut": false, "isSigner": false }, { - "name": "eventAuthority", + "name": "tokenYProgram", "isMut": false, "isSigner": false }, { - "name": "program", + "name": "memoProgram", "isMut": false, "isSigner": false - } - ], - "args": [ - { - "name": "parameter", - "type": { - "defined": "AddLiquiditySingleSidePreciseParameter" - } - } - ] - }, - { - "name": "setPreActivationDuration", - "accounts": [ + }, { - "name": "lbPair", - "isMut": true, + "name": "eventAuthority", + "isMut": false, "isSigner": false }, { - "name": "creator", + "name": "program", "isMut": false, - "isSigner": true + "isSigner": false } ], "args": [ { - "name": "preActivationDuration", - "type": "u16" - } - ] - }, - { - "name": "setPreActivationSwapAddress", - "accounts": [ + "name": "fromBinId", + "type": "i32" + }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + "name": "toBinId", + "type": "i32" }, { - "name": "creator", - "isMut": false, - "isSigner": true - } - ], - "args": [ + "name": "bpsToRemove", + "type": "u16" + }, { - "name": "preActivationSwapAddress", - "type": "publicKey" + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } } ] }, { - "name": "swapExactOut", + "name": "swap2", "accounts": [ { "name": "lbPair", @@ -7307,6 +9151,11 @@ export const IDL: LbClmm = { "isMut": false, "isSigner": false }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, { "name": "eventAuthority", "isMut": false, @@ -7320,17 +9169,23 @@ export const IDL: LbClmm = { ], "args": [ { - "name": "maxInAmount", + "name": "amountIn", "type": "u64" }, { - "name": "outAmount", + "name": "minAmountOut", "type": "u64" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } } ] }, { - "name": "swapWithPriceImpact", + "name": "swapWithPriceImpact2", "accounts": [ { "name": "lbPair", @@ -7399,6 +9254,11 @@ export const IDL: LbClmm = { "isMut": false, "isSigner": false }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, { "name": "eventAuthority", "isMut": false, @@ -7424,6 +9284,12 @@ export const IDL: LbClmm = { { "name": "maxPriceImpactBps", "type": "u16" + }, + { + "name": "remainingAccountsInfo", + "type": { + "defined": "RemainingAccountsInfo" + } } ] } @@ -9070,6 +10936,40 @@ export const IDL: LbClmm = { ] } }, + { + "name": "RemainingAccountsSlice", + "type": { + "kind": "struct", + "fields": [ + { + "name": "accountsType", + "type": { + "defined": "AccountsType" + } + }, + { + "name": "length", + "type": "u8" + } + ] + } + }, + { + "name": "RemainingAccountsInfo", + "type": { + "kind": "struct", + "fields": [ + { + "name": "slices", + "type": { + "vec": { + "defined": "RemainingAccountsSlice" + } + } + } + ] + } + }, { "name": "StrategyType", "type": { @@ -9186,6 +11086,23 @@ export const IDL: LbClmm = { } ] } + }, + { + "name": "AccountsType", + "type": { + "kind": "enum", + "variants": [ + { + "name": "TransferHookX" + }, + { + "name": "TransferHookY" + }, + { + "name": "TransferHookReward" + } + ] + } } ], "events": [ @@ -9980,6 +11897,61 @@ export const IDL: LbClmm = { "code": 6058, "name": "InvalidActivationType", "msg": "Invalid activation type" + }, + { + "code": 6059, + "name": "NotSupportMint", + "msg": "Not support token_2022 mint extension" + }, + { + "code": 6060, + "name": "UnsupportedMintExtension", + "msg": "Unsupported mint extension" + }, + { + "code": 6061, + "name": "UnsupportNativeMintToken2022", + "msg": "Unsupported native mint token2022" + }, + { + "code": 6062, + "name": "UnmatchTokenMint", + "msg": "Unmatch token mint" + }, + { + "code": 6063, + "name": "UnsupportedTokenMint", + "msg": "Unsupported token mint" + }, + { + "code": 6064, + "name": "InsufficientRemainingAccounts", + "msg": "Insufficient remaining accounts" + }, + { + "code": 6065, + "name": "InvalidRemainingAccountSlice", + "msg": "Invalid remaining account slice" + }, + { + "code": 6066, + "name": "DuplicatedRemainingAccountTypes", + "msg": "Duplicated remaining account types" + }, + { + "code": 6067, + "name": "MissingRemainingAccountForTransferHook", + "msg": "Missing remaining account for transfer hook" + }, + { + "code": 6068, + "name": "NoTransferHookProgram", + "msg": "Remaining account was passed for transfer hook but there's no hook program" + }, + { + "code": 6069, + "name": "ZeroFundedAmount", + "msg": "Zero funded amount" } ] }; diff --git a/ts-client/package.json b/ts-client/package.json index 2374022a..9112f923 100644 --- a/ts-client/package.json +++ b/ts-client/package.json @@ -31,13 +31,14 @@ "typescript": "^5.0.4" }, "dependencies": { - "@coral-xyz/anchor": "^0.28.0", - "@coral-xyz/borsh": "^0.28.0", + "@coral-xyz/anchor": "^0.29.0", + "@coral-xyz/borsh": "^0.29.0", "@solana/buffer-layout": "^4.0.1", "@solana/spl-token": "^0.4.6", "@solana/web3.js": "^1.91.6", "decimal.js": "^10.4.2", - "gaussian": "^1.3.0" + "gaussian": "^1.3.0", + "@solana/spl-token-metadata": "^0.1.4" }, "keywords": [], "author": "McSam", diff --git a/ts-client/pnpm-lock.yaml b/ts-client/pnpm-lock.yaml index 2315b3a4..3b5582a8 100644 --- a/ts-client/pnpm-lock.yaml +++ b/ts-client/pnpm-lock.yaml @@ -9,17 +9,20 @@ importers: .: dependencies: '@coral-xyz/anchor': - specifier: ^0.28.0 - version: 0.28.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + specifier: ^0.29.0 + version: 0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@coral-xyz/borsh': - specifier: ^0.28.0 - version: 0.28.0(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + specifier: ^0.29.0 + version: 0.29.0(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@solana/buffer-layout': specifier: ^4.0.1 version: 4.0.1 '@solana/spl-token': specifier: ^0.4.6 version: 0.4.8(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.3.3)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': + specifier: ^0.1.4 + version: 0.1.4(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22) '@solana/web3.js': specifier: ^1.91.6 version: 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -667,12 +670,12 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@coral-xyz/anchor@0.28.0': - resolution: {integrity: sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw==} + '@coral-xyz/anchor@0.29.0': + resolution: {integrity: sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==} engines: {node: '>=11'} - '@coral-xyz/borsh@0.28.0': - resolution: {integrity: sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ==} + '@coral-xyz/borsh@0.29.0': + resolution: {integrity: sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.68.0 @@ -1842,9 +1845,6 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-sha256@0.9.0: - resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3233,11 +3233,11 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@coral-xyz/anchor@0.28.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@coral-xyz/anchor@0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.4.0 '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - base64-js: 1.5.1 bn.js: 5.2.1 bs58: 4.0.1 buffer-layout: 1.2.2 @@ -3245,7 +3245,6 @@ snapshots: cross-fetch: 3.1.8 crypto-hash: 1.3.0 eventemitter3: 4.0.7 - js-sha256: 0.9.0 pako: 2.1.0 snake-case: 3.0.4 superstruct: 0.15.5 @@ -3255,7 +3254,7 @@ snapshots: - encoding - utf-8-validate - '@coral-xyz/borsh@0.28.0(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) bn.js: 5.2.1 @@ -4761,8 +4760,6 @@ snapshots: joycon@3.1.1: {} - js-sha256@0.9.0: {} - js-tokens@4.0.0: {} js-yaml@3.14.1: From 9217626603b58113249d716db67025c8f9f94ec0 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Fri, 6 Sep 2024 00:39:46 +0800 Subject: [PATCH 13/13] fix: ts sdk existing fn use v2 endpoint --- ts-client/src/dlmm/constants/index.ts | 4 + ts-client/src/dlmm/helpers/binArray.ts | 40 +- ts-client/src/dlmm/helpers/token2022.ts | 56 + ts-client/src/dlmm/idl.ts | 4811 ++++++++++++++++------- ts-client/src/dlmm/index.ts | 1208 +++--- ts-client/src/dlmm/types/index.ts | 22 +- ts-client/src/test/sdk.test.ts | 63 +- 7 files changed, 3978 insertions(+), 2226 deletions(-) create mode 100644 ts-client/src/dlmm/helpers/token2022.ts diff --git a/ts-client/src/dlmm/constants/index.ts b/ts-client/src/dlmm/constants/index.ts index 3261638e..588aac4d 100644 --- a/ts-client/src/dlmm/constants/index.ts +++ b/ts-client/src/dlmm/constants/index.ts @@ -8,6 +8,10 @@ export const LBCLMM_PROGRAM_IDS = { "mainnet-beta": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", }; +export const MEMO_PROGRAM_ID = new PublicKey( + "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr" +); + export const ADMIN = { devnet: "6WaLrrRfReGKBYUSkmx2K6AuT21ida4j8at2SUiZdXu8", localhost: "bossj3JvwiNK7pvjr149DqdtJxf2gdygbcmEPTkb2F1", diff --git a/ts-client/src/dlmm/helpers/binArray.ts b/ts-client/src/dlmm/helpers/binArray.ts index a95cc8c8..bf4f7b70 100644 --- a/ts-client/src/dlmm/helpers/binArray.ts +++ b/ts-client/src/dlmm/helpers/binArray.ts @@ -1,5 +1,5 @@ import { BN } from "@coral-xyz/anchor"; -import { PublicKey } from "@solana/web3.js"; +import { AccountMeta, PublicKey } from "@solana/web3.js"; import { MAX_BIN_ARRAY_SIZE, MAX_BIN_PER_POSITION } from "../constants"; import { Bin, @@ -364,3 +364,41 @@ export function getBinArraysRequiredByPositionRange( index, })); } + +export function getBinArrayIndexesByBinRange(lowerBinId: BN, upperBinId: BN) { + let binArrayIndex = binIdToBinArrayIndex(lowerBinId); + const indexes: BN[] = []; + while (true) { + const [binArrayLowerBinId, binArrayUpperBinId] = + getBinArrayLowerUpperBinId(binArrayIndex); + indexes.push(binArrayIndex); + + if ( + upperBinId.gte(binArrayLowerBinId) && + upperBinId.lte(binArrayUpperBinId) + ) { + break; + } else { + binArrayIndex = binArrayIndex.add(new BN(1)); + } + } + + return indexes; +} + +export function getBinArrayAccounstMetaByBinRange( + lbPair: PublicKey, + lowerBinId: BN, + upperBinId: BN, + programId: PublicKey +): AccountMeta[] { + const indexes = getBinArrayIndexesByBinRange(lowerBinId, upperBinId); + return indexes.map((index) => { + const [binArray] = deriveBinArray(lbPair, index, programId); + return { + pubkey: binArray, + isSigner: false, + isWritable: true, + }; + }); +} diff --git a/ts-client/src/dlmm/helpers/token2022.ts b/ts-client/src/dlmm/helpers/token2022.ts new file mode 100644 index 00000000..58e20046 --- /dev/null +++ b/ts-client/src/dlmm/helpers/token2022.ts @@ -0,0 +1,56 @@ +import { + addExtraAccountMetasForExecute, + createTransferCheckedInstruction, + getTransferHook, + TOKEN_PROGRAM_ID, + unpackMint, +} from "@solana/spl-token"; +import { AccountInfo, Connection, PublicKey } from "@solana/web3.js"; + +export async function getExtraAccountMetasForTransferHook( + connection: Connection, + mintAddress: PublicKey, + mintAccountInfo: AccountInfo +) { + const mintState = unpackMint( + mintAddress, + mintAccountInfo, + mintAccountInfo.owner + ); + + if (mintAccountInfo.owner.equals(TOKEN_PROGRAM_ID)) { + return []; + } + + const transferHook = getTransferHook(mintState); + + if (!transferHook) { + return []; + } else { + // We just need the instruction, therefore we do not need source and destination key + const instruction = createTransferCheckedInstruction( + PublicKey.default, + mintAddress, + PublicKey.default, + PublicKey.default, + BigInt(0), + mintState.decimals, + [], + mintAccountInfo.owner + ); + + await addExtraAccountMetasForExecute( + connection, + instruction, + transferHook.programId, + PublicKey.default, + mintAddress, + PublicKey.default, + PublicKey.default, + BigInt(0) + ); + + // Only 4 keys needed if it's single signer. https://github.com/solana-labs/solana-program-library/blob/d72289c79a04411c69a8bf1054f7156b6196f9b3/token/js/src/extensions/transferFee/instructions.ts#L251 + return instruction.keys.slice(4); + } +} diff --git a/ts-client/src/dlmm/idl.ts b/ts-client/src/dlmm/idl.ts index 0321c18f..b502099f 100644 --- a/ts-client/src/dlmm/idl.ts +++ b/ts-client/src/dlmm/idl.ts @@ -1,7 +1,7 @@ export type LbClmm = { - "version": "0.8.0", - "name": "lb_clmm", - "constants": [ + version: "0.9.0"; + name: "lb_clmm"; + constants: [ { name: "BASIS_POINT_MAX"; type: "i32"; @@ -201,8 +201,8 @@ export type LbClmm = { ]; }, { - "name": "initializePermissionLbPair", - "accounts": [ + name: "initializePermissionLbPair"; + accounts: [ { name: "base"; isMut: false; @@ -1437,6 +1437,11 @@ export type LbClmm = { name: "tokenYProgram"; isMut: false; isSigner: false; + }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; } ]; args: [ @@ -1447,6 +1452,12 @@ export type LbClmm = { { name: "amountY"; type: "u64"; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; } ]; }, @@ -1469,9 +1480,15 @@ export type LbClmm = { isSigner: false; }, { - "name": "admin", - "isMut": true, - "isSigner": true + name: "tokenBadge"; + isMut: false; + isSigner: false; + isOptional: true; + }, + { + name: "admin"; + isMut: true; + isSigner: true; }, { name: "tokenProgram"; @@ -1575,6 +1592,12 @@ export type LbClmm = { { name: "carryForward"; type: "bool"; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; } ]; }, @@ -1796,8 +1819,8 @@ export type LbClmm = { args: []; }, { - "name": "closePosition", - "accounts": [ + name: "closePosition"; + accounts: [ { name: "position"; isMut: true; @@ -2052,75 +2075,8 @@ export type LbClmm = { args: []; }, { - "name": "removeLiquiditySingleSide", - "accounts": [ - { - "name": "position", - "isMut": true, - "isSigner": false - }, - { - "name": "lbPair", - "isMut": true, - "isSigner": false - }, - { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true - }, - { - "name": "userToken", - "isMut": true, - "isSigner": false - }, - { - "name": "reserve", - "isMut": true, - "isSigner": false - }, - { - "name": "tokenMint", - "isMut": false, - "isSigner": false - }, - { - "name": "binArrayLower", - "isMut": true, - "isSigner": false - }, - { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false - }, - { - "name": "sender", - "isMut": false, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "eventAuthority", - "isMut": false, - "isSigner": false - }, - { - "name": "program", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "togglePairStatus", - "accounts": [ + name: "togglePairStatus"; + accounts: [ { name: "lbPair"; isMut: true; @@ -2291,6 +2247,11 @@ export type LbClmm = { isMut: false; isSigner: false; }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; + }, { name: "eventAuthority"; isMut: false; @@ -2306,12 +2267,18 @@ export type LbClmm = { { name: "rewardIndex"; type: "u64"; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; } ]; }, { - "name": "setActivationPoint", - "accounts": [ + name: "setActivationPoint"; + accounts: [ { name: "lbPair"; isMut: true; @@ -2325,14 +2292,14 @@ export type LbClmm = { ]; args: [ { - "name": "activationPoint", - "type": "u64" + name: "activationPoint"; + type: "u64"; } ]; }, { - "name": "setLockReleasePoint", - "accounts": [ + name: "setLockReleasePoint"; + accounts: [ { name: "position"; isMut: true; @@ -2361,8 +2328,8 @@ export type LbClmm = { ]; args: [ { - "name": "newLockReleasePoint", - "type": "u64" + name: "newLockReleasePoint"; + type: "u64"; } ]; }, @@ -2585,8 +2552,8 @@ export type LbClmm = { ]; }, { - "name": "setPreActivationDuration", - "accounts": [ + name: "setPreActivationDuration"; + accounts: [ { name: "lbPair"; isMut: true; @@ -2600,8 +2567,8 @@ export type LbClmm = { ]; args: [ { - "name": "preActivationDuration", - "type": "u16" + name: "preActivationDuration"; + type: "u64"; } ]; }, @@ -2624,215 +2591,1096 @@ export type LbClmm = { name: "preActivationSwapAddress"; type: "publicKey"; } - ] - } - ]; - accounts: [ - { - name: "binArrayBitmapExtension"; - type: { - kind: "struct"; - fields: [ - { - name: "lbPair"; - type: "publicKey"; - }, - { - name: "positiveBinArrayBitmap"; - docs: [ - "Packed initialized bin array state for start_bin_index is positive" - ]; - type: { - array: [ - { - array: ["u64", 8]; - }, - 12 - ]; - }; - }, - { - name: "negativeBinArrayBitmap"; - docs: [ - "Packed initialized bin array state for start_bin_index is negative" - ]; - type: { - array: [ - { - array: ["u64", 8]; - }, - 12 - ]; - }; - } - ]; - }; + ]; }, { - name: "binArray"; - docs: [ - "An account to contain a range of bin. For example: Bin 100 <-> 200.", - "For example:", - "BinArray index: 0 contains bin 0 <-> 599", - "index: 2 contains bin 600 <-> 1199, ..." + name: "initializeTokenBadge"; + accounts: [ + { + name: "tokenMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenBadge"; + isMut: true; + isSigner: false; + }, + { + name: "admin"; + isMut: true; + isSigner: true; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + } ]; - type: { - kind: "struct"; - fields: [ - { - name: "index"; - type: "i64"; - }, - { - name: "version"; - docs: ["Version of binArray"]; - type: "u8"; - }, - { - name: "padding"; - type: { - array: ["u8", 7]; - }; - }, - { - name: "lbPair"; - type: "publicKey"; - }, - { - name: "bins"; - type: { - array: [ - { - defined: "Bin"; - }, - 70 - ]; - }; - } - ]; - }; + args: []; }, { - name: "lbPair"; - type: { - kind: "struct"; - fields: [ - { - name: "parameters"; - type: { - defined: "StaticParameters"; - }; - }, - { - name: "vParameters"; - type: { - defined: "VariableParameters"; - }; - }, - { - name: "bumpSeed"; - type: { - array: ["u8", 1]; - }; - }, - { - name: "binStepSeed"; - docs: ["Bin step signer seed"]; - type: { - array: ["u8", 2]; - }; - }, - { - name: "pairType"; - docs: ["Type of the pair"]; - type: "u8"; - }, - { - name: "activeId"; - docs: ["Active bin id"]; - type: "i32"; - }, - { - name: "binStep"; - docs: ["Bin step. Represent the price increment / decrement."]; - type: "u16"; - }, - { - name: "status"; - docs: ["Status of the pair. Check PairStatus enum."]; - type: "u8"; - }, - { - "name": "requireBaseFactorSeed", - "docs": [ - "Require base factor seed" - ], - "type": "u8" - }, - { - "name": "baseFactorSeed", - "docs": [ - "Base factor seed" - ], - "type": { - "array": [ - "u8", - 2 - ] - } - }, - { - "name": "activationType", - "docs": [ - "Activation type" - ], - "type": "u8" - }, - { - "name": "padding0", - "docs": [ - "padding 0" - ], - "type": "u8" - }, - { - name: "tokenXMint"; - docs: ["Token X mint"]; - type: "publicKey"; - }, - { - name: "tokenYMint"; - docs: ["Token Y mint"]; - type: "publicKey"; - }, - { - name: "reserveX"; - docs: ["LB token X vault"]; - type: "publicKey"; - }, - { - name: "reserveY"; - docs: ["LB token Y vault"]; - type: "publicKey"; - }, - { - name: "protocolFee"; - docs: ["Uncollected protocol fee"]; - type: { - defined: "ProtocolFee"; + name: "initializeLbPair2"; + accounts: [ + { + name: "lbPair"; + isMut: true; + isSigner: false; + }, + { + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; + }, + { + name: "tokenMintX"; + isMut: false; + isSigner: false; + }, + { + name: "tokenMintY"; + isMut: false; + isSigner: false; + }, + { + name: "reserveX"; + isMut: true; + isSigner: false; + }, + { + name: "reserveY"; + isMut: true; + isSigner: false; + }, + { + name: "oracle"; + isMut: true; + isSigner: false; + }, + { + name: "presetParameter"; + isMut: false; + isSigner: false; + }, + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "tokenBadgeX"; + isMut: false; + isSigner: false; + isOptional: true; + }, + { + name: "tokenBadgeY"; + isMut: false; + isSigner: false; + isOptional: true; + }, + { + name: "tokenProgramX"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgramY"; + isMut: false; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "activeId"; + type: "i32"; + }, + { + name: "binStep"; + type: "u16"; + } + ]; + }, + { + name: "claimFee2"; + accounts: [ + { + name: "lbPair"; + isMut: true; + isSigner: false; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "sender"; + isMut: false; + isSigner: true; + }, + { + name: "reserveX"; + isMut: true; + isSigner: false; + }, + { + name: "reserveY"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenX"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenY"; + isMut: true; + isSigner: false; + }, + { + name: "tokenXMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgramX"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgramY"; + isMut: false; + isSigner: false; + }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "minBinId"; + type: "i32"; + }, + { + name: "maxBinId"; + type: "i32"; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; + } + ]; + }, + { + name: "claimReward2"; + accounts: [ + { + name: "lbPair"; + isMut: true; + isSigner: false; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "sender"; + isMut: false; + isSigner: true; + }, + { + name: "rewardVault"; + isMut: true; + isSigner: false; + }, + { + name: "rewardMint"; + isMut: false; + isSigner: false; + }, + { + name: "userTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "rewardIndex"; + type: "u64"; + }, + { + name: "minBinId"; + type: "i32"; + }, + { + name: "maxBinId"; + type: "i32"; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; + } + ]; + }, + { + name: "addLiquidity2"; + accounts: [ + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "lbPair"; + isMut: true; + isSigner: false; + }, + { + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; + }, + { + name: "userTokenX"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenY"; + isMut: true; + isSigner: false; + }, + { + name: "reserveX"; + isMut: true; + isSigner: false; + }, + { + name: "reserveY"; + isMut: true; + isSigner: false; + }, + { + name: "tokenXMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYMint"; + isMut: false; + isSigner: false; + }, + { + name: "sender"; + isMut: false; + isSigner: true; + }, + { + name: "tokenXProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYProgram"; + isMut: false; + isSigner: false; + }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "liquidityParameter"; + type: { + defined: "LiquidityParameter"; + }; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; + } + ]; + }, + { + name: "addLiquidityByStrategy2"; + accounts: [ + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "lbPair"; + isMut: true; + isSigner: false; + }, + { + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; + }, + { + name: "userTokenX"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenY"; + isMut: true; + isSigner: false; + }, + { + name: "reserveX"; + isMut: true; + isSigner: false; + }, + { + name: "reserveY"; + isMut: true; + isSigner: false; + }, + { + name: "tokenXMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYMint"; + isMut: false; + isSigner: false; + }, + { + name: "sender"; + isMut: false; + isSigner: true; + }, + { + name: "tokenXProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYProgram"; + isMut: false; + isSigner: false; + }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "liquidityParameter"; + type: { + defined: "LiquidityParameterByStrategy"; + }; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; + } + ]; + }, + { + name: "removeLiquidity2"; + accounts: [ + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "lbPair"; + isMut: true; + isSigner: false; + }, + { + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; + }, + { + name: "userTokenX"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenY"; + isMut: true; + isSigner: false; + }, + { + name: "reserveX"; + isMut: true; + isSigner: false; + }, + { + name: "reserveY"; + isMut: true; + isSigner: false; + }, + { + name: "tokenXMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYMint"; + isMut: false; + isSigner: false; + }, + { + name: "sender"; + isMut: false; + isSigner: true; + }, + { + name: "tokenXProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYProgram"; + isMut: false; + isSigner: false; + }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "binLiquidityRemoval"; + type: { + vec: { + defined: "BinLiquidityReduction"; + }; + }; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; + } + ]; + }, + { + name: "removeLiquidityByRange2"; + accounts: [ + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "lbPair"; + isMut: true; + isSigner: false; + }, + { + name: "binArrayBitmapExtension"; + isMut: true; + isSigner: false; + isOptional: true; + }, + { + name: "userTokenX"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenY"; + isMut: true; + isSigner: false; + }, + { + name: "reserveX"; + isMut: true; + isSigner: false; + }, + { + name: "reserveY"; + isMut: true; + isSigner: false; + }, + { + name: "tokenXMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYMint"; + isMut: false; + isSigner: false; + }, + { + name: "sender"; + isMut: false; + isSigner: true; + }, + { + name: "tokenXProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYProgram"; + isMut: false; + isSigner: false; + }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "fromBinId"; + type: "i32"; + }, + { + name: "toBinId"; + type: "i32"; + }, + { + name: "bpsToRemove"; + type: "u16"; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; + } + ]; + }, + { + name: "swap2"; + accounts: [ + { + name: "lbPair"; + isMut: true; + isSigner: false; + }, + { + name: "binArrayBitmapExtension"; + isMut: false; + isSigner: false; + isOptional: true; + }, + { + name: "reserveX"; + isMut: true; + isSigner: false; + }, + { + name: "reserveY"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenIn"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenOut"; + isMut: true; + isSigner: false; + }, + { + name: "tokenXMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYMint"; + isMut: false; + isSigner: false; + }, + { + name: "oracle"; + isMut: true; + isSigner: false; + }, + { + name: "hostFeeIn"; + isMut: true; + isSigner: false; + isOptional: true; + }, + { + name: "user"; + isMut: false; + isSigner: true; + }, + { + name: "tokenXProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYProgram"; + isMut: false; + isSigner: false; + }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "amountIn"; + type: "u64"; + }, + { + name: "minAmountOut"; + type: "u64"; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; + } + ]; + }, + { + name: "swapWithPriceImpact2"; + accounts: [ + { + name: "lbPair"; + isMut: true; + isSigner: false; + }, + { + name: "binArrayBitmapExtension"; + isMut: false; + isSigner: false; + isOptional: true; + }, + { + name: "reserveX"; + isMut: true; + isSigner: false; + }, + { + name: "reserveY"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenIn"; + isMut: true; + isSigner: false; + }, + { + name: "userTokenOut"; + isMut: true; + isSigner: false; + }, + { + name: "tokenXMint"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYMint"; + isMut: false; + isSigner: false; + }, + { + name: "oracle"; + isMut: true; + isSigner: false; + }, + { + name: "hostFeeIn"; + isMut: true; + isSigner: false; + isOptional: true; + }, + { + name: "user"; + isMut: false; + isSigner: true; + }, + { + name: "tokenXProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenYProgram"; + isMut: false; + isSigner: false; + }, + { + name: "memoProgram"; + isMut: false; + isSigner: false; + }, + { + name: "eventAuthority"; + isMut: false; + isSigner: false; + }, + { + name: "program"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "amountIn"; + type: "u64"; + }, + { + name: "activeId"; + type: { + option: "i32"; + }; + }, + { + name: "maxPriceImpactBps"; + type: "u16"; + }, + { + name: "remainingAccountsInfo"; + type: { + defined: "RemainingAccountsInfo"; + }; + } + ]; + } + ]; + accounts: [ + { + name: "binArrayBitmapExtension"; + type: { + kind: "struct"; + fields: [ + { + name: "lbPair"; + type: "publicKey"; + }, + { + name: "positiveBinArrayBitmap"; + docs: [ + "Packed initialized bin array state for start_bin_index is positive" + ]; + type: { + array: [ + { + array: ["u64", 8]; + }, + 12 + ]; + }; + }, + { + name: "negativeBinArrayBitmap"; + docs: [ + "Packed initialized bin array state for start_bin_index is negative" + ]; + type: { + array: [ + { + array: ["u64", 8]; + }, + 12 + ]; + }; + } + ]; + }; + }, + { + name: "binArray"; + docs: [ + "An account to contain a range of bin. For example: Bin 100 <-> 200.", + "For example:", + "BinArray index: 0 contains bin 0 <-> 599", + "index: 2 contains bin 600 <-> 1199, ..." + ]; + type: { + kind: "struct"; + fields: [ + { + name: "index"; + type: "i64"; + }, + { + name: "version"; + docs: ["Version of binArray"]; + type: "u8"; + }, + { + name: "padding"; + type: { + array: ["u8", 7]; + }; + }, + { + name: "lbPair"; + type: "publicKey"; + }, + { + name: "bins"; + type: { + array: [ + { + defined: "Bin"; + }, + 70 + ]; + }; + } + ]; + }; + }, + { + name: "lbPair"; + type: { + kind: "struct"; + fields: [ + { + name: "parameters"; + type: { + defined: "StaticParameters"; + }; + }, + { + name: "vParameters"; + type: { + defined: "VariableParameters"; + }; + }, + { + name: "bumpSeed"; + type: { + array: ["u8", 1]; + }; + }, + { + name: "binStepSeed"; + docs: ["Bin step signer seed"]; + type: { + array: ["u8", 2]; + }; + }, + { + name: "pairType"; + docs: ["Type of the pair"]; + type: "u8"; + }, + { + name: "activeId"; + docs: ["Active bin id"]; + type: "i32"; + }, + { + name: "binStep"; + docs: ["Bin step. Represent the price increment / decrement."]; + type: "u16"; + }, + { + name: "status"; + docs: ["Status of the pair. Check PairStatus enum."]; + type: "u8"; + }, + { + name: "requireBaseFactorSeed"; + docs: ["Require base factor seed"]; + type: "u8"; + }, + { + name: "baseFactorSeed"; + docs: ["Base factor seed"]; + type: { + array: ["u8", 2]; + }; + }, + { + name: "activationType"; + docs: ["Activation type"]; + type: "u8"; + }, + { + name: "padding0"; + docs: ["padding 0"]; + type: "u8"; + }, + { + name: "tokenXMint"; + docs: ["Token X mint"]; + type: "publicKey"; + }, + { + name: "tokenYMint"; + docs: ["Token Y mint"]; + type: "publicKey"; + }, + { + name: "reserveX"; + docs: ["LB token X vault"]; + type: "publicKey"; + }, + { + name: "reserveY"; + docs: ["LB token Y vault"]; + type: "publicKey"; + }, + { + name: "protocolFee"; + docs: ["Uncollected protocol fee"]; + type: { + defined: "ProtocolFee"; }; }, { - "name": "padding1", - "docs": [ + name: "padding1"; + docs: [ "_padding_1, previous Fee owner, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!" - ], - "type": { - "array": [ - "u8", - 32 - ] - } + ]; + type: { + array: ["u8", 32]; + }; }, { name: "rewardInfos"; @@ -2869,11 +3717,11 @@ export type LbClmm = { type: "publicKey"; }, { - "name": "preActivationSwapAddress", - "docs": [ + name: "preActivationSwapAddress"; + docs: [ "Address allowed to swap when the current point is greater than or equal to the pre-activation point. The pre-activation point is calculated as `activation_point - pre_activation_duration`." - ], - "type": "publicKey" + ]; + type: "publicKey"; }, { name: "baseKey"; @@ -2881,34 +3729,31 @@ export type LbClmm = { type: "publicKey"; }, { - "name": "activationPoint", - "docs": [ + name: "activationPoint"; + docs: [ "Time point to enable the pair. Only applicable for permission pair." - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "preActivationDuration", - "docs": [ + name: "preActivationDuration"; + docs: [ "Duration before activation activation_point. Used to calculate pre-activation time point for pre_activation_swap_address" - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "padding2", - "docs": [ + name: "padding2"; + docs: [ "_padding 2 is reclaimed free space from swap_cap_deactivate_point and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!" - ], - "type": { - "array": [ - "u8", - 8 - ] - } + ]; + type: { + array: ["u8", 8]; + }; }, { - "name": "lockDuration", - "docs": [ + name: "lockDuration"; + docs: [ "Liquidity lock duration for positions which created before activate. Only applicable for permission pair." ]; type: "u64"; @@ -2918,11 +3763,21 @@ export type LbClmm = { docs: ["Pool creator"]; type: "publicKey"; }, + { + name: "tokenMintXProgramFlag"; + docs: ["token_mint_x_program_flag"]; + type: "u8"; + }, + { + name: "tokenMintYProgramFlag"; + docs: ["token_mint_y_program_flag"]; + type: "u8"; + }, { name: "reserved"; docs: ["Reserved space for future use"]; type: { - array: ["u8", 24]; + array: ["u8", 22]; }; } ]; @@ -2934,11 +3789,9 @@ export type LbClmm = { kind: "struct"; fields: [ { - "name": "idx", - "docs": [ - "Index of latest observation" - ], - "type": "u64" + name: "idx"; + docs: ["Index of latest observation"]; + type: "u64"; }, { name: "activeSize"; @@ -3135,11 +3988,9 @@ export type LbClmm = { type: "publicKey"; }, { - "name": "lockReleasePoint", - "docs": [ - "Time point which the locked liquidity can be withdraw" - ], - "type": "u64" + name: "lockReleasePoint"; + docs: ["Time point which the locked liquidity can be withdraw"]; + type: "u64"; }, { name: "subjectedToBootstrapLiquidityLocking"; @@ -3238,8 +4089,29 @@ export type LbClmm = { ]; type: "u16"; } - ] - } + ]; + }; + }, + { + name: "tokenBadge"; + docs: ["Parameter that set by the protocol"]; + type: { + kind: "struct"; + fields: [ + { + name: "tokenMint"; + docs: ["token mint"]; + type: "publicKey"; + }, + { + name: "padding"; + docs: ["Reserve"]; + type: { + array: ["u8", 128]; + }; + } + ]; + }; } ]; types: [ @@ -3543,12 +4415,12 @@ export type LbClmm = { type: "i32"; }, { - "name": "lockDuration", - "type": "u64" + name: "lockDuration"; + type: "u64"; }, { - "name": "activationType", - "type": "u8" + name: "activationType"; + type: "u8"; } ]; }; @@ -3630,10 +4502,10 @@ export type LbClmm = { }; }, { - "name": "FeeParameter", - "type": { - "kind": "struct", - "fields": [ + name: "FeeParameter"; + type: { + kind: "struct"; + fields: [ { name: "protocolShare"; docs: [ @@ -3650,26 +4522,26 @@ export type LbClmm = { }; }, { - "name": "BinLiquidityReduction", - "type": { - "kind": "struct", - "fields": [ + name: "BinLiquidityReduction"; + type: { + kind: "struct"; + fields: [ { - "name": "binId", - "type": "i32" + name: "binId"; + type: "i32"; }, { - "name": "bpsToRemove", - "type": "u16" + name: "bpsToRemove"; + type: "u16"; } - ] - } + ]; + }; }, { - "name": "Bin", - "type": { - "kind": "struct", - "fields": [ + name: "Bin"; + type: { + kind: "struct"; + fields: [ { name: "amountX"; docs: [ @@ -3991,6 +4863,40 @@ export type LbClmm = { ]; }; }, + { + name: "RemainingAccountsSlice"; + type: { + kind: "struct"; + fields: [ + { + name: "accountsType"; + type: { + defined: "AccountsType"; + }; + }, + { + name: "length"; + type: "u8"; + } + ]; + }; + }, + { + name: "RemainingAccountsInfo"; + type: { + kind: "struct"; + fields: [ + { + name: "slices"; + type: { + vec: { + defined: "RemainingAccountsSlice"; + }; + }; + } + ]; + }; + }, { name: "StrategyType"; type: { @@ -4056,25 +4962,23 @@ export type LbClmm = { }; }, { - "name": "ActivationType", - "docs": [ - "Type of the activation" - ], - "type": { - "kind": "enum", - "variants": [ + name: "ActivationType"; + docs: ["Type of the activation"]; + type: { + kind: "enum"; + variants: [ { - "name": "Slot" + name: "Slot"; }, { - "name": "Timestamp" + name: "Timestamp"; } - ] - } + ]; + }; }, { - "name": "PairType", - "docs": [ + name: "PairType"; + docs: [ "Type of the Pair. 0 = Permissionless, 1 = Permission. Putting 0 as permissionless for backward compatibility." ]; type: { @@ -4105,6 +5009,37 @@ export type LbClmm = { } ]; }; + }, + { + name: "TokenProgramFlags"; + type: { + kind: "enum"; + variants: [ + { + name: "TokenProgram"; + }, + { + name: "TokenProgram2022"; + } + ]; + }; + }, + { + name: "AccountsType"; + type: { + kind: "enum"; + variants: [ + { + name: "TransferHookX"; + }, + { + name: "TransferHookY"; + }, + { + name: "TransferHookReward"; + } + ]; + }; } ]; events: [ @@ -4568,27 +5503,27 @@ export type LbClmm = { ]; }, { - "name": "UpdatePositionLockReleasePoint", - "fields": [ + name: "UpdatePositionLockReleasePoint"; + fields: [ { name: "position"; type: "publicKey"; index: false; }, { - "name": "currentPoint", - "type": "u64", - "index": false + name: "currentPoint"; + type: "u64"; + index: false; }, { - "name": "newLockReleasePoint", - "type": "u64", - "index": false + name: "newLockReleasePoint"; + type: "u64"; + index: false; }, { - "name": "oldLockReleasePoint", - "type": "u64", - "index": false + name: "oldLockReleasePoint"; + type: "u64"; + index: false; }, { name: "sender"; @@ -4880,47 +5815,102 @@ export type LbClmm = { msg: "Wrong rent receiver"; }, { - "code": 6052, - "name": "AlreadyPassActivationPoint", - "msg": "Already activated" + code: 6052; + name: "AlreadyPassActivationPoint"; + msg: "Already activated"; + }, + { + code: 6053; + name: "ExceedMaxSwappedAmount"; + msg: "Swapped amount is exceeded max swapped amount"; + }, + { + code: 6054; + name: "InvalidStrategyParameters"; + msg: "Invalid strategy parameters"; + }, + { + code: 6055; + name: "LiquidityLocked"; + msg: "Liquidity locked"; + }, + { + code: 6056; + name: "BinRangeIsNotEmpty"; + msg: "Bin range is not empty"; + }, + { + code: 6057; + name: "NotExactAmountOut"; + msg: "Amount out is not matched with exact amount out"; + }, + { + code: 6058; + name: "InvalidActivationType"; + msg: "Invalid activation type"; + }, + { + code: 6059; + name: "NotSupportMint"; + msg: "Not support token_2022 mint extension"; + }, + { + code: 6060; + name: "UnsupportedMintExtension"; + msg: "Unsupported mint extension"; + }, + { + code: 6061; + name: "UnsupportNativeMintToken2022"; + msg: "Unsupported native mint token2022"; + }, + { + code: 6062; + name: "UnmatchTokenMint"; + msg: "Unmatch token mint"; + }, + { + code: 6063; + name: "UnsupportedTokenMint"; + msg: "Unsupported token mint"; }, { - "code": 6053, - "name": "ExceedMaxSwappedAmount", - "msg": "Swapped amount is exceeded max swapped amount" + code: 6064; + name: "InsufficientRemainingAccounts"; + msg: "Insufficient remaining accounts"; }, { - "code": 6054, - "name": "InvalidStrategyParameters", - "msg": "Invalid strategy parameters" + code: 6065; + name: "InvalidRemainingAccountSlice"; + msg: "Invalid remaining account slice"; }, { - "code": 6055, - "name": "LiquidityLocked", - "msg": "Liquidity locked" + code: 6066; + name: "DuplicatedRemainingAccountTypes"; + msg: "Duplicated remaining account types"; }, { - "code": 6056, - "name": "BinRangeIsNotEmpty", - "msg": "Bin range is not empty" + code: 6067; + name: "MissingRemainingAccountForTransferHook"; + msg: "Missing remaining account for transfer hook"; }, { - "code": 6057, - "name": "NotExactAmountOut", - "msg": "Amount out is not matched with exact amount out" + code: 6068; + name: "NoTransferHookProgram"; + msg: "Remaining account was passed for transfer hook but there's no hook program"; }, { - "code": 6058, - "name": "InvalidActivationType", - "msg": "Invalid activation type" + code: 6069; + name: "ZeroFundedAmount"; + msg: "Zero funded amount"; } ]; }; export const IDL: LbClmm = { - "version": "0.8.0", - "name": "lb_clmm", - "constants": [ + version: "0.9.0", + name: "lb_clmm", + constants: [ { name: "BASIS_POINT_MAX", type: "i32", @@ -5000,43 +5990,582 @@ export const IDL: LbClmm = { value: "512", }, { - name: "MAX_REWARD_BIN_SPLIT", - type: { - defined: "usize", - }, - value: "15", + name: "MAX_REWARD_BIN_SPLIT", + type: { + defined: "usize", + }, + value: "15", + }, + { + name: "BIN_ARRAY", + type: "bytes", + value: "[98, 105, 110, 95, 97, 114, 114, 97, 121]", + }, + { + name: "ORACLE", + type: "bytes", + value: "[111, 114, 97, 99, 108, 101]", + }, + { + name: "BIN_ARRAY_BITMAP_SEED", + type: "bytes", + value: "[98, 105, 116, 109, 97, 112]", + }, + { + name: "PRESET_PARAMETER", + type: "bytes", + value: + "[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]", + }, + { + name: "POSITION", + type: "bytes", + value: "[112, 111, 115, 105, 116, 105, 111, 110]", + }, + ], + instructions: [ + { + name: "initializeLbPair", + accounts: [ + { + name: "lbPair", + isMut: true, + isSigner: false, + }, + { + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, + }, + { + name: "tokenMintX", + isMut: false, + isSigner: false, + }, + { + name: "tokenMintY", + isMut: false, + isSigner: false, + }, + { + name: "reserveX", + isMut: true, + isSigner: false, + }, + { + name: "reserveY", + isMut: true, + isSigner: false, + }, + { + name: "oracle", + isMut: true, + isSigner: false, + }, + { + name: "presetParameter", + isMut: false, + isSigner: false, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + { + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "activeId", + type: "i32", + }, + { + name: "binStep", + type: "u16", + }, + ], + }, + { + name: "initializePermissionLbPair", + accounts: [ + { + name: "base", + isMut: false, + isSigner: true, + }, + { + name: "lbPair", + isMut: true, + isSigner: false, + }, + { + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, + }, + { + name: "tokenMintX", + isMut: false, + isSigner: false, + }, + { + name: "tokenMintY", + isMut: false, + isSigner: false, + }, + { + name: "reserveX", + isMut: true, + isSigner: false, + }, + { + name: "reserveY", + isMut: true, + isSigner: false, + }, + { + name: "oracle", + isMut: true, + isSigner: false, + }, + { + name: "admin", + isMut: true, + isSigner: true, + }, + { + name: "tokenBadgeX", + isMut: false, + isSigner: false, + isOptional: true, + }, + { + name: "tokenBadgeY", + isMut: false, + isSigner: false, + isOptional: true, + }, + { + name: "tokenProgramX", + isMut: false, + isSigner: false, + }, + { + name: "tokenProgramY", + isMut: false, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + { + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "ixData", + type: { + defined: "InitPermissionPairIx", + }, + }, + ], }, { - name: "BIN_ARRAY", - type: "bytes", - value: "[98, 105, 110, 95, 97, 114, 114, 97, 121]", + name: "initializeBinArrayBitmapExtension", + accounts: [ + { + name: "lbPair", + isMut: false, + isSigner: false, + }, + { + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + docs: [ + "Initialize an account to store if a bin array is initialized.", + ], + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [], }, { - name: "ORACLE", - type: "bytes", - value: "[111, 114, 97, 99, 108, 101]", + name: "initializeBinArray", + accounts: [ + { + name: "lbPair", + isMut: false, + isSigner: false, + }, + { + name: "binArray", + isMut: true, + isSigner: false, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "index", + type: "i64", + }, + ], }, { - name: "BIN_ARRAY_BITMAP_SEED", - type: "bytes", - value: "[98, 105, 116, 109, 97, 112]", + name: "addLiquidity", + accounts: [ + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "lbPair", + isMut: true, + isSigner: false, + }, + { + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, + }, + { + name: "userTokenX", + isMut: true, + isSigner: false, + }, + { + name: "userTokenY", + isMut: true, + isSigner: false, + }, + { + name: "reserveX", + isMut: true, + isSigner: false, + }, + { + name: "reserveY", + isMut: true, + isSigner: false, + }, + { + name: "tokenXMint", + isMut: false, + isSigner: false, + }, + { + name: "tokenYMint", + isMut: false, + isSigner: false, + }, + { + name: "binArrayLower", + isMut: true, + isSigner: false, + }, + { + name: "binArrayUpper", + isMut: true, + isSigner: false, + }, + { + name: "sender", + isMut: false, + isSigner: true, + }, + { + name: "tokenXProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenYProgram", + isMut: false, + isSigner: false, + }, + { + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "liquidityParameter", + type: { + defined: "LiquidityParameter", + }, + }, + ], }, { - name: "PRESET_PARAMETER", - type: "bytes", - value: - "[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]", + name: "addLiquidityByWeight", + accounts: [ + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "lbPair", + isMut: true, + isSigner: false, + }, + { + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, + }, + { + name: "userTokenX", + isMut: true, + isSigner: false, + }, + { + name: "userTokenY", + isMut: true, + isSigner: false, + }, + { + name: "reserveX", + isMut: true, + isSigner: false, + }, + { + name: "reserveY", + isMut: true, + isSigner: false, + }, + { + name: "tokenXMint", + isMut: false, + isSigner: false, + }, + { + name: "tokenYMint", + isMut: false, + isSigner: false, + }, + { + name: "binArrayLower", + isMut: true, + isSigner: false, + }, + { + name: "binArrayUpper", + isMut: true, + isSigner: false, + }, + { + name: "sender", + isMut: false, + isSigner: true, + }, + { + name: "tokenXProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenYProgram", + isMut: false, + isSigner: false, + }, + { + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "liquidityParameter", + type: { + defined: "LiquidityParameterByWeight", + }, + }, + ], }, { - name: "POSITION", - type: "bytes", - value: "[112, 111, 115, 105, 116, 105, 111, 110]", + name: "addLiquidityByStrategy", + accounts: [ + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "lbPair", + isMut: true, + isSigner: false, + }, + { + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, + }, + { + name: "userTokenX", + isMut: true, + isSigner: false, + }, + { + name: "userTokenY", + isMut: true, + isSigner: false, + }, + { + name: "reserveX", + isMut: true, + isSigner: false, + }, + { + name: "reserveY", + isMut: true, + isSigner: false, + }, + { + name: "tokenXMint", + isMut: false, + isSigner: false, + }, + { + name: "tokenYMint", + isMut: false, + isSigner: false, + }, + { + name: "binArrayLower", + isMut: true, + isSigner: false, + }, + { + name: "binArrayUpper", + isMut: true, + isSigner: false, + }, + { + name: "sender", + isMut: false, + isSigner: true, + }, + { + name: "tokenXProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenYProgram", + isMut: false, + isSigner: false, + }, + { + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "liquidityParameter", + type: { + defined: "LiquidityParameterByStrategy", + }, + }, + ], }, - ], - instructions: [ { - name: "initializeLbPair", + name: "addLiquidityByStrategyOneSide", accounts: [ + { + name: "position", + isMut: true, + isSigner: false, + }, { name: "lbPair", isMut: true, @@ -5049,52 +6578,111 @@ export const IDL: LbClmm = { isOptional: true, }, { - name: "tokenMintX", + name: "userToken", + isMut: true, + isSigner: false, + }, + { + name: "reserve", + isMut: true, + isSigner: false, + }, + { + name: "tokenMint", isMut: false, isSigner: false, }, { - name: "tokenMintY", + name: "binArrayLower", + isMut: true, + isSigner: false, + }, + { + name: "binArrayUpper", + isMut: true, + isSigner: false, + }, + { + name: "sender", + isMut: false, + isSigner: true, + }, + { + name: "tokenProgram", isMut: false, isSigner: false, }, { - name: "reserveX", + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "liquidityParameter", + type: { + defined: "LiquidityParameterByStrategyOneSide", + }, + }, + ], + }, + { + name: "addLiquidityOneSide", + accounts: [ + { + name: "position", isMut: true, isSigner: false, }, { - name: "reserveY", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "oracle", + name: "binArrayBitmapExtension", isMut: true, isSigner: false, + isOptional: true, }, { - name: "presetParameter", - isMut: false, + name: "userToken", + isMut: true, isSigner: false, }, { - name: "funder", + name: "reserve", isMut: true, - isSigner: true, + isSigner: false, }, { - name: "tokenProgram", + name: "tokenMint", isMut: false, isSigner: false, }, { - name: "systemProgram", - isMut: false, + name: "binArrayLower", + isMut: true, isSigner: false, }, { - name: "rent", + name: "binArrayUpper", + isMut: true, + isSigner: false, + }, + { + name: "sender", + isMut: false, + isSigner: true, + }, + { + name: "tokenProgram", isMut: false, isSigner: false, }, @@ -5111,22 +6699,20 @@ export const IDL: LbClmm = { ], args: [ { - name: "activeId", - type: "i32", - }, - { - name: "binStep", - type: "u16", + name: "liquidityParameter", + type: { + defined: "LiquidityOneSideParameter", + }, }, ], }, { - "name": "initializePermissionLbPair", - "accounts": [ + name: "removeLiquidity", + accounts: [ { - name: "base", - isMut: false, - isSigner: true, + name: "position", + isMut: true, + isSigner: false, }, { name: "lbPair", @@ -5140,13 +6726,13 @@ export const IDL: LbClmm = { isOptional: true, }, { - name: "tokenMintX", - isMut: false, + name: "userTokenX", + isMut: true, isSigner: false, }, { - name: "tokenMintY", - isMut: false, + name: "userTokenY", + isMut: true, isSigner: false, }, { @@ -5160,44 +6746,37 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "oracle", - isMut: true, + name: "tokenXMint", + isMut: false, isSigner: false, }, { - name: "admin", - isMut: true, - isSigner: true, - }, - { - name: "tokenBadgeX", + name: "tokenYMint", isMut: false, isSigner: false, - isOptional: true, }, { - name: "tokenBadgeY", - isMut: false, + name: "binArrayLower", + isMut: true, isSigner: false, - isOptional: true, }, { - name: "tokenProgramX", - isMut: false, + name: "binArrayUpper", + isMut: true, isSigner: false, }, { - name: "tokenProgramY", + name: "sender", isMut: false, - isSigner: false, + isSigner: true, }, { - name: "systemProgram", + name: "tokenXProgram", isMut: false, isSigner: false, }, { - name: "rent", + name: "tokenYProgram", isMut: false, isSigner: false, }, @@ -5214,32 +6793,36 @@ export const IDL: LbClmm = { ], args: [ { - name: "ixData", + name: "binLiquidityRemoval", type: { - defined: "InitPermissionPairIx", + vec: { + defined: "BinLiquidityReduction", + }, }, }, ], }, { - name: "initializeBinArrayBitmapExtension", + name: "initializePosition", accounts: [ { - name: "lbPair", - isMut: false, - isSigner: false, + name: "payer", + isMut: true, + isSigner: true, }, { - name: "binArrayBitmapExtension", + name: "position", isMut: true, + isSigner: true, + }, + { + name: "lbPair", + isMut: false, isSigner: false, - docs: [ - "Initialize an account to store if a bin array is initialized.", - ], }, { - name: "funder", - isMut: true, + name: "owner", + isMut: false, isSigner: true, }, { @@ -5252,113 +6835,170 @@ export const IDL: LbClmm = { isMut: false, isSigner: false, }, + { + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "lowerBinId", + type: "i32", + }, + { + name: "width", + type: "i32", + }, ], - args: [], }, { - name: "initializeBinArray", + name: "initializePositionPda", accounts: [ { - name: "lbPair", + name: "payer", + isMut: true, + isSigner: true, + }, + { + name: "base", isMut: false, - isSigner: false, + isSigner: true, }, { - name: "binArray", + name: "position", isMut: true, isSigner: false, }, { - name: "funder", - isMut: true, + name: "lbPair", + isMut: false, + isSigner: false, + }, + { + name: "owner", + isMut: false, isSigner: true, + docs: ["owner"], }, { name: "systemProgram", isMut: false, isSigner: false, }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + { + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, ], args: [ { - name: "index", - type: "i64", + name: "lowerBinId", + type: "i32", + }, + { + name: "width", + type: "i32", }, ], }, { - name: "addLiquidity", + name: "initializePositionByOperator", accounts: [ { - name: "position", + name: "payer", isMut: true, - isSigner: false, + isSigner: true, }, { - name: "lbPair", - isMut: true, - isSigner: false, + name: "base", + isMut: false, + isSigner: true, }, { - name: "binArrayBitmapExtension", + name: "position", isMut: true, isSigner: false, - isOptional: true, }, { - name: "userTokenX", - isMut: true, + name: "lbPair", + isMut: false, isSigner: false, }, { - name: "userTokenY", - isMut: true, - isSigner: false, + name: "operator", + isMut: false, + isSigner: true, + docs: ["operator"], }, { - name: "reserveX", - isMut: true, + name: "systemProgram", + isMut: false, isSigner: false, }, { - name: "reserveY", - isMut: true, + name: "rent", + isMut: false, isSigner: false, }, { - name: "tokenXMint", + name: "eventAuthority", isMut: false, isSigner: false, }, { - name: "tokenYMint", + name: "program", isMut: false, isSigner: false, }, + ], + args: [ { - name: "binArrayLower", - isMut: true, - isSigner: false, + name: "lowerBinId", + type: "i32", }, { - name: "binArrayUpper", - isMut: true, - isSigner: false, + name: "width", + type: "i32", }, { - name: "sender", - isMut: false, - isSigner: true, + name: "owner", + type: "publicKey", }, { - name: "tokenXProgram", - isMut: false, + name: "feeOwner", + type: "publicKey", + }, + ], + }, + { + name: "updatePositionOperator", + accounts: [ + { + name: "position", + isMut: true, isSigner: false, }, { - name: "tokenYProgram", + name: "owner", isMut: false, - isSigner: false, + isSigner: true, }, { name: "eventAuthority", @@ -5373,21 +7013,14 @@ export const IDL: LbClmm = { ], args: [ { - name: "liquidityParameter", - type: { - defined: "LiquidityParameter", - }, + name: "operator", + type: "publicKey", }, ], }, { - name: "addLiquidityByWeight", + name: "swap", accounts: [ - { - name: "position", - isMut: true, - isSigner: false, - }, { name: "lbPair", isMut: true, @@ -5395,27 +7028,27 @@ export const IDL: LbClmm = { }, { name: "binArrayBitmapExtension", - isMut: true, + isMut: false, isSigner: false, isOptional: true, }, { - name: "userTokenX", + name: "reserveX", isMut: true, isSigner: false, }, { - name: "userTokenY", + name: "reserveY", isMut: true, isSigner: false, }, { - name: "reserveX", + name: "userTokenIn", isMut: true, isSigner: false, }, { - name: "reserveY", + name: "userTokenOut", isMut: true, isSigner: false, }, @@ -5430,17 +7063,18 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "binArrayLower", + name: "oracle", isMut: true, isSigner: false, }, { - name: "binArrayUpper", + name: "hostFeeIn", isMut: true, isSigner: false, + isOptional: true, }, { - name: "sender", + name: "user", isMut: false, isSigner: true, }, @@ -5467,21 +7101,18 @@ export const IDL: LbClmm = { ], args: [ { - name: "liquidityParameter", - type: { - defined: "LiquidityParameterByWeight", - }, + name: "amountIn", + type: "u64", + }, + { + name: "minAmountOut", + type: "u64", }, ], }, { - name: "addLiquidityByStrategy", + name: "swapExactOut", accounts: [ - { - name: "position", - isMut: true, - isSigner: false, - }, { name: "lbPair", isMut: true, @@ -5489,27 +7120,27 @@ export const IDL: LbClmm = { }, { name: "binArrayBitmapExtension", - isMut: true, + isMut: false, isSigner: false, isOptional: true, }, { - name: "userTokenX", + name: "reserveX", isMut: true, isSigner: false, }, { - name: "userTokenY", + name: "reserveY", isMut: true, isSigner: false, }, { - name: "reserveX", + name: "userTokenIn", isMut: true, isSigner: false, }, { - name: "reserveY", + name: "userTokenOut", isMut: true, isSigner: false, }, @@ -5524,17 +7155,18 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "binArrayLower", + name: "oracle", isMut: true, isSigner: false, }, { - name: "binArrayUpper", + name: "hostFeeIn", isMut: true, isSigner: false, + isOptional: true, }, { - name: "sender", + name: "user", isMut: false, isSigner: true, }, @@ -5561,64 +7193,82 @@ export const IDL: LbClmm = { ], args: [ { - name: "liquidityParameter", - type: { - defined: "LiquidityParameterByStrategy", - }, + name: "maxInAmount", + type: "u64", + }, + { + name: "outAmount", + type: "u64", }, ], }, { - name: "addLiquidityByStrategyOneSide", + name: "swapWithPriceImpact", accounts: [ { - name: "position", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "lbPair", + name: "binArrayBitmapExtension", + isMut: false, + isSigner: false, + isOptional: true, + }, + { + name: "reserveX", isMut: true, isSigner: false, }, { - name: "binArrayBitmapExtension", + name: "reserveY", isMut: true, isSigner: false, - isOptional: true, }, { - name: "userToken", + name: "userTokenIn", isMut: true, isSigner: false, }, { - name: "reserve", + name: "userTokenOut", isMut: true, isSigner: false, }, { - name: "tokenMint", + name: "tokenXMint", isMut: false, isSigner: false, }, { - name: "binArrayLower", + name: "tokenYMint", + isMut: false, + isSigner: false, + }, + { + name: "oracle", isMut: true, isSigner: false, }, { - name: "binArrayUpper", + name: "hostFeeIn", isMut: true, isSigner: false, + isOptional: true, }, { - name: "sender", + name: "user", isMut: false, isSigner: true, }, { - name: "tokenProgram", + name: "tokenXProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenYProgram", isMut: false, isSigner: false, }, @@ -5635,158 +7285,133 @@ export const IDL: LbClmm = { ], args: [ { - name: "liquidityParameter", + name: "amountIn", + type: "u64", + }, + { + name: "activeId", type: { - defined: "LiquidityParameterByStrategyOneSide", + option: "i32", }, }, + { + name: "maxPriceImpactBps", + type: "u16", + }, ], }, { - name: "addLiquidityOneSide", + name: "withdrawProtocolFee", accounts: [ - { - name: "position", - isMut: true, - isSigner: false, - }, { name: "lbPair", isMut: true, isSigner: false, }, { - name: "binArrayBitmapExtension", + name: "reserveX", isMut: true, isSigner: false, - isOptional: true, }, { - name: "userToken", + name: "reserveY", isMut: true, isSigner: false, }, { - name: "reserve", - isMut: true, + name: "tokenXMint", + isMut: false, isSigner: false, }, { - name: "tokenMint", + name: "tokenYMint", isMut: false, isSigner: false, }, { - name: "binArrayLower", + name: "receiverTokenX", isMut: true, isSigner: false, }, { - name: "binArrayUpper", + name: "receiverTokenY", isMut: true, isSigner: false, }, { - name: "sender", - isMut: false, - isSigner: true, - }, - { - name: "tokenProgram", + name: "tokenXProgram", isMut: false, isSigner: false, }, { - name: "eventAuthority", + name: "tokenYProgram", isMut: false, isSigner: false, }, { - name: "program", + name: "memoProgram", isMut: false, isSigner: false, }, ], args: [ { - name: "liquidityParameter", - type: { - defined: "LiquidityOneSideParameter", - }, - }, - ], - }, - { - name: "removeLiquidity", - accounts: [ - { - name: "position", - isMut: true, - isSigner: false, - }, - { - name: "lbPair", - isMut: true, - isSigner: false, - }, - { - name: "binArrayBitmapExtension", - isMut: true, - isSigner: false, - isOptional: true, - }, - { - name: "userTokenX", - isMut: true, - isSigner: false, + name: "amountX", + type: "u64", }, { - name: "userTokenY", - isMut: true, - isSigner: false, + name: "amountY", + type: "u64", }, { - name: "reserveX", - isMut: true, - isSigner: false, + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, }, + ], + }, + { + name: "initializeReward", + accounts: [ { - name: "reserveY", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "tokenXMint", - isMut: false, + name: "rewardVault", + isMut: true, isSigner: false, }, { - name: "tokenYMint", + name: "rewardMint", isMut: false, isSigner: false, }, { - name: "binArrayLower", - isMut: true, + name: "tokenBadge", + isMut: false, isSigner: false, + isOptional: true, }, { - name: "binArrayUpper", + name: "admin", isMut: true, - isSigner: false, + isSigner: true, }, { - name: "sender", + name: "tokenProgram", isMut: false, - isSigner: true, + isSigner: false, }, { - name: "tokenXProgram", + name: "systemProgram", isMut: false, isSigner: false, }, { - name: "tokenYProgram", + name: "rent", isMut: false, isSigner: false, }, @@ -5803,45 +7428,54 @@ export const IDL: LbClmm = { ], args: [ { - name: "binLiquidityRemoval", - type: { - vec: { - defined: "BinLiquidityReduction", - }, - }, + name: "rewardIndex", + type: "u64", + }, + { + name: "rewardDuration", + type: "u64", + }, + { + name: "funder", + type: "publicKey", }, ], }, { - name: "initializePosition", + name: "fundReward", accounts: [ { - name: "payer", + name: "lbPair", isMut: true, - isSigner: true, + isSigner: false, }, { - name: "position", + name: "rewardVault", isMut: true, - isSigner: true, + isSigner: false, }, { - name: "lbPair", + name: "rewardMint", isMut: false, isSigner: false, }, { - name: "owner", + name: "funderTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "funder", isMut: false, isSigner: true, }, { - name: "systemProgram", - isMut: false, + name: "binArray", + isMut: true, isSigner: false, }, { - name: "rent", + name: "tokenProgram", isMut: false, isSigner: false, }, @@ -5858,52 +7492,76 @@ export const IDL: LbClmm = { ], args: [ { - name: "lowerBinId", - type: "i32", + name: "rewardIndex", + type: "u64", }, { - name: "width", - type: "i32", + name: "amount", + type: "u64", + }, + { + name: "carryForward", + type: "bool", + }, + { + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, }, ], }, { - name: "initializePositionPda", + name: "updateRewardFunder", accounts: [ { - name: "payer", + name: "lbPair", isMut: true, - isSigner: true, + isSigner: false, }, { - name: "base", + name: "admin", isMut: false, isSigner: true, }, { - name: "position", - isMut: true, + name: "eventAuthority", + isMut: false, isSigner: false, }, { - name: "lbPair", + name: "program", isMut: false, isSigner: false, }, + ], + args: [ { - name: "owner", - isMut: false, - isSigner: true, - docs: ["owner"], + name: "rewardIndex", + type: "u64", }, { - name: "systemProgram", - isMut: false, + name: "newFunder", + type: "publicKey", + }, + ], + }, + { + name: "updateRewardDuration", + accounts: [ + { + name: "lbPair", + isMut: true, isSigner: false, }, { - name: "rent", + name: "admin", isMut: false, + isSigner: true, + }, + { + name: "binArray", + isMut: true, isSigner: false, }, { @@ -5919,51 +7577,60 @@ export const IDL: LbClmm = { ], args: [ { - name: "lowerBinId", - type: "i32", + name: "rewardIndex", + type: "u64", }, { - name: "width", - type: "i32", + name: "newDuration", + type: "u64", }, ], }, { - name: "initializePositionByOperator", + name: "claimReward", accounts: [ { - name: "payer", + name: "lbPair", isMut: true, - isSigner: true, + isSigner: false, }, { - name: "base", - isMut: false, - isSigner: true, + name: "position", + isMut: true, + isSigner: false, }, { - name: "position", + name: "binArrayLower", isMut: true, isSigner: false, }, { - name: "lbPair", - isMut: false, + name: "binArrayUpper", + isMut: true, isSigner: false, }, { - name: "operator", + name: "sender", isMut: false, isSigner: true, - docs: ["operator"], }, { - name: "systemProgram", + name: "rewardVault", + isMut: true, + isSigner: false, + }, + { + name: "rewardMint", isMut: false, isSigner: false, }, { - name: "rent", + name: "userTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "tokenProgram", isMut: false, isSigner: false, }, @@ -5980,67 +7647,38 @@ export const IDL: LbClmm = { ], args: [ { - name: "lowerBinId", - type: "i32", - }, - { - name: "width", - type: "i32", - }, - { - name: "owner", - type: "publicKey", - }, - { - name: "feeOwner", - type: "publicKey", + name: "rewardIndex", + type: "u64", }, ], }, { - name: "updatePositionOperator", + name: "claimFee", accounts: [ { - name: "position", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "owner", - isMut: false, - isSigner: true, - }, - { - name: "eventAuthority", - isMut: false, + name: "position", + isMut: true, isSigner: false, }, { - name: "program", - isMut: false, + name: "binArrayLower", + isMut: true, isSigner: false, }, - ], - args: [ - { - name: "operator", - type: "publicKey", - }, - ], - }, - { - name: "swap", - accounts: [ { - name: "lbPair", + name: "binArrayUpper", isMut: true, isSigner: false, }, { - name: "binArrayBitmapExtension", + name: "sender", isMut: false, - isSigner: false, - isOptional: true, + isSigner: true, }, { name: "reserveX", @@ -6053,12 +7691,12 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "userTokenIn", + name: "userTokenX", isMut: true, isSigner: false, }, { - name: "userTokenOut", + name: "userTokenY", isMut: true, isSigner: false, }, @@ -6073,29 +7711,54 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "oracle", + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "eventAuthority", + isMut: false, + isSigner: false, + }, + { + name: "program", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "closePosition", + accounts: [ + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "lbPair", isMut: true, isSigner: false, }, { - name: "hostFeeIn", + name: "binArrayLower", isMut: true, isSigner: false, - isOptional: true, }, { - name: "user", - isMut: false, - isSigner: true, + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - name: "tokenXProgram", + name: "sender", isMut: false, - isSigner: false, + isSigner: true, }, { - name: "tokenYProgram", - isMut: false, + name: "rentReceiver", + isMut: true, isSigner: false, }, { @@ -6109,19 +7772,10 @@ export const IDL: LbClmm = { isSigner: false, }, ], - args: [ - { - name: "amountIn", - type: "u64", - }, - { - name: "minAmountOut", - type: "u64", - }, - ], + args: [], }, { - name: "swapExactOut", + name: "updateFeeParameters", accounts: [ { name: "lbPair", @@ -6129,92 +7783,128 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "binArrayBitmapExtension", + name: "admin", isMut: false, - isSigner: false, - isOptional: true, + isSigner: true, }, { - name: "reserveX", - isMut: true, + name: "eventAuthority", + isMut: false, isSigner: false, }, { - name: "reserveY", - isMut: true, + name: "program", + isMut: false, isSigner: false, }, + ], + args: [ { - name: "userTokenIn", + name: "feeParameter", + type: { + defined: "FeeParameter", + }, + }, + ], + }, + { + name: "increaseOracleLength", + accounts: [ + { + name: "oracle", isMut: true, isSigner: false, }, { - name: "userTokenOut", + name: "funder", isMut: true, - isSigner: false, + isSigner: true, }, { - name: "tokenXMint", + name: "systemProgram", isMut: false, isSigner: false, }, { - name: "tokenYMint", + name: "eventAuthority", isMut: false, isSigner: false, }, { - name: "oracle", - isMut: true, + name: "program", + isMut: false, isSigner: false, }, + ], + args: [ { - name: "hostFeeIn", + name: "lengthToAdd", + type: "u64", + }, + ], + }, + { + name: "initializePresetParameter", + accounts: [ + { + name: "presetParameter", isMut: true, isSigner: false, - isOptional: true, }, { - name: "user", - isMut: false, + name: "admin", + isMut: true, isSigner: true, }, { - name: "tokenXProgram", + name: "systemProgram", isMut: false, isSigner: false, }, { - name: "tokenYProgram", + name: "rent", isMut: false, isSigner: false, }, + ], + args: [ { - name: "eventAuthority", - isMut: false, - isSigner: false, + name: "ix", + type: { + defined: "InitPresetParametersIx", + }, }, + ], + }, + { + name: "closePresetParameter", + accounts: [ { - name: "program", - isMut: false, + name: "presetParameter", + isMut: true, isSigner: false, }, - ], - args: [ { - name: "maxInAmount", - type: "u64", + name: "admin", + isMut: true, + isSigner: true, }, { - name: "outAmount", - type: "u64", + name: "rentReceiver", + isMut: true, + isSigner: false, }, ], + args: [], }, { - name: "swapWithPriceImpact", + name: "removeAllLiquidity", accounts: [ + { + name: "position", + isMut: true, + isSigner: false, + }, { name: "lbPair", isMut: true, @@ -6222,27 +7912,27 @@ export const IDL: LbClmm = { }, { name: "binArrayBitmapExtension", - isMut: false, + isMut: true, isSigner: false, isOptional: true, }, { - name: "reserveX", + name: "userTokenX", isMut: true, isSigner: false, }, { - name: "reserveY", + name: "userTokenY", isMut: true, isSigner: false, }, { - name: "userTokenIn", + name: "reserveX", isMut: true, isSigner: false, }, { - name: "userTokenOut", + name: "reserveY", isMut: true, isSigner: false, }, @@ -6257,18 +7947,17 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "oracle", + name: "binArrayLower", isMut: true, isSigner: false, }, { - name: "hostFeeIn", + name: "binArrayUpper", isMut: true, isSigner: false, - isOptional: true, }, { - name: "user", + name: "sender", isMut: false, isSigner: true, }, @@ -6293,25 +7982,10 @@ export const IDL: LbClmm = { isSigner: false, }, ], - args: [ - { - name: "amountIn", - type: "u64", - }, - { - name: "activeId", - type: { - option: "i32", - }, - }, - { - name: "maxPriceImpactBps", - type: "u16", - }, - ], + args: [], }, { - name: "withdrawProtocolFee", + name: "togglePairStatus", accounts: [ { name: "lbPair", @@ -6319,123 +7993,134 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "reserveX", - isMut: true, - isSigner: false, + name: "admin", + isMut: false, + isSigner: true, }, + ], + args: [], + }, + { + name: "updateWhitelistedWallet", + accounts: [ { - name: "reserveY", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "tokenXMint", + name: "creator", isMut: false, - isSigner: false, + isSigner: true, }, + ], + args: [ { - name: "tokenYMint", - isMut: false, - isSigner: false, + name: "wallet", + type: "publicKey", }, + ], + }, + { + name: "migratePosition", + accounts: [ { - name: "receiverTokenX", + name: "positionV2", isMut: true, - isSigner: false, + isSigner: true, }, { - name: "receiverTokenY", + name: "positionV1", isMut: true, isSigner: false, }, { - name: "tokenXProgram", + name: "lbPair", isMut: false, isSigner: false, }, { - name: "tokenYProgram", - isMut: false, + name: "binArrayLower", + isMut: true, isSigner: false, }, - ], - args: [ { - name: "amountX", - type: "u64", + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - name: "amountY", - type: "u64", + name: "owner", + isMut: true, + isSigner: true, }, - ], - }, - { - name: "initializeReward", - accounts: [ { - name: "lbPair", - isMut: true, + name: "systemProgram", + isMut: false, isSigner: false, }, { - name: "rewardVault", + name: "rentReceiver", isMut: true, isSigner: false, }, { - name: "rewardMint", + name: "eventAuthority", isMut: false, isSigner: false, }, { - "name": "admin", - "isMut": true, - "isSigner": true - }, - { - name: "tokenProgram", + name: "program", isMut: false, isSigner: false, }, + ], + args: [], + }, + { + name: "migrateBinArray", + accounts: [ { - name: "systemProgram", + name: "lbPair", isMut: false, isSigner: false, }, + ], + args: [], + }, + { + name: "updateFeesAndRewards", + accounts: [ { - name: "rent", - isMut: false, + name: "position", + isMut: true, isSigner: false, }, { - name: "eventAuthority", - isMut: false, + name: "lbPair", + isMut: true, isSigner: false, }, { - name: "program", - isMut: false, + name: "binArrayLower", + isMut: true, isSigner: false, }, - ], - args: [ - { - name: "rewardIndex", - type: "u64", - }, { - name: "rewardDuration", - type: "u64", + name: "binArrayUpper", + isMut: true, + isSigner: false, }, { - name: "funder", - type: "publicKey", + name: "owner", + isMut: false, + isSigner: true, }, ], + args: [], }, { - name: "fundReward", + name: "withdrawIneligibleReward", accounts: [ { name: "lbPair", @@ -6472,6 +8157,11 @@ export const IDL: LbClmm = { isMut: false, isSigner: false, }, + { + name: "memoProgram", + isMut: false, + isSigner: false, + }, { name: "eventAuthority", isMut: false, @@ -6489,17 +8179,15 @@ export const IDL: LbClmm = { type: "u64", }, { - name: "amount", - type: "u64", - }, - { - name: "carryForward", - type: "bool", + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, }, ], }, { - name: "updateRewardFunder", + name: "setActivationPoint", accounts: [ { name: "lbPair", @@ -6508,48 +8196,34 @@ export const IDL: LbClmm = { }, { name: "admin", - isMut: false, + isMut: true, isSigner: true, }, - { - name: "eventAuthority", - isMut: false, - isSigner: false, - }, - { - name: "program", - isMut: false, - isSigner: false, - }, ], args: [ { - name: "rewardIndex", + name: "activationPoint", type: "u64", }, - { - name: "newFunder", - type: "publicKey", - }, ], }, { - name: "updateRewardDuration", + name: "setLockReleasePoint", accounts: [ { - name: "lbPair", + name: "position", isMut: true, isSigner: false, }, { - name: "admin", + name: "lbPair", isMut: false, - isSigner: true, + isSigner: false, }, { - name: "binArray", - isMut: true, - isSigner: false, + name: "sender", + isMut: false, + isSigner: true, }, { name: "eventAuthority", @@ -6564,60 +8238,82 @@ export const IDL: LbClmm = { ], args: [ { - name: "rewardIndex", - type: "u64", - }, - { - name: "newDuration", + name: "newLockReleasePoint", type: "u64", }, ], }, { - name: "claimReward", + name: "removeLiquidityByRange", accounts: [ + { + name: "position", + isMut: true, + isSigner: false, + }, { name: "lbPair", isMut: true, isSigner: false, }, { - name: "position", + name: "binArrayBitmapExtension", isMut: true, isSigner: false, + isOptional: true, }, { - name: "binArrayLower", + name: "userTokenX", isMut: true, isSigner: false, }, { - name: "binArrayUpper", + name: "userTokenY", isMut: true, isSigner: false, }, { - name: "sender", - isMut: false, - isSigner: true, + name: "reserveX", + isMut: true, + isSigner: false, }, { - name: "rewardVault", + name: "reserveY", isMut: true, isSigner: false, }, { - name: "rewardMint", + name: "tokenXMint", isMut: false, isSigner: false, }, { - name: "userTokenAccount", + name: "tokenYMint", + isMut: false, + isSigner: false, + }, + { + name: "binArrayLower", isMut: true, isSigner: false, }, { - name: "tokenProgram", + name: "binArrayUpper", + isMut: true, + isSigner: false, + }, + { + name: "sender", + isMut: false, + isSigner: true, + }, + { + name: "tokenXProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenYProgram", isMut: false, isSigner: false, }, @@ -6634,23 +8330,52 @@ export const IDL: LbClmm = { ], args: [ { - name: "rewardIndex", - type: "u64", + name: "fromBinId", + type: "i32", + }, + { + name: "toBinId", + type: "i32", + }, + { + name: "bpsToRemove", + type: "u16", }, ], }, { - name: "claimFee", + name: "addLiquidityOneSidePrecise", accounts: [ + { + name: "position", + isMut: true, + isSigner: false, + }, { name: "lbPair", isMut: true, isSigner: false, }, { - name: "position", + name: "binArrayBitmapExtension", isMut: true, isSigner: false, + isOptional: true, + }, + { + name: "userToken", + isMut: true, + isSigner: false, + }, + { + name: "reserve", + isMut: true, + isSigner: false, + }, + { + name: "tokenMint", + isMut: false, + isSigner: false, }, { name: "binArrayLower", @@ -6668,39 +8393,55 @@ export const IDL: LbClmm = { isSigner: true, }, { - name: "reserveX", - isMut: true, + name: "tokenProgram", + isMut: false, isSigner: false, }, { - name: "reserveY", - isMut: true, + name: "eventAuthority", + isMut: false, isSigner: false, }, { - name: "userTokenX", - isMut: true, + name: "program", + isMut: false, isSigner: false, }, + ], + args: [ { - name: "userTokenY", + name: "parameter", + type: { + defined: "AddLiquiditySingleSidePreciseParameter", + }, + }, + ], + }, + { + name: "goToABin", + accounts: [ + { + name: "lbPair", isMut: true, isSigner: false, }, { - name: "tokenXMint", + name: "binArrayBitmapExtension", isMut: false, isSigner: false, + isOptional: true, }, { - name: "tokenYMint", + name: "fromBinArray", isMut: false, isSigner: false, + isOptional: true, }, { - name: "tokenProgram", + name: "toBinArray", isMut: false, isSigner: false, + isOptional: true, }, { name: "eventAuthority", @@ -6713,48 +8454,75 @@ export const IDL: LbClmm = { isSigner: false, }, ], - args: [], + args: [ + { + name: "binId", + type: "i32", + }, + ], }, { - "name": "closePosition", - "accounts": [ + name: "setPreActivationDuration", + accounts: [ { - name: "position", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "lbPair", - isMut: true, - isSigner: false, + name: "creator", + isMut: false, + isSigner: true, }, + ], + args: [ { - name: "binArrayLower", - isMut: true, - isSigner: false, + name: "preActivationDuration", + type: "u64", }, + ], + }, + { + name: "setPreActivationSwapAddress", + accounts: [ { - name: "binArrayUpper", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "sender", + name: "creator", isMut: false, isSigner: true, }, + ], + args: [ { - name: "rentReceiver", - isMut: true, - isSigner: false, + name: "preActivationSwapAddress", + type: "publicKey", }, + ], + }, + { + name: "initializeTokenBadge", + accounts: [ { - name: "eventAuthority", + name: "tokenMint", isMut: false, isSigner: false, }, { - name: "program", + name: "tokenBadge", + isMut: true, + isSigner: false, + }, + { + name: "admin", + isMut: true, + isSigner: true, + }, + { + name: "systemProgram", isMut: false, isSigner: false, }, @@ -6762,7 +8530,7 @@ export const IDL: LbClmm = { args: [], }, { - name: "updateFeeParameters", + name: "initializeLbPair2", accounts: [ { name: "lbPair", @@ -6770,79 +8538,68 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "admin", + name: "binArrayBitmapExtension", + isMut: true, + isSigner: false, + isOptional: true, + }, + { + name: "tokenMintX", isMut: false, - isSigner: true, + isSigner: false, }, { - name: "eventAuthority", + name: "tokenMintY", isMut: false, isSigner: false, }, { - name: "program", - isMut: false, + name: "reserveX", + isMut: true, isSigner: false, }, - ], - args: [ { - name: "feeParameter", - type: { - defined: "FeeParameter", - }, + name: "reserveY", + isMut: true, + isSigner: false, }, - ], - }, - { - name: "increaseOracleLength", - accounts: [ { name: "oracle", isMut: true, isSigner: false, }, + { + name: "presetParameter", + isMut: false, + isSigner: false, + }, { name: "funder", isMut: true, isSigner: true, }, { - name: "systemProgram", + name: "tokenBadgeX", isMut: false, isSigner: false, + isOptional: true, }, { - name: "eventAuthority", + name: "tokenBadgeY", isMut: false, isSigner: false, + isOptional: true, }, { - name: "program", + name: "tokenProgramX", isMut: false, isSigner: false, }, - ], - args: [ - { - name: "lengthToAdd", - type: "u64", - }, - ], - }, - { - name: "initializePresetParameter", - accounts: [ { - name: "presetParameter", - isMut: true, + name: "tokenProgramY", + isMut: false, isSigner: false, }, - { - name: "admin", - isMut: true, - isSigner: true, - }, { name: "systemProgram", isMut: false, @@ -6853,73 +8610,63 @@ export const IDL: LbClmm = { isMut: false, isSigner: false, }, - ], - args: [ { - name: "ix", - type: { - defined: "InitPresetParametersIx", - }, + name: "eventAuthority", + isMut: false, + isSigner: false, }, - ], - }, - { - name: "closePresetParameter", - accounts: [ { - name: "presetParameter", - isMut: true, + name: "program", + isMut: false, isSigner: false, }, + ], + args: [ { - name: "admin", - isMut: true, - isSigner: true, + name: "activeId", + type: "i32", }, { - name: "rentReceiver", - isMut: true, - isSigner: false, + name: "binStep", + type: "u16", }, ], - args: [], }, { - name: "removeAllLiquidity", + name: "claimFee2", accounts: [ { - name: "position", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "lbPair", + name: "position", isMut: true, isSigner: false, }, { - name: "binArrayBitmapExtension", - isMut: true, - isSigner: false, - isOptional: true, + name: "sender", + isMut: false, + isSigner: true, }, { - name: "userTokenX", + name: "reserveX", isMut: true, isSigner: false, }, { - name: "userTokenY", + name: "reserveY", isMut: true, isSigner: false, }, { - name: "reserveX", + name: "userTokenX", isMut: true, isSigner: false, }, { - name: "reserveY", + name: "userTokenY", isMut: true, isSigner: false, }, @@ -6934,27 +8681,17 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "binArrayLower", - isMut: true, - isSigner: false, - }, - { - name: "binArrayUpper", - isMut: true, - isSigner: false, - }, - { - name: "sender", + name: "tokenProgramX", isMut: false, - isSigner: true, + isSigner: false, }, { - name: "tokenXProgram", + name: "tokenProgramY", isMut: false, isSigner: false, }, { - name: "tokenYProgram", + name: "memoProgram", isMut: false, isSigner: false, }, @@ -6969,153 +8706,165 @@ export const IDL: LbClmm = { isSigner: false, }, ], - args: [], - }, - { - "name": "removeLiquiditySingleSide", - "accounts": [ + args: [ { - "name": "position", - "isMut": true, - "isSigner": false + name: "minBinId", + type: "i32", }, { - "name": "lbPair", - "isMut": true, - "isSigner": false + name: "maxBinId", + type: "i32", }, { - "name": "binArrayBitmapExtension", - "isMut": true, - "isSigner": false, - "isOptional": true + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, }, + ], + }, + { + name: "claimReward2", + accounts: [ { - "name": "userToken", - "isMut": true, - "isSigner": false + name: "lbPair", + isMut: true, + isSigner: false, }, { - "name": "reserve", - "isMut": true, - "isSigner": false + name: "position", + isMut: true, + isSigner: false, }, { - "name": "tokenMint", - "isMut": false, - "isSigner": false + name: "sender", + isMut: false, + isSigner: true, }, { - "name": "binArrayLower", - "isMut": true, - "isSigner": false + name: "rewardVault", + isMut: true, + isSigner: false, }, { - "name": "binArrayUpper", - "isMut": true, - "isSigner": false + name: "rewardMint", + isMut: false, + isSigner: false, }, { - "name": "sender", - "isMut": false, - "isSigner": true + name: "userTokenAccount", + isMut: true, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "eventAuthority", - "isMut": false, - "isSigner": false + name: "memoProgram", + isMut: false, + isSigner: false, }, { - "name": "program", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "togglePairStatus", - "accounts": [ - { - name: "lbPair", - isMut: true, + name: "eventAuthority", + isMut: false, isSigner: false, }, { - name: "admin", + name: "program", isMut: false, - isSigner: true, + isSigner: false, }, ], - args: [], - }, - { - name: "updateWhitelistedWallet", - accounts: [ + args: [ { - name: "lbPair", - isMut: true, - isSigner: false, + name: "rewardIndex", + type: "u64", }, { - name: "creator", - isMut: false, - isSigner: true, + name: "minBinId", + type: "i32", }, - ], - args: [ { - name: "wallet", - type: "publicKey", + name: "maxBinId", + type: "i32", + }, + { + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, }, ], }, { - name: "migratePosition", + name: "addLiquidity2", accounts: [ { - name: "positionV2", + name: "position", isMut: true, - isSigner: true, + isSigner: false, }, { - name: "positionV1", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "lbPair", - isMut: false, + name: "binArrayBitmapExtension", + isMut: true, isSigner: false, + isOptional: true, }, { - name: "binArrayLower", + name: "userTokenX", isMut: true, isSigner: false, }, { - name: "binArrayUpper", + name: "userTokenY", isMut: true, isSigner: false, }, { - name: "owner", + name: "reserveX", isMut: true, + isSigner: false, + }, + { + name: "reserveY", + isMut: true, + isSigner: false, + }, + { + name: "tokenXMint", + isMut: false, + isSigner: false, + }, + { + name: "tokenYMint", + isMut: false, + isSigner: false, + }, + { + name: "sender", + isMut: false, isSigner: true, }, { - name: "systemProgram", + name: "tokenXProgram", isMut: false, isSigner: false, }, { - name: "rentReceiver", - isMut: true, + name: "tokenYProgram", + isMut: false, + isSigner: false, + }, + { + name: "memoProgram", + isMut: false, isSigner: false, }, { @@ -7129,21 +8878,23 @@ export const IDL: LbClmm = { isSigner: false, }, ], - args: [], - }, - { - name: "migrateBinArray", - accounts: [ + args: [ + { + name: "liquidityParameter", + type: { + defined: "LiquidityParameter", + }, + }, { - name: "lbPair", - isMut: false, - isSigner: false, + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, }, ], - args: [], }, { - name: "updateFeesAndRewards", + name: "addLiquidityByStrategy2", accounts: [ { name: "position", @@ -7156,58 +8907,58 @@ export const IDL: LbClmm = { isSigner: false, }, { - name: "binArrayLower", + name: "binArrayBitmapExtension", isMut: true, isSigner: false, + isOptional: true, }, { - name: "binArrayUpper", + name: "userTokenX", isMut: true, isSigner: false, }, { - name: "owner", - isMut: false, - isSigner: true, + name: "userTokenY", + isMut: true, + isSigner: false, }, - ], - args: [], - }, - { - name: "withdrawIneligibleReward", - accounts: [ { - name: "lbPair", + name: "reserveX", isMut: true, isSigner: false, }, { - name: "rewardVault", + name: "reserveY", isMut: true, isSigner: false, }, { - name: "rewardMint", + name: "tokenXMint", isMut: false, isSigner: false, }, { - name: "funderTokenAccount", - isMut: true, + name: "tokenYMint", + isMut: false, isSigner: false, }, { - name: "funder", + name: "sender", isMut: false, isSigner: true, }, { - name: "binArray", - isMut: true, + name: "tokenXProgram", + isMut: false, isSigner: false, }, { - name: "tokenProgram", + name: "tokenYProgram", + isMut: false, + isSigner: false, + }, + { + name: "memoProgram", isMut: false, isSigner: false, }, @@ -7224,42 +8975,65 @@ export const IDL: LbClmm = { ], args: [ { - name: "rewardIndex", - type: "u64", + name: "liquidityParameter", + type: { + defined: "LiquidityParameterByStrategy", + }, + }, + { + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, }, ], }, { - "name": "setActivationPoint", - "accounts": [ + name: "removeLiquidity2", + accounts: [ + { + name: "position", + isMut: true, + isSigner: false, + }, { name: "lbPair", isMut: true, isSigner: false, }, { - name: "admin", + name: "binArrayBitmapExtension", isMut: true, - isSigner: true, + isSigner: false, + isOptional: true, }, - ], - args: [ { - "name": "activationPoint", - "type": "u64" - } - ] - }, - { - "name": "setLockReleasePoint", - "accounts": [ + name: "userTokenX", + isMut: true, + isSigner: false, + }, { - name: "position", + name: "userTokenY", isMut: true, isSigner: false, }, { - name: "lbPair", + name: "reserveX", + isMut: true, + isSigner: false, + }, + { + name: "reserveY", + isMut: true, + isSigner: false, + }, + { + name: "tokenXMint", + isMut: false, + isSigner: false, + }, + { + name: "tokenYMint", isMut: false, isSigner: false, }, @@ -7268,6 +9042,21 @@ export const IDL: LbClmm = { isMut: false, isSigner: true, }, + { + name: "tokenXProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenYProgram", + isMut: false, + isSigner: false, + }, + { + name: "memoProgram", + isMut: false, + isSigner: false, + }, { name: "eventAuthority", isMut: false, @@ -7281,13 +9070,23 @@ export const IDL: LbClmm = { ], args: [ { - "name": "newLockReleasePoint", - "type": "u64" - } - ] + name: "binLiquidityRemoval", + type: { + vec: { + defined: "BinLiquidityReduction", + }, + }, + }, + { + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, + }, + ], }, { - name: "removeLiquidityByRange", + name: "removeLiquidityByRange2", accounts: [ { name: "position", @@ -7335,16 +9134,6 @@ export const IDL: LbClmm = { isMut: false, isSigner: false, }, - { - name: "binArrayLower", - isMut: true, - isSigner: false, - }, - { - name: "binArrayUpper", - isMut: true, - isSigner: false, - }, { name: "sender", isMut: false, @@ -7360,6 +9149,11 @@ export const IDL: LbClmm = { isMut: false, isSigner: false, }, + { + name: "memoProgram", + isMut: false, + isSigner: false, + }, { name: "eventAuthority", isMut: false, @@ -7384,59 +9178,86 @@ export const IDL: LbClmm = { name: "bpsToRemove", type: "u16", }, + { + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, + }, ], }, { - name: "addLiquidityOneSidePrecise", + name: "swap2", accounts: [ { - name: "position", + name: "lbPair", isMut: true, isSigner: false, }, { - name: "lbPair", + name: "binArrayBitmapExtension", + isMut: false, + isSigner: false, + isOptional: true, + }, + { + name: "reserveX", isMut: true, isSigner: false, }, { - name: "binArrayBitmapExtension", + name: "reserveY", isMut: true, isSigner: false, - isOptional: true, }, { - name: "userToken", + name: "userTokenIn", isMut: true, isSigner: false, }, { - name: "reserve", + name: "userTokenOut", isMut: true, isSigner: false, }, { - name: "tokenMint", + name: "tokenXMint", isMut: false, isSigner: false, }, { - name: "binArrayLower", + name: "tokenYMint", + isMut: false, + isSigner: false, + }, + { + name: "oracle", isMut: true, isSigner: false, }, { - name: "binArrayUpper", + name: "hostFeeIn", isMut: true, isSigner: false, + isOptional: true, }, { - name: "sender", + name: "user", isMut: false, isSigner: true, }, { - name: "tokenProgram", + name: "tokenXProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenYProgram", + isMut: false, + isSigner: false, + }, + { + name: "memoProgram", isMut: false, isSigner: false, }, @@ -7453,15 +9274,23 @@ export const IDL: LbClmm = { ], args: [ { - name: "parameter", + name: "amountIn", + type: "u64", + }, + { + name: "minAmountOut", + type: "u64", + }, + { + name: "remainingAccountsInfo", type: { - defined: "AddLiquiditySingleSidePreciseParameter", + defined: "RemainingAccountsInfo", }, }, ], }, { - name: "goToABin", + name: "swapWithPriceImpact2", accounts: [ { name: "lbPair", @@ -7475,77 +9304,100 @@ export const IDL: LbClmm = { isOptional: true, }, { - name: "fromBinArray", + name: "reserveX", + isMut: true, + isSigner: false, + }, + { + name: "reserveY", + isMut: true, + isSigner: false, + }, + { + name: "userTokenIn", + isMut: true, + isSigner: false, + }, + { + name: "userTokenOut", + isMut: true, + isSigner: false, + }, + { + name: "tokenXMint", isMut: false, isSigner: false, - isOptional: true, }, { - name: "toBinArray", + name: "tokenYMint", isMut: false, isSigner: false, + }, + { + name: "oracle", + isMut: true, + isSigner: false, + }, + { + name: "hostFeeIn", + isMut: true, + isSigner: false, isOptional: true, }, { - name: "eventAuthority", + name: "user", + isMut: false, + isSigner: true, + }, + { + name: "tokenXProgram", isMut: false, isSigner: false, }, { - name: "program", + name: "tokenYProgram", isMut: false, isSigner: false, }, - ], - args: [ { - name: "binId", - type: "i32", + name: "memoProgram", + isMut: false, + isSigner: false, }, - ], - }, - { - "name": "setPreActivationDuration", - "accounts": [ { - name: "lbPair", - isMut: true, + name: "eventAuthority", + isMut: false, isSigner: false, }, { - name: "creator", + name: "program", isMut: false, - isSigner: true, + isSigner: false, }, ], args: [ { - "name": "preActivationDuration", - "type": "u16" - } - ] - }, - { - name: "setPreActivationSwapAddress", - accounts: [ + name: "amountIn", + type: "u64", + }, { - name: "lbPair", - isMut: true, - isSigner: false, + name: "activeId", + type: { + option: "i32", + }, }, { - name: "creator", - isMut: false, - isSigner: true, + name: "maxPriceImpactBps", + type: "u16", }, - ], - args: [ { - "name": "preActivationSwapAddress", - "type": "publicKey" - } - ] - } + name: "remainingAccountsInfo", + type: { + defined: "RemainingAccountsInfo", + }, + }, + ], + }, ], accounts: [ { @@ -7684,19 +9536,25 @@ export const IDL: LbClmm = { }, { name: "requireBaseFactorSeed", + docs: ["Require base factor seed"], type: "u8", }, { name: "baseFactorSeed", + docs: ["Base factor seed"], type: { array: ["u8", 2], }, }, { - name: "padding1", - type: { - array: ["u8", 2], - }, + name: "activationType", + docs: ["Activation type"], + type: "u8", + }, + { + name: "padding0", + docs: ["padding 0"], + type: "u8", }, { name: "tokenXMint", @@ -7726,129 +9584,19 @@ export const IDL: LbClmm = { }, }, { - name: "feeOwner", + name: "padding1", docs: [ - "Fee owner. Deprecated. Can be used as buffer in the future.", - ], - type: "publicKey", - }, - { - "name": "pairType", - "docs": [ - "Type of the pair" - ], - "type": "u8" - }, - { - "name": "activeId", - "docs": [ - "Active bin id" - ], - "type": "i32" - }, - { - "name": "binStep", - "docs": [ - "Bin step. Represent the price increment / decrement." - ], - "type": "u16" - }, - { - "name": "status", - "docs": [ - "Status of the pair. Check PairStatus enum." - ], - "type": "u8" - }, - { - "name": "requireBaseFactorSeed", - "docs": [ - "Require base factor seed" - ], - "type": "u8" - }, - { - "name": "baseFactorSeed", - "docs": [ - "Base factor seed" - ], - "type": { - "array": [ - "u8", - 2 - ] - } - }, - { - "name": "activationType", - "docs": [ - "Activation type" + "_padding_1, previous Fee owner, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!", ], - "type": "u8" - }, - { - "name": "padding0", - "docs": [ - "padding 0" - ], - "type": "u8" - }, - { - "name": "tokenXMint", - "docs": [ - "Token X mint" - ], - "type": "publicKey" - }, - { - "name": "tokenYMint", - "docs": [ - "Token Y mint" - ], - "type": "publicKey" - }, - { - "name": "reserveX", - "docs": [ - "LB token X vault" - ], - "type": "publicKey" - }, - { - "name": "reserveY", - "docs": [ - "LB token Y vault" - ], - "type": "publicKey" - }, - { - "name": "protocolFee", - "docs": [ - "Uncollected protocol fee" - ], - "type": { - "defined": "ProtocolFee" - } - }, - { - "name": "padding1", - "docs": [ - "_padding_1, previous Fee owner, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!" - ], - "type": { - "array": [ - "u8", - 32 - ] - } + type: { + array: ["u8", 32], + }, }, { - "name": "rewardInfos", - "docs": [ - "Farming reward information" - ], - "type": { - "array": [ + name: "rewardInfos", + docs: ["Farming reward information"], + type: { + array: [ { defined: "RewardInfo", }, @@ -7879,9 +9627,9 @@ export const IDL: LbClmm = { type: "publicKey", }, { - "name": "preActivationSwapAddress", - "docs": [ - "Address allowed to swap when the current point is greater than or equal to the pre-activation point. The pre-activation point is calculated as `activation_point - pre_activation_duration`." + name: "preActivationSwapAddress", + docs: [ + "Address allowed to swap when the current point is greater than or equal to the pre-activation point. The pre-activation point is calculated as `activation_point - pre_activation_duration`.", ], type: "publicKey", }, @@ -7891,32 +9639,32 @@ export const IDL: LbClmm = { type: "publicKey", }, { - "name": "activationPoint", - "docs": [ - "Time point to enable the pair. Only applicable for permission pair." + name: "activationPoint", + docs: [ + "Time point to enable the pair. Only applicable for permission pair.", ], type: "u64", }, { - "name": "preActivationDuration", - "docs": [ - "Duration before activation activation_point. Used to calculate pre-activation time point for pre_activation_swap_address" + name: "preActivationDuration", + docs: [ + "Duration before activation activation_point. Used to calculate pre-activation time point for pre_activation_swap_address", ], type: "u64", }, { - "name": "padding2", - "docs": [ - "_padding 2 is reclaimed free space from swap_cap_deactivate_point and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!" + name: "padding2", + docs: [ + "_padding 2 is reclaimed free space from swap_cap_deactivate_point and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!", ], type: { array: ["u8", 8], }, }, { - "name": "lockDuration", - "docs": [ - "Liquidity lock duration for positions which created before activate. Only applicable for permission pair." + name: "lockDuration", + docs: [ + "Liquidity lock duration for positions which created before activate. Only applicable for permission pair.", ], type: "u64", }, @@ -7925,11 +9673,21 @@ export const IDL: LbClmm = { docs: ["Pool creator"], type: "publicKey", }, + { + name: "tokenMintXProgramFlag", + docs: ["token_mint_x_program_flag"], + type: "u8", + }, + { + name: "tokenMintYProgramFlag", + docs: ["token_mint_y_program_flag"], + type: "u8", + }, { name: "reserved", docs: ["Reserved space for future use"], type: { - array: ["u8", 24], + array: ["u8", 22], }, }, ], @@ -7941,11 +9699,9 @@ export const IDL: LbClmm = { kind: "struct", fields: [ { - "name": "idx", - "docs": [ - "Index of latest observation" - ], - "type": "u64" + name: "idx", + docs: ["Index of latest observation"], + type: "u64", }, { name: "activeSize", @@ -8142,11 +9898,9 @@ export const IDL: LbClmm = { type: "publicKey", }, { - "name": "lockReleasePoint", - "docs": [ - "Time point which the locked liquidity can be withdraw" - ], - "type": "u64" + name: "lockReleasePoint", + docs: ["Time point which the locked liquidity can be withdraw"], + type: "u64", }, { name: "subjectedToBootstrapLiquidityLocking", @@ -8243,11 +9997,32 @@ export const IDL: LbClmm = { docs: [ "Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee", ], - "type": "u16" - } - ] - } - } + type: "u16", + }, + ], + }, + }, + { + name: "tokenBadge", + docs: ["Parameter that set by the protocol"], + type: { + kind: "struct", + fields: [ + { + name: "tokenMint", + docs: ["token mint"], + type: "publicKey", + }, + { + name: "padding", + docs: ["Reserve"], + type: { + array: ["u8", 128], + }, + }, + ], + }, + }, ], types: [ { @@ -8550,15 +10325,15 @@ export const IDL: LbClmm = { type: "i32", }, { - "name": "lockDuration", - "type": "u64" + name: "lockDuration", + type: "u64", }, { - "name": "activationType", - "type": "u8" - } - ] - } + name: "activationType", + type: "u8", + }, + ], + }, }, { name: "InitPresetParametersIx", @@ -8637,10 +10412,10 @@ export const IDL: LbClmm = { }, }, { - "name": "FeeParameter", - "type": { - "kind": "struct", - "fields": [ + name: "FeeParameter", + type: { + kind: "struct", + fields: [ { name: "protocolShare", docs: [ @@ -8657,26 +10432,26 @@ export const IDL: LbClmm = { }, }, { - "name": "BinLiquidityReduction", - "type": { - "kind": "struct", - "fields": [ + name: "BinLiquidityReduction", + type: { + kind: "struct", + fields: [ { - "name": "binId", - "type": "i32" + name: "binId", + type: "i32", }, { - "name": "bpsToRemove", - "type": "u16" - } - ] - } + name: "bpsToRemove", + type: "u16", + }, + ], + }, }, { - "name": "Bin", - "type": { - "kind": "struct", - "fields": [ + name: "Bin", + type: { + kind: "struct", + fields: [ { name: "amountX", docs: [ @@ -8998,6 +10773,40 @@ export const IDL: LbClmm = { ], }, }, + { + name: "RemainingAccountsSlice", + type: { + kind: "struct", + fields: [ + { + name: "accountsType", + type: { + defined: "AccountsType", + }, + }, + { + name: "length", + type: "u8", + }, + ], + }, + }, + { + name: "RemainingAccountsInfo", + type: { + kind: "struct", + fields: [ + { + name: "slices", + type: { + vec: { + defined: "RemainingAccountsSlice", + }, + }, + }, + ], + }, + }, { name: "StrategyType", type: { @@ -9062,6 +10871,21 @@ export const IDL: LbClmm = { ], }, }, + { + name: "ActivationType", + docs: ["Type of the activation"], + type: { + kind: "enum", + variants: [ + { + name: "Slot", + }, + { + name: "Timestamp", + }, + ], + }, + }, { name: "PairType", docs: [ @@ -9080,35 +10904,49 @@ export const IDL: LbClmm = { }, }, { - "name": "ActivationType", - "docs": [ - "Type of the activation" + name: "PairStatus", + docs: [ + "Pair status. 0 = Enabled, 1 = Disabled. Putting 0 as enabled for backward compatibility.", ], - "type": { - "kind": "enum", - "variants": [ + type: { + kind: "enum", + variants: [ { - "name": "Slot" + name: "Enabled", }, { - "name": "Timestamp" - } - ] - } + name: "Disabled", + }, + ], + }, }, { - "name": "PairType", - "docs": [ - "Type of the Pair. 0 = Permissionless, 1 = Permission. Putting 0 as permissionless for backward compatibility." - ], + name: "TokenProgramFlags", type: { kind: "enum", variants: [ { - name: "Enabled", + name: "TokenProgram", }, { - name: "Disabled", + name: "TokenProgram2022", + }, + ], + }, + }, + { + name: "AccountsType", + type: { + kind: "enum", + variants: [ + { + name: "TransferHookX", + }, + { + name: "TransferHookY", + }, + { + name: "TransferHookReward", }, ], }, @@ -9575,27 +11413,27 @@ export const IDL: LbClmm = { ], }, { - "name": "UpdatePositionLockReleasePoint", - "fields": [ + name: "UpdatePositionLockReleasePoint", + fields: [ { name: "position", type: "publicKey", index: false, }, { - "name": "currentPoint", - "type": "u64", - "index": false + name: "currentPoint", + type: "u64", + index: false, }, { - "name": "newLockReleasePoint", - "type": "u64", - "index": false + name: "newLockReleasePoint", + type: "u64", + index: false, }, { - "name": "oldLockReleasePoint", - "type": "u64", - "index": false + name: "oldLockReleasePoint", + type: "u64", + index: false, }, { name: "sender", @@ -9887,39 +11725,94 @@ export const IDL: LbClmm = { msg: "Wrong rent receiver", }, { - "code": 6052, - "name": "AlreadyPassActivationPoint", - "msg": "Already activated" + code: 6052, + name: "AlreadyPassActivationPoint", + msg: "Already activated", }, { - "code": 6053, - "name": "ExceedMaxSwappedAmount", - "msg": "Swapped amount is exceeded max swapped amount" + code: 6053, + name: "ExceedMaxSwappedAmount", + msg: "Swapped amount is exceeded max swapped amount", }, { - "code": 6054, - "name": "InvalidStrategyParameters", - "msg": "Invalid strategy parameters" + code: 6054, + name: "InvalidStrategyParameters", + msg: "Invalid strategy parameters", }, { - "code": 6055, - "name": "LiquidityLocked", - "msg": "Liquidity locked" + code: 6055, + name: "LiquidityLocked", + msg: "Liquidity locked", }, { - "code": 6056, - "name": "BinRangeIsNotEmpty", - "msg": "Bin range is not empty" + code: 6056, + name: "BinRangeIsNotEmpty", + msg: "Bin range is not empty", }, { - "code": 6057, - "name": "NotExactAmountOut", - "msg": "Amount out is not matched with exact amount out" + code: 6057, + name: "NotExactAmountOut", + msg: "Amount out is not matched with exact amount out", }, { - "code": 6058, - "name": "InvalidActivationType", - "msg": "Invalid activation type" - } - ] + code: 6058, + name: "InvalidActivationType", + msg: "Invalid activation type", + }, + { + code: 6059, + name: "NotSupportMint", + msg: "Not support token_2022 mint extension", + }, + { + code: 6060, + name: "UnsupportedMintExtension", + msg: "Unsupported mint extension", + }, + { + code: 6061, + name: "UnsupportNativeMintToken2022", + msg: "Unsupported native mint token2022", + }, + { + code: 6062, + name: "UnmatchTokenMint", + msg: "Unmatch token mint", + }, + { + code: 6063, + name: "UnsupportedTokenMint", + msg: "Unsupported token mint", + }, + { + code: 6064, + name: "InsufficientRemainingAccounts", + msg: "Insufficient remaining accounts", + }, + { + code: 6065, + name: "InvalidRemainingAccountSlice", + msg: "Invalid remaining account slice", + }, + { + code: 6066, + name: "DuplicatedRemainingAccountTypes", + msg: "Duplicated remaining account types", + }, + { + code: 6067, + name: "MissingRemainingAccountForTransferHook", + msg: "Missing remaining account for transfer hook", + }, + { + code: 6068, + name: "NoTransferHookProgram", + msg: "Remaining account was passed for transfer hook but there's no hook program", + }, + { + code: 6069, + name: "ZeroFundedAmount", + msg: "Zero funded amount", + }, + ], }; diff --git a/ts-client/src/dlmm/index.ts b/ts-client/src/dlmm/index.ts index d34e3cc0..4e7be22f 100644 --- a/ts-client/src/dlmm/index.ts +++ b/ts-client/src/dlmm/index.ts @@ -25,6 +25,7 @@ import { BIN_ARRAY_FEE, POSITION_FEE, MAX_BIN_PER_TX, + MEMO_PROGRAM_ID, } from "./constants"; import { BinLiquidity, @@ -73,6 +74,8 @@ import { PairStatus, PairType, RewardMintInfo, + RemainingAccountsInfo, + AccountsType, } from "./types"; import { AnchorProvider, BN, Program } from "@coral-xyz/anchor"; import { @@ -108,6 +111,7 @@ import { getPriceOfBinByBinId, computeFee, deriveTokenBadge, + getBinArrayAccounstMetaByBinRange, } from "./helpers"; import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; import Decimal from "decimal.js"; @@ -118,6 +122,7 @@ import { RawMint, TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, + unpackMint, } from "@solana/spl-token"; import { Rounding, @@ -133,6 +138,7 @@ import { shlDiv, } from "./helpers/math"; import { DlmmSdkError } from "./error"; +import { getExtraAccountMetasForTransferHook } from "./helpers/token2022"; type Opt = { cluster?: Cluster | "localhost"; @@ -316,10 +322,34 @@ export class DLMM { const reserveXBalance = AccountLayout.decode(reserveAccountsInfo[0].data); const reserveYBalance = AccountLayout.decode(reserveAccountsInfo[1].data); + const mintXAccountInfo = reserveAccountsInfo[2]; const mintYAccountInfo = reserveAccountsInfo[3]; - const tokenXDecimal = MintLayout.decode(mintXAccountInfo.data).decimals; - const tokenYDecimal = MintLayout.decode(mintYAccountInfo.data).decimals; + + const [mintXHookAccountsMeta, mintYHookAccountsMeta] = await Promise.all([ + getExtraAccountMetasForTransferHook( + connection, + lbPairAccInfo.tokenXMint, + mintXAccountInfo + ), + getExtraAccountMetasForTransferHook( + connection, + lbPairAccInfo.tokenYMint, + mintYAccountInfo + ), + ]); + + const mintXState = unpackMint( + lbPairAccInfo.tokenXMint, + mintXAccountInfo, + mintXAccountInfo.owner + ); + + const mintYState = unpackMint( + lbPairAccInfo.tokenXMint, + mintYAccountInfo, + mintYAccountInfo.owner + ); let rewardInfos: RewardMintInfo[] = []; @@ -330,29 +360,40 @@ export class DLMM { rewardInfos.push({ publicKey: PublicKey.default, owner: SystemProgram.programId, + extraAccountsMetaForTransferHook: [], }); } else { + const mintAccountInfo = rewardMintAccountsInfo.shift(); + const rewardMintHookAccountsMeta = + await getExtraAccountMetasForTransferHook( + connection, + reward.mint, + mintAccountInfo + ); rewardInfos.push({ publicKey: reward.mint, - owner: rewardMintAccountsInfo.shift().owner, + owner: mintAccountInfo.owner, + extraAccountsMetaForTransferHook: rewardMintHookAccountsMeta, }); } } - const tokenX = { + const tokenX: TokenReserve = { publicKey: lbPairAccInfo.tokenXMint, reserve: lbPairAccInfo.reserveX, amount: reserveXBalance.amount, - decimal: tokenXDecimal, + decimal: mintXState.decimals, owner: mintXAccountInfo.owner, + extraAccountsMetaForTransferHook: mintXHookAccountsMeta, }; - const tokenY = { + const tokenY: TokenReserve = { publicKey: lbPairAccInfo.tokenYMint, reserve: lbPairAccInfo.reserveY, amount: reserveYBalance.amount, - decimal: tokenYDecimal, + decimal: mintYState.decimals, owner: mintYAccountInfo.owner, + extraAccountsMetaForTransferHook: mintYHookAccountsMeta, }; return new DLMM( @@ -482,6 +523,55 @@ export class DLMM { new Map>() ); + const rewardMintHookAccountsMetaMap = ( + await Promise.all( + Array.from(rewardMintAccountInfoMap.keys()).map(async (key) => { + const mintAccountInfo = rewardMintAccountInfoMap.get(key); + const extraAccountMetas = await getExtraAccountMetasForTransferHook( + connection, + key, + mintAccountInfo + ); + return { + key, + extraAccountMetas, + }; + }) + ) + ).reduce((map, { key, extraAccountMetas }) => { + map.set(key, extraAccountMetas); + return map; + }, new Map()); + + const mintAccountsInfoSlice = reserveAndTokenMintAccountsInfo.slice( + reservePublicKeys.length + ); + + const mintAccountsInfoMap = tokenMintPublicKeys.reduce((map, key, idx) => { + map.set(key, mintAccountsInfoSlice[idx]); + return map; + }, new Map>()); + + const mintHookAccountsMetaMap = ( + await Promise.all( + Array.from(mintAccountsInfoMap.keys()).map(async (key) => { + const mintAccountInfo = mintAccountsInfoMap.get(key); + const extraAccountMetas = await getExtraAccountMetasForTransferHook( + connection, + key, + mintAccountInfo + ); + return { + key, + extraAccountMetas, + }; + }) + ) + ).reduce((map, { key, extraAccountMetas }) => { + map.set(key, extraAccountMetas); + return map; + }, new Map()); + const lbClmmImpl = await Promise.all( dlmmList.map(async (lbPair, index) => { const lbPairState = lbPairArraysMap.get(lbPair.toBase58()); @@ -520,27 +610,41 @@ export class DLMM { const reserveXBalance = AccountLayout.decode(reserveXAccountInfo.data); const reserveYBalance = AccountLayout.decode(reserveYAccountInfo.data); - const tokenXDecimal = MintLayout.decode( - tokenXMintAccountInfo.data - ).decimals; - const tokenYDecimal = MintLayout.decode( - tokenYMintAccountInfo.data - ).decimals; + const mintXHookAccountsMeta = mintHookAccountsMetaMap.get( + lbPairState.tokenXMint + ); + const mintYHookAccountsMeta = mintHookAccountsMetaMap.get( + lbPairState.tokenYMint + ); - const tokenX = { + const mintXState = unpackMint( + lbPairState.tokenXMint, + tokenXMintAccountInfo, + tokenXMintAccountInfo.owner + ); + + const mintYState = unpackMint( + lbPairState.tokenYMint, + tokenYMintAccountInfo, + tokenYMintAccountInfo.owner + ); + + const tokenX: TokenReserve = { publicKey: lbPairState.tokenXMint, reserve: lbPairState.reserveX, amount: reserveXBalance.amount, - decimal: tokenXDecimal, + decimal: mintXState.decimals, owner: tokenXMintAccountInfo.owner, + extraAccountsMetaForTransferHook: mintXHookAccountsMeta, }; - const tokenY = { + const tokenY: TokenReserve = { publicKey: lbPairState.tokenYMint, reserve: lbPairState.reserveY, amount: reserveYBalance.amount, - decimal: tokenYDecimal, + decimal: mintYState.decimals, owner: tokenYMintAccountInfo.owner, + extraAccountsMetaForTransferHook: mintYHookAccountsMeta, }; let rewardInfos: RewardMintInfo[] = []; @@ -550,11 +654,16 @@ export class DLMM { rewardInfos.push({ publicKey: PublicKey.default, owner: SystemProgram.programId, + extraAccountsMetaForTransferHook: [], }); } else { + const mintAccountInfo = rewardMintAccountInfoMap.get(reward.mint); + const rewardMintHookAccountsMeta = + rewardMintHookAccountsMetaMap.get(reward.mint); rewardInfos.push({ publicKey: reward.mint, - owner: rewardMintAccountInfoMap.get(reward.mint).owner, + owner: mintAccountInfo.owner, + extraAccountsMetaForTransferHook: rewardMintHookAccountsMeta, }); } } @@ -804,9 +913,11 @@ export class DLMM { ]) .flat(); + const reserveAndMintKeys = [...reservePublicKeys, ...reservePublicKeysV2]; + const reserveAccountsInfo = await chunkedGetMultipleAccountInfos( program.provider.connection, - [...reservePublicKeys, ...reservePublicKeysV2] + reserveAndMintKeys ); type LbPairMintInfo = { mint: RawMint; owner: PublicKey }; @@ -819,6 +930,7 @@ export class DLMM { string, { mintX: LbPairMintInfo; mintY: LbPairMintInfo } >(); + const mintAccountInfoMap = new Map>(); lbPairArray.forEach((lbPair, idx) => { const index = idx * 4; const reserveAccBufferX = reserveAccountsInfo[index]; @@ -837,6 +949,13 @@ export class DLMM { const mintXBuffer = reserveAccountsInfo[index + 2]; const mintYBuffer = reserveAccountsInfo[index + 3]; + + const mintXKey = reserveAndMintKeys[index + 2]; + const mintYKey = reserveAndMintKeys[index + 3]; + + mintAccountInfoMap.set(mintXKey, mintXBuffer); + mintAccountInfoMap.set(mintYKey, mintYBuffer); + if (!mintXBuffer || !mintYBuffer) throw new Error( `Mint account for LB Pair ${lbPair.toBase58()} not found` @@ -880,6 +999,13 @@ export class DLMM { reserveAccountsInfo[reservePublicKeys.length + index + 2]; const mintYBufferV2 = reserveAccountsInfo[reservePublicKeys.length + index + 3]; + + const mintXKey = reserveAndMintKeys[reservePublicKeys.length + index + 2]; + const mintYKey = reserveAndMintKeys[reservePublicKeys.length + index + 3]; + + mintAccountInfoMap.set(mintXKey, mintXBufferV2); + mintAccountInfoMap.set(mintYKey, mintYBufferV2); + if (!mintXBufferV2 || !mintYBufferV2) throw new Error( `Mint account for LB Pair ${lbPair.toBase58()} not found` @@ -899,6 +1025,26 @@ export class DLMM { }); }); + const mintHookAccountsMetaMap = ( + await Promise.all( + Array.from(mintAccountInfoMap.keys()).map(async (key) => { + const mintAccountInfo = mintAccountInfoMap.get(key); + const extraAccountMetas = await getExtraAccountMetasForTransferHook( + connection, + key, + mintAccountInfo + ); + return { + key, + extraAccountMetas, + }; + }) + ) + ).reduce((map, { key, extraAccountMetas }) => { + map.set(key, extraAccountMetas); + return map; + }, new Map()); + const onChainTimestamp = new BN( clockAccInfo.data.readBigInt64LE(32).toString() ).toNumber(); @@ -945,19 +1091,29 @@ export class DLMM { lbPairReserveMap.get(lbPair.toBase58())?.reserveX ?? BigInt(0); const reserveYBalance = lbPairReserveMap.get(lbPair.toBase58())?.reserveY ?? BigInt(0); - const tokenX = { + + const mintXHookAccountsMeta = mintHookAccountsMetaMap.get( + lbPairAcc.tokenXMint + ); + const mintYHookAccountsMeta = mintHookAccountsMetaMap.get( + lbPairAcc.tokenYMint + ); + + const tokenX: TokenReserve = { publicKey: lbPairAcc.tokenXMint, reserve: lbPairAcc.reserveX, amount: reserveXBalance, decimal: mintX.mint.decimals, owner: mintX.owner, + extraAccountsMetaForTransferHook: mintXHookAccountsMeta ?? [], }; - const tokenY = { + const tokenY: TokenReserve = { publicKey: lbPairAcc.tokenYMint, reserve: lbPairAcc.reserveY, amount: reserveYBalance, decimal: mintY.mint.decimals, owner: mintY.owner, + extraAccountsMetaForTransferHook: mintYHookAccountsMeta ?? [], }; const positionData = await DLMM.processPosition( program, @@ -1025,19 +1181,30 @@ export class DLMM { lbPairReserveMapV2.get(lbPair.toBase58())?.reserveX ?? BigInt(0); const reserveYBalance = lbPairReserveMapV2.get(lbPair.toBase58())?.reserveY ?? BigInt(0); - const tokenX = { + + const mintXHookAccountsMeta = mintHookAccountsMetaMap.get( + lbPairAcc.tokenXMint + ); + + const mintYHookAccountsMeta = mintHookAccountsMetaMap.get( + lbPairAcc.tokenYMint + ); + + const tokenX: TokenReserve = { publicKey: lbPairAcc.tokenXMint, reserve: lbPairAcc.reserveX, amount: reserveXBalance, decimal: baseMint.decimals, owner: baseMintAccountInfo.owner, + extraAccountsMetaForTransferHook: mintXHookAccountsMeta ?? [], }; - const tokenY = { + const tokenY: TokenReserve = { publicKey: lbPairAcc.tokenYMint, reserve: lbPairAcc.reserveY, amount: reserveYBalance, decimal: quoteMint.decimals, owner: quoteMintAccountInfo.owner, + extraAccountsMetaForTransferHook: mintYHookAccountsMeta ?? [], }; const positionData = await DLMM.processPosition( program, @@ -1352,11 +1519,17 @@ export class DLMM { binArrayBitmapExtensionAccountInfo, reserveXAccountInfo, reserveYAccountInfo, + mintXAccountInfo, + mintYAccountInfo, + clockAccountInfo, ] = await chunkedGetMultipleAccountInfos(this.program.provider.connection, [ this.pubkey, binArrayBitmapExtensionPubkey, this.lbPair.reserveX, this.lbPair.reserveY, + this.lbPair.tokenXMint, + this.lbPair.tokenYMint, + SYSVAR_CLOCK_PUBKEY, ]); const lbPairState = this.program.coder.accounts.decode( @@ -1379,32 +1552,53 @@ export class DLMM { const reserveXBalance = AccountLayout.decode(reserveXAccountInfo.data); const reserveYBalance = AccountLayout.decode(reserveYAccountInfo.data); - const [tokenXDecimal, tokenYDecimal] = await Promise.all([ - getTokenDecimals( - this.program.provider.connection, - lbPairState.tokenXMint + + const mintXState = unpackMint( + this.lbPair.tokenXMint, + mintXAccountInfo, + mintXAccountInfo.owner + ); + + const mintYState = unpackMint( + this.lbPair.tokenYMint, + mintYAccountInfo, + mintYAccountInfo.owner + ); + + const connection = this.program.provider.connection; + const [mintXHookAccountsMeta, mintYHookAccountsMeta] = await Promise.all([ + getExtraAccountMetasForTransferHook( + connection, + this.lbPair.tokenXMint, + mintXAccountInfo ), - getTokenDecimals( - this.program.provider.connection, - lbPairState.tokenYMint + getExtraAccountMetasForTransferHook( + connection, + this.lbPair.tokenYMint, + mintYAccountInfo ), ]); + const clock = ClockLayout.decode(clockAccountInfo.data) as Clock; + this.tokenX = { amount: reserveXBalance.amount, - decimal: tokenXDecimal, + decimal: mintXState.decimals, publicKey: lbPairState.tokenXMint, reserve: lbPairState.reserveX, owner: this.tokenX.owner, + extraAccountsMetaForTransferHook: mintXHookAccountsMeta, }; this.tokenY = { amount: reserveYBalance.amount, - decimal: tokenYDecimal, + decimal: mintYState.decimals, publicKey: lbPairState.tokenYMint, reserve: lbPairState.reserveY, owner: this.tokenY.owner, + extraAccountsMetaForTransferHook: mintYHookAccountsMeta, }; + this.clock = clock; this.lbPair = lbPairState; } @@ -2086,446 +2280,9 @@ export class DLMM { position: positionPubKey, lbPair: this.pubkey, owner: user, - }) - .instruction(); - preInstructions.push(initializePositionIx); - - const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId)); - const [binArrayLower] = deriveBinArray( - this.pubkey, - lowerBinArrayIndex, - this.program.programId - ); - - const upperBinArrayIndex = BN.max( - lowerBinArrayIndex.add(new BN(1)), - binIdToBinArrayIndex(new BN(maxBinId)) - ); - const [binArrayUpper] = deriveBinArray( - this.pubkey, - upperBinArrayIndex, - this.program.programId - ); - - const createBinArrayIxs = await this.createBinArraysIfNeeded( - upperBinArrayIndex, - lowerBinArrayIndex, - user - ); - preInstructions.push(...createBinArrayIxs); - - const [ - { ataPubKey: userTokenX, ix: createPayerTokenXIx }, - { ataPubKey: userTokenY, ix: createPayerTokenYIx }, - ] = await Promise.all([ - getOrCreateATAInstruction( - this.program.provider.connection, - this.tokenX.publicKey, - user - ), - getOrCreateATAInstruction( - this.program.provider.connection, - this.tokenY.publicKey, - user - ), - ]); - createPayerTokenXIx && preInstructions.push(createPayerTokenXIx); - createPayerTokenYIx && preInstructions.push(createPayerTokenYIx); - - if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) { - const wrapSOLIx = wrapSOLInstruction( - user, - userTokenX, - BigInt(totalXAmount.toString()) - ); - - preInstructions.push(...wrapSOLIx); - } - - if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) { - const wrapSOLIx = wrapSOLInstruction( - user, - userTokenY, - BigInt(totalYAmount.toString()) - ); - - preInstructions.push(...wrapSOLIx); - } - - const postInstructions: Array = []; - if ( - [ - this.tokenX.publicKey.toBase58(), - this.tokenY.publicKey.toBase58(), - ].includes(NATIVE_MINT.toBase58()) - ) { - const closeWrappedSOLIx = await unwrapSOLInstruction(user); - closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); - } - - const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId)); - const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId)); - - const useExtension = - isOverflowDefaultBinArrayBitmap(minBinArrayIndex) || - isOverflowDefaultBinArrayBitmap(maxBinArrayIndex); - - const binArrayBitmapExtension = useExtension - ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0] - : null; - - const activeId = this.lbPair.activeId; - - const strategyParameters: LiquidityParameterByStrategy["strategyParameters"] = - toStrategyParameters(strategy) as ProgramStrategyParameter; - - const liquidityParams: LiquidityParameterByStrategy = { - amountX: totalXAmount, - amountY: totalYAmount, - activeId, - maxActiveBinSlippage, - strategyParameters, - }; - - const addLiquidityAccounts = { - position: positionPubKey, - lbPair: this.pubkey, - userTokenX, - userTokenY, - reserveX: this.lbPair.reserveX, - reserveY: this.lbPair.reserveY, - tokenXMint: this.lbPair.tokenXMint, - tokenYMint: this.lbPair.tokenYMint, - binArrayLower, - binArrayUpper, - binArrayBitmapExtension, - sender: user, - tokenXProgram: this.tokenX.owner, - tokenYProgram: this.tokenY.owner, - }; - - const programMethod = - this.program.methods.addLiquidityByStrategy(liquidityParams); - - const createPositionTx = await programMethod - .accounts(addLiquidityAccounts) - .preInstructions(preInstructions) - .postInstructions(postInstructions) - .transaction(); - - const { blockhash, lastValidBlockHeight } = - await this.program.provider.connection.getLatestBlockhash("confirmed"); - return new Transaction({ - blockhash, - lastValidBlockHeight, - feePayer: user, - }).add(createPositionTx); - } - - /** - * The function `initializePositionAndAddLiquidityByWeight` function is used to initializes a position and adds liquidity - * @param {TInitializePositionAndAddLiquidityParams} - * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`) - * - `totalXAmount`: The total amount of token X to be added to the liquidity pool. - * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool. - * - `xYAmountDistribution`: An array of objects of type `XYAmountDistribution` that represents (can use `calculateSpotDistribution`, `calculateBidAskDistribution` & `calculateNormalDistribution`) - * - `user`: The public key of the user account. - * - `slippage`: The slippage percentage to be used for the liquidity pool. - * @returns {Promise} The function `initializePositionAndAddLiquidityByWeight` returns a `Promise` that - * resolves to either a single `Transaction` object (if less than 26bin involved) or an array of `Transaction` objects. - */ - public async initializePositionAndAddLiquidityByWeight({ - positionPubKey, - totalXAmount, - totalYAmount, - xYAmountDistribution, - user, - slippage, - }: TInitializePositionAndAddLiquidityParams): Promise< - Transaction | Transaction[] - > { - const { lowerBinId, upperBinId, binIds } = - this.processXYAmountDistribution(xYAmountDistribution); - - const maxActiveBinSlippage = slippage - ? Math.ceil(slippage / (this.lbPair.binStep / 100)) - : MAX_ACTIVE_BIN_SLIPPAGE; - - if (upperBinId >= lowerBinId + MAX_BIN_PER_POSITION.toNumber()) { - throw new Error( - `Position must be within a range of 1 to ${MAX_BIN_PER_POSITION.toNumber()} bins.` - ); - } - - const preInstructions: Array = []; - const initializePositionIx = await this.program.methods - .initializePosition(lowerBinId, upperBinId - lowerBinId + 1) - .accounts({ - payer: user, - position: positionPubKey, - lbPair: this.pubkey, - owner: user, - }) - .instruction(); - preInstructions.push(initializePositionIx); - - const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId)); - const [binArrayLower] = deriveBinArray( - this.pubkey, - lowerBinArrayIndex, - this.program.programId - ); - - const upperBinArrayIndex = BN.max( - lowerBinArrayIndex.add(new BN(1)), - binIdToBinArrayIndex(new BN(upperBinId)) - ); - const [binArrayUpper] = deriveBinArray( - this.pubkey, - upperBinArrayIndex, - this.program.programId - ); - - const createBinArrayIxs = await this.createBinArraysIfNeeded( - upperBinArrayIndex, - lowerBinArrayIndex, - user - ); - preInstructions.push(...createBinArrayIxs); - - const [ - { ataPubKey: userTokenX, ix: createPayerTokenXIx }, - { ataPubKey: userTokenY, ix: createPayerTokenYIx }, - ] = await Promise.all([ - getOrCreateATAInstruction( - this.program.provider.connection, - this.tokenX.publicKey, - user - ), - getOrCreateATAInstruction( - this.program.provider.connection, - this.tokenY.publicKey, - user - ), - ]); - createPayerTokenXIx && preInstructions.push(createPayerTokenXIx); - createPayerTokenYIx && preInstructions.push(createPayerTokenYIx); - - if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) { - const wrapSOLIx = wrapSOLInstruction( - user, - userTokenX, - BigInt(totalXAmount.toString()) - ); - - preInstructions.push(...wrapSOLIx); - } - - if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) { - const wrapSOLIx = wrapSOLInstruction( - user, - userTokenY, - BigInt(totalYAmount.toString()) - ); - - preInstructions.push(...wrapSOLIx); - } - - const postInstructions: Array = []; - if ( - [ - this.tokenX.publicKey.toBase58(), - this.tokenY.publicKey.toBase58(), - ].includes(NATIVE_MINT.toBase58()) - ) { - const closeWrappedSOLIx = await unwrapSOLInstruction(user); - closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); - } - - const setComputeUnitLimitIx = computeBudgetIx(); - - const minBinId = Math.min(...binIds); - const maxBinId = Math.max(...binIds); - - const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId)); - const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId)); - - const useExtension = - isOverflowDefaultBinArrayBitmap(minBinArrayIndex) || - isOverflowDefaultBinArrayBitmap(maxBinArrayIndex); - - const binArrayBitmapExtension = useExtension - ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0] - : null; - - const activeId = this.lbPair.activeId; - - const binLiquidityDist: LiquidityParameterByWeight["binLiquidityDist"] = - toWeightDistribution( - totalXAmount, - totalYAmount, - xYAmountDistribution.map((item) => ({ - binId: item.binId, - xAmountBpsOfTotal: item.xAmountBpsOfTotal, - yAmountBpsOfTotal: item.yAmountBpsOfTotal, - })), - this.lbPair.binStep - ); - - if (binLiquidityDist.length === 0) { - throw new Error("No liquidity to add"); - } - - const liquidityParams: LiquidityParameterByWeight = { - amountX: totalXAmount, - amountY: totalYAmount, - binLiquidityDist, - activeId, - maxActiveBinSlippage, - }; - - const addLiquidityAccounts = { - position: positionPubKey, - lbPair: this.pubkey, - userTokenX, - userTokenY, - reserveX: this.lbPair.reserveX, - reserveY: this.lbPair.reserveY, - tokenXMint: this.lbPair.tokenXMint, - tokenYMint: this.lbPair.tokenYMint, - binArrayLower, - binArrayUpper, - binArrayBitmapExtension, - sender: user, - tokenXProgram: this.tokenX.owner, - tokenYProgram: this.tokenY.owner, - }; - - const oneSideLiquidityParams: LiquidityOneSideParameter = { - amount: totalXAmount.isZero() ? totalYAmount : totalXAmount, - activeId, - maxActiveBinSlippage, - binLiquidityDist, - }; - - const [reserve, tokenMint, tokenProgram, userToken] = totalXAmount.isZero() - ? [ - this.lbPair.reserveY, - this.lbPair.tokenYMint, - this.tokenY.owner, - userTokenY, - ] - : [ - this.lbPair.reserveX, - this.lbPair.tokenXMint, - this.tokenX.owner, - userTokenX, - ]; - - const oneSideAddLiquidityAccounts = { - binArrayLower, - binArrayUpper, - lbPair: this.pubkey, - binArrayBitmapExtension: null, - sender: user, - position: positionPubKey, - reserve, - tokenMint, - tokenProgram, - userToken, - }; - - const isOneSideDeposit = totalXAmount.isZero() || totalYAmount.isZero(); - const programMethod = isOneSideDeposit - ? this.program.methods.addLiquidityOneSide(oneSideLiquidityParams) - : this.program.methods.addLiquidityByWeight(liquidityParams); - - if (xYAmountDistribution.length < MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX) { - const addLiqTx = await programMethod - .accounts( - isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts - ) - .preInstructions([setComputeUnitLimitIx, ...preInstructions]) - .postInstructions(postInstructions) - .transaction(); - - const { blockhash, lastValidBlockHeight } = - await this.program.provider.connection.getLatestBlockhash("confirmed"); - return new Transaction({ - blockhash, - lastValidBlockHeight, - feePayer: user, - }).add(addLiqTx); - } - - const addLiqTx = await programMethod - .accounts( - isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts - ) - .preInstructions([setComputeUnitLimitIx]) - .transaction(); - - const transactions: Transaction[] = []; - const { blockhash, lastValidBlockHeight } = - await this.program.provider.connection.getLatestBlockhash("confirmed"); - if (preInstructions.length) { - const preInstructionsTx = new Transaction({ - blockhash, - lastValidBlockHeight, - feePayer: user, - }).add(...preInstructions); - transactions.push(preInstructionsTx); - } - - const mainTx = new Transaction({ - blockhash, - lastValidBlockHeight, - feePayer: user, - }).add(addLiqTx); - transactions.push(mainTx); - - if (postInstructions.length) { - const postInstructionsTx = new Transaction({ - blockhash, - lastValidBlockHeight, - feePayer: user, - }).add(...postInstructions); - transactions.push(postInstructionsTx); - } - - return transactions; - } - - /** - * The `addLiquidityByStrategy` function is used to add liquidity to existing position - * @param {TInitializePositionAndAddLiquidityParamsByStrategy} - * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`) - * - `totalXAmount`: The total amount of token X to be added to the liquidity pool. - * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool. - * - `strategy`: The strategy parameters to be used for the liquidity pool (Can use `calculateStrategyParameter` to calculate). - * - `user`: The public key of the user account. - * - `slippage`: The slippage percentage to be used for the liquidity pool. - * @returns {Promise} The function `addLiquidityByWeight` returns a `Promise` that resolves to either a single - * `Transaction` object - */ - public async addLiquidityByStrategy({ - positionPubKey, - totalXAmount, - totalYAmount, - strategy, - user, - slippage, - }: TInitializePositionAndAddLiquidityParamsByStrategy): Promise { - const { maxBinId, minBinId } = strategy; - - const maxActiveBinSlippage = slippage - ? Math.ceil(slippage / (this.lbPair.binStep / 100)) - : MAX_ACTIVE_BIN_SLIPPAGE; - - const preInstructions: TransactionInstruction[] = []; - - const setComputeUnitLimitIx = computeBudgetIx(); - preInstructions.push(setComputeUnitLimitIx); + }) + .instruction(); + preInstructions.push(initializePositionIx); const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId)); const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId)); @@ -2538,31 +2295,9 @@ export class DLMM { ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0] : null; - const activeId = this.lbPair.activeId; - - const strategyParameters: LiquidityParameterByStrategy["strategyParameters"] = - toStrategyParameters(strategy) as ProgramStrategyParameter; - - const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId)); - const [binArrayLower] = deriveBinArray( - this.pubkey, - lowerBinArrayIndex, - this.program.programId - ); - - const upperBinArrayIndex = BN.max( - lowerBinArrayIndex.add(new BN(1)), - binIdToBinArrayIndex(new BN(maxBinId)) - ); - const [binArrayUpper] = deriveBinArray( - this.pubkey, - upperBinArrayIndex, - this.program.programId - ); - const createBinArrayIxs = await this.createBinArraysIfNeeded( - upperBinArrayIndex, - lowerBinArrayIndex, + maxBinArrayIndex, + minBinArrayIndex, user ); preInstructions.push(...createBinArrayIxs); @@ -2616,14 +2351,39 @@ export class DLMM { closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); } + const activeId = this.lbPair.activeId; + + const strategyParameters: LiquidityParameterByStrategy["strategyParameters"] = + toStrategyParameters(strategy) as ProgramStrategyParameter; + const liquidityParams: LiquidityParameterByStrategy = { amountX: totalXAmount, amountY: totalYAmount, - activeId: this.lbPair.activeId, + activeId, maxActiveBinSlippage, strategyParameters, }; + const binArrayAccountsMeta = getBinArrayAccounstMetaByBinRange( + this.pubkey, + new BN(minBinId), + new BN(maxBinId), + this.program.programId + ); + + const remainingAccountsInfo: RemainingAccountsInfo = { + slices: [ + { + accountsType: AccountsType.TransferHookX, + length: this.tokenX.extraAccountsMetaForTransferHook.length, + }, + { + accountsType: AccountsType.TransferHookY, + length: this.tokenY.extraAccountsMetaForTransferHook.length, + }, + ], + }; + const addLiquidityAccounts = { position: positionPubKey, lbPair: this.pubkey, @@ -2633,19 +2393,25 @@ export class DLMM { reserveY: this.lbPair.reserveY, tokenXMint: this.lbPair.tokenXMint, tokenYMint: this.lbPair.tokenYMint, - binArrayLower, - binArrayUpper, binArrayBitmapExtension, sender: user, tokenXProgram: this.tokenX.owner, tokenYProgram: this.tokenY.owner, + memoProgram: MEMO_PROGRAM_ID, }; - const programMethod = - this.program.methods.addLiquidityByStrategy(liquidityParams); + const programMethod = this.program.methods.addLiquidityByStrategy2( + liquidityParams, + remainingAccountsInfo + ); const createPositionTx = await programMethod .accounts(addLiquidityAccounts) + .remainingAccounts([ + ...this.tokenX.extraAccountsMetaForTransferHook, + ...this.tokenY.extraAccountsMetaForTransferHook, + ...binArrayAccountsMeta, + ]) .preInstructions(preInstructions) .postInstructions(postInstructions) .transaction(); @@ -2660,48 +2426,35 @@ export class DLMM { } /** - * The `addLiquidityByWeight` function is used to add liquidity to existing position - * @param {TInitializePositionAndAddLiquidityParams} + * The `addLiquidityByStrategy` function is used to add liquidity to existing position + * @param {TInitializePositionAndAddLiquidityParamsByStrategy} * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`) * - `totalXAmount`: The total amount of token X to be added to the liquidity pool. * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool. - * - `xYAmountDistribution`: An array of objects of type `XYAmountDistribution` that represents (can use `calculateSpotDistribution`, `calculateBidAskDistribution` & `calculateNormalDistribution`) + * - `strategy`: The strategy parameters to be used for the liquidity pool (Can use `calculateStrategyParameter` to calculate). * - `user`: The public key of the user account. * - `slippage`: The slippage percentage to be used for the liquidity pool. - * @returns {Promise} The function `addLiquidityByWeight` returns a `Promise` that resolves to either a single - * `Transaction` object (if less than 26bin involved) or an array of `Transaction` objects. + * @returns {Promise} The function `addLiquidityByWeight` returns a `Promise` that resolves to either a single + * `Transaction` object */ - public async addLiquidityByWeight({ + public async addLiquidityByStrategy({ positionPubKey, totalXAmount, totalYAmount, - xYAmountDistribution, + strategy, user, slippage, - }: TInitializePositionAndAddLiquidityParams): Promise< - Transaction | Transaction[] - > { + }: TInitializePositionAndAddLiquidityParamsByStrategy): Promise { + const { maxBinId, minBinId } = strategy; + const maxActiveBinSlippage = slippage ? Math.ceil(slippage / (this.lbPair.binStep / 100)) : MAX_ACTIVE_BIN_SLIPPAGE; - const positionAccount = await this.program.account.positionV2.fetch( - positionPubKey - ); - const { lowerBinId, upperBinId, binIds } = - this.processXYAmountDistribution(xYAmountDistribution); - - if (lowerBinId < positionAccount.lowerBinId) - throw new Error( - `Lower Bin ID (${lowerBinId}) lower than Position Lower Bin Id (${positionAccount.lowerBinId})` - ); - if (upperBinId > positionAccount.upperBinId) - throw new Error( - `Upper Bin ID (${upperBinId}) higher than Position Upper Bin Id (${positionAccount.upperBinId})` - ); + const preInstructions: TransactionInstruction[] = []; - const minBinId = Math.min(...binIds); - const maxBinId = Math.max(...binIds); + const setComputeUnitLimitIx = computeBudgetIx(); + preInstructions.push(setComputeUnitLimitIx); const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId)); const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId)); @@ -2714,47 +2467,12 @@ export class DLMM { ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0] : null; - const activeId = this.lbPair.activeId; - - const binLiquidityDist: LiquidityParameterByWeight["binLiquidityDist"] = - toWeightDistribution( - totalXAmount, - totalYAmount, - xYAmountDistribution.map((item) => ({ - binId: item.binId, - xAmountBpsOfTotal: item.xAmountBpsOfTotal, - yAmountBpsOfTotal: item.yAmountBpsOfTotal, - })), - this.lbPair.binStep - ); - - if (binLiquidityDist.length === 0) { - throw new Error("No liquidity to add"); - } - - const lowerBinArrayIndex = binIdToBinArrayIndex( - new BN(positionAccount.lowerBinId) - ); - const [binArrayLower] = deriveBinArray( - this.pubkey, - lowerBinArrayIndex, - this.program.programId - ); - - const upperBinArrayIndex = BN.max( - lowerBinArrayIndex.add(new BN(1)), - binIdToBinArrayIndex(new BN(positionAccount.upperBinId)) - ); - const [binArrayUpper] = deriveBinArray( - this.pubkey, - upperBinArrayIndex, - this.program.programId - ); + const strategyParameters: LiquidityParameterByStrategy["strategyParameters"] = + toStrategyParameters(strategy) as ProgramStrategyParameter; - const preInstructions: TransactionInstruction[] = []; const createBinArrayIxs = await this.createBinArraysIfNeeded( - upperBinArrayIndex, - lowerBinArrayIndex, + maxBinArrayIndex, + minBinArrayIndex, user ); preInstructions.push(...createBinArrayIxs); @@ -2808,14 +2526,12 @@ export class DLMM { closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); } - const setComputeUnitLimitIx = computeBudgetIx(); - - const liquidityParams: LiquidityParameterByWeight = { + const liquidityParams: LiquidityParameterByStrategy = { amountX: totalXAmount, amountY: totalYAmount, - binLiquidityDist, - activeId, + activeId: this.lbPair.activeId, maxActiveBinSlippage, + strategyParameters, }; const addLiquidityAccounts = { @@ -2827,107 +2543,56 @@ export class DLMM { reserveY: this.lbPair.reserveY, tokenXMint: this.lbPair.tokenXMint, tokenYMint: this.lbPair.tokenYMint, - binArrayLower, - binArrayUpper, binArrayBitmapExtension, sender: user, tokenXProgram: this.tokenX.owner, tokenYProgram: this.tokenY.owner, + memoProgram: MEMO_PROGRAM_ID, }; - const oneSideLiquidityParams: LiquidityOneSideParameter = { - amount: totalXAmount.isZero() ? totalYAmount : totalXAmount, - activeId, - maxActiveBinSlippage, - binLiquidityDist, - }; - - const [reserve, tokenMint, tokenProgram, userToken] = totalXAmount.isZero() - ? [ - this.lbPair.reserveY, - this.lbPair.tokenYMint, - this.tokenY.owner, - userTokenY, - ] - : [ - this.lbPair.reserveX, - this.lbPair.tokenXMint, - this.tokenX.owner, - userTokenX, - ]; + const binArrayAccountsMeta = getBinArrayAccounstMetaByBinRange( + this.pubkey, + new BN(minBinId), + new BN(maxBinId), + this.program.programId + ); - const oneSideAddLiquidityAccounts = { - binArrayLower, - binArrayUpper, - lbPair: this.pubkey, - binArrayBitmapExtension: null, - sender: user, - position: positionPubKey, - reserve, - tokenMint, - tokenProgram, - userToken, + const remainingAccountsInfo: RemainingAccountsInfo = { + slices: [ + { + accountsType: AccountsType.TransferHookX, + length: this.tokenX.extraAccountsMetaForTransferHook.length, + }, + { + accountsType: AccountsType.TransferHookY, + length: this.tokenY.extraAccountsMetaForTransferHook.length, + }, + ], }; - const isOneSideDeposit = totalXAmount.isZero() || totalYAmount.isZero(); - const programMethod = isOneSideDeposit - ? this.program.methods.addLiquidityOneSide(oneSideLiquidityParams) - : this.program.methods.addLiquidityByWeight(liquidityParams); - - if (xYAmountDistribution.length < MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX) { - const addLiqTx = await programMethod - .accounts( - isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts - ) - .preInstructions([setComputeUnitLimitIx, ...preInstructions]) - .postInstructions(postInstructions) - .transaction(); - - const { blockhash, lastValidBlockHeight } = - await this.program.provider.connection.getLatestBlockhash("confirmed"); - return new Transaction({ - blockhash, - lastValidBlockHeight, - feePayer: user, - }).add(addLiqTx); - } + const programMethod = this.program.methods.addLiquidityByStrategy2( + liquidityParams, + remainingAccountsInfo + ); - const addLiqTx = await programMethod - .accounts( - isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts - ) - .preInstructions([setComputeUnitLimitIx]) + const createPositionTx = await programMethod + .accounts(addLiquidityAccounts) + .remainingAccounts([ + ...this.tokenX.extraAccountsMetaForTransferHook, + ...this.tokenY.extraAccountsMetaForTransferHook, + ...binArrayAccountsMeta, + ]) + .preInstructions(preInstructions) + .postInstructions(postInstructions) .transaction(); - const transactions: Transaction[] = []; const { blockhash, lastValidBlockHeight } = await this.program.provider.connection.getLatestBlockhash("confirmed"); - if (preInstructions.length) { - const preInstructionsTx = new Transaction({ - blockhash, - lastValidBlockHeight, - feePayer: user, - }).add(...preInstructions); - transactions.push(preInstructionsTx); - } - - const mainTx = new Transaction({ + return new Transaction({ blockhash, lastValidBlockHeight, feePayer: user, - }).add(addLiqTx); - transactions.push(mainTx); - - if (postInstructions.length) { - const postInstructionsTx = new Transaction({ - blockhash, - lastValidBlockHeight, - feePayer: user, - }).add(...postInstructions); - transactions.push(postInstructionsTx); - } - - return transactions; + }).add(createPositionTx); } /** @@ -2959,18 +2624,9 @@ export class DLMM { const { reserveX, reserveY, tokenXMint, tokenYMint } = await this.program.account.lbPair.fetch(lbPair); - const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId)); - const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1)); - const [binArrayLower] = deriveBinArray( - lbPair, - lowerBinArrayIndex, - this.program.programId - ); - const [binArrayUpper] = deriveBinArray( - lbPair, - upperBinArrayIndex, - this.program.programId - ); + + const minBinId = Math.min(...binIds); + const maxBinId = Math.max(...binIds); const preInstructions: Array = []; const setComputeUnitLimitIx = computeBudgetIx(); @@ -3023,12 +2679,30 @@ export class DLMM { const secondTransactionsIx: TransactionInstruction[] = []; const postInstructions: Array = []; + let mintXYRemainingAccountsInfo: RemainingAccountsInfo = { + slices: [ + { + accountsType: AccountsType.TransferHookX, + length: this.tokenX.extraAccountsMetaForTransferHook.length, + }, + { + accountsType: AccountsType.TransferHookY, + length: this.tokenY.extraAccountsMetaForTransferHook.length, + }, + ], + }; + + const binArrayAccountsMeta = getBinArrayAccounstMetaByBinRange( + this.pubkey, + new BN(minBinId), + new BN(maxBinId), + this.program.programId + ); + if (shouldClaimAndClose) { const claimSwapFeeIx = await this.program.methods - .claimFee2() + .claimFee2(minBinId, maxBinId, mintXYRemainingAccountsInfo) .accounts({ - binArrayLower, - binArrayUpper, lbPair: this.pubkey, sender: user, position, @@ -3040,7 +2714,13 @@ export class DLMM { tokenYMint: this.tokenY.publicKey, userTokenX: feeOwnerTokenX, userTokenY: feeOwnerTokenY, + memoProgram: MEMO_PROGRAM_ID, }) + .remainingAccounts([ + ...this.tokenX.extraAccountsMetaForTransferHook, + ...this.tokenY.extraAccountsMetaForTransferHook, + ...binArrayAccountsMeta, + ]) .instruction(); postInstructions.push(claimSwapFeeIx); @@ -3048,6 +2728,16 @@ export class DLMM { const rewardInfo = this.lbPair.rewardInfos[i]; if (!rewardInfo || rewardInfo.mint.equals(PublicKey.default)) continue; + const rewardMintRemainingAccountsInfo: RemainingAccountsInfo = { + slices: [ + { + accountsType: AccountsType.TransferHookReward, + length: + this.rewardMintInfo[i].extraAccountsMetaForTransferHook.length, + }, + ], + }; + const { ataPubKey, ix: rewardAtaIx } = await getOrCreateATAInstruction( this.program.provider.connection, rewardInfo.mint, @@ -3056,22 +2746,43 @@ export class DLMM { rewardAtaIx && preInstructions.push(rewardAtaIx); const claimRewardIx = await this.program.methods - .claimReward(new BN(i)) + .claimReward2( + new BN(i), + minBinId, + maxBinId, + rewardMintRemainingAccountsInfo + ) .accounts({ lbPair: this.pubkey, sender: user, position, - binArrayLower, - binArrayUpper, rewardVault: rewardInfo.vault, rewardMint: rewardInfo.mint, tokenProgram: this.rewardMintInfo[i].owner, userTokenAccount: ataPubKey, + memoProgram: MEMO_PROGRAM_ID, }) + .remainingAccounts([ + ...this.rewardMintInfo[i].extraAccountsMetaForTransferHook, + ...binArrayAccountsMeta, + ]) .instruction(); secondTransactionsIx.push(claimRewardIx); } + const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId)); + const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1)); + const [binArrayLower] = deriveBinArray( + lbPair, + lowerBinArrayIndex, + this.program.programId + ); + const [binArrayUpper] = deriveBinArray( + lbPair, + upperBinArrayIndex, + this.program.programId + ); + const closePositionIx = await this.program.methods .closePosition() .accounts({ @@ -3100,9 +2811,6 @@ export class DLMM { closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); } - const minBinId = Math.min(...binIds); - const maxBinId = Math.max(...binIds); - const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId)); const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId)); @@ -3115,7 +2823,12 @@ export class DLMM { : null; const removeLiquidityTx = await this.program.methods - .removeLiquidityByRange(minBinId, maxBinId, bps.toNumber()) + .removeLiquidityByRange2( + minBinId, + maxBinId, + bps.toNumber(), + mintXYRemainingAccountsInfo + ) .accounts({ position, lbPair, @@ -3125,13 +2838,17 @@ export class DLMM { reserveY, tokenXMint, tokenYMint, - binArrayLower, - binArrayUpper, binArrayBitmapExtension, tokenXProgram: this.tokenX.owner, tokenYProgram: this.tokenY.owner, sender: user, + memoProgram: MEMO_PROGRAM_ID, }) + .remainingAccounts([ + ...this.tokenX.extraAccountsMetaForTransferHook, + ...this.tokenY.extraAccountsMetaForTransferHook, + ...binArrayAccountsMeta, + ]) .preInstructions(preInstructions) .postInstructions(postInstructions) .transaction(); @@ -3348,7 +3065,7 @@ export class DLMM { } /** - * The `swapQuote` function returns a quote for a swap + * The `swapQuote` function returns a quote for a swap. Do not support token 2022. * @param * - `inAmount`: Amount of lamport to swap in * - `swapForY`: Swap token X to Y when it is true, else reversed. @@ -3655,8 +3372,18 @@ export class DLMM { closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); } - let swapForY = true; - if (outToken.equals(tokenXMint)) swapForY = false; + const remainingAccountsInfo: RemainingAccountsInfo = { + slices: [ + { + accountsType: AccountsType.TransferHookX, + length: this.tokenX.extraAccountsMetaForTransferHook.length, + }, + { + accountsType: AccountsType.TransferHookY, + length: this.tokenY.extraAccountsMetaForTransferHook.length, + }, + ], + }; // TODO: needs some refinement in case binArray not yet initialized const binArrays: AccountMeta[] = binArraysPubkey.map((pubkey) => { @@ -3668,10 +3395,11 @@ export class DLMM { }); const swapTx = await this.program.methods - .swapWithPriceImpact( + .swapWithPriceImpact2( inAmount, this.lbPair.activeId, - priceImpact.toNumber() + priceImpact.toNumber(), + remainingAccountsInfo ) .accounts({ lbPair, @@ -3689,8 +3417,13 @@ export class DLMM { : null, oracle, hostFeeIn: null, + memoProgram: MEMO_PROGRAM_ID, }) - .remainingAccounts(binArrays) + .remainingAccounts([ + ...this.tokenX.extraAccountsMetaForTransferHook, + ...this.tokenY.extraAccountsMetaForTransferHook, + ...binArrays, + ]) .preInstructions(preInstructions) .postInstructions(postInstructions) .transaction(); @@ -3764,8 +3497,18 @@ export class DLMM { closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); } - let swapForY = true; - if (outToken.equals(tokenXMint)) swapForY = false; + const remainingAccountsInfo: RemainingAccountsInfo = { + slices: [ + { + accountsType: AccountsType.TransferHookX, + length: this.tokenX.extraAccountsMetaForTransferHook.length, + }, + { + accountsType: AccountsType.TransferHookY, + length: this.tokenY.extraAccountsMetaForTransferHook.length, + }, + ], + }; // TODO: needs some refinement in case binArray not yet initialized const binArrays: AccountMeta[] = binArraysPubkey.map((pubkey) => { @@ -3777,7 +3520,7 @@ export class DLMM { }); const swapTx = await this.program.methods - .swap(inAmount, minOutAmount) + .swap2(inAmount, minOutAmount, remainingAccountsInfo) .accounts({ lbPair, reserveX, @@ -3794,8 +3537,13 @@ export class DLMM { : null, oracle, hostFeeIn: null, + memoProgram: MEMO_PROGRAM_ID, }) - .remainingAccounts(binArrays) + .remainingAccounts([ + ...this.tokenX.extraAccountsMetaForTransferHook, + ...this.tokenY.extraAccountsMetaForTransferHook, + ...binArrays, + ]) .preInstructions(preInstructions) .postInstructions(postInstructions) .transaction(); @@ -5601,23 +5349,16 @@ export class DLMM { position: LbPosition; shouldIncludePreIx?: boolean; }) { - const lowerBinArrayIndex = binIdToBinArrayIndex( - new BN(position.positionData.lowerBinId) - ); - const [binArrayLower] = deriveBinArray( - this.pubkey, - lowerBinArrayIndex, - this.program.programId - ); + const { lowerBinId, upperBinId } = position.positionData; + const claimTransactions: Transaction[] = []; - const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1)); - const [binArrayUpper] = deriveBinArray( + const binArrayAccountsMeta = getBinArrayAccounstMetaByBinRange( this.pubkey, - upperBinArrayIndex, + new BN(lowerBinId), + new BN(upperBinId), this.program.programId ); - const claimTransactions: Transaction[] = []; for (let i = 0; i < 2; i++) { const rewardInfo = this.lbPair.rewardInfos[i]; if (!rewardInfo || rewardInfo.mint.equals(PublicKey.default)) continue; @@ -5629,19 +5370,32 @@ export class DLMM { owner ); ix && preInstructions.push(ix); + + const remainingAccountsInfo: RemainingAccountsInfo = { + slices: [ + { + accountsType: AccountsType.TransferHookReward, + length: + this.rewardMintInfo[i].extraAccountsMetaForTransferHook.length, + }, + ], + }; + const claimTransaction = await this.program.methods - .claimReward(new BN(i)) + .claimReward2(new BN(i), lowerBinId, upperBinId, remainingAccountsInfo) .accounts({ lbPair: this.pubkey, sender: owner, position: position.publicKey, - binArrayLower, - binArrayUpper, rewardVault: rewardInfo.vault, rewardMint: rewardInfo.mint, tokenProgram: this.rewardMintInfo[i].owner, userTokenAccount: ataPubKey, }) + .remainingAccounts([ + ...this.rewardMintInfo[i].extraAccountsMetaForTransferHook, + ...binArrayAccountsMeta, + ]) .preInstructions(shouldIncludePreIx ? preInstructions : []) .transaction(); claimTransactions.push(claimTransaction); @@ -5661,21 +5415,7 @@ export class DLMM { shouldIncludePretIx?: boolean; shouldIncludePostIx?: boolean; }) { - const { lowerBinId, feeOwner } = position.positionData; - - const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId)); - const [binArrayLower] = deriveBinArray( - this.pubkey, - lowerBinArrayIndex, - this.program.programId - ); - - const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1)); - const [binArrayUpper] = deriveBinArray( - this.pubkey, - upperBinArrayIndex, - this.program.programId - ); + const { lowerBinId, upperBinId, feeOwner } = position.positionData; const [reserveX] = deriveReserve( this.tokenX.publicKey, @@ -5724,11 +5464,29 @@ export class DLMM { closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); } + const binArrayAccountsMeta = getBinArrayAccounstMetaByBinRange( + this.pubkey, + new BN(lowerBinId), + new BN(upperBinId), + this.program.programId + ); + + const remainingAccountsInfo: RemainingAccountsInfo = { + slices: [ + { + accountsType: AccountsType.TransferHookX, + length: this.tokenX.extraAccountsMetaForTransferHook.length, + }, + { + accountsType: AccountsType.TransferHookY, + length: this.tokenY.extraAccountsMetaForTransferHook.length, + }, + ], + }; + const claimFeeTx = await this.program.methods - .claimFee2() + .claimFee2(lowerBinId, upperBinId, remainingAccountsInfo) .accounts({ - binArrayLower, - binArrayUpper, lbPair: this.pubkey, sender: owner, position: position.publicKey, @@ -5740,7 +5498,13 @@ export class DLMM { tokenYMint: this.tokenY.publicKey, userTokenX, userTokenY, + memoProgram: MEMO_PROGRAM_ID, }) + .remainingAccounts([ + ...this.tokenX.extraAccountsMetaForTransferHook, + ...this.tokenY.extraAccountsMetaForTransferHook, + ...binArrayAccountsMeta, + ]) .preInstructions(shouldIncludePretIx ? preInstructions : []) .postInstructions(shouldIncludePostIx ? postInstructions : []) .transaction(); diff --git a/ts-client/src/dlmm/types/index.ts b/ts-client/src/dlmm/types/index.ts index 0024b732..ff244244 100644 --- a/ts-client/src/dlmm/types/index.ts +++ b/ts-client/src/dlmm/types/index.ts @@ -6,7 +6,11 @@ import { ProgramAccount, } from "@coral-xyz/anchor"; import { LbClmm } from "../idl"; -import { PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { + AccountMeta, + PublicKey, + TransactionInstruction, +} from "@solana/web3.js"; import Decimal from "decimal.js"; import { u64, i64, struct } from "@coral-xyz/borsh"; @@ -28,11 +32,13 @@ export interface TokenReserve { amount: bigint; decimal: number; owner: PublicKey; + extraAccountsMetaForTransferHook: AccountMeta[]; } export interface RewardMintInfo { publicKey: PublicKey; owner: PublicKey; + extraAccountsMetaForTransferHook: AccountMeta[]; } export type ClmmProgram = Program; @@ -79,6 +85,8 @@ export type CompressedBinDepositAmount = IdlTypes["CompressedBinDepositAmount"]; export type CompressedBinDepositAmounts = CompressedBinDepositAmount[]; +export type RemainingAccountsInfo = IdlTypes["RemainingAccountsInfo"]; + export interface LbPosition { publicKey: PublicKey; positionData: PositionData; @@ -153,6 +161,18 @@ export enum ActivationType { Timestamp, } +export const AccountsType = { + TransferHookX: { + transferHookX: {}, + }, + TransferHookY: { + transferHookY: {}, + }, + TransferHookReward: { + transferHookReward: {}, + }, +}; + export interface StrategyParameters { maxBinId: number; minBinId: number; diff --git a/ts-client/src/test/sdk.test.ts b/ts-client/src/test/sdk.test.ts index 30b6144d..b514b3d4 100644 --- a/ts-client/src/test/sdk.test.ts +++ b/ts-client/src/test/sdk.test.ts @@ -471,11 +471,18 @@ describe.only("SDK test", () => { await pair.refetchStates(); - let addLiquidityTxs = await pair.addLiquidityByWeight({ + const minBinId = lowerBinId; + const maxBinId = minBinId.add(MAX_BIN_PER_POSITION).sub(new BN(1)); + + let addLiquidityTxs = await pair.addLiquidityByStrategy({ positionPubKey: customFeeOwnerPosition, totalXAmount: btcInAmount, totalYAmount: usdcInAmount, - xYAmountDistribution, + strategy: { + strategyType: StrategyType.SpotBalanced, + minBinId: minBinId.toNumber(), + maxBinId: maxBinId.toNumber(), + }, user: keypair.publicKey, slippage: 0, }); @@ -1622,30 +1629,19 @@ describe.only("SDK test", () => { const btcInAmount = new BN(1).mul(new BN(10 ** btcDecimal)); const usdcInAmount = new BN(24000).mul(new BN(10 ** usdcDecimal)); - const xYAmountDistribution = [ - { - binId: DEFAULT_ACTIVE_ID.sub(new BN(1)).toNumber(), - xAmountBpsOfTotal: new BN(0), - yAmountBpsOfTotal: new BN(7500), - }, - { - binId: DEFAULT_ACTIVE_ID.toNumber(), - xAmountBpsOfTotal: new BN(2500), - yAmountBpsOfTotal: new BN(2500), - }, - { - binId: DEFAULT_ACTIVE_ID.add(new BN(1)).toNumber(), - xAmountBpsOfTotal: new BN(7500), - yAmountBpsOfTotal: new BN(0), - }, - ]; + const minBinId = DEFAULT_ACTIVE_ID.sub(new BN(1)); + const maxBinId = DEFAULT_ACTIVE_ID.add(new BN(1)); - const rawTxs = await lbClmm.initializePositionAndAddLiquidityByWeight({ + const rawTxs = await lbClmm.initializePositionAndAddLiquidityByStrategy({ user: keypair.publicKey, positionPubKey: positionKeypair.publicKey, totalXAmount: btcInAmount, totalYAmount: usdcInAmount, - xYAmountDistribution, + strategy: { + strategyType: StrategyType.SpotBalanced, + minBinId: minBinId.toNumber(), + maxBinId: maxBinId.toNumber(), + }, }); if (Array.isArray(rawTxs)) { @@ -1705,28 +1701,9 @@ describe.only("SDK test", () => { const positionBinWithLiquidity = positionData.positionBinData.filter( (p) => p.positionLiquidity != "0" ); - expect(positionBinWithLiquidity.length).toBe(xYAmountDistribution.length); - - for (const [idx, binData] of positionBinWithLiquidity.entries()) { - const xYDist = xYAmountDistribution[idx]; - expect(binData.binId).toBe(xYDist.binId); - assertAmountWithPrecision( - +binData.binXAmount, - xYDist.xAmountBpsOfTotal - .mul(btcInAmount) - .div(new BN(BASIS_POINT_MAX)) - .toNumber(), - 15 - ); - assertAmountWithPrecision( - +binData.binYAmount, - xYDist.yAmountBpsOfTotal - .mul(usdcInAmount) - .div(new BN(BASIS_POINT_MAX)) - .toNumber(), - 15 - ); - } + expect(positionBinWithLiquidity.length).toBe( + maxBinId.sub(minBinId).add(new BN(1)).toNumber() + ); }); it("get user positions in pool", async () => {