From b1b39d356966f1ad0af27926581e0f9f8efc4bf9 Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 30 Nov 2024 04:36:16 +0100 Subject: [PATCH 01/18] Add base repositioning logic --- .gitignore | 1 + Cargo.toml | 3 +- examples/lp-bot/Cargo.toml | 14 ++++ examples/lp-bot/src/main.rs | 124 ++++++++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 examples/lp-bot/Cargo.toml create mode 100644 examples/lp-bot/src/main.rs diff --git a/.gitignore b/.gitignore index fe9c4620..0f89ceda 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ generated **/Cargo.lock .next .env +wallet.json diff --git a/Cargo.toml b/Cargo.toml index e32be758..8a8f1231 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,5 +6,6 @@ members = [ exclude = [ "rust-sdk", "ts-sdk", - "docs" + "docs", + "examples" ] diff --git a/examples/lp-bot/Cargo.toml b/examples/lp-bot/Cargo.toml new file mode 100644 index 00000000..ce918a34 --- /dev/null +++ b/examples/lp-bot/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "lp-bot" +version = "0.1.0" +edition = "2021" + +[dependencies] +orca_whirlpools = "0.4.0" +orca_whirlpools_client = "0.4.3" +orca_whirlpools_core = "0.4.3" +serde_json = "1.0.133" +solana-client = "1.18" +solana-sdk = "1.18" +spl-token-2022 = { version = "^3.0" } +tokio = "1.41.1" diff --git a/examples/lp-bot/src/main.rs b/examples/lp-bot/src/main.rs new file mode 100644 index 00000000..6c058a82 --- /dev/null +++ b/examples/lp-bot/src/main.rs @@ -0,0 +1,124 @@ +use orca_whirlpools::{ + close_position_instructions, open_position_instructions, set_funder, + set_whirlpools_config_address, IncreaseLiquidityParam, WhirlpoolsConfigInput, +}; +use orca_whirlpools_client::{get_position_address, Position, Whirlpool}; +use orca_whirlpools_core::{sqrt_price_to_price, tick_index_to_price}; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::message::{self, Message}; +use solana_sdk::program_pack::Pack; +use solana_sdk::pubkey::Pubkey; +use solana_sdk::transaction::Transaction; +use solana_sdk::{signature::Keypair, signer::Signer}; +use spl_token_2022::state::Mint; +use std::str::FromStr; +use std::{fs, vec}; + +#[tokio::main] +async fn main() { + set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet).unwrap(); + let rpc = RpcClient::new("https://api.mainnet-beta.solana.com".to_string()); + let wallet = load_wallet(); + set_funder(wallet.pubkey()).unwrap(); + + let position_mint_address = + Pubkey::from_str("").unwrap(); + + let (position_address, _) = get_position_address(&position_mint_address).unwrap(); + let position_account = rpc.get_account(&position_address).await.unwrap(); + let position: Position = Position::from_bytes(&position_account.data).unwrap(); + + let whirlpool_address = position.whirlpool; + let whirlpool_account = rpc.get_account(&whirlpool_address).await.unwrap(); + let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data).unwrap(); + + let token_mint_a_address = whirlpool.token_mint_a; + let token_mint_a_account = rpc.get_account(&token_mint_a_address).await.unwrap(); + let token_mint_a = Mint::unpack(&token_mint_a_account.data).unwrap(); + let decimals_a = token_mint_a.decimals; + + let token_mint_b_address = whirlpool.token_mint_b; + let token_mint_b_account = rpc.get_account(&token_mint_b_address).await.unwrap(); + let token_mint_b = Mint::unpack(&token_mint_b_account.data).unwrap(); + let decimals_b = token_mint_b.decimals; + + let current_price = sqrt_price_to_price(whirlpool.sqrt_price, decimals_a, decimals_b); + let position_lower_price = + tick_index_to_price(position.tick_lower_index, decimals_a, decimals_b); + let position_upper_price = + tick_index_to_price(position.tick_upper_index, decimals_a, decimals_b); + let position_center_price = (position_lower_price + position_upper_price) / 2.0; + + let threshold = 1.0; + let deviation = ((current_price - position_center_price).abs() / position_center_price) * 100.0; + println!("Current pool price: {:.6}", current_price); + println!("Position price range: [{:.6}, {:.6}]", position_lower_price, position_upper_price); + println!("Position center price: {:.6}", position_center_price); + println!("Threshold for repositioning: {:.2}%", threshold); + println!("Price deviation from center: {:.2}%", deviation); + + if deviation >= threshold { + println!("Deviation exceeds threshold. Closing position..."); + let close_position_instructions = + close_position_instructions(&rpc, position_mint_address, Some(100), None) + .await + .unwrap(); + let recent_blockhash = rpc.get_latest_blockhash().await.unwrap(); + let message = Message::new( + &close_position_instructions.instructions, + Some(&wallet.pubkey()), + ); + let transaction = Transaction::new(&vec![wallet.as_ref()], message, recent_blockhash); + let signature = rpc + .send_and_confirm_transaction(&transaction) + .await + .unwrap(); + println!("Close position transaction signature: {}", signature); + + let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; + let new_upper_price = current_price + (position_upper_price - position_lower_price) / 2.0; + println!("New position price range: [{:.6}, {:.6}]", new_lower_price, new_upper_price); + println!("Opening new position with adjusted range..."); + let increase_liquidity_param = + IncreaseLiquidityParam::Liquidity(close_position_instructions.quote.liquidity_delta); + let open_position_instructions = open_position_instructions( + &rpc, + whirlpool_address, + new_lower_price, + new_upper_price, + increase_liquidity_param, + Some(100), + None, + ) + .await + .unwrap(); + let recent_blockhash = rpc.get_latest_blockhash().await.unwrap(); + let message = Message::new( + &open_position_instructions.instructions, + Some(&wallet.pubkey()), + ); + let mut signers: Vec<&dyn Signer> = vec![wallet.as_ref()]; + signers.extend( + open_position_instructions + .additional_signers + .iter() + .map(|kp| kp as &dyn Signer), + ); + let transaction = Transaction::new(&signers, message, recent_blockhash); + let signature = rpc + .send_and_confirm_transaction(&transaction) + .await + .unwrap(); + println!("Open position transaction signature: {}", signature); + println!("New position mint address: {}", open_position_instructions.position_mint); + } else { + println!("Current price is within range. No repositioning needed."); + } +} + +fn load_wallet() -> Box { + let wallet_string = fs::read_to_string("wallet.json").unwrap(); + let keypair_bytes: Vec = serde_json::from_str(&wallet_string).unwrap(); + let wallet = Keypair::from_bytes(&keypair_bytes).unwrap(); + Box::new(wallet) +} From cdf95a7fe8e6f1919f40ef1e824e085c8c920357 Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 30 Nov 2024 05:09:38 +0100 Subject: [PATCH 02/18] Add clap for cli input. Add loop. --- examples/lp-bot/Cargo.toml | 1 + examples/lp-bot/src/main.rs | 188 +++++++++++++++++++++--------------- 2 files changed, 109 insertions(+), 80 deletions(-) diff --git a/examples/lp-bot/Cargo.toml b/examples/lp-bot/Cargo.toml index ce918a34..03249634 100644 --- a/examples/lp-bot/Cargo.toml +++ b/examples/lp-bot/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +clap = { version = "4.5.21", features = ["derive"] } orca_whirlpools = "0.4.0" orca_whirlpools_client = "0.4.3" orca_whirlpools_core = "0.4.3" diff --git a/examples/lp-bot/src/main.rs b/examples/lp-bot/src/main.rs index 6c058a82..4750d6ae 100644 --- a/examples/lp-bot/src/main.rs +++ b/examples/lp-bot/src/main.rs @@ -1,3 +1,4 @@ +use clap::Parser; use orca_whirlpools::{ close_position_instructions, open_position_instructions, set_funder, set_whirlpools_config_address, IncreaseLiquidityParam, WhirlpoolsConfigInput, @@ -13,106 +14,133 @@ use solana_sdk::{signature::Keypair, signer::Signer}; use spl_token_2022::state::Mint; use std::str::FromStr; use std::{fs, vec}; +use tokio::time::{sleep, Duration}; + +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +struct Args { + /// Position mint address + #[arg(short, long)] + position_mint_address: String, + + /// Threshold for repositioning (in percentage) + #[arg(short, long, default_value_t = 1.0)] + threshold: f64, + + /// Time interval for checking (in seconds) + #[arg(short, long, default_value_t = 60)] + interval: u64, +} #[tokio::main] async fn main() { + let args = Args::parse(); + set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet).unwrap(); let rpc = RpcClient::new("https://api.mainnet-beta.solana.com".to_string()); let wallet = load_wallet(); set_funder(wallet.pubkey()).unwrap(); - let position_mint_address = - Pubkey::from_str("").unwrap(); + let mut position_mint_address = Pubkey::from_str(&args.position_mint_address).unwrap(); + let threshold = args.threshold; + let interval = args.interval; + + println!("Position Mint Address: {}", position_mint_address); + println!("Threshold: {:.2}%", threshold); + println!("Interval: {} seconds", interval); - let (position_address, _) = get_position_address(&position_mint_address).unwrap(); - let position_account = rpc.get_account(&position_address).await.unwrap(); - let position: Position = Position::from_bytes(&position_account.data).unwrap(); + loop { + println!("Checking position..."); + let (position_address, _) = get_position_address(&position_mint_address).unwrap(); + let position_account = rpc.get_account(&position_address).await.unwrap(); + let position: Position = Position::from_bytes(&position_account.data).unwrap(); - let whirlpool_address = position.whirlpool; - let whirlpool_account = rpc.get_account(&whirlpool_address).await.unwrap(); - let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data).unwrap(); + let whirlpool_address = position.whirlpool; + let whirlpool_account = rpc.get_account(&whirlpool_address).await.unwrap(); + let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data).unwrap(); - let token_mint_a_address = whirlpool.token_mint_a; - let token_mint_a_account = rpc.get_account(&token_mint_a_address).await.unwrap(); - let token_mint_a = Mint::unpack(&token_mint_a_account.data).unwrap(); - let decimals_a = token_mint_a.decimals; + let token_mint_a_address = whirlpool.token_mint_a; + let token_mint_a_account = rpc.get_account(&token_mint_a_address).await.unwrap(); + let token_mint_a = Mint::unpack(&token_mint_a_account.data).unwrap(); + let decimals_a = token_mint_a.decimals; - let token_mint_b_address = whirlpool.token_mint_b; - let token_mint_b_account = rpc.get_account(&token_mint_b_address).await.unwrap(); - let token_mint_b = Mint::unpack(&token_mint_b_account.data).unwrap(); - let decimals_b = token_mint_b.decimals; + let token_mint_b_address = whirlpool.token_mint_b; + let token_mint_b_account = rpc.get_account(&token_mint_b_address).await.unwrap(); + let token_mint_b = Mint::unpack(&token_mint_b_account.data).unwrap(); + let decimals_b = token_mint_b.decimals; - let current_price = sqrt_price_to_price(whirlpool.sqrt_price, decimals_a, decimals_b); - let position_lower_price = - tick_index_to_price(position.tick_lower_index, decimals_a, decimals_b); - let position_upper_price = - tick_index_to_price(position.tick_upper_index, decimals_a, decimals_b); - let position_center_price = (position_lower_price + position_upper_price) / 2.0; + let current_price = sqrt_price_to_price(whirlpool.sqrt_price, decimals_a, decimals_b); + let position_lower_price = + tick_index_to_price(position.tick_lower_index, decimals_a, decimals_b); + let position_upper_price = + tick_index_to_price(position.tick_upper_index, decimals_a, decimals_b); + let position_center_price = (position_lower_price + position_upper_price) / 2.0; - let threshold = 1.0; - let deviation = ((current_price - position_center_price).abs() / position_center_price) * 100.0; - println!("Current pool price: {:.6}", current_price); - println!("Position price range: [{:.6}, {:.6}]", position_lower_price, position_upper_price); - println!("Position center price: {:.6}", position_center_price); - println!("Threshold for repositioning: {:.2}%", threshold); - println!("Price deviation from center: {:.2}%", deviation); + let deviation = ((current_price - position_center_price).abs() / position_center_price) * 100.0; + println!("Current pool price: {:.6}", current_price); + println!("Position price range: [{:.6}, {:.6}]", position_lower_price, position_upper_price); + println!("Position center price: {:.6}", position_center_price); + println!("Price deviation from center: {:.2}%", deviation); - if deviation >= threshold { - println!("Deviation exceeds threshold. Closing position..."); - let close_position_instructions = - close_position_instructions(&rpc, position_mint_address, Some(100), None) + if deviation >= threshold { + println!("Deviation exceeds threshold. Closing position..."); + let close_position_instructions = + close_position_instructions(&rpc, position_mint_address, Some(100), None) + .await + .unwrap(); + let recent_blockhash = rpc.get_latest_blockhash().await.unwrap(); + let message = Message::new( + &close_position_instructions.instructions, + Some(&wallet.pubkey()), + ); + let transaction = Transaction::new(&vec![wallet.as_ref()], message, recent_blockhash); + let signature = rpc + .send_and_confirm_transaction(&transaction) .await .unwrap(); - let recent_blockhash = rpc.get_latest_blockhash().await.unwrap(); - let message = Message::new( - &close_position_instructions.instructions, - Some(&wallet.pubkey()), - ); - let transaction = Transaction::new(&vec![wallet.as_ref()], message, recent_blockhash); - let signature = rpc - .send_and_confirm_transaction(&transaction) - .await - .unwrap(); - println!("Close position transaction signature: {}", signature); + println!("Close position transaction signature: {}", signature); - let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; - let new_upper_price = current_price + (position_upper_price - position_lower_price) / 2.0; - println!("New position price range: [{:.6}, {:.6}]", new_lower_price, new_upper_price); - println!("Opening new position with adjusted range..."); - let increase_liquidity_param = - IncreaseLiquidityParam::Liquidity(close_position_instructions.quote.liquidity_delta); - let open_position_instructions = open_position_instructions( - &rpc, - whirlpool_address, - new_lower_price, - new_upper_price, - increase_liquidity_param, - Some(100), - None, - ) - .await - .unwrap(); - let recent_blockhash = rpc.get_latest_blockhash().await.unwrap(); - let message = Message::new( - &open_position_instructions.instructions, - Some(&wallet.pubkey()), - ); - let mut signers: Vec<&dyn Signer> = vec![wallet.as_ref()]; - signers.extend( - open_position_instructions - .additional_signers - .iter() - .map(|kp| kp as &dyn Signer), - ); - let transaction = Transaction::new(&signers, message, recent_blockhash); - let signature = rpc - .send_and_confirm_transaction(&transaction) + let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; + let new_upper_price = current_price + (position_upper_price - position_lower_price) / 2.0; + println!("New position price range: [{:.6}, {:.6}]", new_lower_price, new_upper_price); + println!("Opening new position with adjusted range..."); + let increase_liquidity_param = + IncreaseLiquidityParam::Liquidity(close_position_instructions.quote.liquidity_delta); + let open_position_instructions = open_position_instructions( + &rpc, + whirlpool_address, + new_lower_price, + new_upper_price, + increase_liquidity_param, + Some(100), + None, + ) .await .unwrap(); - println!("Open position transaction signature: {}", signature); - println!("New position mint address: {}", open_position_instructions.position_mint); - } else { - println!("Current price is within range. No repositioning needed."); + let recent_blockhash = rpc.get_latest_blockhash().await.unwrap(); + let message = Message::new( + &open_position_instructions.instructions, + Some(&wallet.pubkey()), + ); + let mut signers: Vec<&dyn Signer> = vec![wallet.as_ref()]; + signers.extend( + open_position_instructions + .additional_signers + .iter() + .map(|kp| kp as &dyn Signer), + ); + let transaction = Transaction::new(&signers, message, recent_blockhash); + let signature = rpc + .send_and_confirm_transaction(&transaction) + .await + .unwrap(); + println!("Open position transaction signature: {}", signature); + println!("New position mint address: {}", open_position_instructions.position_mint); + position_mint_address = open_position_instructions.position_mint; + } else { + println!("Current price is within range. No repositioning needed."); + } + sleep(Duration::from_secs(interval)).await; } } From 5515f3e0bb2026213989311ef29a8b65b85abd46 Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 30 Nov 2024 05:27:17 +0100 Subject: [PATCH 03/18] Refactor --- examples/lp-bot/src/cli.rs | 18 +++ examples/lp-bot/src/main.rs | 152 +++--------------------- examples/lp-bot/src/position_manager.rs | 115 ++++++++++++++++++ examples/lp-bot/src/wallet.rs | 9 ++ 4 files changed, 157 insertions(+), 137 deletions(-) create mode 100644 examples/lp-bot/src/cli.rs create mode 100644 examples/lp-bot/src/position_manager.rs create mode 100644 examples/lp-bot/src/wallet.rs diff --git a/examples/lp-bot/src/cli.rs b/examples/lp-bot/src/cli.rs new file mode 100644 index 00000000..a41f1cec --- /dev/null +++ b/examples/lp-bot/src/cli.rs @@ -0,0 +1,18 @@ +use clap::Parser; + +/// CLI arguments structure +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +pub struct Args { + /// Position mint address + #[arg(short, long)] + pub position_mint_address: String, + + /// Threshold for repositioning (in percentage) + #[arg(short, long, default_value_t = 1.0)] + pub threshold: f64, + + /// Time interval for checking (in seconds) + #[arg(short, long, default_value_t = 60)] + pub interval: u64, +} diff --git a/examples/lp-bot/src/main.rs b/examples/lp-bot/src/main.rs index 4750d6ae..74016654 100644 --- a/examples/lp-bot/src/main.rs +++ b/examples/lp-bot/src/main.rs @@ -1,152 +1,30 @@ +mod cli; +mod position_manager; +mod wallet; + +use std::str::FromStr; + use clap::Parser; -use orca_whirlpools::{ - close_position_instructions, open_position_instructions, set_funder, - set_whirlpools_config_address, IncreaseLiquidityParam, WhirlpoolsConfigInput, -}; -use orca_whirlpools_client::{get_position_address, Position, Whirlpool}; -use orca_whirlpools_core::{sqrt_price_to_price, tick_index_to_price}; -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_sdk::message::{self, Message}; -use solana_sdk::program_pack::Pack; +use cli::Args; +use position_manager::run_position_manager; use solana_sdk::pubkey::Pubkey; -use solana_sdk::transaction::Transaction; -use solana_sdk::{signature::Keypair, signer::Signer}; -use spl_token_2022::state::Mint; -use std::str::FromStr; -use std::{fs, vec}; use tokio::time::{sleep, Duration}; -#[derive(Parser)] -#[command(author, version, about, long_about = None)] -struct Args { - /// Position mint address - #[arg(short, long)] - position_mint_address: String, - - /// Threshold for repositioning (in percentage) - #[arg(short, long, default_value_t = 1.0)] - threshold: f64, - - /// Time interval for checking (in seconds) - #[arg(short, long, default_value_t = 60)] - interval: u64, -} - #[tokio::main] async fn main() { let args = Args::parse(); - - set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet).unwrap(); - let rpc = RpcClient::new("https://api.mainnet-beta.solana.com".to_string()); - let wallet = load_wallet(); - set_funder(wallet.pubkey()).unwrap(); + let wallet = wallet::load_wallet(); let mut position_mint_address = Pubkey::from_str(&args.position_mint_address).unwrap(); - let threshold = args.threshold; - let interval = args.interval; - println!("Position Mint Address: {}", position_mint_address); - println!("Threshold: {:.2}%", threshold); - println!("Interval: {} seconds", interval); + println!("Position Mint Address: {}", args.position_mint_address); + println!("Threshold: {:.2}%", args.threshold); + println!("Interval: {} seconds", args.interval); loop { - println!("Checking position..."); - let (position_address, _) = get_position_address(&position_mint_address).unwrap(); - let position_account = rpc.get_account(&position_address).await.unwrap(); - let position: Position = Position::from_bytes(&position_account.data).unwrap(); - - let whirlpool_address = position.whirlpool; - let whirlpool_account = rpc.get_account(&whirlpool_address).await.unwrap(); - let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data).unwrap(); - - let token_mint_a_address = whirlpool.token_mint_a; - let token_mint_a_account = rpc.get_account(&token_mint_a_address).await.unwrap(); - let token_mint_a = Mint::unpack(&token_mint_a_account.data).unwrap(); - let decimals_a = token_mint_a.decimals; - - let token_mint_b_address = whirlpool.token_mint_b; - let token_mint_b_account = rpc.get_account(&token_mint_b_address).await.unwrap(); - let token_mint_b = Mint::unpack(&token_mint_b_account.data).unwrap(); - let decimals_b = token_mint_b.decimals; - - let current_price = sqrt_price_to_price(whirlpool.sqrt_price, decimals_a, decimals_b); - let position_lower_price = - tick_index_to_price(position.tick_lower_index, decimals_a, decimals_b); - let position_upper_price = - tick_index_to_price(position.tick_upper_index, decimals_a, decimals_b); - let position_center_price = (position_lower_price + position_upper_price) / 2.0; - - let deviation = ((current_price - position_center_price).abs() / position_center_price) * 100.0; - println!("Current pool price: {:.6}", current_price); - println!("Position price range: [{:.6}, {:.6}]", position_lower_price, position_upper_price); - println!("Position center price: {:.6}", position_center_price); - println!("Price deviation from center: {:.2}%", deviation); - - if deviation >= threshold { - println!("Deviation exceeds threshold. Closing position..."); - let close_position_instructions = - close_position_instructions(&rpc, position_mint_address, Some(100), None) - .await - .unwrap(); - let recent_blockhash = rpc.get_latest_blockhash().await.unwrap(); - let message = Message::new( - &close_position_instructions.instructions, - Some(&wallet.pubkey()), - ); - let transaction = Transaction::new(&vec![wallet.as_ref()], message, recent_blockhash); - let signature = rpc - .send_and_confirm_transaction(&transaction) - .await - .unwrap(); - println!("Close position transaction signature: {}", signature); - - let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; - let new_upper_price = current_price + (position_upper_price - position_lower_price) / 2.0; - println!("New position price range: [{:.6}, {:.6}]", new_lower_price, new_upper_price); - println!("Opening new position with adjusted range..."); - let increase_liquidity_param = - IncreaseLiquidityParam::Liquidity(close_position_instructions.quote.liquidity_delta); - let open_position_instructions = open_position_instructions( - &rpc, - whirlpool_address, - new_lower_price, - new_upper_price, - increase_liquidity_param, - Some(100), - None, - ) - .await - .unwrap(); - let recent_blockhash = rpc.get_latest_blockhash().await.unwrap(); - let message = Message::new( - &open_position_instructions.instructions, - Some(&wallet.pubkey()), - ); - let mut signers: Vec<&dyn Signer> = vec![wallet.as_ref()]; - signers.extend( - open_position_instructions - .additional_signers - .iter() - .map(|kp| kp as &dyn Signer), - ); - let transaction = Transaction::new(&signers, message, recent_blockhash); - let signature = rpc - .send_and_confirm_transaction(&transaction) - .await - .unwrap(); - println!("Open position transaction signature: {}", signature); - println!("New position mint address: {}", open_position_instructions.position_mint); - position_mint_address = open_position_instructions.position_mint; - } else { - println!("Current price is within range. No repositioning needed."); + if let Err(err) = run_position_manager(&args, &wallet, &mut position_mint_address).await { + eprintln!("Error: {}", err); } - sleep(Duration::from_secs(interval)).await; + sleep(Duration::from_secs(args.interval)).await; } } - -fn load_wallet() -> Box { - let wallet_string = fs::read_to_string("wallet.json").unwrap(); - let keypair_bytes: Vec = serde_json::from_str(&wallet_string).unwrap(); - let wallet = Keypair::from_bytes(&keypair_bytes).unwrap(); - Box::new(wallet) -} diff --git a/examples/lp-bot/src/position_manager.rs b/examples/lp-bot/src/position_manager.rs new file mode 100644 index 00000000..868b19ed --- /dev/null +++ b/examples/lp-bot/src/position_manager.rs @@ -0,0 +1,115 @@ +use crate::cli::Args; +use orca_whirlpools::{ + close_position_instructions, open_position_instructions, set_funder, + set_whirlpools_config_address, IncreaseLiquidityParam, WhirlpoolsConfigInput, +}; +use orca_whirlpools_client::{get_position_address, Position, Whirlpool}; +use orca_whirlpools_core::{sqrt_price_to_price, tick_index_to_price}; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::{ + message::Message, program_pack::Pack, pubkey::Pubkey, signer::Signer, transaction::Transaction, +}; +use spl_token_2022::state::Mint; + +pub async fn run_position_manager( + args: &Args, + wallet: &Box, + position_mint_address: &mut Pubkey, +) -> Result<(), Box> { + set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet).unwrap(); + let rpc = RpcClient::new("https://api.mainnet-beta.solana.com".to_string()); + set_funder(wallet.pubkey()).unwrap(); + + println!("Checking position..."); + let (position_address, _) = get_position_address(&position_mint_address).unwrap(); + let position_account = rpc.get_account(&position_address).await.unwrap(); + let position: Position = Position::from_bytes(&position_account.data).unwrap(); + + let whirlpool_address = position.whirlpool; + let whirlpool_account = rpc.get_account(&whirlpool_address).await.unwrap(); + let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data).unwrap(); + + let token_mint_a_account = rpc.get_account(&whirlpool.token_mint_a).await.unwrap(); + let token_mint_b_account = rpc.get_account(&whirlpool.token_mint_b).await.unwrap(); + let token_mint_a = Mint::unpack(&token_mint_a_account.data).unwrap(); + let token_mint_b = Mint::unpack(&token_mint_b_account.data).unwrap(); + + let current_price = sqrt_price_to_price( + whirlpool.sqrt_price, + token_mint_a.decimals, + token_mint_b.decimals, + ); + let position_lower_price = tick_index_to_price( + position.tick_lower_index, + token_mint_a.decimals, + token_mint_b.decimals, + ); + let position_upper_price = tick_index_to_price( + position.tick_upper_index, + token_mint_a.decimals, + token_mint_b.decimals, + ); + let position_center_price = (position_lower_price + position_upper_price) / 2.0; + + let deviation = ((current_price - position_center_price).abs() / position_center_price) * 100.0; + println!("Current pool price: {:.6}", current_price); + println!( + "Position price range: [{:.6}, {:.6}]", + position_lower_price, position_upper_price + ); + println!("Position center price: {:.6}", position_center_price); + println!("Price deviation from center: {:.2}%", deviation); + + if deviation >= args.threshold { + println!("Deviation exceeds threshold. Closing position..."); + let close_position_instructions = + close_position_instructions(&rpc, *position_mint_address, Some(100), None).await?; + let recent_blockhash = rpc.get_latest_blockhash().await?; + let message = Message::new( + &close_position_instructions.instructions, + Some(&wallet.pubkey()), + ); + let transaction = Transaction::new(&vec![wallet.as_ref()], message, recent_blockhash); + let signature = rpc.send_and_confirm_transaction(&transaction).await?; + println!("Close position transaction signature: {}", signature); + + let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; + let new_upper_price = current_price + (position_upper_price - position_lower_price) / 2.0; + println!("Opening new position with adjusted range..."); + let increase_liquidity_param = + IncreaseLiquidityParam::Liquidity(close_position_instructions.quote.liquidity_delta); + let open_position_instructions = open_position_instructions( + &rpc, + whirlpool_address, + new_lower_price, + new_upper_price, + increase_liquidity_param, + Some(100), + None, + ) + .await?; + let recent_blockhash = rpc.get_latest_blockhash().await?; + let message = Message::new( + &open_position_instructions.instructions, + Some(&wallet.pubkey()), + ); + let mut signers: Vec<&dyn Signer> = vec![wallet.as_ref()]; + signers.extend( + open_position_instructions + .additional_signers + .iter() + .map(|kp| kp as &dyn Signer), + ); + let transaction = Transaction::new(&signers, message, recent_blockhash); + let signature = rpc.send_and_confirm_transaction(&transaction).await?; + println!("Open position transaction signature: {}", signature); + println!( + "New position mint address: {}", + open_position_instructions.position_mint + ); + *position_mint_address = open_position_instructions.position_mint; + } else { + println!("Current price is within range. No repositioning needed."); + } + Ok(()) +} \ No newline at end of file diff --git a/examples/lp-bot/src/wallet.rs b/examples/lp-bot/src/wallet.rs new file mode 100644 index 00000000..e43ee8f6 --- /dev/null +++ b/examples/lp-bot/src/wallet.rs @@ -0,0 +1,9 @@ +use solana_sdk::{signature::Keypair, signer::Signer}; +use std::fs; + +pub fn load_wallet() -> Box { + let wallet_string = fs::read_to_string("wallet.json").unwrap(); + let keypair_bytes: Vec = serde_json::from_str(&wallet_string).unwrap(); + let wallet = Keypair::from_bytes(&keypair_bytes).unwrap(); + Box::new(wallet) +} From 0953218d167df4d9441c351aa1f11de1ecf07b4d Mon Sep 17 00:00:00 2001 From: calintje Date: Mon, 2 Dec 2024 04:17:12 +0100 Subject: [PATCH 04/18] Refactor --- examples/lp-bot/src/main.rs | 1 + examples/lp-bot/src/position_manager.rs | 59 +++++++++++-------------- examples/lp-bot/src/utils.rs | 50 +++++++++++++++++++++ 3 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 examples/lp-bot/src/utils.rs diff --git a/examples/lp-bot/src/main.rs b/examples/lp-bot/src/main.rs index 74016654..d49a8fb9 100644 --- a/examples/lp-bot/src/main.rs +++ b/examples/lp-bot/src/main.rs @@ -1,5 +1,6 @@ mod cli; mod position_manager; +mod utils; mod wallet; use std::str::FromStr; diff --git a/examples/lp-bot/src/position_manager.rs b/examples/lp-bot/src/position_manager.rs index 868b19ed..0a899924 100644 --- a/examples/lp-bot/src/position_manager.rs +++ b/examples/lp-bot/src/position_manager.rs @@ -1,15 +1,15 @@ -use crate::cli::Args; +use crate::{ + cli::Args, + utils::{fetch_mint, fetch_position, fetch_whirlpool, send_transaction}, +}; use orca_whirlpools::{ close_position_instructions, open_position_instructions, set_funder, set_whirlpools_config_address, IncreaseLiquidityParam, WhirlpoolsConfigInput, }; -use orca_whirlpools_client::{get_position_address, Position, Whirlpool}; +use orca_whirlpools_client::get_position_address; use orca_whirlpools_core::{sqrt_price_to_price, tick_index_to_price}; use solana_client::nonblocking::rpc_client::RpcClient; -use solana_sdk::{ - message::Message, program_pack::Pack, pubkey::Pubkey, signer::Signer, transaction::Transaction, -}; -use spl_token_2022::state::Mint; +use solana_sdk::{pubkey::Pubkey, signer::Signer}; pub async fn run_position_manager( args: &Args, @@ -22,17 +22,13 @@ pub async fn run_position_manager( println!("Checking position..."); let (position_address, _) = get_position_address(&position_mint_address).unwrap(); - let position_account = rpc.get_account(&position_address).await.unwrap(); - let position: Position = Position::from_bytes(&position_account.data).unwrap(); + let position = fetch_position(&rpc, &position_address).await?; let whirlpool_address = position.whirlpool; - let whirlpool_account = rpc.get_account(&whirlpool_address).await.unwrap(); - let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data).unwrap(); + let whirlpool = fetch_whirlpool(&rpc, &whirlpool_address).await?; - let token_mint_a_account = rpc.get_account(&whirlpool.token_mint_a).await.unwrap(); - let token_mint_b_account = rpc.get_account(&whirlpool.token_mint_b).await.unwrap(); - let token_mint_a = Mint::unpack(&token_mint_a_account.data).unwrap(); - let token_mint_b = Mint::unpack(&token_mint_b_account.data).unwrap(); + let token_mint_a = fetch_mint(&rpc, &whirlpool.token_mint_a).await?; + let token_mint_b = fetch_mint(&rpc, &whirlpool.token_mint_b).await?; let current_price = sqrt_price_to_price( whirlpool.sqrt_price, @@ -64,13 +60,13 @@ pub async fn run_position_manager( println!("Deviation exceeds threshold. Closing position..."); let close_position_instructions = close_position_instructions(&rpc, *position_mint_address, Some(100), None).await?; - let recent_blockhash = rpc.get_latest_blockhash().await?; - let message = Message::new( - &close_position_instructions.instructions, - Some(&wallet.pubkey()), - ); - let transaction = Transaction::new(&vec![wallet.as_ref()], message, recent_blockhash); - let signature = rpc.send_and_confirm_transaction(&transaction).await?; + let signature = send_transaction( + &rpc, + wallet.as_ref(), + close_position_instructions.instructions, + vec![], + ) + .await?; println!("Close position transaction signature: {}", signature); let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; @@ -88,20 +84,17 @@ pub async fn run_position_manager( None, ) .await?; - let recent_blockhash = rpc.get_latest_blockhash().await?; - let message = Message::new( - &open_position_instructions.instructions, - Some(&wallet.pubkey()), - ); - let mut signers: Vec<&dyn Signer> = vec![wallet.as_ref()]; - signers.extend( + let signature = send_transaction( + &rpc, + wallet.as_ref(), + open_position_instructions.instructions, open_position_instructions .additional_signers .iter() - .map(|kp| kp as &dyn Signer), - ); - let transaction = Transaction::new(&signers, message, recent_blockhash); - let signature = rpc.send_and_confirm_transaction(&transaction).await?; + .map(|kp| kp as &dyn Signer) + .collect(), + ) + .await?; println!("Open position transaction signature: {}", signature); println!( "New position mint address: {}", @@ -112,4 +105,4 @@ pub async fn run_position_manager( println!("Current price is within range. No repositioning needed."); } Ok(()) -} \ No newline at end of file +} diff --git a/examples/lp-bot/src/utils.rs b/examples/lp-bot/src/utils.rs new file mode 100644 index 00000000..57972a51 --- /dev/null +++ b/examples/lp-bot/src/utils.rs @@ -0,0 +1,50 @@ +use orca_whirlpools_client::{Position, Whirlpool}; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::{ + message::Message, program_pack::Pack, pubkey::Pubkey, signature::Signature, signer::Signer, + transaction::Transaction, +}; +use spl_token_2022::state::Mint; + +pub async fn fetch_position( + rpc: &RpcClient, + position_address: &Pubkey, +) -> Result> { + let position_account = rpc.get_account(position_address).await?; + let position = Position::from_bytes(&position_account.data)?; + Ok(position) +} + +pub async fn fetch_whirlpool( + rpc: &RpcClient, + whirlpool_address: &Pubkey, +) -> Result> { + let whirlpool_account = rpc.get_account(whirlpool_address).await?; + let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data)?; + Ok(whirlpool) +} + +pub async fn fetch_mint( + rpc: &RpcClient, + mint_address: &Pubkey, +) -> Result> { + let mint_account = rpc.get_account(mint_address).await?; + let mint = Mint::unpack(&mint_account.data)?; + Ok(mint) +} + +pub async fn send_transaction( + rpc: &RpcClient, + wallet: &dyn Signer, + instructions: Vec, + additional_signers: Vec<&dyn Signer>, +) -> Result> { + let recent_blockhash = rpc.get_latest_blockhash().await?; + let message = Message::new(&instructions, Some(&wallet.pubkey())); + let mut all_signers = vec![wallet]; + all_signers.extend(additional_signers); + + let transaction = Transaction::new(&all_signers, message, recent_blockhash); + let signature = rpc.send_and_confirm_transaction(&transaction).await?; + Ok(signature) +} From e8f27ec1723ce98310446c1c0bd8d48140a4b16a Mon Sep 17 00:00:00 2001 From: calintje Date: Wed, 4 Dec 2024 05:19:53 +0100 Subject: [PATCH 05/18] Add README. Add RPC URL as const to main.rs. Add directory for rust-sdk. Make atomic transaction for close and open position instructions. Add utility functions for priority fee and client-side retry. Work in progress: dislapying wallet balances. --- examples/lp-bot/src/cli.rs | 18 -- examples/lp-bot/src/utils.rs | 50 ---- examples/{ => rust-sdk}/lp-bot/Cargo.toml | 0 examples/rust-sdk/lp-bot/README.md | 106 +++++++ examples/rust-sdk/lp-bot/src/cli.rs | 52 ++++ examples/{ => rust-sdk}/lp-bot/src/main.rs | 18 +- .../lp-bot/src/position_manager.rs | 48 +-- examples/rust-sdk/lp-bot/src/utils.rs | 277 ++++++++++++++++++ examples/{ => rust-sdk}/lp-bot/src/wallet.rs | 0 9 files changed, 479 insertions(+), 90 deletions(-) delete mode 100644 examples/lp-bot/src/cli.rs delete mode 100644 examples/lp-bot/src/utils.rs rename examples/{ => rust-sdk}/lp-bot/Cargo.toml (100%) create mode 100644 examples/rust-sdk/lp-bot/README.md create mode 100644 examples/rust-sdk/lp-bot/src/cli.rs rename examples/{ => rust-sdk}/lp-bot/src/main.rs (53%) rename examples/{ => rust-sdk}/lp-bot/src/position_manager.rs (80%) create mode 100644 examples/rust-sdk/lp-bot/src/utils.rs rename examples/{ => rust-sdk}/lp-bot/src/wallet.rs (100%) diff --git a/examples/lp-bot/src/cli.rs b/examples/lp-bot/src/cli.rs deleted file mode 100644 index a41f1cec..00000000 --- a/examples/lp-bot/src/cli.rs +++ /dev/null @@ -1,18 +0,0 @@ -use clap::Parser; - -/// CLI arguments structure -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -pub struct Args { - /// Position mint address - #[arg(short, long)] - pub position_mint_address: String, - - /// Threshold for repositioning (in percentage) - #[arg(short, long, default_value_t = 1.0)] - pub threshold: f64, - - /// Time interval for checking (in seconds) - #[arg(short, long, default_value_t = 60)] - pub interval: u64, -} diff --git a/examples/lp-bot/src/utils.rs b/examples/lp-bot/src/utils.rs deleted file mode 100644 index 57972a51..00000000 --- a/examples/lp-bot/src/utils.rs +++ /dev/null @@ -1,50 +0,0 @@ -use orca_whirlpools_client::{Position, Whirlpool}; -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_sdk::{ - message::Message, program_pack::Pack, pubkey::Pubkey, signature::Signature, signer::Signer, - transaction::Transaction, -}; -use spl_token_2022::state::Mint; - -pub async fn fetch_position( - rpc: &RpcClient, - position_address: &Pubkey, -) -> Result> { - let position_account = rpc.get_account(position_address).await?; - let position = Position::from_bytes(&position_account.data)?; - Ok(position) -} - -pub async fn fetch_whirlpool( - rpc: &RpcClient, - whirlpool_address: &Pubkey, -) -> Result> { - let whirlpool_account = rpc.get_account(whirlpool_address).await?; - let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data)?; - Ok(whirlpool) -} - -pub async fn fetch_mint( - rpc: &RpcClient, - mint_address: &Pubkey, -) -> Result> { - let mint_account = rpc.get_account(mint_address).await?; - let mint = Mint::unpack(&mint_account.data)?; - Ok(mint) -} - -pub async fn send_transaction( - rpc: &RpcClient, - wallet: &dyn Signer, - instructions: Vec, - additional_signers: Vec<&dyn Signer>, -) -> Result> { - let recent_blockhash = rpc.get_latest_blockhash().await?; - let message = Message::new(&instructions, Some(&wallet.pubkey())); - let mut all_signers = vec![wallet]; - all_signers.extend(additional_signers); - - let transaction = Transaction::new(&all_signers, message, recent_blockhash); - let signature = rpc.send_and_confirm_transaction(&transaction).await?; - Ok(signature) -} diff --git a/examples/lp-bot/Cargo.toml b/examples/rust-sdk/lp-bot/Cargo.toml similarity index 100% rename from examples/lp-bot/Cargo.toml rename to examples/rust-sdk/lp-bot/Cargo.toml diff --git a/examples/rust-sdk/lp-bot/README.md b/examples/rust-sdk/lp-bot/README.md new file mode 100644 index 00000000..893de3c1 --- /dev/null +++ b/examples/rust-sdk/lp-bot/README.md @@ -0,0 +1,106 @@ +# LP Bot - position rebalance +A Rust-based CLI bot for interacting with the Orca Whirlpools program on Solana. This bot monitors and rebalances a liquidity position by closing and reopening positions when price deviations exceed a user-defined threshold. + +--- + +## Features +- **Automated Position Monitoring**: Monitors price deviation of a liquidity position on Orca Whirlpool by calculating the center of the position's price range and comparing it to the current pool price. If the deviation exceeds the specified threshold (in percentage), the bot initiates rebalancing. +- **Automated Rebalancing**: Closes and reopens liquidity positions by centering the new position around the current pool price, maintaining the same width (distance between the lower and upper price bounds) as the initial position. +- **Customizable Priority Fees**: Integrates compute budget priority fees to enhance transaction speed and landing, with options ranging from `none` to `turbo` for different levels of prioritization. + +--- + +## Prerequisites +1. **Solana Wallet**: + - Place a `wallet.json` file in the working directory with the keypair that owns the positions. + - Ensure the wallet has sufficient funds for transactions. +2. **Existing Position**: + - You must have an active position on Orca Whirlpools. You can open a position using our SDKs or through our UI at https://www.orca.so/pools. +3. **Rust**: + - Install Rust using [rustup](https://rustup.rs/). + +--- + +## Installation +1. Clone this repository: + ```bash + git clone https://github.com/orca-so/whirlpools.git + cd examples/rust-sdk/lp-bot + ``` +2. Build the bot: + ```bash + cargo build --release + ``` +3. The executable will be located in target/release/lp-bot + +--- + +## RPC Configuration +The bot connects to Solana Mainnet Beta by default using: + +```rust +const RPC_URL: &str = "https://api.mainnet-beta.solana.com"; +``` + +To modify this, update the RPC_URL constant in main.rs. + +--- + +## Usage +Run the bot with the following arguments +```bash +./target/release/lp-bot \ + --position-mint-address \ + --threshold \ + --interval \ + --priority-fee-tier +``` + +### Arguments +- `--position-mint-address` (required): The mint address of the position to monitor and rebalance. +- `--threshold` (optional): The percentage deviation from the center price at which rebalancing is triggered. Default: 1.0. +- `--interval` (optional): The time interval (in seconds) between checks. Default: 60. +- `--priority-fee-tier` (optional): The priority fee tier for transaction processing. Options: + - `none`: No priority fee. + - `low`: Lower 25th quartile prioritization fee. + - `medium`: Median prioritization fee (default). + - `high`: Upper 75th quartile prioritization fee. + - `turbo`: Upper 95th quartile prioritization fee. + +### Example Usage +Monitor and rebalance with default settings: +```bash +./target/release/lp-bot \ + --position-mint-address 5m1izNWC3ioBaKm63e3gSNFeZ44o13ncre5QknTXBJUS +``` + +Monitor with custom threshold and interval: +```bash +./target/release/lp-bot \ + --position-mint-address 5m1izNWC3ioBaKm63e3gSNFeZ44o13ncre5QknTXBJUS \ + --threshold 0.5 \ + --interval 30 +``` + +Monitor with turbo priority fees: +```bash +./target/release/lp-bot \ + --position-mint-address 5m1izNWC3ioBaKm63e3gSNFeZ44o13ncre5QknTXBJUS \ + --priority-fee-tier turbo +``` + +--- + +## Directory Structure + +```bash +examples/ +├── rust-sdk/ + └── lp-bot/ + └── src/ + ├── main.rs # Entry point + ├── cli.rs # CLI argument parsing + ├── wallet.rs # Wallet management + ├── position_manager.rs # Position monitoring and rebalancing + ├── solana_utils.rs # RPC utilities +``` \ No newline at end of file diff --git a/examples/rust-sdk/lp-bot/src/cli.rs b/examples/rust-sdk/lp-bot/src/cli.rs new file mode 100644 index 00000000..2cd9ca11 --- /dev/null +++ b/examples/rust-sdk/lp-bot/src/cli.rs @@ -0,0 +1,52 @@ +use clap::Parser; + +use crate::utils::PriorityFeeTier; + +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +pub struct Args { + #[arg( + short = 'p', + long, + help = "The position mint address to monitor and rebalance." + )] + pub position_mint_address: String, + + #[arg( + short = 't', + long, + default_value_t = 1.0, + help = "Threshold for repositioning in percentage.\n" + )] + pub threshold: f64, + + #[arg( + short = 'i', + long, + default_value_t = 60, + help = "Time interval for checking in seconds.\n" + )] + pub interval: u64, + + #[arg( + short = 'f', + long, + value_enum, + default_value_t = PriorityFeeTier::Medium, + help = "Priority fee tier for transaction processing based on recently paid priority fees. Options:\n \ + - `none`: No priority fee\n \ + - `low`: Lower 25th quartile prioritization fee\n \ + - `medium`: Median prioritization fee\n \ + - `high`: Upper 75th quartile prioritization fee\n \ + - `turbo`: Upper 95th quartile prioritization fee\n" + )] + pub priority_fee_tier: PriorityFeeTier, + + #[arg( + short = 'm', + long, + default_value_t = 10_000_000, + help = "Maximum total priority fee in lamports.\n" + )] + pub max_priority_fee_lamports: u64, +} diff --git a/examples/lp-bot/src/main.rs b/examples/rust-sdk/lp-bot/src/main.rs similarity index 53% rename from examples/lp-bot/src/main.rs rename to examples/rust-sdk/lp-bot/src/main.rs index d49a8fb9..571d2f2c 100644 --- a/examples/lp-bot/src/main.rs +++ b/examples/rust-sdk/lp-bot/src/main.rs @@ -11,6 +11,9 @@ use position_manager::run_position_manager; use solana_sdk::pubkey::Pubkey; use tokio::time::{sleep, Duration}; +pub const RPC_URL: &str = + "https://mainnet.helius-rpc.com/?api-key=e1bbe936-f564-4d9a-ae4e-a69e6f99e9b1"; + #[tokio::main] async fn main() { let args = Args::parse(); @@ -18,9 +21,18 @@ async fn main() { let mut position_mint_address = Pubkey::from_str(&args.position_mint_address).unwrap(); - println!("Position Mint Address: {}", args.position_mint_address); - println!("Threshold: {:.2}%", args.threshold); - println!("Interval: {} seconds", args.interval); + println!( + "\n\ + ====================\n\ + 🌀 Whirlpool LP BOT \n\ + ====================\n" + ); + println!("Configuration:"); + println!( + " Position Mint Address: {}\n Threshold: {:.2}%\n Interval: {} seconds\n Priority Fee Tier: {:?}\n", + args.position_mint_address, args.threshold, args.interval, args.priority_fee_tier + ); + println!("-------------------------------------\n"); loop { if let Err(err) = run_position_manager(&args, &wallet, &mut position_mint_address).await { diff --git a/examples/lp-bot/src/position_manager.rs b/examples/rust-sdk/lp-bot/src/position_manager.rs similarity index 80% rename from examples/lp-bot/src/position_manager.rs rename to examples/rust-sdk/lp-bot/src/position_manager.rs index 0a899924..7f1470b8 100644 --- a/examples/lp-bot/src/position_manager.rs +++ b/examples/rust-sdk/lp-bot/src/position_manager.rs @@ -1,6 +1,7 @@ use crate::{ cli::Args, utils::{fetch_mint, fetch_position, fetch_whirlpool, send_transaction}, + RPC_URL, }; use orca_whirlpools::{ close_position_instructions, open_position_instructions, set_funder, @@ -17,7 +18,7 @@ pub async fn run_position_manager( position_mint_address: &mut Pubkey, ) -> Result<(), Box> { set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet).unwrap(); - let rpc = RpcClient::new("https://api.mainnet-beta.solana.com".to_string()); + let rpc = RpcClient::new(RPC_URL.to_string()); set_funder(wallet.pubkey()).unwrap(); println!("Checking position..."); @@ -27,6 +28,10 @@ pub async fn run_position_manager( let whirlpool_address = position.whirlpool; let whirlpool = fetch_whirlpool(&rpc, &whirlpool_address).await?; + // let token_a_pubkey = whirlpool.token_mint_a; + // let token_b_pubkey = whirlpool.token_mint_b; + // display_wallet_balances(&rpc, &token_a_pubkey, &token_b_pubkey).await?; + let token_mint_a = fetch_mint(&rpc, &whirlpool.token_mint_a).await?; let token_mint_b = fetch_mint(&rpc, &whirlpool.token_mint_b).await?; @@ -57,21 +62,14 @@ pub async fn run_position_manager( println!("Price deviation from center: {:.2}%", deviation); if deviation >= args.threshold { - println!("Deviation exceeds threshold. Closing position..."); + println!("Deviation exceeds threshold. Rebalancing position..."); + let close_position_instructions = close_position_instructions(&rpc, *position_mint_address, Some(100), None).await?; - let signature = send_transaction( - &rpc, - wallet.as_ref(), - close_position_instructions.instructions, - vec![], - ) - .await?; - println!("Close position transaction signature: {}", signature); let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; let new_upper_price = current_price + (position_upper_price - position_lower_price) / 2.0; - println!("Opening new position with adjusted range..."); + let increase_liquidity_param = IncreaseLiquidityParam::Liquidity(close_position_instructions.quote.liquidity_delta); let open_position_instructions = open_position_instructions( @@ -84,23 +82,35 @@ pub async fn run_position_manager( None, ) .await?; - let signature = send_transaction( - &rpc, - wallet.as_ref(), - open_position_instructions.instructions, + + let mut all_instructions = vec![]; + all_instructions.extend(close_position_instructions.instructions); + all_instructions.extend(open_position_instructions.instructions); + + let mut signers: Vec<&dyn Signer> = vec![wallet.as_ref()]; + signers.extend( open_position_instructions .additional_signers .iter() - .map(|kp| kp as &dyn Signer) - .collect(), + .map(|kp| kp as &dyn Signer), + ); + + let signature = send_transaction( + &rpc, + wallet.as_ref(), + all_instructions, + signers, + args.priority_fee_tier, + args.max_priority_fee_lamports, ) .await?; - println!("Open position transaction signature: {}", signature); + println!("Rebalancing transaction signature: {}", signature); + + *position_mint_address = open_position_instructions.position_mint; println!( "New position mint address: {}", open_position_instructions.position_mint ); - *position_mint_address = open_position_instructions.position_mint; } else { println!("Current price is within range. No repositioning needed."); } diff --git a/examples/rust-sdk/lp-bot/src/utils.rs b/examples/rust-sdk/lp-bot/src/utils.rs new file mode 100644 index 00000000..b75a71f9 --- /dev/null +++ b/examples/rust-sdk/lp-bot/src/utils.rs @@ -0,0 +1,277 @@ +use clap::ValueEnum; +use orca_whirlpools_client::{Position, Whirlpool}; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::compute_budget::ComputeBudgetInstruction; +use solana_sdk::{ + message::Message, program_pack::Pack, pubkey::Pubkey, signature::Signature, signer::Signer, + transaction::Transaction, +}; +use spl_token_2022::state::Mint; +use std::future::Future; +use tokio::time::sleep; +use tokio::time::Duration; + +const MAX_RETRIES: usize = 3; +const INITIAL_RETRY_DELAY: Duration = Duration::from_millis(100); + +// pub async fn display_wallet_balances( +// rpc: &RpcClient, +// token_a_address: &Pubkey, +// token_b_address: &Pubkey, +// ) -> Result<(), Box> { +// let token_a_balance = fetch_token_balance(rpc, token_a_address).await?; +// let token_b_balance = fetch_token_balance(rpc, token_b_address).await?; + +// println!( +// "Wallet Balances: \n\ +// - Token A ({:?}): {} \n\ +// - Token B ({:?}): {}", +// token_a_address, token_a_balance, token_b_address, token_b_balance +// ); + +// Ok(()) +// } + +// async fn fetch_token_balance( +// rpc: &RpcClient, +// token_address: &Pubkey, +// ) -> Result> { +// retry_async( +// || async { +// let balance = rpc.get_token_account_balance(token_address).await?; +// Ok(balance.ui_amount_string) +// }, +// MAX_RETRIES, +// INITIAL_RETRY_DELAY, +// "fetch token balance", +// ) +// .await +// } + +pub async fn fetch_position( + rpc: &RpcClient, + position_address: &Pubkey, +) -> Result> { + retry_async( + || async { + let position_account = rpc.get_account(position_address).await?; + let position = Position::from_bytes(&position_account.data)?; + Ok(position) + }, + MAX_RETRIES, + INITIAL_RETRY_DELAY, + "fetch position", + ) + .await +} + +pub async fn fetch_whirlpool( + rpc: &RpcClient, + whirlpool_address: &Pubkey, +) -> Result> { + retry_async( + || async { + let whirlpool_account = rpc.get_account(whirlpool_address).await?; + let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data)?; + Ok(whirlpool) + }, + MAX_RETRIES, + INITIAL_RETRY_DELAY, + "fetch whirlpool", + ) + .await +} + +pub async fn fetch_mint( + rpc: &RpcClient, + mint_address: &Pubkey, +) -> Result> { + retry_async( + || async { + let mint_account = rpc.get_account(mint_address).await?; + let mint = Mint::unpack(&mint_account.data)?; + Ok(mint) + }, + MAX_RETRIES, + INITIAL_RETRY_DELAY, + "fetch mint", + ) + .await +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] +pub enum PriorityFeeTier { + None, + Low, + Medium, + High, + Turbo, +} + +pub async fn send_transaction( + rpc: &RpcClient, + wallet: &dyn Signer, + instructions: Vec, + additional_signers: Vec<&dyn Signer>, + tier: PriorityFeeTier, + max_priority_fee: u64, +) -> Result> { + retry_async( + || async { + let mut all_instructions = vec![]; + + if let Some(priority_fee_instruction) = get_priority_fee_instruction( + rpc, + &instructions, + wallet, + &additional_signers, + tier, + max_priority_fee, + ) + .await? + { + all_instructions.push(priority_fee_instruction); + } + + all_instructions.extend(instructions.clone()); + + let recent_blockhash = rpc.get_latest_blockhash().await?; + let message = Message::new(&all_instructions, Some(&wallet.pubkey())); + let mut all_signers = vec![wallet]; + all_signers.extend(additional_signers.clone()); + + let transaction = Transaction::new(&all_signers, message, recent_blockhash); + let signature = rpc.send_and_confirm_transaction(&transaction).await?; + Ok(signature) + }, + MAX_RETRIES, + INITIAL_RETRY_DELAY, + "send transaction", + ) + .await +} + +async fn get_priority_fee_instruction( + rpc: &RpcClient, + instructions: &[solana_sdk::instruction::Instruction], + wallet: &dyn Signer, + additional_signers: &[&dyn Signer], + tier: PriorityFeeTier, + max_priority_fee_lamports: u64, +) -> Result, Box> { + if let Some(priority_fee_micro_lamports) = calculate_priority_fee(rpc, tier).await? { + let recent_blockhash = rpc.get_latest_blockhash().await?; + let message = Message::new(instructions, Some(&wallet.pubkey())); + let mut signers = vec![wallet]; + signers.extend(additional_signers); + + let transaction = Transaction::new(&signers, message, recent_blockhash); + let simulated_transaction = rpc.simulate_transaction(&transaction).await.unwrap(); + + if let Some(units_consumed) = simulated_transaction.value.units_consumed { + let mut compute_unit_price = priority_fee_micro_lamports; + let total_priority_fee_lamports = + (units_consumed as u64 * priority_fee_micro_lamports) / 1_000_000; + + if total_priority_fee_lamports > max_priority_fee_lamports { + compute_unit_price = (max_priority_fee_lamports * 1_000_000) / units_consumed; + } + + print_priority_fee_details( + compute_unit_price, + units_consumed, + (units_consumed as u64 * compute_unit_price) / 1_000_000, + ); + + return Ok(Some(create_priority_fee_instruction(compute_unit_price))); + } + } + + Ok(None) +} + +fn print_priority_fee_details( + compute_unit_price: u64, + units_consumed: u64, + total_priority_fee_lamports: u64, +) { + println!( + "Priority Fee Details:\n\ + - Compute Unit Price: {} microlamports\n\ + - Compute Units Consumed: {}\n\ + - Total Priority Fee: {} lamports\n", + compute_unit_price, units_consumed, total_priority_fee_lamports + ); +} + +async fn calculate_priority_fee( + rpc: &RpcClient, + tier: PriorityFeeTier, +) -> Result, Box> { + let prioritization_fees = rpc.get_recent_prioritization_fees(&[]).await.unwrap(); + + if prioritization_fees.is_empty() || matches!(tier, PriorityFeeTier::None) { + return Ok(None); + } + + let mut fees: Vec = prioritization_fees + .iter() + .map(|fee| fee.prioritization_fee) + .collect(); + fees.sort_unstable(); + + let fee = match tier { + PriorityFeeTier::Low => fees.get(fees.len() / 4).cloned(), + PriorityFeeTier::Medium => fees.get(fees.len() / 2).cloned(), + PriorityFeeTier::High => fees.get((fees.len() * 3) / 4).cloned(), + PriorityFeeTier::Turbo => fees.get((fees.len() * 95) / 100).cloned(), + PriorityFeeTier::None => None, + }; + + Ok(fee) +} + +fn create_priority_fee_instruction(unit_price: u64) -> solana_sdk::instruction::Instruction { + ComputeBudgetInstruction::set_compute_unit_price(unit_price) +} + +async fn retry_async<'a, F, Fut, T, E>( + mut operation: F, + max_retries: usize, + delay: Duration, + description: &str, +) -> Result +where + F: FnMut() -> Fut + 'a, + Fut: Future> + 'a, + E: std::fmt::Debug, +{ + let mut attempts = 0; + let mut current_delay = delay; + + while attempts < max_retries { + match operation().await { + Ok(result) => return Ok(result), + Err(err) if attempts < max_retries - 1 => { + attempts += 1; + eprintln!( + "[Retry {}/{}] Failed to {}. Error: {:?}. Retrying in {:?}...", + attempts, max_retries, description, err, current_delay + ); + sleep(current_delay).await; + current_delay *= 2; + } + Err(err) => { + eprintln!( + "[Failed] {} failed after {} attempts. Error: {:?}", + description, + attempts + 1, + err + ); + return Err(err); + } + } + } + + unreachable!("Exceeded max retries but did not return error"); +} diff --git a/examples/lp-bot/src/wallet.rs b/examples/rust-sdk/lp-bot/src/wallet.rs similarity index 100% rename from examples/lp-bot/src/wallet.rs rename to examples/rust-sdk/lp-bot/src/wallet.rs From f54bf866003dfc7caee1054944d3d783ecd22d75 Mon Sep 17 00:00:00 2001 From: calintje Date: Wed, 4 Dec 2024 13:18:05 +0100 Subject: [PATCH 06/18] Resolve comments. Add display functions for wallet and position balances. Update args. --- examples/rust-sdk/lp-bot/Cargo.toml | 1 + examples/rust-sdk/lp-bot/src/cli.rs | 8 + examples/rust-sdk/lp-bot/src/main.rs | 60 +++++++- .../rust-sdk/lp-bot/src/position_manager.rs | 81 ++++++---- examples/rust-sdk/lp-bot/src/utils.rs | 138 ++++++++++++------ 5 files changed, 214 insertions(+), 74 deletions(-) diff --git a/examples/rust-sdk/lp-bot/Cargo.toml b/examples/rust-sdk/lp-bot/Cargo.toml index 03249634..c8acb22e 100644 --- a/examples/rust-sdk/lp-bot/Cargo.toml +++ b/examples/rust-sdk/lp-bot/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] clap = { version = "4.5.21", features = ["derive"] } +colored = "2.0" orca_whirlpools = "0.4.0" orca_whirlpools_client = "0.4.3" orca_whirlpools_core = "0.4.3" diff --git a/examples/rust-sdk/lp-bot/src/cli.rs b/examples/rust-sdk/lp-bot/src/cli.rs index 2cd9ca11..24aa9eb1 100644 --- a/examples/rust-sdk/lp-bot/src/cli.rs +++ b/examples/rust-sdk/lp-bot/src/cli.rs @@ -49,4 +49,12 @@ pub struct Args { help = "Maximum total priority fee in lamports.\n" )] pub max_priority_fee_lamports: u64, + + #[arg( + short = 's', + long, + default_value_t = 100, + help = "Slippage tolerance in basis points (bps).\n" + )] + pub slippage_tolerance_bps: u16, } diff --git a/examples/rust-sdk/lp-bot/src/main.rs b/examples/rust-sdk/lp-bot/src/main.rs index 571d2f2c..35f826b2 100644 --- a/examples/rust-sdk/lp-bot/src/main.rs +++ b/examples/rust-sdk/lp-bot/src/main.rs @@ -7,19 +7,27 @@ use std::str::FromStr; use clap::Parser; use cli::Args; +use orca_whirlpools::{set_funder, set_whirlpools_config_address, WhirlpoolsConfigInput}; +use orca_whirlpools_client::get_position_address; use position_manager::run_position_manager; +use solana_client::nonblocking::rpc_client::RpcClient; use solana_sdk::pubkey::Pubkey; use tokio::time::{sleep, Duration}; +use utils::{ + display_position_balances, display_wallet_balances, fetch_mint, fetch_position, fetch_whirlpool, +}; -pub const RPC_URL: &str = - "https://mainnet.helius-rpc.com/?api-key=e1bbe936-f564-4d9a-ae4e-a69e6f99e9b1"; +pub const RPC_URL: &str = "https://api.mainnet-beta.solana.com"; #[tokio::main] async fn main() { let args = Args::parse(); + set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet).unwrap(); + let rpc = RpcClient::new(RPC_URL.to_string()); let wallet = wallet::load_wallet(); + set_funder(wallet.pubkey()).unwrap(); - let mut position_mint_address = Pubkey::from_str(&args.position_mint_address).unwrap(); + let position_mint_address = Pubkey::from_str(&args.position_mint_address).unwrap(); println!( "\n\ @@ -29,13 +37,53 @@ async fn main() { ); println!("Configuration:"); println!( - " Position Mint Address: {}\n Threshold: {:.2}%\n Interval: {} seconds\n Priority Fee Tier: {:?}\n", - args.position_mint_address, args.threshold, args.interval, args.priority_fee_tier + " Position Mint Address: {}\n Threshold: {:.2}%\n Interval: {} seconds\n Priority Fee Tier: {:?}\n Slippage tolerance bps: {:?}\n", + args.position_mint_address, args.threshold, args.interval, args.priority_fee_tier, args.slippage_tolerance_bps ); + println!("-------------------------------------\n"); + let (position_address, _) = get_position_address(&position_mint_address).unwrap(); + let mut position = fetch_position(&rpc, &position_address).await.unwrap(); + + let whirlpool_address = position.whirlpool; + let whirlpool = fetch_whirlpool(&rpc, &whirlpool_address).await.unwrap(); + + let token_mint_a = fetch_mint(&rpc, &whirlpool.token_mint_a).await.unwrap(); + let token_mint_b = fetch_mint(&rpc, &whirlpool.token_mint_b).await.unwrap(); + + display_wallet_balances( + &rpc, + &wallet.pubkey(), + &whirlpool.token_mint_a, + &whirlpool.token_mint_b, + ) + .await + .unwrap(); + + display_position_balances( + &rpc, + &position, + &whirlpool.token_mint_a, + &whirlpool.token_mint_b, + token_mint_a.decimals, + token_mint_b.decimals, + args.slippage_tolerance_bps, + ) + .await + .unwrap(); + loop { - if let Err(err) = run_position_manager(&args, &wallet, &mut position_mint_address).await { + if let Err(err) = run_position_manager( + &rpc, + &args, + &wallet, + &mut position, + &token_mint_a, + &token_mint_b, + ) + .await + { eprintln!("Error: {}", err); } sleep(Duration::from_secs(args.interval)).await; diff --git a/examples/rust-sdk/lp-bot/src/position_manager.rs b/examples/rust-sdk/lp-bot/src/position_manager.rs index 7f1470b8..60a9c87d 100644 --- a/examples/rust-sdk/lp-bot/src/position_manager.rs +++ b/examples/rust-sdk/lp-bot/src/position_manager.rs @@ -1,40 +1,33 @@ use crate::{ cli::Args, - utils::{fetch_mint, fetch_position, fetch_whirlpool, send_transaction}, - RPC_URL, + utils::{ + display_position_balances, display_wallet_balances, fetch_position, fetch_whirlpool, + send_transaction, + }, }; +use colored::Colorize; use orca_whirlpools::{ - close_position_instructions, open_position_instructions, set_funder, - set_whirlpools_config_address, IncreaseLiquidityParam, WhirlpoolsConfigInput, + close_position_instructions, open_position_instructions, IncreaseLiquidityParam, }; -use orca_whirlpools_client::get_position_address; +use orca_whirlpools_client::{get_position_address, Position}; use orca_whirlpools_core::{sqrt_price_to_price, tick_index_to_price}; use solana_client::nonblocking::rpc_client::RpcClient; -use solana_sdk::{pubkey::Pubkey, signer::Signer}; +use solana_sdk::signer::Signer; +use spl_token_2022::state::Mint; pub async fn run_position_manager( + rpc: &RpcClient, args: &Args, wallet: &Box, - position_mint_address: &mut Pubkey, + position: &mut Position, + token_mint_a: &Mint, + token_mint_b: &Mint, ) -> Result<(), Box> { - set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet).unwrap(); - let rpc = RpcClient::new(RPC_URL.to_string()); - set_funder(wallet.pubkey()).unwrap(); - println!("Checking position..."); - let (position_address, _) = get_position_address(&position_mint_address).unwrap(); - let position = fetch_position(&rpc, &position_address).await?; let whirlpool_address = position.whirlpool; let whirlpool = fetch_whirlpool(&rpc, &whirlpool_address).await?; - // let token_a_pubkey = whirlpool.token_mint_a; - // let token_b_pubkey = whirlpool.token_mint_b; - // display_wallet_balances(&rpc, &token_a_pubkey, &token_b_pubkey).await?; - - let token_mint_a = fetch_mint(&rpc, &whirlpool.token_mint_a).await?; - let token_mint_b = fetch_mint(&rpc, &whirlpool.token_mint_b).await?; - let current_price = sqrt_price_to_price( whirlpool.sqrt_price, token_mint_a.decimals, @@ -62,10 +55,20 @@ pub async fn run_position_manager( println!("Price deviation from center: {:.2}%", deviation); if deviation >= args.threshold { - println!("Deviation exceeds threshold. Rebalancing position..."); + println!( + "{}", + "Deviation exceeds threshold. Rebalancing position." + .to_string() + .yellow() + ); - let close_position_instructions = - close_position_instructions(&rpc, *position_mint_address, Some(100), None).await?; + let close_position_instructions = close_position_instructions( + &rpc, + position.position_mint, + Some(args.slippage_tolerance_bps), + None, + ) + .await?; let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; let new_upper_price = current_price + (position_upper_price - position_lower_price) / 2.0; @@ -106,13 +109,41 @@ pub async fn run_position_manager( .await?; println!("Rebalancing transaction signature: {}", signature); - *position_mint_address = open_position_instructions.position_mint; + let position_mint_address = open_position_instructions.position_mint; + let (position_address, _) = get_position_address(&position_mint_address)?; + *position = fetch_position(&rpc, &position_address).await?; println!( "New position mint address: {}", open_position_instructions.position_mint ); + + display_wallet_balances( + &rpc, + &wallet.pubkey(), + &whirlpool.token_mint_a, + &whirlpool.token_mint_b, + ) + .await + .unwrap(); + + display_position_balances( + &rpc, + &position, + &whirlpool.token_mint_a, + &whirlpool.token_mint_b, + token_mint_a.decimals, + token_mint_b.decimals, + args.slippage_tolerance_bps, + ) + .await + .unwrap(); } else { - println!("Current price is within range. No repositioning needed."); + println!( + "{}", + "Current price is within range. No repositioning needed." + .to_string() + .green() + ); } Ok(()) } diff --git a/examples/rust-sdk/lp-bot/src/utils.rs b/examples/rust-sdk/lp-bot/src/utils.rs index b75a71f9..c4eff551 100644 --- a/examples/rust-sdk/lp-bot/src/utils.rs +++ b/examples/rust-sdk/lp-bot/src/utils.rs @@ -1,4 +1,5 @@ use clap::ValueEnum; +use orca_whirlpools::close_position_instructions; use orca_whirlpools_client::{Position, Whirlpool}; use solana_client::nonblocking::rpc_client::RpcClient; use solana_sdk::compute_budget::ComputeBudgetInstruction; @@ -8,45 +9,93 @@ use solana_sdk::{ }; use spl_token_2022::state::Mint; use std::future::Future; +use std::str::FromStr; use tokio::time::sleep; use tokio::time::Duration; const MAX_RETRIES: usize = 3; const INITIAL_RETRY_DELAY: Duration = Duration::from_millis(100); -// pub async fn display_wallet_balances( -// rpc: &RpcClient, -// token_a_address: &Pubkey, -// token_b_address: &Pubkey, -// ) -> Result<(), Box> { -// let token_a_balance = fetch_token_balance(rpc, token_a_address).await?; -// let token_b_balance = fetch_token_balance(rpc, token_b_address).await?; - -// println!( -// "Wallet Balances: \n\ -// - Token A ({:?}): {} \n\ -// - Token B ({:?}): {}", -// token_a_address, token_a_balance, token_b_address, token_b_balance -// ); - -// Ok(()) -// } - -// async fn fetch_token_balance( -// rpc: &RpcClient, -// token_address: &Pubkey, -// ) -> Result> { -// retry_async( -// || async { -// let balance = rpc.get_token_account_balance(token_address).await?; -// Ok(balance.ui_amount_string) -// }, -// MAX_RETRIES, -// INITIAL_RETRY_DELAY, -// "fetch token balance", -// ) -// .await -// } +pub async fn display_position_balances( + rpc: &RpcClient, + position: &Position, + token_mint_a_address: &Pubkey, + token_mint_b_address: &Pubkey, + decimals_a: u8, + decimals_b: u8, + slippage_tolerance_bps: u16, +) -> Result<(), Box> { + let close_position_instructions = close_position_instructions( + &rpc, + position.position_mint, + Some(slippage_tolerance_bps), + None, + ) + .await?; + + let positon_balance_token_a = + close_position_instructions.quote.token_est_a as f64 / 10u64.pow(decimals_a as u32) as f64; + let positon_balance_token_b = + close_position_instructions.quote.token_est_b as f64 / 10u64.pow(decimals_b as u32) as f64; + + println!( + "Position Balances: \n\ + - Token A ({:?}): {} \n\ + - Token B ({:?}): {} \n", + token_mint_a_address, + positon_balance_token_a, + token_mint_b_address, + positon_balance_token_b + ); + + Ok(()) +} + +pub async fn display_wallet_balances( + rpc: &RpcClient, + wallet_address: &Pubkey, + token_mint_a_address: &Pubkey, + token_mint_b_address: &Pubkey, +) -> Result<(), Box> { + let token_a_balance = fetch_token_balance(rpc, wallet_address, token_mint_a_address).await?; + let token_b_balance = fetch_token_balance(rpc, wallet_address, token_mint_b_address).await?; + + println!( + "Wallet Balances: \n\ + - Token A ({:?}): {} \n\ + - Token B ({:?}): {}", + token_mint_a_address, token_a_balance, token_mint_b_address, token_b_balance + ); + + Ok(()) +} + +async fn fetch_token_balance( + rpc: &RpcClient, + wallet_address: &Pubkey, + token_mint_address: &Pubkey, +) -> Result> { + retry_async( + || async { + let mint_account = rpc.get_account(token_mint_address).await?; + let mint_owner_id = mint_account.owner; + let (token_address, _) = Pubkey::find_program_address( + &[ + &wallet_address.to_bytes(), + &mint_owner_id.to_bytes(), + &token_mint_address.to_bytes(), + ], + &Pubkey::from_str("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL").unwrap(), + ); + let balance = rpc.get_token_account_balance(&token_address).await?; + Ok(balance.ui_amount_string) + }, + MAX_RETRIES, + INITIAL_RETRY_DELAY, + "fetch token balance", + ) + .await +} pub async fn fetch_position( rpc: &RpcClient, @@ -177,7 +226,7 @@ async fn get_priority_fee_instruction( compute_unit_price = (max_priority_fee_lamports * 1_000_000) / units_consumed; } - print_priority_fee_details( + display_priority_fee_details( compute_unit_price, units_consumed, (units_consumed as u64 * compute_unit_price) / 1_000_000, @@ -190,7 +239,7 @@ async fn get_priority_fee_instruction( Ok(None) } -fn print_priority_fee_details( +fn display_priority_fee_details( compute_unit_price: u64, units_consumed: u64, total_priority_fee_lamports: u64, @@ -199,7 +248,7 @@ fn print_priority_fee_details( "Priority Fee Details:\n\ - Compute Unit Price: {} microlamports\n\ - Compute Units Consumed: {}\n\ - - Total Priority Fee: {} lamports\n", + - Total Priority Fee: {} lamports", compute_unit_price, units_consumed, total_priority_fee_lamports ); } @@ -213,18 +262,21 @@ async fn calculate_priority_fee( if prioritization_fees.is_empty() || matches!(tier, PriorityFeeTier::None) { return Ok(None); } - - let mut fees: Vec = prioritization_fees + let mut non_zero_fees: Vec = prioritization_fees .iter() .map(|fee| fee.prioritization_fee) + .filter(|&fee| fee > 0) // Keep only non-zero fees .collect(); - fees.sort_unstable(); + if non_zero_fees.is_empty() { + return Ok(Some(0)); + } + non_zero_fees.sort_unstable(); let fee = match tier { - PriorityFeeTier::Low => fees.get(fees.len() / 4).cloned(), - PriorityFeeTier::Medium => fees.get(fees.len() / 2).cloned(), - PriorityFeeTier::High => fees.get((fees.len() * 3) / 4).cloned(), - PriorityFeeTier::Turbo => fees.get((fees.len() * 95) / 100).cloned(), + PriorityFeeTier::Low => non_zero_fees.get(non_zero_fees.len() / 4).cloned(), + PriorityFeeTier::Medium => non_zero_fees.get(non_zero_fees.len() / 2).cloned(), + PriorityFeeTier::High => non_zero_fees.get((non_zero_fees.len() * 3) / 4).cloned(), + PriorityFeeTier::Turbo => non_zero_fees.get((non_zero_fees.len() * 95) / 100).cloned(), PriorityFeeTier::None => None, }; From f1b104ecd057352d30b6935b74e7cceae5075250 Mon Sep 17 00:00:00 2001 From: calintje Date: Wed, 4 Dec 2024 13:20:37 +0100 Subject: [PATCH 07/18] Update README --- examples/rust-sdk/lp-bot/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/rust-sdk/lp-bot/README.md b/examples/rust-sdk/lp-bot/README.md index 893de3c1..8fd0963a 100644 --- a/examples/rust-sdk/lp-bot/README.md +++ b/examples/rust-sdk/lp-bot/README.md @@ -66,6 +66,8 @@ Run the bot with the following arguments - `medium`: Median prioritization fee (default). - `high`: Upper 75th quartile prioritization fee. - `turbo`: Upper 95th quartile prioritization fee. +- `max_priority_fee_lamports` (optional): Maximum total priority fee in lamports. Default: 10_000_000 (0.01 SOL). +- `slippage_tolerance_bps` (optional): Slippage tolerance in basis points (bps). Default: 100. ### Example Usage Monitor and rebalance with default settings: From abbdc6ba4de4e4c639e76cb729916fa85bb435be Mon Sep 17 00:00:00 2001 From: calintje Date: Wed, 4 Dec 2024 13:37:47 +0100 Subject: [PATCH 08/18] Fix typo --- examples/rust-sdk/lp-bot/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rust-sdk/lp-bot/src/main.rs b/examples/rust-sdk/lp-bot/src/main.rs index 35f826b2..b7e36b68 100644 --- a/examples/rust-sdk/lp-bot/src/main.rs +++ b/examples/rust-sdk/lp-bot/src/main.rs @@ -37,7 +37,7 @@ async fn main() { ); println!("Configuration:"); println!( - " Position Mint Address: {}\n Threshold: {:.2}%\n Interval: {} seconds\n Priority Fee Tier: {:?}\n Slippage tolerance bps: {:?}\n", + " Position Mint Address: {}\n Threshold: {:.2}%\n Interval: {} seconds\n Priority Fee Tier: {:?}\n Slippage tolerance bps: {:?}\n", args.position_mint_address, args.threshold, args.interval, args.priority_fee_tier, args.slippage_tolerance_bps ); From 70928955f9847ae2e91a31982af7a0583e0ba26d Mon Sep 17 00:00:00 2001 From: calintje Date: Fri, 6 Dec 2024 03:44:38 +0100 Subject: [PATCH 09/18] Resolve comments, except for calculations regarding price --- examples/README.md | 31 + examples/rust-sdk/lp-bot/Cargo.toml | 16 - examples/rust-sdk/lp-bot/src/utils.rs | 329 --- .../whirlpool_repositioning_bot/Cargo.toml | 18 + .../README.md | 8 +- .../whirlpool_repositioning_bot/package.json | 16 + .../src/cli.rs | 0 .../src/main.rs | 37 +- .../src/position_manager.rs | 37 +- .../whirlpool_repositioning_bot/src/utils.rs | 266 ++ .../src/wallet.rs | 0 examples/{ => ts-sdk}/next/README.md | 0 examples/{ => ts-sdk}/next/app/layout.tsx | 0 examples/{ => ts-sdk}/next/app/page.tsx | 0 examples/{ => ts-sdk}/next/next-env.d.ts | 0 examples/{ => ts-sdk}/next/next.config.js | 2 +- examples/{ => ts-sdk}/next/package.json | 2 +- examples/{ => ts-sdk}/next/tsconfig.json | 2 +- nx.json | 9 +- package.json | 3 +- yarn.lock | 2201 +++++++++-------- 21 files changed, 1535 insertions(+), 1442 deletions(-) create mode 100644 examples/README.md delete mode 100644 examples/rust-sdk/lp-bot/Cargo.toml delete mode 100644 examples/rust-sdk/lp-bot/src/utils.rs create mode 100644 examples/rust-sdk/whirlpool_repositioning_bot/Cargo.toml rename examples/rust-sdk/{lp-bot => whirlpool_repositioning_bot}/README.md (90%) create mode 100644 examples/rust-sdk/whirlpool_repositioning_bot/package.json rename examples/rust-sdk/{lp-bot => whirlpool_repositioning_bot}/src/cli.rs (100%) rename examples/rust-sdk/{lp-bot => whirlpool_repositioning_bot}/src/main.rs (69%) rename examples/rust-sdk/{lp-bot => whirlpool_repositioning_bot}/src/position_manager.rs (81%) create mode 100644 examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs rename examples/rust-sdk/{lp-bot => whirlpool_repositioning_bot}/src/wallet.rs (100%) rename examples/{ => ts-sdk}/next/README.md (100%) rename examples/{ => ts-sdk}/next/app/layout.tsx (100%) rename examples/{ => ts-sdk}/next/app/page.tsx (100%) rename examples/{ => ts-sdk}/next/next-env.d.ts (100%) rename examples/{ => ts-sdk}/next/next.config.js (91%) rename examples/{ => ts-sdk}/next/package.json (91%) rename examples/{ => ts-sdk}/next/tsconfig.json (89%) diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..8d6f49c2 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,31 @@ +# Whirlpools SDK Examples + +This directory contains example projects showcasing how to use the Whirlpools SDK suite in different environments. Each project demonstrates specific functionalities, providing a starting point for developers. + +## Building the Examples +To build the examples, run the following commands from the root of the monorepo: + +```bash +yarn install +yarn build +``` + +### General Note on Dependencies +All examples in this directory use local versions of the Orca SDK dependencies from this monorepo. If you plan to move an example project outside of the monorepo, you must update the dependencies to ensure compatibility. + +## Available Examples +### Rust +#### 1. Whirlpool Repositioning Bot +- Path: examples/rust-sdk/whirlpools-repositioning-bot +- Description: A CLI tool to automatically reposition positions based on configurable thresholds. +- Highlights: + - Utilizes the Whirlpools Rust SDKs. + - Dynamically fetches on-chain data to manage LP positions. + +### Typescript +#### 2. Next.js Integration +- Path: examples/ts-sdk/whirlpools-next +- Description: Demonstrates how to integrate the Whirlpools TS SDK `@orca-so/whirlpools` with a Next.js application. +- Highlights: + - Configures WebAssembly (`asyncWebAssembly`) support in Next.js. + - Provides a working setup to query and interact with Orca's whirlpools. \ No newline at end of file diff --git a/examples/rust-sdk/lp-bot/Cargo.toml b/examples/rust-sdk/lp-bot/Cargo.toml deleted file mode 100644 index c8acb22e..00000000 --- a/examples/rust-sdk/lp-bot/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "lp-bot" -version = "0.1.0" -edition = "2021" - -[dependencies] -clap = { version = "4.5.21", features = ["derive"] } -colored = "2.0" -orca_whirlpools = "0.4.0" -orca_whirlpools_client = "0.4.3" -orca_whirlpools_core = "0.4.3" -serde_json = "1.0.133" -solana-client = "1.18" -solana-sdk = "1.18" -spl-token-2022 = { version = "^3.0" } -tokio = "1.41.1" diff --git a/examples/rust-sdk/lp-bot/src/utils.rs b/examples/rust-sdk/lp-bot/src/utils.rs deleted file mode 100644 index c4eff551..00000000 --- a/examples/rust-sdk/lp-bot/src/utils.rs +++ /dev/null @@ -1,329 +0,0 @@ -use clap::ValueEnum; -use orca_whirlpools::close_position_instructions; -use orca_whirlpools_client::{Position, Whirlpool}; -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_sdk::compute_budget::ComputeBudgetInstruction; -use solana_sdk::{ - message::Message, program_pack::Pack, pubkey::Pubkey, signature::Signature, signer::Signer, - transaction::Transaction, -}; -use spl_token_2022::state::Mint; -use std::future::Future; -use std::str::FromStr; -use tokio::time::sleep; -use tokio::time::Duration; - -const MAX_RETRIES: usize = 3; -const INITIAL_RETRY_DELAY: Duration = Duration::from_millis(100); - -pub async fn display_position_balances( - rpc: &RpcClient, - position: &Position, - token_mint_a_address: &Pubkey, - token_mint_b_address: &Pubkey, - decimals_a: u8, - decimals_b: u8, - slippage_tolerance_bps: u16, -) -> Result<(), Box> { - let close_position_instructions = close_position_instructions( - &rpc, - position.position_mint, - Some(slippage_tolerance_bps), - None, - ) - .await?; - - let positon_balance_token_a = - close_position_instructions.quote.token_est_a as f64 / 10u64.pow(decimals_a as u32) as f64; - let positon_balance_token_b = - close_position_instructions.quote.token_est_b as f64 / 10u64.pow(decimals_b as u32) as f64; - - println!( - "Position Balances: \n\ - - Token A ({:?}): {} \n\ - - Token B ({:?}): {} \n", - token_mint_a_address, - positon_balance_token_a, - token_mint_b_address, - positon_balance_token_b - ); - - Ok(()) -} - -pub async fn display_wallet_balances( - rpc: &RpcClient, - wallet_address: &Pubkey, - token_mint_a_address: &Pubkey, - token_mint_b_address: &Pubkey, -) -> Result<(), Box> { - let token_a_balance = fetch_token_balance(rpc, wallet_address, token_mint_a_address).await?; - let token_b_balance = fetch_token_balance(rpc, wallet_address, token_mint_b_address).await?; - - println!( - "Wallet Balances: \n\ - - Token A ({:?}): {} \n\ - - Token B ({:?}): {}", - token_mint_a_address, token_a_balance, token_mint_b_address, token_b_balance - ); - - Ok(()) -} - -async fn fetch_token_balance( - rpc: &RpcClient, - wallet_address: &Pubkey, - token_mint_address: &Pubkey, -) -> Result> { - retry_async( - || async { - let mint_account = rpc.get_account(token_mint_address).await?; - let mint_owner_id = mint_account.owner; - let (token_address, _) = Pubkey::find_program_address( - &[ - &wallet_address.to_bytes(), - &mint_owner_id.to_bytes(), - &token_mint_address.to_bytes(), - ], - &Pubkey::from_str("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL").unwrap(), - ); - let balance = rpc.get_token_account_balance(&token_address).await?; - Ok(balance.ui_amount_string) - }, - MAX_RETRIES, - INITIAL_RETRY_DELAY, - "fetch token balance", - ) - .await -} - -pub async fn fetch_position( - rpc: &RpcClient, - position_address: &Pubkey, -) -> Result> { - retry_async( - || async { - let position_account = rpc.get_account(position_address).await?; - let position = Position::from_bytes(&position_account.data)?; - Ok(position) - }, - MAX_RETRIES, - INITIAL_RETRY_DELAY, - "fetch position", - ) - .await -} - -pub async fn fetch_whirlpool( - rpc: &RpcClient, - whirlpool_address: &Pubkey, -) -> Result> { - retry_async( - || async { - let whirlpool_account = rpc.get_account(whirlpool_address).await?; - let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data)?; - Ok(whirlpool) - }, - MAX_RETRIES, - INITIAL_RETRY_DELAY, - "fetch whirlpool", - ) - .await -} - -pub async fn fetch_mint( - rpc: &RpcClient, - mint_address: &Pubkey, -) -> Result> { - retry_async( - || async { - let mint_account = rpc.get_account(mint_address).await?; - let mint = Mint::unpack(&mint_account.data)?; - Ok(mint) - }, - MAX_RETRIES, - INITIAL_RETRY_DELAY, - "fetch mint", - ) - .await -} - -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] -pub enum PriorityFeeTier { - None, - Low, - Medium, - High, - Turbo, -} - -pub async fn send_transaction( - rpc: &RpcClient, - wallet: &dyn Signer, - instructions: Vec, - additional_signers: Vec<&dyn Signer>, - tier: PriorityFeeTier, - max_priority_fee: u64, -) -> Result> { - retry_async( - || async { - let mut all_instructions = vec![]; - - if let Some(priority_fee_instruction) = get_priority_fee_instruction( - rpc, - &instructions, - wallet, - &additional_signers, - tier, - max_priority_fee, - ) - .await? - { - all_instructions.push(priority_fee_instruction); - } - - all_instructions.extend(instructions.clone()); - - let recent_blockhash = rpc.get_latest_blockhash().await?; - let message = Message::new(&all_instructions, Some(&wallet.pubkey())); - let mut all_signers = vec![wallet]; - all_signers.extend(additional_signers.clone()); - - let transaction = Transaction::new(&all_signers, message, recent_blockhash); - let signature = rpc.send_and_confirm_transaction(&transaction).await?; - Ok(signature) - }, - MAX_RETRIES, - INITIAL_RETRY_DELAY, - "send transaction", - ) - .await -} - -async fn get_priority_fee_instruction( - rpc: &RpcClient, - instructions: &[solana_sdk::instruction::Instruction], - wallet: &dyn Signer, - additional_signers: &[&dyn Signer], - tier: PriorityFeeTier, - max_priority_fee_lamports: u64, -) -> Result, Box> { - if let Some(priority_fee_micro_lamports) = calculate_priority_fee(rpc, tier).await? { - let recent_blockhash = rpc.get_latest_blockhash().await?; - let message = Message::new(instructions, Some(&wallet.pubkey())); - let mut signers = vec![wallet]; - signers.extend(additional_signers); - - let transaction = Transaction::new(&signers, message, recent_blockhash); - let simulated_transaction = rpc.simulate_transaction(&transaction).await.unwrap(); - - if let Some(units_consumed) = simulated_transaction.value.units_consumed { - let mut compute_unit_price = priority_fee_micro_lamports; - let total_priority_fee_lamports = - (units_consumed as u64 * priority_fee_micro_lamports) / 1_000_000; - - if total_priority_fee_lamports > max_priority_fee_lamports { - compute_unit_price = (max_priority_fee_lamports * 1_000_000) / units_consumed; - } - - display_priority_fee_details( - compute_unit_price, - units_consumed, - (units_consumed as u64 * compute_unit_price) / 1_000_000, - ); - - return Ok(Some(create_priority_fee_instruction(compute_unit_price))); - } - } - - Ok(None) -} - -fn display_priority_fee_details( - compute_unit_price: u64, - units_consumed: u64, - total_priority_fee_lamports: u64, -) { - println!( - "Priority Fee Details:\n\ - - Compute Unit Price: {} microlamports\n\ - - Compute Units Consumed: {}\n\ - - Total Priority Fee: {} lamports", - compute_unit_price, units_consumed, total_priority_fee_lamports - ); -} - -async fn calculate_priority_fee( - rpc: &RpcClient, - tier: PriorityFeeTier, -) -> Result, Box> { - let prioritization_fees = rpc.get_recent_prioritization_fees(&[]).await.unwrap(); - - if prioritization_fees.is_empty() || matches!(tier, PriorityFeeTier::None) { - return Ok(None); - } - let mut non_zero_fees: Vec = prioritization_fees - .iter() - .map(|fee| fee.prioritization_fee) - .filter(|&fee| fee > 0) // Keep only non-zero fees - .collect(); - if non_zero_fees.is_empty() { - return Ok(Some(0)); - } - non_zero_fees.sort_unstable(); - - let fee = match tier { - PriorityFeeTier::Low => non_zero_fees.get(non_zero_fees.len() / 4).cloned(), - PriorityFeeTier::Medium => non_zero_fees.get(non_zero_fees.len() / 2).cloned(), - PriorityFeeTier::High => non_zero_fees.get((non_zero_fees.len() * 3) / 4).cloned(), - PriorityFeeTier::Turbo => non_zero_fees.get((non_zero_fees.len() * 95) / 100).cloned(), - PriorityFeeTier::None => None, - }; - - Ok(fee) -} - -fn create_priority_fee_instruction(unit_price: u64) -> solana_sdk::instruction::Instruction { - ComputeBudgetInstruction::set_compute_unit_price(unit_price) -} - -async fn retry_async<'a, F, Fut, T, E>( - mut operation: F, - max_retries: usize, - delay: Duration, - description: &str, -) -> Result -where - F: FnMut() -> Fut + 'a, - Fut: Future> + 'a, - E: std::fmt::Debug, -{ - let mut attempts = 0; - let mut current_delay = delay; - - while attempts < max_retries { - match operation().await { - Ok(result) => return Ok(result), - Err(err) if attempts < max_retries - 1 => { - attempts += 1; - eprintln!( - "[Retry {}/{}] Failed to {}. Error: {:?}. Retrying in {:?}...", - attempts, max_retries, description, err, current_delay - ); - sleep(current_delay).await; - current_delay *= 2; - } - Err(err) => { - eprintln!( - "[Failed] {} failed after {} attempts. Error: {:?}", - description, - attempts + 1, - err - ); - return Err(err); - } - } - } - - unreachable!("Exceeded max retries but did not return error"); -} diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/Cargo.toml b/examples/rust-sdk/whirlpool_repositioning_bot/Cargo.toml new file mode 100644 index 00000000..ba72bc76 --- /dev/null +++ b/examples/rust-sdk/whirlpool_repositioning_bot/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "whirlpool_repositioning_bot" +version = "0.1.0" +edition = "2021" + +[dependencies] +clap = { version = "^4.5.21", features = ["derive"] } +colored = { version = "^2.0" } +orca_whirlpools = { path = '../../../rust-sdk/whirlpool' } +orca_whirlpools_client = { path = '../../../rust-sdk/client' } +orca_whirlpools_core = { path = '../../../rust-sdk/core' } +serde_json = { version = "^1.0" } +solana-client = { version = "^1.18" } +solana-sdk = { version = "^1.18" } +spl-token-2022 = { version = "^3.0" } +spl-associated-token-account = { version = "^3.0" } +tokio = { version = "^1.41.1" } +tokio-retry = { version = "^0.3.0" } diff --git a/examples/rust-sdk/lp-bot/README.md b/examples/rust-sdk/whirlpool_repositioning_bot/README.md similarity index 90% rename from examples/rust-sdk/lp-bot/README.md rename to examples/rust-sdk/whirlpool_repositioning_bot/README.md index 8fd0963a..42516955 100644 --- a/examples/rust-sdk/lp-bot/README.md +++ b/examples/rust-sdk/whirlpool_repositioning_bot/README.md @@ -33,6 +33,12 @@ A Rust-based CLI bot for interacting with the Orca Whirlpools program on Solana. ``` 3. The executable will be located in target/release/lp-bot +> NOTE: This project uses the local version of the dependency. If you want to move this example project outside of this monorepo, make sure you install the necessary dependecies: + ```bash + cargo add orca_whirlpools orca_whirlpools_client orca_whirlpools_core + ``` + + --- ## RPC Configuration @@ -42,7 +48,7 @@ The bot connects to Solana Mainnet Beta by default using: const RPC_URL: &str = "https://api.mainnet-beta.solana.com"; ``` -To modify this, update the RPC_URL constant in main.rs. +It is strongly recommended to modify this with URL from an RPC provider like Helius or Quicknod. You can update the RPC_URL constant in main.rs. --- diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/package.json b/examples/rust-sdk/whirlpool_repositioning_bot/package.json new file mode 100644 index 00000000..de7b1d45 --- /dev/null +++ b/examples/rust-sdk/whirlpool_repositioning_bot/package.json @@ -0,0 +1,16 @@ +{ + "name": "@orca-so/whirlpools-example-rust-repositioning-bot", + "version": "0.0.1", + "scripts": { + "build": "cargo build", + "test": "cargo test --lib", + "format": "cargo clippy --fix --allow-dirty --allow-staged && cargo fmt", + "lint": "cargo clippy", + "clean": "cargo clean" + }, + "devDependencies": { + "@orca-so/whirlpools-rust": "*", + "@orca-so/whirlpools-rust-client": "*", + "@orca-so/whirlpools-rust-core": "*" + } +} diff --git a/examples/rust-sdk/lp-bot/src/cli.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/cli.rs similarity index 100% rename from examples/rust-sdk/lp-bot/src/cli.rs rename to examples/rust-sdk/whirlpool_repositioning_bot/src/cli.rs diff --git a/examples/rust-sdk/lp-bot/src/main.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs similarity index 69% rename from examples/rust-sdk/lp-bot/src/main.rs rename to examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs index b7e36b68..1e625be0 100644 --- a/examples/rust-sdk/lp-bot/src/main.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs @@ -17,17 +17,20 @@ use utils::{ display_position_balances, display_wallet_balances, fetch_mint, fetch_position, fetch_whirlpool, }; -pub const RPC_URL: &str = "https://api.mainnet-beta.solana.com"; +pub const RPC_URL: &str = + "https://mainnet.helius-rpc.com/?api-key=e1bbe936-f564-4d9a-ae4e-a69e6f99e9b1"; #[tokio::main] async fn main() { let args = Args::parse(); - set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet).unwrap(); + set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet) + .expect("Failed to set Whirlpools config address for specified network."); let rpc = RpcClient::new(RPC_URL.to_string()); let wallet = wallet::load_wallet(); - set_funder(wallet.pubkey()).unwrap(); + set_funder(wallet.pubkey()).expect("Failed to set funder address."); - let position_mint_address = Pubkey::from_str(&args.position_mint_address).unwrap(); + let position_mint_address = Pubkey::from_str(&args.position_mint_address) + .expect("Invalid position mint address provided."); println!( "\n\ @@ -43,14 +46,20 @@ async fn main() { println!("-------------------------------------\n"); - let (position_address, _) = get_position_address(&position_mint_address).unwrap(); - let mut position = fetch_position(&rpc, &position_address).await.unwrap(); - - let whirlpool_address = position.whirlpool; - let whirlpool = fetch_whirlpool(&rpc, &whirlpool_address).await.unwrap(); - - let token_mint_a = fetch_mint(&rpc, &whirlpool.token_mint_a).await.unwrap(); - let token_mint_b = fetch_mint(&rpc, &whirlpool.token_mint_b).await.unwrap(); + let (position_address, _) = + get_position_address(&position_mint_address).expect("Failed to derive position address."); + let mut position = fetch_position(&rpc, &position_address) + .await + .expect("Failed to fetch position data."); + let whirlpool = fetch_whirlpool(&rpc, &position.whirlpool) + .await + .expect("Failed to fetch Whirlpool data."); + let token_mint_a = fetch_mint(&rpc, &whirlpool.token_mint_a) + .await + .expect("Failed to fetch Token Mint A data."); + let token_mint_b = fetch_mint(&rpc, &whirlpool.token_mint_b) + .await + .expect("Failed to fetch Token Mint B data."); display_wallet_balances( &rpc, @@ -59,7 +68,7 @@ async fn main() { &whirlpool.token_mint_b, ) .await - .unwrap(); + .expect("Failed to display wallet balances."); display_position_balances( &rpc, @@ -71,7 +80,7 @@ async fn main() { args.slippage_tolerance_bps, ) .await - .unwrap(); + .expect("Failed to display position balances."); loop { if let Err(err) = run_position_manager( diff --git a/examples/rust-sdk/lp-bot/src/position_manager.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs similarity index 81% rename from examples/rust-sdk/lp-bot/src/position_manager.rs rename to examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs index 60a9c87d..a0bc3016 100644 --- a/examples/rust-sdk/lp-bot/src/position_manager.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs @@ -23,10 +23,12 @@ pub async fn run_position_manager( token_mint_a: &Mint, token_mint_b: &Mint, ) -> Result<(), Box> { - println!("Checking position..."); + println!("Checking position."); let whirlpool_address = position.whirlpool; - let whirlpool = fetch_whirlpool(&rpc, &whirlpool_address).await?; + let whirlpool = fetch_whirlpool(&rpc, &whirlpool_address) + .await + .expect("Failed to fetch Whirlpool data."); let current_price = sqrt_price_to_price( whirlpool.sqrt_price, @@ -68,7 +70,8 @@ pub async fn run_position_manager( Some(args.slippage_tolerance_bps), None, ) - .await?; + .await + .expect("Failed to generate close position instructions."); let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; let new_upper_price = current_price + (position_upper_price - position_lower_price) / 2.0; @@ -84,7 +87,8 @@ pub async fn run_position_manager( Some(100), None, ) - .await?; + .await + .expect("Failed to generate open position instructions."); let mut all_instructions = vec![]; all_instructions.extend(close_position_instructions.instructions); @@ -97,6 +101,12 @@ pub async fn run_position_manager( .iter() .map(|kp| kp as &dyn Signer), ); + signers.extend( + close_position_instructions + .additional_signers + .iter() + .map(|kp| kp as &dyn Signer), + ); let signature = send_transaction( &rpc, @@ -106,16 +116,17 @@ pub async fn run_position_manager( args.priority_fee_tier, args.max_priority_fee_lamports, ) - .await?; + .await + .expect("Failed to send rebalancing transaction."); println!("Rebalancing transaction signature: {}", signature); let position_mint_address = open_position_instructions.position_mint; - let (position_address, _) = get_position_address(&position_mint_address)?; - *position = fetch_position(&rpc, &position_address).await?; - println!( - "New position mint address: {}", - open_position_instructions.position_mint - ); + println!("New position mint address: {}", position_mint_address); + let (position_address, _) = get_position_address(&position_mint_address) + .expect("Failed to derive new position address."); + *position = fetch_position(&rpc, &position_address) + .await + .expect("Failed to fetch new position data."); display_wallet_balances( &rpc, @@ -124,7 +135,7 @@ pub async fn run_position_manager( &whirlpool.token_mint_b, ) .await - .unwrap(); + .expect("Failed to display wallet balances."); display_position_balances( &rpc, @@ -136,7 +147,7 @@ pub async fn run_position_manager( args.slippage_tolerance_bps, ) .await - .unwrap(); + .expect("Failed to display position balances."); } else { println!( "{}", diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs new file mode 100644 index 00000000..a9e803b3 --- /dev/null +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs @@ -0,0 +1,266 @@ +use clap::ValueEnum; +use orca_whirlpools::close_position_instructions; +use orca_whirlpools_client::{Position, Whirlpool}; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::compute_budget::ComputeBudgetInstruction; +use solana_sdk::{ + message::Message, program_pack::Pack, pubkey::Pubkey, signature::Signature, signer::Signer, + transaction::Transaction, +}; +use spl_associated_token_account::get_associated_token_address_with_program_id; +use spl_token_2022::state::Mint; +use std::error::Error; +use tokio::time::Duration; +use tokio_retry::strategy::ExponentialBackoff; +use tokio_retry::Retry; + +pub async fn display_position_balances( + rpc: &RpcClient, + position: &Position, + token_mint_a_address: &Pubkey, + token_mint_b_address: &Pubkey, + decimals_a: u8, + decimals_b: u8, + slippage_tolerance_bps: u16, +) -> Result<(), Box> { + let close_position_instructions = close_position_instructions( + &rpc, + position.position_mint, + Some(slippage_tolerance_bps), + None, + ) + .await?; + + let positon_balance_token_a = + close_position_instructions.quote.token_est_a as f64 / 10u64.pow(decimals_a as u32) as f64; + let positon_balance_token_b = + close_position_instructions.quote.token_est_b as f64 / 10u64.pow(decimals_b as u32) as f64; + + println!( + "Position Balances: \n\ + - Token A ({:?}): {} \n\ + - Token B ({:?}): {} \n", + token_mint_a_address, + positon_balance_token_a, + token_mint_b_address, + positon_balance_token_b + ); + + Ok(()) +} + +pub async fn display_wallet_balances( + rpc: &RpcClient, + wallet_address: &Pubkey, + token_mint_a_address: &Pubkey, + token_mint_b_address: &Pubkey, +) -> Result<(), Box> { + let token_a_balance = fetch_token_balance(rpc, wallet_address, token_mint_a_address).await?; + let token_b_balance = fetch_token_balance(rpc, wallet_address, token_mint_b_address).await?; + + println!( + "Wallet Balances: \n\ + - Token A ({:?}): {} \n\ + - Token B ({:?}): {}", + token_mint_a_address, token_a_balance, token_mint_b_address, token_b_balance + ); + + Ok(()) +} + +pub async fn fetch_token_balance( + rpc: &RpcClient, + wallet_address: &Pubkey, + token_mint_address: &Pubkey, +) -> Result> { + Retry::spawn(retry_strategy(), || async { + let mint_account = rpc.get_account(token_mint_address).await?; + let token_program_id = mint_account.owner; + let token_address = get_associated_token_address_with_program_id( + wallet_address, + token_mint_address, + &token_program_id, + ); + let balance = rpc.get_token_account_balance(&token_address).await?; + Ok(balance.ui_amount_string) + }) + .await +} + +pub async fn fetch_position( + rpc: &RpcClient, + position_address: &Pubkey, +) -> Result> { + Retry::spawn(retry_strategy(), || async { + let position_account = rpc.get_account(position_address).await?; + let position = Position::from_bytes(&position_account.data)?; + Ok(position) + }) + .await +} + +pub async fn fetch_whirlpool( + rpc: &RpcClient, + whirlpool_address: &Pubkey, +) -> Result> { + Retry::spawn(retry_strategy(), || async { + let whirlpool_account = rpc.get_account(whirlpool_address).await?; + let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data)?; + Ok(whirlpool) + }) + .await +} + +pub async fn fetch_mint(rpc: &RpcClient, mint_address: &Pubkey) -> Result> { + Retry::spawn(retry_strategy(), || async { + let mint_account = rpc.get_account(mint_address).await?; + let mint = Mint::unpack(&mint_account.data)?; + Ok(mint) + }) + .await +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] +pub enum PriorityFeeTier { + None, + Low, + Medium, + High, + Turbo, +} + +pub async fn send_transaction( + rpc: &RpcClient, + wallet: &dyn Signer, + instructions: Vec, + additional_signers: Vec<&dyn Signer>, + tier: PriorityFeeTier, + max_priority_fee: u64, +) -> Result> { + Retry::spawn(retry_strategy(), || async { + let mut all_instructions = vec![]; + + let recent_blockhash = rpc.get_latest_blockhash().await?; + + let compute_unit_instructions = get_compute_unit_instructions( + rpc, + &instructions, + wallet, + &additional_signers, + tier, + max_priority_fee, + recent_blockhash, + ) + .await?; + all_instructions.extend(compute_unit_instructions); + + all_instructions.extend(instructions.clone()); + + let message = Message::new(&all_instructions, Some(&wallet.pubkey())); + let mut all_signers = vec![wallet]; + all_signers.extend(additional_signers.clone()); + + let transaction = Transaction::new(&all_signers, message, recent_blockhash); + let signature = rpc.send_and_confirm_transaction(&transaction).await?; + Ok(signature) + }) + .await +} + +pub async fn get_compute_unit_instructions( + rpc: &RpcClient, + instructions: &[solana_sdk::instruction::Instruction], + wallet: &dyn Signer, + additional_signers: &[&dyn Signer], + tier: PriorityFeeTier, + max_priority_fee_lamports: u64, + recent_blockhash: solana_sdk::hash::Hash, +) -> Result, Box> { + let mut compute_unit_instructions = vec![]; + + let message = Message::new(instructions, Some(&wallet.pubkey())); + let mut signers = vec![wallet]; + signers.extend(additional_signers); + + let transaction = Transaction::new(&signers, message, recent_blockhash); + let simulated_transaction = rpc.simulate_transaction(&transaction).await?; + + if let Some(units_consumed) = simulated_transaction.value.units_consumed { + let units_margin = std::cmp::max(100_000, (units_consumed as f32 * 0.2).ceil() as u32); + let units_consumed_safe = units_consumed as u32 + units_margin; + let compute_limit_instruction = + ComputeBudgetInstruction::set_compute_unit_limit(units_consumed_safe); + compute_unit_instructions.push(compute_limit_instruction); + + if let Some(priority_fee_micro_lamports) = calculate_priority_fee(rpc, tier).await? { + let mut compute_unit_price = priority_fee_micro_lamports; + let total_priority_fee_lamports = + (units_consumed as u64 * priority_fee_micro_lamports) / 1_000_000; + + if total_priority_fee_lamports > max_priority_fee_lamports { + compute_unit_price = (max_priority_fee_lamports * 1_000_000) / units_consumed; + } + + display_priority_fee_details( + compute_unit_price, + units_consumed, + (units_consumed as u64 * compute_unit_price) / 1_000_000, + ); + + let priority_fee_instruction = + ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price); + compute_unit_instructions.push(priority_fee_instruction); + } + } + + Ok(compute_unit_instructions) +} + +fn display_priority_fee_details( + compute_unit_price: u64, + units_consumed: u64, + total_priority_fee_lamports: u64, +) { + println!( + "Priority Fee Details:\n\ + - Compute Unit Price: {} microlamports\n\ + - Compute Units Consumed: {}\n\ + - Total Priority Fee: {} lamports", + compute_unit_price, units_consumed, total_priority_fee_lamports + ); +} + +async fn calculate_priority_fee( + rpc: &RpcClient, + tier: PriorityFeeTier, +) -> Result, Box> { + let prioritization_fees = rpc.get_recent_prioritization_fees(&[]).await.unwrap(); + + if prioritization_fees.is_empty() || matches!(tier, PriorityFeeTier::None) { + return Ok(None); + } + let mut fees: Vec = prioritization_fees + .iter() + .map(|fee| fee.prioritization_fee) + .collect(); + if fees.is_empty() { + return Ok(Some(0)); + } + fees.sort_unstable(); + + let fee = match tier { + PriorityFeeTier::Low => fees.get(fees.len() / 4).cloned(), + PriorityFeeTier::Medium => fees.get(fees.len() / 2).cloned(), + PriorityFeeTier::High => fees.get((fees.len() * 3) / 4).cloned(), + PriorityFeeTier::Turbo => fees.get((fees.len() * 95) / 100).cloned(), + PriorityFeeTier::None => None, + }; + + Ok(fee) +} + +fn retry_strategy() -> std::iter::Take { + ExponentialBackoff::from_millis(100) + .max_delay(Duration::from_secs(2)) + .take(3) +} diff --git a/examples/rust-sdk/lp-bot/src/wallet.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/wallet.rs similarity index 100% rename from examples/rust-sdk/lp-bot/src/wallet.rs rename to examples/rust-sdk/whirlpool_repositioning_bot/src/wallet.rs diff --git a/examples/next/README.md b/examples/ts-sdk/next/README.md similarity index 100% rename from examples/next/README.md rename to examples/ts-sdk/next/README.md diff --git a/examples/next/app/layout.tsx b/examples/ts-sdk/next/app/layout.tsx similarity index 100% rename from examples/next/app/layout.tsx rename to examples/ts-sdk/next/app/layout.tsx diff --git a/examples/next/app/page.tsx b/examples/ts-sdk/next/app/page.tsx similarity index 100% rename from examples/next/app/page.tsx rename to examples/ts-sdk/next/app/page.tsx diff --git a/examples/next/next-env.d.ts b/examples/ts-sdk/next/next-env.d.ts similarity index 100% rename from examples/next/next-env.d.ts rename to examples/ts-sdk/next/next-env.d.ts diff --git a/examples/next/next.config.js b/examples/ts-sdk/next/next.config.js similarity index 91% rename from examples/next/next.config.js rename to examples/ts-sdk/next/next.config.js index f37ba34b..ddb328a8 100644 --- a/examples/next/next.config.js +++ b/examples/ts-sdk/next/next.config.js @@ -12,7 +12,7 @@ const nextConfig = { config.plugins.push( new CopyWebpackPlugin({ patterns: [{ - from: "../../ts-sdk/core/dist/nodejs/orca_whirlpools_core_js_bindings_bg.wasm", + from: "../../../ts-sdk/core/dist/nodejs/orca_whirlpools_core_js_bindings_bg.wasm", to: "./server/app" }], }) diff --git a/examples/next/package.json b/examples/ts-sdk/next/package.json similarity index 91% rename from examples/next/package.json rename to examples/ts-sdk/next/package.json index 802de6bc..d778ecc5 100644 --- a/examples/next/package.json +++ b/examples/ts-sdk/next/package.json @@ -1,5 +1,5 @@ { - "name": "@orca-so/whirlpools-next-example", + "name": "@orca-so/whirlpools-example-ts-next", "version": "0.1.0", "type": "module", "scripts": { diff --git a/examples/next/tsconfig.json b/examples/ts-sdk/next/tsconfig.json similarity index 89% rename from examples/next/tsconfig.json rename to examples/ts-sdk/next/tsconfig.json index cf6a23d3..5fdf71fd 100644 --- a/examples/next/tsconfig.json +++ b/examples/ts-sdk/next/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../../tsconfig.json", "compilerOptions": { "outDir": "./dist", "jsx": "preserve", diff --git a/nx.json b/nx.json index 1ac33171..9964a7c5 100644 --- a/nx.json +++ b/nx.json @@ -16,5 +16,12 @@ } }, "$schema": "./node_modules/nx/schemas/nx-schema.json", - "defaultBase": "main" + "defaultBase": "main", + "projects": { + "whirlpools-example-rust-repositioning-bot": { + "root": "examples/rust-sdk/whirlpools-example-rust-repositioning-bot", + "sourceRoot": "examples/rust-sdk/whirlpools-example-rust-repositioning-bot", + "projectType": "application" + } + } } diff --git a/package.json b/package.json index 7f885c80..666d9643 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "rust-sdk/*", "ts-sdk/*", "legacy-sdk/*", - "examples/*", + "examples/ts-sdk/*", + "examples/rust-sdk/*", "docs/*" ], "lint-staged": { diff --git a/yarn.lock b/yarn.lock index 89fee776..42a79841 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,46 +5,46 @@ __metadata: version: 8 cacheKey: 10c0 -"@algolia/autocomplete-core@npm:1.17.6": - version: 1.17.6 - resolution: "@algolia/autocomplete-core@npm:1.17.6" +"@algolia/autocomplete-core@npm:1.17.7": + version: 1.17.7 + resolution: "@algolia/autocomplete-core@npm:1.17.7" dependencies: - "@algolia/autocomplete-plugin-algolia-insights": "npm:1.17.6" - "@algolia/autocomplete-shared": "npm:1.17.6" - checksum: 10c0/4979f841533241c7aa0e6da7f9858727ec2b027d4f3d1dc1bac72473390695772c096c1a413500ccd3e58ed525ce1b13558c149bdf72646611a9e0d9c15a622e + "@algolia/autocomplete-plugin-algolia-insights": "npm:1.17.7" + "@algolia/autocomplete-shared": "npm:1.17.7" + checksum: 10c0/603e0f0157eed71a8fabfba2d14ca846e399dc4e10bc300eb2f018529f9ac68f689193f582b6e97828e01bb150c045bb7d251aa40950a058a191dc560895ed98 languageName: node linkType: hard -"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.6": - version: 1.17.6 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.6" +"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.7": + version: 1.17.7 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.7" dependencies: - "@algolia/autocomplete-shared": "npm:1.17.6" + "@algolia/autocomplete-shared": "npm:1.17.7" peerDependencies: search-insights: ">= 1 < 3" - checksum: 10c0/0220b38e4d4e027bebdf51554fca39dbfc853d861caef22dac21e1ba68054191bb177902e06f1cd0c3395eb5746f555d451906b46327eb1fb9ea1796bb812aac + checksum: 10c0/4f0f6b87ca76ea2fb45bfaa8a14c206d5bead60962b80bad10fd26928a37835d61a7420cbfd07cc2f1eb027b23b2e14f5796acfc35a74a9f51653367ee95e506 languageName: node linkType: hard -"@algolia/autocomplete-preset-algolia@npm:1.17.6": - version: 1.17.6 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.6" +"@algolia/autocomplete-preset-algolia@npm:1.17.7": + version: 1.17.7 + resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.7" dependencies: - "@algolia/autocomplete-shared": "npm:1.17.6" + "@algolia/autocomplete-shared": "npm:1.17.7" peerDependencies: "@algolia/client-search": ">= 4.9.1 < 6" algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/b4cc10997a702d8c544ec3bd7c87d9b0005546fd1b2db580a2f623f65e1d49640c42b78e7a27a15daf0329263e372d671e27c9ff7ca0257e9be6160912e476a0 + checksum: 10c0/eb20746cbba532f8ade62fb48b7d2b6e9b2e0b5acc33bc80071630d3da724d78242de9c06cf838bef402ce2a912e86ab018bd2f6728ecb0f981a22c65bbbb2cb languageName: node linkType: hard -"@algolia/autocomplete-shared@npm:1.17.6": - version: 1.17.6 - resolution: "@algolia/autocomplete-shared@npm:1.17.6" +"@algolia/autocomplete-shared@npm:1.17.7": + version: 1.17.7 + resolution: "@algolia/autocomplete-shared@npm:1.17.7" peerDependencies: "@algolia/client-search": ">= 4.9.1 < 6" algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/1489a6111ad8e083df93c0393701679af1180b4f4bbffc7170f254e755365624fbe706ec8452054f829807c12ffd89437c5e1afcdaced3b0ebfdeac52eea387c + checksum: 10c0/9eb0c3ab57c7bae5b9c1d4c5c58dfdab56d1f4591f7488bd3d1dfd372eb8fa03416c97e247a3fcd581cda075eaea8b973dcfa306a8085c67d71f14513e3f5c5b languageName: node linkType: hard @@ -73,15 +73,15 @@ __metadata: languageName: node linkType: hard -"@algolia/client-abtesting@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/client-abtesting@npm:5.13.0" +"@algolia/client-abtesting@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/client-abtesting@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/d1e8d67dbfa070d702b28e5c45fc7e917e8c731a0ba4ee82a57e0a0e256e1dc3f507fa5561b301259cde4a3e3fab895abd50d12fa25ce7d735c50769c5526d21 + "@algolia/client-common": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/0fcb06e8502fbc15f35db47c6cdfa8c405c9a1751050b56966cfb67e59022b64138f19f02f6de62bb90d9f72ffd400fd8998830fc1bd8dfe7f7391c36c3166c4 languageName: node linkType: hard @@ -108,15 +108,15 @@ __metadata: languageName: node linkType: hard -"@algolia/client-analytics@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/client-analytics@npm:5.13.0" +"@algolia/client-analytics@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/client-analytics@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/23e2ee1368e064b9bfd5bedb3e5caf5a24474c6c24c0353a09a3457ce8ab5d32839036c71de790b6ca6b26bf2c1cd068c262c8a6e9e9a8474f883d04e118203a + "@algolia/client-common": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/c46d6fff92dd99b00baafedb500d6784b502cbf26b3ebcd0d1a05b8d26f93aab4cf1fa38b87612a21c0dbb30aee985d10a5016e555353fb73c249f93982e110f languageName: node linkType: hard @@ -130,22 +130,22 @@ __metadata: languageName: node linkType: hard -"@algolia/client-common@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/client-common@npm:5.13.0" - checksum: 10c0/83fc7b29f28c181214d8846b49dba93691871260e14d290d64de3bc74c4ce40eb40d4caed6a686128ae879f6a6b97bb936b60f82f9ca044fb18da6e8479bb7f0 +"@algolia/client-common@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/client-common@npm:5.15.0" + checksum: 10c0/94b1cbc12a453baf18306cf53e7da318bf46e3c0d0cae9763dbf7bd6a3c1ba0ee9046c087f31daf0e0a0cfd233d4b4bd4365c1ef8dcb85e9948a0791f7321df2 languageName: node linkType: hard -"@algolia/client-insights@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/client-insights@npm:5.13.0" +"@algolia/client-insights@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/client-insights@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/484e533935c0edb67826cb1c7494a758925dacda447dec79318a0d2d9acdcaaf459e0e03cf67a6e1fc12f4db98120f80f4782ac38585beba859ef25fd95c4d76 + "@algolia/client-common": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/e0a73f14be8d147d2ff65bb98245cdd8c0262d200f2ac19274b88fbd871e87686909731871af344cf0ff719c83915b003948b69d79b02e9c36e79eef2e776e4d languageName: node linkType: hard @@ -160,27 +160,27 @@ __metadata: languageName: node linkType: hard -"@algolia/client-personalization@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/client-personalization@npm:5.13.0" +"@algolia/client-personalization@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/client-personalization@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/8ff33e742ef67e2c4d0369de0fc6761f8dd0bc67d86d9f430736bc5fc60be1f567d01410e27f792fab6f457ab77b7f5d5e973e220e2cc504bf07fca8e790262e + "@algolia/client-common": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/4a276fc8477d7a45abc631548f7512988ea0270b4376df1e608382f4e79e4d9984c7946d50d9eed223d41dd227cb9be0a6d9ee217e4cc7c8a9c020d8097d53ec languageName: node linkType: hard -"@algolia/client-query-suggestions@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/client-query-suggestions@npm:5.13.0" +"@algolia/client-query-suggestions@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/client-query-suggestions@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/735a8ed20e456be71fdc35a679cd317c752ccfedb0e05e7a5fa95deebe74db913eeba03302bd55d7f7f8c7f4574137bafa792dfef7b7bde6dc3f9c6ef51c39a5 + "@algolia/client-common": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/4e891a37c8cba8ea64e615a27929387d57036452b1dd0bc0af562c33f8c08915ce9886e8a0eee7497e4669945a89c772e23b6e626baa352e492f3a18e5eb6220 languageName: node linkType: hard @@ -195,15 +195,15 @@ __metadata: languageName: node linkType: hard -"@algolia/client-search@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/client-search@npm:5.13.0" +"@algolia/client-search@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/client-search@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/ae80bd92487fb70bae318ed99cea57dccf62f4c1b53999e2621e1d3f8e08aadd3771c45becbe39c0b569e812daf09a271544e9b269a6dcd0f88383cdfabb6374 + "@algolia/client-common": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/5121547beca7affa6568658a5c1eceec636ba1af7a76fd450d1bcb95ed8a41a21c34947cc5f5053fa55c6fab7449b79b8c128a52f8f192677b0707b6a2692a44 languageName: node linkType: hard @@ -214,15 +214,15 @@ __metadata: languageName: node linkType: hard -"@algolia/ingestion@npm:1.13.0": - version: 1.13.0 - resolution: "@algolia/ingestion@npm:1.13.0" +"@algolia/ingestion@npm:1.15.0": + version: 1.15.0 + resolution: "@algolia/ingestion@npm:1.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/79ad1c1f97267cb5c0ab011215519e89554573523c16f77f1c66ba891459e8e54537a7c2fe14d81c69767b2eaeab0c69f42476ff0761b13a44d5133e865ba60c + "@algolia/client-common": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/0fdc41f9be87e37dc6a8e493718929932eb051b22002f911efe76836b1ef05be0585d39ac2d2face94a03f443efbde574b8065e537fa8aa4378aadf1c7e571be languageName: node linkType: hard @@ -242,15 +242,15 @@ __metadata: languageName: node linkType: hard -"@algolia/monitoring@npm:1.13.0": - version: 1.13.0 - resolution: "@algolia/monitoring@npm:1.13.0" +"@algolia/monitoring@npm:1.15.0": + version: 1.15.0 + resolution: "@algolia/monitoring@npm:1.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/d2857cad2231497c3c2f259e7b62b2742fa3e49083fefd2295e6a3ebbaa69c7279bc487a86d6253e0a9c5a7ebf77b85a9d613da077252283da88c4b5d719a65a + "@algolia/client-common": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/07f7fc607ee42e39e09a84686e30767fe83601b407a98918fd8eb9ae7a9c6a6ab7d817140d6c2565416082926bc9860214b70d398cd60974efd7925946e315ba languageName: node linkType: hard @@ -273,15 +273,15 @@ __metadata: languageName: node linkType: hard -"@algolia/recommend@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/recommend@npm:5.13.0" +"@algolia/recommend@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/recommend@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/dcc7d860a3a70e38270fbc763c49e5372254171ac059abe65e2713bc1d4551e533137f74eeec63358883f55e83168f95c93c37a79af6fa3718f95e86af64164b + "@algolia/client-common": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/05711b83cfd943a5020ca1322444e46ab99a855f25d24c7f22a99f2eb511674a84d0614e27e42292f3f7fb9a6665a1f3bcdbc9e309cd30368b8f77d51f2442da languageName: node linkType: hard @@ -294,12 +294,12 @@ __metadata: languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/requester-browser-xhr@npm:5.13.0" +"@algolia/requester-browser-xhr@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/requester-browser-xhr@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - checksum: 10c0/01f2f996a55a1c5fc56c1ee3a57aff99ff54a1039d81bea7306eee9718671d75b9c563c0c1e33378afa4c90b162c396bcda606b845122208c25539c05549b99f + "@algolia/client-common": "npm:5.15.0" + checksum: 10c0/f3488c540abdbc653bdd0e671dc32c91bf5252c374dea4066987043fba9b63902801fe8292ed584af295274e06417b8f8deafc7b06229eba095d8b77baeadda2 languageName: node linkType: hard @@ -310,12 +310,12 @@ __metadata: languageName: node linkType: hard -"@algolia/requester-fetch@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/requester-fetch@npm:5.13.0" +"@algolia/requester-fetch@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/requester-fetch@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - checksum: 10c0/8b31f57807d2511d8c054c693d0bb5fd63afe11486a388537c9078a1a2ee0b675336cc093da086b37deabfe3b3ab1e62f505b74c65471ea57199508d3a7614bd + "@algolia/client-common": "npm:5.15.0" + checksum: 10c0/d38f657f7b90fdcd0a9fb43c0bb222ed3533d461f426b2a07b0df9cc307791bc5755d3fd56eb8c938a935aeb96466c7dc16c8b3fa929218849831cab5b600114 languageName: node linkType: hard @@ -328,12 +328,12 @@ __metadata: languageName: node linkType: hard -"@algolia/requester-node-http@npm:5.13.0": - version: 5.13.0 - resolution: "@algolia/requester-node-http@npm:5.13.0" +"@algolia/requester-node-http@npm:5.15.0": + version: 5.15.0 + resolution: "@algolia/requester-node-http@npm:5.15.0" dependencies: - "@algolia/client-common": "npm:5.13.0" - checksum: 10c0/622af41e08053488f84ccce13fa56c5886f7e774365b9baaa03d4ab02b72953974b8c58c1d6c60ffd5daec83397465f3d5c86b68d3826b778c0d685451cee74a + "@algolia/client-common": "npm:5.15.0" + checksum: 10c0/06f7b48e6ae1c57cd64beaedb5c9b417f912c4c7487cf06a8fef424077be3b844a4a5bbf7e45db8611f21ebfc2f7b5b16bbf46a8ebe372786a0ec001e37ae374 languageName: node linkType: hard @@ -358,7 +358,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.8.3": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -370,9 +370,9 @@ __metadata: linkType: hard "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0": - version: 7.26.2 - resolution: "@babel/compat-data@npm:7.26.2" - checksum: 10c0/c9b5f3724828d17f728a778f9d66c19b55c018d0d76de6d731178cca64f182c22b71400a73bf2b65dcc4fcfe52b630088a94d5902911b54206aa90e3ffe07d12 + version: 7.26.3 + resolution: "@babel/compat-data@npm:7.26.3" + checksum: 10c0/d63e71845c34dfad8d7ff8c15b562e620dbf60e68e3abfa35681d24d612594e8e5ec9790d831a287ecd79ce00f48e7ffddc85c5ce94af7242d45917b9c1a5f90 languageName: node linkType: hard @@ -399,16 +399,16 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": - version: 7.26.2 - resolution: "@babel/generator@npm:7.26.2" +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/generator@npm:7.26.3" dependencies: - "@babel/parser": "npm:^7.26.2" - "@babel/types": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.3" + "@babel/types": "npm:^7.26.3" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10c0/167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c + checksum: 10c0/54f260558e3e4ec8942da3cde607c35349bb983c3a7c5121243f96893fba3e8cd62e1f1773b2051f936f8c8a10987b758d5c7d76dbf2784e95bb63ab4843fa00 languageName: node linkType: hard @@ -421,16 +421,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/a6068bb813e7f72d12b72edeecb99167f60cd7964cacedfb60e01fff5e7bed4a5a7f4f7414de7cf352a1b71487df5f8dab8c2b5230de4ad5aea16adf32e14219 - languageName: node - linkType: hard - "@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-compilation-targets@npm:7.25.9" @@ -462,21 +452,21 @@ __metadata: linkType: hard "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.9" + version: 7.26.3 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.26.3" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.25.9" - regexpu-core: "npm:^6.1.1" + regexpu-core: "npm:^6.2.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/3adc60a758febbf07d65a15eaccab1f7b9fcc55e7141e59122f13c9f81fc0d1cce4525b7f4af50285d27c93b34c859fd2c39c39820c5fb92211898c3bbdc77ef + checksum: 10c0/266f30b99af621559467ed67634cb653408a9262930c0627c3d17691a9d477329fb4dabe4b1785cbf0490e892513d247836674271842d6a8da49fd0afae7d435 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.2": - version: 0.6.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" +"@babel/helper-define-polyfill-provider@npm:^0.6.2, @babel/helper-define-polyfill-provider@npm:^0.6.3": + version: 0.6.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.3" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -485,7 +475,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/f777fe0ee1e467fdaaac059c39ed203bdc94ef2465fb873316e9e1acfc511a276263724b061e3b0af2f6d7ad3ff174f2bb368fde236a860e0f650fda43d7e022 + checksum: 10c0/4320e3527645e98b6a0d5626fef815680e3b2b03ec36045de5e909b0f01546ab3674e96f50bf3bc8413f8c9037e5ee1a5f560ebdf8210426dad1c2c03c96184a languageName: node linkType: hard @@ -564,16 +554,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-simple-access@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/3f1bcdb88ee3883ccf86959869a867f6bbf8c4737cd44fb9f799c38e54f67474590bc66802500ae9fe18161792875b2cfb7ec15673f48ed6c8663f6d09686ca8 - languageName: node - linkType: hard - "@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" @@ -626,14 +606,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": - version: 7.26.2 - resolution: "@babel/parser@npm:7.26.2" +"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/parser@npm:7.26.3" dependencies: - "@babel/types": "npm:^7.26.0" + "@babel/types": "npm:^7.26.3" bin: parser: ./bin/babel-parser.js - checksum: 10c0/751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 + checksum: 10c0/48f736374e61cfd10ddbf7b80678514ae1f16d0e88bc793d2b505d73d9b987ea786fc8c2f7ee8f8b8c467df062030eb07fd0eb2168f0f541ca1f542775852cad languageName: node linkType: hard @@ -941,14 +921,13 @@ __metadata: linkType: hard "@babel/plugin-transform-exponentiation-operator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.25.9" + version: 7.26.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.25.9" "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3b42f65bab3fee28c385115ce6bcb6ba544dff187012df408a432c9fb44c980afd898911020c723dc1c9257aaf3d7d0131ad83ba15102bf30ad9a86fc2a8a912 + checksum: 10c0/cac922e851c6a0831fdd2e3663564966916015aeff7f4485825fc33879cbc3a313ceb859814c9200248e2875d65bb13802a723e5d7d7b40a2e90da82a5a1e15c languageName: node linkType: hard @@ -1045,15 +1024,14 @@ __metadata: linkType: hard "@babel/plugin-transform-modules-commonjs@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.25.9" + version: 7.26.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.26.0" "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-simple-access": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6ce771fb04d4810257fc8900374fece877dacaed74b05eaa16ad9224b390f43795c4d046cbe9ae304e1eb5aad035d37383895e3c64496d647c2128d183916e74 + checksum: 10c0/82e59708f19f36da29531a64a7a94eabbf6ff46a615e0f5d9b49f3f59e8ef10e2bac607d749091508d3fa655146c9e5647c3ffeca781060cdabedb4c7a33c6f2 languageName: node linkType: hard @@ -1391,8 +1369,8 @@ __metadata: linkType: hard "@babel/plugin-transform-typescript@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-typescript@npm:7.25.9" + version: 7.26.3 + resolution: "@babel/plugin-transform-typescript@npm:7.26.3" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.25.9" "@babel/helper-create-class-features-plugin": "npm:^7.25.9" @@ -1401,7 +1379,7 @@ __metadata: "@babel/plugin-syntax-typescript": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c607ddb45f7e33cfcb928aad05cb1b18b1ecb564d2329d8f8e427f75192511aa821dee42d26871f1bdffbd883853e150ba81436664646c6e6b13063e65ce1475 + checksum: 10c0/0a0509ec56666fab5b557d573254665956a377916fc1e7cee309c0711d11257338ba7ee678db03603a3985d2c6c0b210b788fb6b9616d8fc0595469e39089a8f languageName: node linkType: hard @@ -1545,8 +1523,8 @@ __metadata: linkType: hard "@babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/preset-react@npm:7.25.9" + version: 7.26.3 + resolution: "@babel/preset-react@npm:7.26.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.25.9" "@babel/helper-validator-option": "npm:^7.25.9" @@ -1556,7 +1534,7 @@ __metadata: "@babel/plugin-transform-react-pure-annotations": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/c294b475ee741f01f63ea0d828862811c453fabc6023f01814ce983bc316388e9d73290164d2b1384c2684db9c330803a3d4d2170285b105dcbacd483329eb93 + checksum: 10c0/b470dcba11032ef6c832066f4af5c75052eaed49feb0f445227231ef1b5c42aacd6e216988c0bd469fd5728cd27b6b059ca307c9ecaa80c6bb5da4bf1c833e12 languageName: node linkType: hard @@ -1606,27 +1584,27 @@ __metadata: linkType: hard "@babel/traverse@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/traverse@npm:7.25.9" + version: 7.26.3 + resolution: "@babel/traverse@npm:7.26.3" dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/generator": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.3" + "@babel/parser": "npm:^7.26.3" "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" + "@babel/types": "npm:^7.26.3" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 + checksum: 10c0/f56765b18425e41970c03ae56a05ddc45807d0861408ecaaa1684368a57fb20b27c79c7d95d7086b9ab7b8c7ddd75527f373b10b0fe08e29218e67f8e677abd3 languageName: node linkType: hard -"@babel/types@npm:^7.21.3, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.4.4": - version: 7.26.0 - resolution: "@babel/types@npm:7.26.0" +"@babel/types@npm:^7.21.3, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.3, @babel/types@npm:^7.4.4": + version: 7.26.3 + resolution: "@babel/types@npm:7.26.3" dependencies: "@babel/helper-string-parser": "npm:^7.25.9" "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 + checksum: 10c0/966c5242c5e55c8704bf7a7418e7be2703a0afa4d19a8480999d5a4ef13d095dd60686615fe5983cb7593b4b06ba3a7de8d6ca501c1d78bdd233a10d90be787b languageName: node linkType: hard @@ -2284,20 +2262,20 @@ __metadata: languageName: node linkType: hard -"@docsearch/css@npm:3.7.0": - version: 3.7.0 - resolution: "@docsearch/css@npm:3.7.0" - checksum: 10c0/d8e204eec9e982ad41d0d77fd4c054e5525cdd2fb68b1ceffd93f5a4845836770caefe47cd699e636c8c4ec2c52d7a1c42e9d96e4baabb02402bd868224a7638 +"@docsearch/css@npm:3.8.0": + version: 3.8.0 + resolution: "@docsearch/css@npm:3.8.0" + checksum: 10c0/eda8801f48a0b0c987d69c611bf76887fa64bc49e36870667af67c430ef344df4b02ad248067c87cc7ae148e67f880109dfaa450a73b0988dbe77cced243932c languageName: node linkType: hard "@docsearch/react@npm:^3.5.2": - version: 3.7.0 - resolution: "@docsearch/react@npm:3.7.0" + version: 3.8.0 + resolution: "@docsearch/react@npm:3.8.0" dependencies: - "@algolia/autocomplete-core": "npm:1.17.6" - "@algolia/autocomplete-preset-algolia": "npm:1.17.6" - "@docsearch/css": "npm:3.7.0" + "@algolia/autocomplete-core": "npm:1.17.7" + "@algolia/autocomplete-preset-algolia": "npm:1.17.7" + "@docsearch/css": "npm:3.8.0" algoliasearch: "npm:^5.12.0" peerDependencies: "@types/react": ">= 16.8.0 < 19.0.0" @@ -2313,7 +2291,7 @@ __metadata: optional: true search-insights: optional: true - checksum: 10c0/6bcc168bd0dcce5083e6e8ccd9b9f0404ded20399d067ca9e743a9903cdb59500b178f9ce4e342ef65c8f442f0841725700d14990e2501a92ceac7af2ac2e653 + checksum: 10c0/9b7b4e17a5ef5173853ec701b954e0881e29955ba380401014bc4359c752d36c48381b8053266172a73c870f4789c22d28285dd450eb129d99456c533cd69a13 languageName: node linkType: hard @@ -2902,6 +2880,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/aix-ppc64@npm:0.23.1" @@ -2916,6 +2901,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/android-arm64@npm:0.23.1" @@ -2930,6 +2922,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/android-arm@npm:0.23.1" @@ -2944,6 +2943,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/android-x64@npm:0.23.1" @@ -2958,6 +2964,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/darwin-arm64@npm:0.23.1" @@ -2972,6 +2985,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/darwin-x64@npm:0.23.1" @@ -2986,6 +3006,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/freebsd-arm64@npm:0.23.1" @@ -3000,6 +3027,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/freebsd-x64@npm:0.23.1" @@ -3014,6 +3048,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/linux-arm64@npm:0.23.1" @@ -3028,6 +3069,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/linux-arm@npm:0.23.1" @@ -3042,6 +3090,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/linux-ia32@npm:0.23.1" @@ -3056,6 +3111,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/linux-loong64@npm:0.23.1" @@ -3070,6 +3132,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/linux-mips64el@npm:0.23.1" @@ -3084,6 +3153,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/linux-ppc64@npm:0.23.1" @@ -3098,6 +3174,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/linux-riscv64@npm:0.23.1" @@ -3112,6 +3195,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/linux-s390x@npm:0.23.1" @@ -3126,6 +3216,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/linux-x64@npm:0.23.1" @@ -3140,6 +3237,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/netbsd-x64@npm:0.23.1" @@ -3168,6 +3272,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/openbsd-x64@npm:0.23.1" @@ -3182,6 +3293,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/sunos-x64@npm:0.23.1" @@ -3196,6 +3314,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/win32-arm64@npm:0.23.1" @@ -3210,6 +3335,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/win32-ia32@npm:0.23.1" @@ -3224,6 +3356,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.23.1": version: 0.23.1 resolution: "@esbuild/win32-x64@npm:0.23.1" @@ -3257,20 +3396,22 @@ __metadata: linkType: hard "@eslint/config-array@npm:^0.19.0": - version: 0.19.0 - resolution: "@eslint/config-array@npm:0.19.0" + version: 0.19.1 + resolution: "@eslint/config-array@npm:0.19.1" dependencies: - "@eslint/object-schema": "npm:^2.1.4" + "@eslint/object-schema": "npm:^2.1.5" debug: "npm:^4.3.1" minimatch: "npm:^3.1.2" - checksum: 10c0/def23c6c67a8f98dc88f1b87e17a5668e5028f5ab9459661aabfe08e08f2acd557474bbaf9ba227be0921ae4db232c62773dbb7739815f8415678eb8f592dbf5 + checksum: 10c0/43b01f596ddad404473beae5cf95c013d29301c72778d0f5bf8a6699939c8a9a5663dbd723b53c5f476b88b0c694f76ea145d1aa9652230d140fe1161e4a4b49 languageName: node linkType: hard "@eslint/core@npm:^0.9.0": - version: 0.9.0 - resolution: "@eslint/core@npm:0.9.0" - checksum: 10c0/6d8e8e0991cef12314c49425d8d2d9394f5fb1a36753ff82df7c03185a4646cb7c8736cf26638a4a714782cedf4b23cfc17667d282d3e5965b3920a0e7ce20d4 + version: 0.9.1 + resolution: "@eslint/core@npm:0.9.1" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10c0/638104b1b5833a9bbf2329f0c0ddf322e4d6c0410b149477e02cd2b78c04722be90c14b91b8ccdef0d63a2404dff72a17b6b412ce489ea429ae6a8fcb8abff28 languageName: node linkType: hard @@ -3291,37 +3432,37 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.15.0": - version: 9.15.0 - resolution: "@eslint/js@npm:9.15.0" - checksum: 10c0/56552966ab1aa95332f70d0e006db5746b511c5f8b5e0c6a9b2d6764ff6d964e0b2622731877cbc4e3f0e74c5b39191290d5f48147be19175292575130d499ab +"@eslint/js@npm:9.16.0": + version: 9.16.0 + resolution: "@eslint/js@npm:9.16.0" + checksum: 10c0/a55846a4ddade720662d36682f3eaaf38eac06eeee12c83bb837bba2b7d550dadcb3445b104219f0bc1da2e09b4fe5fb5ba123b8338c8c787bcfbd540878df75 languageName: node linkType: hard -"@eslint/object-schema@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/object-schema@npm:2.1.4" - checksum: 10c0/e9885532ea70e483fb007bf1275968b05bb15ebaa506d98560c41a41220d33d342e19023d5f2939fed6eb59676c1bda5c847c284b4b55fce521d282004da4dda +"@eslint/object-schema@npm:^2.1.5": + version: 2.1.5 + resolution: "@eslint/object-schema@npm:2.1.5" + checksum: 10c0/5320691ed41ecd09a55aff40ce8e56596b4eb81f3d4d6fe530c50fdd6552d88102d1c1a29d970ae798ce30849752a708772de38ded07a6f25b3da32ebea081d8 languageName: node linkType: hard "@eslint/plugin-kit@npm:^0.2.3": - version: 0.2.3 - resolution: "@eslint/plugin-kit@npm:0.2.3" + version: 0.2.4 + resolution: "@eslint/plugin-kit@npm:0.2.4" dependencies: levn: "npm:^0.4.1" - checksum: 10c0/89a8035976bb1780e3fa8ffe682df013bd25f7d102d991cecd3b7c297f4ce8c1a1b6805e76dd16465b5353455b670b545eff2b4ec3133e0eab81a5f9e99bd90f + checksum: 10c0/1bcfc0a30b1df891047c1d8b3707833bded12a057ba01757a2a8591fdc8d8fe0dbb8d51d4b0b61b2af4ca1d363057abd7d2fb4799f1706b105734f4d3fa0dbf1 languageName: node linkType: hard -"@gerrit0/mini-shiki@npm:^1.23.2": - version: 1.23.2 - resolution: "@gerrit0/mini-shiki@npm:1.23.2" +"@gerrit0/mini-shiki@npm:^1.24.0": + version: 1.24.1 + resolution: "@gerrit0/mini-shiki@npm:1.24.1" dependencies: - "@shikijs/engine-oniguruma": "npm:^1.23.1" - "@shikijs/types": "npm:^1.23.1" + "@shikijs/engine-oniguruma": "npm:^1.24.0" + "@shikijs/types": "npm:^1.24.0" "@shikijs/vscode-textmate": "npm:^9.3.0" - checksum: 10c0/e8800afd3917b16eff945cb0d2a21b2e5361f3c12456be56e3dec603fa77a8ebc7163948f367ae2d1ccf88d9009a30047da7e4220174b62fb6dda776d57852ac + checksum: 10c0/12cedece534f0aa1b665e5e305fe18ae5ee628af2a83e39491112be44fba0f630984f4e1d1254b57a1fa0aeece3d2d8ff016f58016b4bf1634df4dfe709495cc languageName: node linkType: hard @@ -3568,6 +3709,15 @@ __metadata: languageName: node linkType: hard +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + "@jest/expect-utils@npm:^29.7.0": version: 29.7.0 resolution: "@jest/expect-utils@npm:29.7.0" @@ -3787,18 +3937,25 @@ __metadata: linkType: hard "@noble/curves@npm:^1.4.2": - version: 1.6.0 - resolution: "@noble/curves@npm:1.6.0" + version: 1.7.0 + resolution: "@noble/curves@npm:1.7.0" dependencies: - "@noble/hashes": "npm:1.5.0" - checksum: 10c0/f3262aa4d39148e627cd82b5ac1c93f88c5bb46dd2566b5e8e52ffac3a0fc381ad30c2111656fd2bd3b0d37d43d540543e0d93a5ff96a6cb184bc3bfe10d1cd9 + "@noble/hashes": "npm:1.6.0" + checksum: 10c0/3317ec9b7699d2476707a89ceb3ddce60e69bac287561a31dd533669408633e093860fea5067eb9c54e5a7ced0705da1cba8859b6b1e0c48d3afff55fe2e77d0 languageName: node linkType: hard -"@noble/hashes@npm:1.5.0, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:^1.5.0": - version: 1.5.0 - resolution: "@noble/hashes@npm:1.5.0" - checksum: 10c0/1b46539695fbfe4477c0822d90c881a04d4fa2921c08c552375b444a48cac9930cb1ee68de0a3c7859e676554d0f3771999716606dc4d8f826e414c11692cdd9 +"@noble/hashes@npm:1.6.0": + version: 1.6.0 + resolution: "@noble/hashes@npm:1.6.0" + checksum: 10c0/e7e75898257fb36d933935fcdf1cc67ca7c083eb7b2411aa57fde7eb494c2cea0bec03686462032e25d5b0e1e4ab7357d1afb6718f6a68515db1f392141e9f14 + languageName: node + linkType: hard + +"@noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:^1.5.0": + version: 1.6.1 + resolution: "@noble/hashes@npm:1.6.1" + checksum: 10c0/27643cd8b551bc933b57cc29aa8c8763d586552fc4c3e06ecf7897f55be3463c0c9dff7f6ebacd88e5ce6d0cdb5415ca4874d0cf4359b5ea4a85be21ada03aab languageName: node linkType: hard @@ -3829,94 +3986,94 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" dependencies: agent-base: "npm:^7.1.0" http-proxy-agent: "npm:^7.0.0" https-proxy-agent: "npm:^7.0.1" lru-cache: "npm:^10.0.1" socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" dependencies: semver: "npm:^7.3.5" - checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 languageName: node linkType: hard -"@nx/nx-darwin-arm64@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-darwin-arm64@npm:20.1.3" +"@nx/nx-darwin-arm64@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-darwin-arm64@npm:20.1.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@nx/nx-darwin-x64@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-darwin-x64@npm:20.1.3" +"@nx/nx-darwin-x64@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-darwin-x64@npm:20.1.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@nx/nx-freebsd-x64@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-freebsd-x64@npm:20.1.3" +"@nx/nx-freebsd-x64@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-freebsd-x64@npm:20.1.4" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@nx/nx-linux-arm-gnueabihf@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-linux-arm-gnueabihf@npm:20.1.3" +"@nx/nx-linux-arm-gnueabihf@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-linux-arm-gnueabihf@npm:20.1.4" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@nx/nx-linux-arm64-gnu@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-linux-arm64-gnu@npm:20.1.3" +"@nx/nx-linux-arm64-gnu@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-linux-arm64-gnu@npm:20.1.4" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@nx/nx-linux-arm64-musl@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-linux-arm64-musl@npm:20.1.3" +"@nx/nx-linux-arm64-musl@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-linux-arm64-musl@npm:20.1.4" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@nx/nx-linux-x64-gnu@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-linux-x64-gnu@npm:20.1.3" +"@nx/nx-linux-x64-gnu@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-linux-x64-gnu@npm:20.1.4" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@nx/nx-linux-x64-musl@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-linux-x64-musl@npm:20.1.3" +"@nx/nx-linux-x64-musl@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-linux-x64-musl@npm:20.1.4" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@nx/nx-win32-arm64-msvc@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-win32-arm64-msvc@npm:20.1.3" +"@nx/nx-win32-arm64-msvc@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-win32-arm64-msvc@npm:20.1.4" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@nx/nx-win32-x64-msvc@npm:20.1.3": - version: 20.1.3 - resolution: "@nx/nx-win32-x64-msvc@npm:20.1.3" +"@nx/nx-win32-x64-msvc@npm:20.1.4": + version: 20.1.4 + resolution: "@nx/nx-win32-x64-msvc@npm:20.1.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4028,6 +4185,33 @@ __metadata: languageName: unknown linkType: soft +"@orca-so/whirlpools-example-rust-repositioning-bot@workspace:examples/rust-sdk/whirlpool_repositioning_bot": + version: 0.0.0-use.local + resolution: "@orca-so/whirlpools-example-rust-repositioning-bot@workspace:examples/rust-sdk/whirlpool_repositioning_bot" + dependencies: + "@orca-so/whirlpools-rust": "npm:*" + "@orca-so/whirlpools-rust-client": "npm:*" + "@orca-so/whirlpools-rust-core": "npm:*" + languageName: unknown + linkType: soft + +"@orca-so/whirlpools-example-ts-next@workspace:examples/ts-sdk/next": + version: 0.0.0-use.local + resolution: "@orca-so/whirlpools-example-ts-next@workspace:examples/ts-sdk/next" + dependencies: + "@next/bundle-analyzer": "npm:^15.0.3" + "@orca-so/whirlpools": "npm:*" + "@solana/web3.js": "npm:^2.0.0" + "@types/node": "npm:^22.10.1" + "@types/react": "npm:^18.3.12" + copy-webpack-plugin: "npm:^12.0.2" + next: "npm:^15.0.3" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" + typescript: "npm:^5.7.2" + languageName: unknown + linkType: soft + "@orca-so/whirlpools-integration@workspace:ts-sdk/integration": version: 0.0.0-use.local resolution: "@orca-so/whirlpools-integration@workspace:ts-sdk/integration" @@ -4063,23 +4247,6 @@ __metadata: languageName: unknown linkType: soft -"@orca-so/whirlpools-next-example@workspace:examples/next": - version: 0.0.0-use.local - resolution: "@orca-so/whirlpools-next-example@workspace:examples/next" - dependencies: - "@next/bundle-analyzer": "npm:^15.0.3" - "@orca-so/whirlpools": "npm:*" - "@solana/web3.js": "npm:^2.0.0" - "@types/node": "npm:^22.10.1" - "@types/react": "npm:^18.3.12" - copy-webpack-plugin: "npm:^12.0.2" - next: "npm:^15.0.3" - react: "npm:^18.3.1" - react-dom: "npm:^18.3.1" - typescript: "npm:^5.7.2" - languageName: unknown - linkType: soft - "@orca-so/whirlpools-program@npm:*, @orca-so/whirlpools-program@workspace:programs/whirlpool": version: 0.0.0-use.local resolution: "@orca-so/whirlpools-program@workspace:programs/whirlpool" @@ -4235,275 +4402,149 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.24.4" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm-eabi@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.27.4" +"@rollup/rollup-android-arm-eabi@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.28.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-android-arm64@npm:4.24.4" +"@rollup/rollup-android-arm64@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-android-arm64@npm:4.28.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-android-arm64@npm:4.27.4" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-darwin-arm64@npm:4.24.4" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-darwin-arm64@npm:4.27.4" +"@rollup/rollup-darwin-arm64@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.28.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-darwin-x64@npm:4.24.4" +"@rollup/rollup-darwin-x64@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.28.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-darwin-x64@npm:4.27.4" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-arm64@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.24.4" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-arm64@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.27.4" +"@rollup/rollup-freebsd-arm64@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.28.0" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-freebsd-x64@npm:4.24.4" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-x64@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-freebsd-x64@npm:4.27.4" +"@rollup/rollup-freebsd-x64@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.28.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.24.4" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.28.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.27.4" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-musleabihf@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.24.4" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-musleabihf@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.27.4" +"@rollup/rollup-linux-arm-musleabihf@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.28.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.24.4" +"@rollup/rollup-linux-arm64-gnu@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.28.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.27.4" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-musl@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.24.4" +"@rollup/rollup-linux-arm64-musl@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.28.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.27.4" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.4" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.4" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-gnu@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.24.4" +"@rollup/rollup-linux-riscv64-gnu@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.28.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.27.4" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.24.4" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.27.4" +"@rollup/rollup-linux-s390x-gnu@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.28.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.24.4" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.27.4" +"@rollup/rollup-linux-x64-gnu@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.28.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.24.4" +"@rollup/rollup-linux-x64-musl@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.28.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.27.4" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.24.4" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.27.4" +"@rollup/rollup-win32-arm64-msvc@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.28.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.24.4" +"@rollup/rollup-win32-ia32-msvc@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.28.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.27.4" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.24.4": - version: 4.24.4 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.24.4" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.27.4": - version: 4.27.4 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.27.4" +"@rollup/rollup-win32-x64-msvc@npm:4.28.0": + version: 4.28.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.28.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@shikijs/engine-oniguruma@npm:^1.23.1": - version: 1.23.1 - resolution: "@shikijs/engine-oniguruma@npm:1.23.1" +"@shikijs/engine-oniguruma@npm:^1.24.0": + version: 1.24.0 + resolution: "@shikijs/engine-oniguruma@npm:1.24.0" dependencies: - "@shikijs/types": "npm:1.23.1" + "@shikijs/types": "npm:1.24.0" "@shikijs/vscode-textmate": "npm:^9.3.0" - checksum: 10c0/834f64cb66c844763ae44f481d55c361f851ae0deec0edfb00e1de05959b6672cbfd9189a1c5943beacfb66468d6a2c788b8f5874360e80dc417109117e86d3a + checksum: 10c0/add369d9a945918cf52385fc21cf360ac23e7e1abff290e93b462737b3c26acc69001dc4d0c42c2105ca60d615cecd58ad9c1b9744d6c921d4e399025ce3fa6e languageName: node linkType: hard -"@shikijs/types@npm:1.23.1, @shikijs/types@npm:^1.23.1": - version: 1.23.1 - resolution: "@shikijs/types@npm:1.23.1" +"@shikijs/types@npm:1.24.0, @shikijs/types@npm:^1.24.0": + version: 1.24.0 + resolution: "@shikijs/types@npm:1.24.0" dependencies: "@shikijs/vscode-textmate": "npm:^9.3.0" "@types/hast": "npm:^3.0.4" - checksum: 10c0/5360e5ff777e5945137ca6bf9aab8ea5d30632ccf648825e67908d1840cac7ab9fc25b5bc321e99a7120f454cf3639a8ab252568010c7dc5a260744bfa0a5352 + checksum: 10c0/2aa2e8782841d92d3c3ef441e3d7a9ce288923dd0b7ec054be8f26ef6617147e569bb60239d3af80371e35cd60eefdc157499631c47864ef9b76144eaa0ade7b languageName: node linkType: hard @@ -5310,8 +5351,8 @@ __metadata: linkType: hard "@solana/web3.js@npm:^1.32.0, @solana/web3.js@npm:^1.68.0, @solana/web3.js@npm:^1.90.0": - version: 1.95.4 - resolution: "@solana/web3.js@npm:1.95.4" + version: 1.95.8 + resolution: "@solana/web3.js@npm:1.95.8" dependencies: "@babel/runtime": "npm:^7.25.0" "@noble/curves": "npm:^1.4.2" @@ -5328,7 +5369,7 @@ __metadata: node-fetch: "npm:^2.7.0" rpc-websockets: "npm:^9.0.2" superstruct: "npm:^2.0.2" - checksum: 10c0/87e02de9f731d717ce280b2ba02323d666868b51e3ce92229f7e21e00ae14c9813b6e0e8cde5d66def54d933f66f12580346d88fc9c4a1624d88246a05788735 + checksum: 10c0/1feb44fda9c6e33191e623dc60d8e6ff64fa9e3916599be14d85d0090fe5d376c533e44bb9453853c3808a738058668d89b6331e2e80add8888bfc8e91005d79 languageName: node linkType: hard @@ -5523,7 +5564,7 @@ __metadata: languageName: node linkType: hard -"@swc/helpers@npm:0.5.13, @swc/helpers@npm:^0.5.11": +"@swc/helpers@npm:0.5.13": version: 0.5.13 resolution: "@swc/helpers@npm:0.5.13" dependencies: @@ -5532,6 +5573,15 @@ __metadata: languageName: node linkType: hard +"@swc/helpers@npm:^0.5.11": + version: 0.5.15 + resolution: "@swc/helpers@npm:0.5.15" + dependencies: + tslib: "npm:^2.8.0" + checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4 + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^5.0.1": version: 5.0.1 resolution: "@szmarczak/http-timer@npm:5.0.1" @@ -5659,14 +5709,14 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": - version: 5.0.1 - resolution: "@types/express-serve-static-core@npm:5.0.1" + version: 5.0.2 + resolution: "@types/express-serve-static-core@npm:5.0.2" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 10c0/42919f9de55e9fd1524dc72c2f06a3f3e7fbd21f42ccc6e71ea2d530c8942cc0004d468f09e8557bf51c585d9673efd455b9668c2cd2416f5d61e70dc1bc49ac + checksum: 10c0/9f6ee50bd81f0aa6cc9df6ad2c2d221a3a63249da944db58ec8bb8681e77a5b3b3fdb1931bda73beb13cfaf9125731f835fe5256afb6a6da35b0eb08ccbdbfdf languageName: node linkType: hard @@ -5847,12 +5897,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": - version: 22.9.0 - resolution: "@types/node@npm:22.9.0" +"@types/node@npm:*, @types/node@npm:^22.10.1": + version: 22.10.1 + resolution: "@types/node@npm:22.10.1" dependencies: - undici-types: "npm:~6.19.8" - checksum: 10c0/3f46cbe0a49bab4ba30494025e4c8a6e699b98ac922857aa1f0209ce11a1313ee46e6808b8f13fe5b8b960a9d7796b77c8d542ad4e9810e85ef897d5593b5d51 + undici-types: "npm:~6.20.0" + checksum: 10c0/0fbb6d29fa35d807f0223a4db709c598ac08d66820240a2cd6a8a69b8f0bc921d65b339d850a666b43b4e779f967e6ed6cf6f0fca3575e08241e6b900364c234 languageName: node linkType: hard @@ -5870,15 +5920,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^22.10.1": - version: 22.10.1 - resolution: "@types/node@npm:22.10.1" - dependencies: - undici-types: "npm:~6.20.0" - checksum: 10c0/0fbb6d29fa35d807f0223a4db709c598ac08d66820240a2cd6a8a69b8f0bc921d65b339d850a666b43b4e779f967e6ed6cf6f0fca3575e08241e6b900364c234 - languageName: node - linkType: hard - "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -5957,12 +5998,12 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:^18.3.12": - version: 18.3.12 - resolution: "@types/react@npm:18.3.12" + version: 18.3.13 + resolution: "@types/react@npm:18.3.13" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/8bae8d9a41619804561574792e29112b413044eb0d53746dde2b9720c1f9a59f71c895bbd7987cd8ce9500b00786e53bc032dced38cddf42910458e145675290 + checksum: 10c0/91815e00157deb179fa670aa2dfc491952698b7743ffddca0e3e0f16e7a18454f3f5ef72321a07386c49e721563b9d280dbbdfae039face764e2fdd8ad949d4b languageName: node linkType: hard @@ -6083,15 +6124,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.16.0" +"@typescript-eslint/eslint-plugin@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.17.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.16.0" - "@typescript-eslint/type-utils": "npm:8.16.0" - "@typescript-eslint/utils": "npm:8.16.0" - "@typescript-eslint/visitor-keys": "npm:8.16.0" + "@typescript-eslint/scope-manager": "npm:8.17.0" + "@typescript-eslint/type-utils": "npm:8.17.0" + "@typescript-eslint/utils": "npm:8.17.0" + "@typescript-eslint/visitor-keys": "npm:8.17.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -6102,44 +6143,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/b03612b726ee5aff631cd50e05ceeb06a522e64465e4efdc134e3a27a09406b959ef7a05ec4acef1956b3674dc4fedb6d3a62ce69382f9e30c227bd4093003e5 + checksum: 10c0/d78778173571a9a1370345bc2aa3e850235a489d16b8a8b5ba3086b988bbef7549bdae38e509d7a679ba3179c688cc5a408376b158be402770836e94ffc9602d languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/parser@npm:8.16.0" +"@typescript-eslint/parser@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/parser@npm:8.17.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.16.0" - "@typescript-eslint/types": "npm:8.16.0" - "@typescript-eslint/typescript-estree": "npm:8.16.0" - "@typescript-eslint/visitor-keys": "npm:8.16.0" + "@typescript-eslint/scope-manager": "npm:8.17.0" + "@typescript-eslint/types": "npm:8.17.0" + "@typescript-eslint/typescript-estree": "npm:8.17.0" + "@typescript-eslint/visitor-keys": "npm:8.17.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/e49c6640a7a863a16baecfbc5b99392a4731e9c7e9c9aaae4efbc354e305485fe0f39a28bf0acfae85bc01ce37fe0cc140fd315fdaca8b18f9b5e0addff8ceae + checksum: 10c0/2543deadf01302a92d3b6f58a4c14f98d8936c4d976e7da05e3bb65608f19d8de93b25282e343c304eca3e3f37f2ac23e97fa9c11c6edff36dd2d4f6b601a630 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/scope-manager@npm:8.16.0" +"@typescript-eslint/scope-manager@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/scope-manager@npm:8.17.0" dependencies: - "@typescript-eslint/types": "npm:8.16.0" - "@typescript-eslint/visitor-keys": "npm:8.16.0" - checksum: 10c0/23b7c738b83f381c6419a36e6ca951944187e3e00abb8e012bce8041880410fe498303e28bdeb0e619023a69b14cf32a5ec1f9427c5382807788cd8e52a46a6e + "@typescript-eslint/types": "npm:8.17.0" + "@typescript-eslint/visitor-keys": "npm:8.17.0" + checksum: 10c0/0c08d14240bad4b3f6874f08ba80b29db1a6657437089a6f109db458c544d835bcdc06ba9140bb4f835233ba4326d9a86e6cf6bdb5209960d2f7025aa3191f4f languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/type-utils@npm:8.16.0" +"@typescript-eslint/type-utils@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/type-utils@npm:8.17.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.16.0" - "@typescript-eslint/utils": "npm:8.16.0" + "@typescript-eslint/typescript-estree": "npm:8.17.0" + "@typescript-eslint/utils": "npm:8.17.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependencies: @@ -6147,23 +6188,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/24c0e815c8bdf99bf488c7528bd6a7c790e8b3b674cb7fb075663afc2ee26b48e6f4cf7c0d14bb21e2376ca62bd8525cbcb5688f36135b00b62b1d353d7235b9 + checksum: 10c0/6138ec71b5692d4b5e0bf3d7f66a6fa4e91ddea7031907b0ac45a7693df0a2f4cc5bca7218311e0639620d636ceb7efec83a137dfcd5938304d873b774fcc8bd languageName: node linkType: hard -"@typescript-eslint/types@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/types@npm:8.16.0" - checksum: 10c0/141e257ab4060a9c0e2e14334ca14ab6be713659bfa38acd13be70a699fb5f36932a2584376b063063ab3d723b24bc703dbfb1ce57d61d7cfd7ec5bd8a975129 +"@typescript-eslint/types@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/types@npm:8.17.0" + checksum: 10c0/26b1bf9dfc3ee783c85c6f354b84c28706d5689d777f3ff2de2cb496e45f9d0189c0d561c03ccbc8b24712438be17cf63dd0871ff3ca2083e7f48749770d1893 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.16.0" +"@typescript-eslint/typescript-estree@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.17.0" dependencies: - "@typescript-eslint/types": "npm:8.16.0" - "@typescript-eslint/visitor-keys": "npm:8.16.0" + "@typescript-eslint/types": "npm:8.17.0" + "@typescript-eslint/visitor-keys": "npm:8.17.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -6173,34 +6214,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/f28fea5af4798a718b6735d1758b791a331af17386b83cb2856d89934a5d1693f7cb805e73c3b33f29140884ac8ead9931b1d7c3de10176fa18ca7a346fe10d0 + checksum: 10c0/523013f9b5cf2c58c566868e4c3b0b9ac1b4807223a6d64e2a7c58e01e53b6587ba61f1a8241eade361f3f426d6057657515473176141ef8aebb352bc0d223ce languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/utils@npm:8.16.0" +"@typescript-eslint/utils@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/utils@npm:8.17.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.16.0" - "@typescript-eslint/types": "npm:8.16.0" - "@typescript-eslint/typescript-estree": "npm:8.16.0" + "@typescript-eslint/scope-manager": "npm:8.17.0" + "@typescript-eslint/types": "npm:8.17.0" + "@typescript-eslint/typescript-estree": "npm:8.17.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/1e61187eef3da1ab1486d2a977d8f3b1cb8ef7fa26338500a17eb875ca42a8942ef3f2241f509eef74cf7b5620c109483afc7d83d5b0ab79b1e15920f5a49818 + checksum: 10c0/a9785ae5f7e7b51d521dc3f48b15093948e4fcd03352c0b60f39bae366cbc935947d215f91e2ae3182d52fa6affb5ccbb50feff487bd1209011f3e0da02cdf07 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.16.0": - version: 8.16.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.16.0" +"@typescript-eslint/visitor-keys@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.17.0" dependencies: - "@typescript-eslint/types": "npm:8.16.0" + "@typescript-eslint/types": "npm:8.17.0" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/537df37801831aa8d91082b2adbffafd40305ed4518f0e7d3cbb17cc466d8b9ac95ac91fa232e7fe585d7c522d1564489ec80052ebb2a6ab9bbf89ef9dd9b7bc + checksum: 10c0/9144c4e4a63034fb2031a0ee1fc77e80594f30cab3faafa9a1f7f83782695774dd32fac8986f260698b4e150b4dd52444f2611c07e4c101501f08353eb47c82c languageName: node linkType: hard @@ -6211,88 +6252,88 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:2.1.6": - version: 2.1.6 - resolution: "@vitest/expect@npm:2.1.6" +"@vitest/expect@npm:2.1.8": + version: 2.1.8 + resolution: "@vitest/expect@npm:2.1.8" dependencies: - "@vitest/spy": "npm:2.1.6" - "@vitest/utils": "npm:2.1.6" + "@vitest/spy": "npm:2.1.8" + "@vitest/utils": "npm:2.1.8" chai: "npm:^5.1.2" tinyrainbow: "npm:^1.2.0" - checksum: 10c0/86327692f03b2ec6895486b118f25e1a141749c31ba671d253da4e33cf81db81f40755198ac9b46616155a8b74765d0ab15b8080041dbe139c83a9a0690004a2 + checksum: 10c0/6fbf4abc2360efe4d3671d3425f8bb6012fe2dd932a88720d8b793030b766ba260494822c721d3fc497afe52373515c7e150635a95c25f6e1b567f86155c5408 languageName: node linkType: hard -"@vitest/mocker@npm:2.1.6": - version: 2.1.6 - resolution: "@vitest/mocker@npm:2.1.6" +"@vitest/mocker@npm:2.1.8": + version: 2.1.8 + resolution: "@vitest/mocker@npm:2.1.8" dependencies: - "@vitest/spy": "npm:2.1.6" + "@vitest/spy": "npm:2.1.8" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.12" peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - checksum: 10c0/f8f4482e196a72cc9f202edb07da6f8d612f0daef272525a4c2447a5ffa435cc1cfe758cb79af0e296a60faa973ee0e2767cbb8bb6769eff2b5b9c6941ceda7c + checksum: 10c0/b4113ed8a57c0f60101d02e1b1769357a346ecd55ded499eab384d52106fd4b12d51e9aaa6db98f47de0d56662477be0ed8d46d6dfa84c235f9e1b234709814e languageName: node linkType: hard -"@vitest/pretty-format@npm:2.1.6, @vitest/pretty-format@npm:^2.1.6": - version: 2.1.6 - resolution: "@vitest/pretty-format@npm:2.1.6" +"@vitest/pretty-format@npm:2.1.8, @vitest/pretty-format@npm:^2.1.8": + version: 2.1.8 + resolution: "@vitest/pretty-format@npm:2.1.8" dependencies: tinyrainbow: "npm:^1.2.0" - checksum: 10c0/5c82496e5816c0c388bbe18a88ed01b39f5492aaa8e0df90868a65a50ee135105da367e58b4a0bed0dc67201c0518c451a32a5d9b81f56665b76b1c75c550686 + checksum: 10c0/1dc5c9b1c7c7e78e46a2a16033b6b20be05958bbebc5a5b78f29e32718c80252034804fccd23f34db6b3583239db47e68fc5a8e41942c54b8047cc3b4133a052 languageName: node linkType: hard -"@vitest/runner@npm:2.1.6": - version: 2.1.6 - resolution: "@vitest/runner@npm:2.1.6" +"@vitest/runner@npm:2.1.8": + version: 2.1.8 + resolution: "@vitest/runner@npm:2.1.8" dependencies: - "@vitest/utils": "npm:2.1.6" + "@vitest/utils": "npm:2.1.8" pathe: "npm:^1.1.2" - checksum: 10c0/3105aaa875ac58e237626ae3f9734cf003c2e40886a96ba20e78f1c1f721c9013d4f720d4a2fa4cd3a415ccd529bb4c7ff73021871c8ecda423f7e1fb7695cd4 + checksum: 10c0/d0826a71494adeafc8c6478257f584d11655145c83e2d8f94c17301d7059c7463ad768a69379e394c50838a7435abcc9255a6b7d8894f5ee06b153e314683a75 languageName: node linkType: hard -"@vitest/snapshot@npm:2.1.6": - version: 2.1.6 - resolution: "@vitest/snapshot@npm:2.1.6" +"@vitest/snapshot@npm:2.1.8": + version: 2.1.8 + resolution: "@vitest/snapshot@npm:2.1.8" dependencies: - "@vitest/pretty-format": "npm:2.1.6" + "@vitest/pretty-format": "npm:2.1.8" magic-string: "npm:^0.30.12" pathe: "npm:^1.1.2" - checksum: 10c0/91708ee9fdf9ccaa637d9fa58141342831aaf2119641f050a45f80cca37f0a4c1f7d65363e609a6353594418d5ecfebacd090c64273cd63de6915d186c948632 + checksum: 10c0/8d7a77a52e128630ea737ee0a0fe746d1d325cac5848326861dbf042844da4d5c1a5145539ae0ed1a3f0b0363506e98d86f2679fadf114ec4b987f1eb616867b languageName: node linkType: hard -"@vitest/spy@npm:2.1.6": - version: 2.1.6 - resolution: "@vitest/spy@npm:2.1.6" +"@vitest/spy@npm:2.1.8": + version: 2.1.8 + resolution: "@vitest/spy@npm:2.1.8" dependencies: tinyspy: "npm:^3.0.2" - checksum: 10c0/4d3e965f9096968125dd4f53a66a8afd7a105852a41bd36865288bef5b6a79f3ec6f2056cc1c7be5a0afb2cd86b3b83e354451f452bf049ddd4516005a748f6f + checksum: 10c0/9740f10772ede004ea7f9ffb8a6c3011341d75d9d7f2d4d181b123a701c4691e942f38cf1700684a3bb5eea3c78addf753fd8cdf78c51d8eadc3bada6fadf8f2 languageName: node linkType: hard -"@vitest/utils@npm:2.1.6": - version: 2.1.6 - resolution: "@vitest/utils@npm:2.1.6" +"@vitest/utils@npm:2.1.8": + version: 2.1.8 + resolution: "@vitest/utils@npm:2.1.8" dependencies: - "@vitest/pretty-format": "npm:2.1.6" + "@vitest/pretty-format": "npm:2.1.8" loupe: "npm:^3.1.2" tinyrainbow: "npm:^1.2.0" - checksum: 10c0/1ec077b9707ec627075348f1a98687c7bb2fcbf9edf6e73dea6842c328d0d51a33663d22679e2a90a75f45afca9246f8fa3ea452447f474ae9d5f4eca4023b91 + checksum: 10c0/d4a29ecd8f6c24c790e4c009f313a044d89e664e331bc9c3cfb57fe1380fb1d2999706dbbfc291f067d6c489602e76d00435309fbc906197c0d01f831ca17d64 languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.12.1": +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/ast@npm:1.14.1" dependencies: @@ -6378,7 +6419,7 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:^1.12.1": +"@webassemblyjs/wasm-edit@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" dependencies: @@ -6419,7 +6460,7 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.12.1": +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" dependencies: @@ -6676,23 +6717,23 @@ __metadata: linkType: hard "algoliasearch@npm:^5.12.0": - version: 5.13.0 - resolution: "algoliasearch@npm:5.13.0" - dependencies: - "@algolia/client-abtesting": "npm:5.13.0" - "@algolia/client-analytics": "npm:5.13.0" - "@algolia/client-common": "npm:5.13.0" - "@algolia/client-insights": "npm:5.13.0" - "@algolia/client-personalization": "npm:5.13.0" - "@algolia/client-query-suggestions": "npm:5.13.0" - "@algolia/client-search": "npm:5.13.0" - "@algolia/ingestion": "npm:1.13.0" - "@algolia/monitoring": "npm:1.13.0" - "@algolia/recommend": "npm:5.13.0" - "@algolia/requester-browser-xhr": "npm:5.13.0" - "@algolia/requester-fetch": "npm:5.13.0" - "@algolia/requester-node-http": "npm:5.13.0" - checksum: 10c0/a76b990c67a185ad2aa3f0d9c6c872b795293f01ff57aa4b408b5dbfb84c93f83f85582ae1c5d7fb5559b8cb3dca1111c5a9c1226e6e73809e4a176891c7bfd0 + version: 5.15.0 + resolution: "algoliasearch@npm:5.15.0" + dependencies: + "@algolia/client-abtesting": "npm:5.15.0" + "@algolia/client-analytics": "npm:5.15.0" + "@algolia/client-common": "npm:5.15.0" + "@algolia/client-insights": "npm:5.15.0" + "@algolia/client-personalization": "npm:5.15.0" + "@algolia/client-query-suggestions": "npm:5.15.0" + "@algolia/client-search": "npm:5.15.0" + "@algolia/ingestion": "npm:1.15.0" + "@algolia/monitoring": "npm:1.15.0" + "@algolia/recommend": "npm:5.15.0" + "@algolia/requester-browser-xhr": "npm:5.15.0" + "@algolia/requester-fetch": "npm:5.15.0" + "@algolia/requester-node-http": "npm:5.15.0" + checksum: 10c0/fd226182aa20fff59182e61c4c5b02fe441bd8934d11f00e3beaf43b35b48001cbdd21c486429b6ef522fc1daff27c025df5a3af58be357b762649489988f3ec languageName: node linkType: hard @@ -6895,13 +6936,13 @@ __metadata: linkType: hard "axios@npm:^1.7.4": - version: 1.7.7 - resolution: "axios@npm:1.7.7" + version: 1.7.9 + resolution: "axios@npm:1.7.9" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/4499efc89e86b0b49ffddc018798de05fab26e3bf57913818266be73279a6418c3ce8f9e934c7d2d707ab8c095e837fc6c90608fb7715b94d357720b5f568af7 + checksum: 10c0/b7a41e24b59fee5f0f26c1fc844b45b17442832eb3a0fb42dd4f1430eb4abc571fe168e67913e8a1d91c993232bd1d1ab03e20e4d1fee8c6147649b576fc1b0b languageName: node linkType: hard @@ -6928,15 +6969,15 @@ __metadata: linkType: hard "babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.11 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" + version: 0.4.12 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.12" dependencies: "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + "@babel/helper-define-polyfill-provider": "npm:^0.6.3" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b2217bc8d5976cf8142453ed44daabf0b2e0e75518f24eac83b54a8892e87a88f1bd9089daa92fd25df979ecd0acfd29b6bc28c4182c1c46344cee15ef9bce84 + checksum: 10c0/49150c310de2d472ecb95bd892bca1aa833cf5e84bbb76e3e95cf9ff2c6c8c3b3783dd19d70ba50ff6235eb8ce1fa1c0affe491273c95a1ef6a2923f4d5a3819 languageName: node linkType: hard @@ -6953,13 +6994,13 @@ __metadata: linkType: hard "babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" + version: 0.6.3 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.3" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + "@babel/helper-define-polyfill-provider": "npm:^0.6.3" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/bc541037cf7620bc84ddb75a1c0ce3288f90e7d2799c070a53f8a495c8c8ae0316447becb06f958dd25dcce2a2fce855d318ecfa48036a1ddb218d55aa38a744 + checksum: 10c0/40164432e058e4b5c6d56feecacdad22692ae0534bd80c92d5399ed9e1a6a2b6797c8fda837995daddd4ca391f9aa2d58c74ad465164922e0f73631eaf9c4f76 languageName: node linkType: hard @@ -7097,12 +7138,12 @@ __metadata: linkType: hard "bonjour-service@npm:^1.0.11": - version: 1.2.1 - resolution: "bonjour-service@npm:1.2.1" + version: 1.3.0 + resolution: "bonjour-service@npm:1.3.0" dependencies: fast-deep-equal: "npm:^3.1.3" multicast-dns: "npm:^7.2.5" - checksum: 10c0/953cbfc27fc9e36e6f988012993ab2244817d82426603e0390d4715639031396c932b6657b1aa4ec30dbb5fa903d6b2c7f1be3af7a8ba24165c93e987c849730 + checksum: 10c0/5721fd9f9bb968e9cc16c1e8116d770863dd2329cb1f753231de1515870648c225142b7eefa71f14a5c22bc7b37ddd7fdeb018700f28a8c936d50d4162d433c7 languageName: node linkType: hard @@ -7301,11 +7342,11 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" dependencies: - "@npmcli/fs": "npm:^3.1.0" + "@npmcli/fs": "npm:^4.0.0" fs-minipass: "npm:^3.0.0" glob: "npm:^10.2.2" lru-cache: "npm:^10.0.1" @@ -7313,11 +7354,11 @@ __metadata: minipass-collect: "npm:^2.0.1" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c languageName: node linkType: hard @@ -7399,17 +7440,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669": - version: 1.0.30001678 - resolution: "caniuse-lite@npm:1.0.30001678" - checksum: 10c0/3209cc0f0b9683514916bed676d8f7965cae7faccaccb90f97c11fbdee32cd3f2f3b9cfec388ef400476299c3dd496fb1f8734c31c6199c4799b42813391517f - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001579": - version: 1.0.30001680 - resolution: "caniuse-lite@npm:1.0.30001680" - checksum: 10c0/11a4e7f6f5d5f965cfd4b7dc4aef34e12a26e99647f02b5ac9fd7f7670845473b95ada416a785473237e4b1b67281f7b043c8736c85b77097f6b697e8950b15f +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669": + version: 1.0.30001686 + resolution: "caniuse-lite@npm:1.0.30001686" + checksum: 10c0/41748e81c17c1a6a0fd6e515c93c8620004171fe6706027e45f837fde71e97173e85141b0dc11e07d53b4782f3741a6651cb0f7d395cc1c1860892355eabdfa2 languageName: node linkType: hard @@ -7556,6 +7590,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + "chrome-trace-event@npm:^1.0.2": version: 1.0.4 resolution: "chrome-trace-event@npm:1.0.4" @@ -8060,13 +8101,13 @@ __metadata: linkType: hard "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5": - version: 7.0.5 - resolution: "cross-spawn@npm:7.0.5" + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 10c0/aa82ce7ac0814a27e6f2b738c5a7cf1fa21a3558a1e42df449fc96541ba3ba731e4d3ecffa4435348808a86212f287c6f20a1ee551ef1ff95d01cfec5f434944 + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 languageName: node linkType: hard @@ -8235,9 +8276,9 @@ __metadata: linkType: hard "cssdb@npm:^8.2.1": - version: 8.2.1 - resolution: "cssdb@npm:8.2.1" - checksum: 10c0/d27d7db0a39e1105181aac119a98d6c92cd5ceba2e8bd349cdf2ba4a8d9ead149b685a1dba9542ca24f094cc70eca4a3e02973fe1f74c11a373b508606e5e1c0 + version: 8.2.2 + resolution: "cssdb@npm:8.2.2" + checksum: 10c0/fa313d7cbea307fc2ddc71b2d0257162377e6b463f5c77eb28941426e0541fc7b650222e2fe97c88e0db932ff3c42f4af0ae4b75955d2077a3aebafad08ed501 languageName: node linkType: hard @@ -8709,18 +8750,18 @@ __metadata: linkType: hard "dotenv-expand@npm:~11.0.6": - version: 11.0.6 - resolution: "dotenv-expand@npm:11.0.6" + version: 11.0.7 + resolution: "dotenv-expand@npm:11.0.7" dependencies: - dotenv: "npm:^16.4.4" - checksum: 10c0/e22891ec72cb926d46d9a26290ef77f9cc9ddcba92d2f83d5e6f3a803d1590887be68e25b559415d080053000441b6f63f5b36093a565bb8c5c994b992ae49f2 + dotenv: "npm:^16.4.5" + checksum: 10c0/d80b8a7be085edf351270b96ac0e794bc3ddd7f36157912939577cb4d33ba6492ebee349d59798b71b90e36f498d24a2a564fb4aa00073b2ef4c2a3a49c467b1 languageName: node linkType: hard -"dotenv@npm:^16.4.4, dotenv@npm:~16.4.5": - version: 16.4.5 - resolution: "dotenv@npm:16.4.5" - checksum: 10c0/48d92870076832af0418b13acd6e5a5a3e83bb00df690d9812e94b24aff62b88ade955ac99a05501305b8dc8f1b0ee7638b18493deb6fe93d680e5220936292f +"dotenv@npm:^16.4.5, dotenv@npm:~16.4.5": + version: 16.4.7 + resolution: "dotenv@npm:16.4.7" + checksum: 10c0/be9f597e36a8daf834452daa1f4cc30e5375a5968f98f46d89b16b983c567398a330580c88395069a77473943c06b877d1ca25b4afafcdd6d4adb549e8293462 languageName: node linkType: hard @@ -8746,9 +8787,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.41": - version: 1.5.53 - resolution: "electron-to-chromium@npm:1.5.53" - checksum: 10c0/a0a0328ee51f678a0635341f97649e4d128c691d4d580219c46c54a61b94942f8b1ff830fce4e8614a67acd1c94c1a55bd2d2165ae70451f19435f4377cb9ab3 + version: 1.5.70 + resolution: "electron-to-chromium@npm:1.5.70" + checksum: 10c0/135dfe5b764eb54afcd70ec6084430ea562706570a7104eda8b69e694c3ec900f8d0a2f2e90f0fc86f7dbc6435dad427ec1732bb88f4e62cc5c86c55265ebcf4 languageName: node linkType: hard @@ -8952,6 +8993,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de + languageName: node + linkType: hard + "esbuild@npm:^0.24.0": version: 0.24.0 resolution: "esbuild@npm:0.24.0" @@ -9202,15 +9323,15 @@ __metadata: linkType: hard "eslint@npm:^9.15.0": - version: 9.15.0 - resolution: "eslint@npm:9.15.0" + version: 9.16.0 + resolution: "eslint@npm:9.16.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.12.1" "@eslint/config-array": "npm:^0.19.0" "@eslint/core": "npm:^0.9.0" "@eslint/eslintrc": "npm:^3.2.0" - "@eslint/js": "npm:9.15.0" + "@eslint/js": "npm:9.16.0" "@eslint/plugin-kit": "npm:^0.2.3" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" @@ -9246,7 +9367,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/d0d7606f36bfcccb1c3703d0a24df32067b207a616f17efe5fb1765a91d13f085afffc4fc97ecde4ab9c9f4edd64d9b4ce750e13ff7937a25074b24bee15b20f + checksum: 10c0/f36d12652c6f20bab8a77375b8ad29a6af030c3840deb0a5f9dd4cee49d68a2d68d7dc73b0c25918df59d83cd686dd5712e11387e696e1f3842e8dde15cd3255 languageName: node linkType: hard @@ -9778,9 +9899,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 languageName: node linkType: hard @@ -9999,7 +10120,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": +"get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" dependencies: @@ -10074,7 +10195,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -10205,11 +10326,9 @@ __metadata: linkType: hard "gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead languageName: node linkType: hard @@ -10298,16 +10417,18 @@ __metadata: linkType: hard "has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 + version: 1.1.0 + resolution: "has-proto@npm:1.1.0" + dependencies: + call-bind: "npm:^1.0.7" + checksum: 10c0/d0aeb83ca76aa265a7629bf973d6338c310b8307cb7fa8b85f8f01a7d95fc3d6ede54eaedeb538a6c1ee4fc8961abfbe89ea88d9a78244fa03097fe5b506c10d languageName: node linkType: hard "has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e languageName: node linkType: hard @@ -10328,13 +10449,13 @@ __metadata: linkType: hard "hast-util-from-dom@npm:^5.0.0": - version: 5.0.0 - resolution: "hast-util-from-dom@npm:5.0.0" + version: 5.0.1 + resolution: "hast-util-from-dom@npm:5.0.1" dependencies: "@types/hast": "npm:^3.0.0" - hastscript: "npm:^8.0.0" + hastscript: "npm:^9.0.0" web-namespaces: "npm:^2.0.0" - checksum: 10c0/1b0a9d65eb8f8cd3616559190bb6db271b7b4f72a13c5dc16abac264b6f7145beb408fbaa497d1b5c725d55392b951972d8313802bfe90ccac33f888ec34c63c + checksum: 10c0/9a90381e048107a093a3da758bb17b67aaf5322e222f02497f841c4990abf94aa177d38d5b9bf61ad07b3601d0409f34f5b556d89578cc189230c6b994d2af77 languageName: node linkType: hard @@ -10365,18 +10486,18 @@ __metadata: linkType: hard "hast-util-from-parse5@npm:^8.0.0": - version: 8.0.1 - resolution: "hast-util-from-parse5@npm:8.0.1" + version: 8.0.2 + resolution: "hast-util-from-parse5@npm:8.0.2" dependencies: "@types/hast": "npm:^3.0.0" "@types/unist": "npm:^3.0.0" devlop: "npm:^1.0.0" - hastscript: "npm:^8.0.0" + hastscript: "npm:^9.0.0" property-information: "npm:^6.0.0" vfile: "npm:^6.0.0" vfile-location: "npm:^5.0.0" web-namespaces: "npm:^2.0.0" - checksum: 10c0/4a30bb885cff1f0e023c429ae3ece73fe4b03386f07234bf23f5555ca087c2573ff4e551035b417ed7615bde559f394cdaf1db2b91c3b7f0575f3563cd238969 + checksum: 10c0/921f40d7bd71fe7415b68df5e2d53ba62f0a35808be0504fa24584e6f6a85bfbf14dc20d171c7ccc1cf84058bcc445d12a746598d324cece1ec1e52ea9d489af languageName: node linkType: hard @@ -10399,8 +10520,8 @@ __metadata: linkType: hard "hast-util-raw@npm:^9.0.0": - version: 9.0.4 - resolution: "hast-util-raw@npm:9.0.4" + version: 9.1.0 + resolution: "hast-util-raw@npm:9.1.0" dependencies: "@types/hast": "npm:^3.0.0" "@types/unist": "npm:^3.0.0" @@ -10415,7 +10536,7 @@ __metadata: vfile: "npm:^6.0.0" web-namespaces: "npm:^2.0.0" zwitch: "npm:^2.0.0" - checksum: 10c0/03d0fe7ba8bd75c9ce81f829650b19b78917bbe31db70d36bf6f136842496c3474e3bb1841f2d30dafe1f6b561a89a524185492b9a93d40b131000743c0d7998 + checksum: 10c0/d0d909d2aedecef6a06f0005cfae410d6475e6e182d768bde30c3af9fcbbe4f9beb0522bdc21d0679cb3c243c0df40385797ed255148d68b3d3f12e82d12aacc languageName: node linkType: hard @@ -10502,16 +10623,16 @@ __metadata: languageName: node linkType: hard -"hastscript@npm:^8.0.0": - version: 8.0.0 - resolution: "hastscript@npm:8.0.0" +"hastscript@npm:^9.0.0": + version: 9.0.0 + resolution: "hastscript@npm:9.0.0" dependencies: "@types/hast": "npm:^3.0.0" comma-separated-tokens: "npm:^2.0.0" hast-util-parse-selector: "npm:^4.0.0" property-information: "npm:^6.0.0" space-separated-tokens: "npm:^2.0.0" - checksum: 10c0/f0b54bbdd710854b71c0f044612db0fe1b5e4d74fa2001633dc8c535c26033269f04f536f9fd5b03f234de1111808f9e230e9d19493bf919432bb24d541719e0 + checksum: 10c0/66eff826846c55482052ebbc99b6881c14aff6421526634f4c95318ba1d0d1f1bbf5aa38446f388943c0f32d5383fa38740c972b37678dd1cd0c82e6e5807fbf languageName: node linkType: hard @@ -11138,13 +11259,6 @@ __metadata: languageName: node linkType: hard -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d - languageName: node - linkType: hard - "is-npm@npm:^6.0.0": version: 6.0.0 resolution: "is-npm@npm:6.0.0" @@ -11349,8 +11463,8 @@ __metadata: linkType: hard "jayson@npm:^4.1.1": - version: 4.1.2 - resolution: "jayson@npm:4.1.2" + version: 4.1.3 + resolution: "jayson@npm:4.1.3" dependencies: "@types/connect": "npm:^3.4.33" "@types/node": "npm:^12.12.54" @@ -11366,7 +11480,7 @@ __metadata: ws: "npm:^7.5.10" bin: jayson: bin/jayson.js - checksum: 10c0/c3e0be127c2450fc8d4003386d29762a8a02ac9554801770729b64cf6d76c973ee1165761571c7455f5a3d1369a3ddde16c184b9df62405896ae05b8152cd571 + checksum: 10c0/7d72728cf3379575d5e788e733bdb874ad3cea1335c85b1aae986719530cf859d4d1487e0d941d9d1dcb9d7b86877cffdb585deb273b5736cb40974f30ea695d languageName: node linkType: hard @@ -11705,9 +11819,9 @@ __metadata: linkType: hard "lilconfig@npm:^3.1.1, lilconfig@npm:~3.1.2": - version: 3.1.2 - resolution: "lilconfig@npm:3.1.2" - checksum: 10c0/f059630b1a9bddaeba83059db00c672b64dc14074e9f232adce32b38ca1b5686ab737eb665c5ba3c32f147f0002b4bee7311ad0386a9b98547b5623e87071fbe + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 10c0/f5604e7240c5c275743561442fbc5abf2a84ad94da0f5adc71d25e31fa8483048de3dcedcb7a44112a942fed305fd75841cdf6c9681c7f640c63f1049e9a5dcc languageName: node linkType: hard @@ -11965,31 +12079,30 @@ __metadata: linkType: hard "magic-string@npm:^0.30.12": - version: 0.30.12 - resolution: "magic-string@npm:0.30.12" + version: 0.30.14 + resolution: "magic-string@npm:0.30.14" dependencies: "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/469f457d18af37dfcca8617086ea8a65bcd8b60ba8a1182cb024ce43e470ace3c9d1cb6bee58d3b311768fb16bc27bd50bdeebcaa63dadd0fd46cac4d2e11d5f + checksum: 10c0/c52c2a6e699dfa8a840e13154da35464a40cd8b07049b695a8b282883b0426c0811af1e36ac26860b4267289340b42772c156a5608e87be97b63d510e617e87a languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" + minipass-fetch: "npm:^4.0.0" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 languageName: node linkType: hard @@ -12366,8 +12479,8 @@ __metadata: linkType: hard "micromark-core-commonmark@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-core-commonmark@npm:2.0.1" + version: 2.0.2 + resolution: "micromark-core-commonmark@npm:2.0.2" dependencies: decode-named-character-reference: "npm:^1.0.0" devlop: "npm:^1.0.0" @@ -12385,7 +12498,7 @@ __metadata: micromark-util-subtokenize: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/a0b280b1b6132f600518e72cb29a4dd1b2175b85f5ed5b25d2c5695e42b876b045971370daacbcfc6b4ce8cf7acbf78dd3a0284528fb422b450144f4b3bebe19 + checksum: 10c0/87c7a75cd339189eb6f1d6323037f7d108d1331d953b84fe839b37fd385ee2292b27222327c1ceffda46ba5d5d4dee703482475e5ee8744be40c9e308d8acb77 languageName: node linkType: hard @@ -12602,25 +12715,25 @@ __metadata: linkType: hard "micromark-factory-destination@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-destination@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/b73492f687d41a6a379159c2f3acbf813042346bcea523d9041d0cc6124e6715f0779dbb2a0b3422719e9764c3b09f9707880aa159557e3cb4aeb03b9d274915 + checksum: 10c0/bbafcf869cee5bf511161354cb87d61c142592fbecea051000ff116068dc85216e6d48519d147890b9ea5d7e2864a6341c0c09d9948c203bff624a80a476023c languageName: node linkType: hard "micromark-factory-label@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-label@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" dependencies: devlop: "npm:^1.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/8ffad00487a7891941b1d1f51d53a33c7a659dcf48617edb7a4008dad7aff67ec316baa16d55ca98ae3d75ce1d81628dbf72fedc7c6f108f740dec0d5d21c8ee + checksum: 10c0/0137716b4ecb428114165505e94a2f18855c8bbea21b07a8b5ce514b32a595ed789d2b967125718fc44c4197ceaa48f6609d58807a68e778138d2e6b91b824e8 languageName: node linkType: hard @@ -12652,36 +12765,36 @@ __metadata: linkType: hard "micromark-factory-space@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-space@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/103ca954dade963d4ff1d2f27d397833fe855ddc72590205022832ef68b775acdea67949000cee221708e376530b1de78c745267b0bf8366740840783eb37122 + checksum: 10c0/f9ed43f1c0652d8d898de0ac2be3f77f776fffe7dd96bdbba1e02d7ce33d3853c6ff5daa52568fc4fa32cdf3a62d86b85ead9b9189f7211e1d69ff2163c450fb languageName: node linkType: hard "micromark-factory-title@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-title@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" dependencies: micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/2b2188e7a011b1b001faf8c860286d246d5c3485ef8819270c60a5808f4c7613e49d4e481dbdff62600ef7acdba0f5100be2d125cbd2a15e236c26b3668a8ebd + checksum: 10c0/e72fad8d6e88823514916890099a5af20b6a9178ccf78e7e5e05f4de99bb8797acb756257d7a3a57a53854cb0086bf8aab15b1a9e9db8982500dd2c9ff5948b6 languageName: node linkType: hard "micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-whitespace@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" dependencies: micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/4e91baab0cc71873095134bd0e225d01d9786cde352701402d71b72d317973954754e8f9f1849901f165530e6421202209f4d97c460a27bb0808ec5a3fc3148c + checksum: 10c0/20a1ec58698f24b766510a309b23a10175034fcf1551eaa9da3adcbed3e00cd53d1ebe5f030cf873f76a1cec3c34eb8c50cc227be3344caa9ed25d56cf611224 languageName: node linkType: hard @@ -12696,70 +12809,70 @@ __metadata: linkType: hard "micromark-util-character@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-character@npm:2.1.0" + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" dependencies: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/fc37a76aaa5a5138191ba2bef1ac50c36b3bcb476522e98b1a42304ab4ec76f5b036a746ddf795d3de3e7004b2c09f21dd1bad42d161f39b8cfc0acd067e6373 + checksum: 10c0/d3fe7a5e2c4060fc2a076f9ce699c82a2e87190a3946e1e5eea77f563869b504961f5668d9c9c014724db28ac32fa909070ea8b30c3a39bd0483cc6c04cc76a1 languageName: node linkType: hard "micromark-util-chunked@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-chunked@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-chunked@npm:2.0.1" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/043b5f2abc8c13a1e2e4c378ead191d1a47ed9e0cd6d0fa5a0a430b2df9e17ada9d5de5a20688a000bbc5932507e746144acec60a9589d9a79fa60918e029203 + checksum: 10c0/b68c0c16fe8106949537bdcfe1be9cf36c0ccd3bc54c4007003cb0984c3750b6cdd0fd77d03f269a3382b85b0de58bde4f6eedbe7ecdf7244759112289b1ab56 languageName: node linkType: hard "micromark-util-classify-character@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-classify-character@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/2bf5fa5050faa9b69f6c7e51dbaaf02329ab70fabad8229984381b356afbbf69db90f4617bec36d814a7d285fb7cad8e3c4e38d1daf4387dc9e240aa7f9a292a + checksum: 10c0/8a02e59304005c475c332f581697e92e8c585bcd45d5d225a66c1c1b14ab5a8062705188c2ccec33cc998d33502514121478b2091feddbc751887fc9c290ed08 languageName: node linkType: hard "micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-combine-extensions@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" dependencies: micromark-util-chunked: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/cd4c8d1a85255527facb419ff3b3cc3d7b7f27005c5ef5fa7ef2c4d0e57a9129534fc292a188ec2d467c2c458642d369c5f894bc8a9e142aed6696cc7989d3ea + checksum: 10c0/f15e282af24c8372cbb10b9b0b3e2c0aa681fea0ca323a44d6bc537dc1d9382c819c3689f14eaa000118f5a163245358ce6276b2cda9a84439cdb221f5d86ae7 languageName: node linkType: hard "micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/3f6d684ee8f317c67806e19b3e761956256cb936a2e0533aad6d49ac5604c6536b2041769c6febdd387ab7175b7b7e551851bf2c1f78da943e7a3671ca7635ac + checksum: 10c0/9c8a9f2c790e5593ffe513901c3a110e9ec8882a08f466da014112a25e5059b51551ca0aeb7ff494657d86eceb2f02ee556c6558b8d66aadc61eae4a240da0df languageName: node linkType: hard "micromark-util-decode-string@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-string@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" dependencies: decode-named-character-reference: "npm:^1.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-decode-numeric-character-reference: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/f5413bebb21bdb686cfa1bcfa7e9c93093a523d1b42443ead303b062d2d680a94e5e8424549f57b8ba9d786a758e5a26a97f56068991bbdbca5d1885b3aa7227 + checksum: 10c0/f24d75b2e5310be6e7b6dee532e0d17d3bf46996841d6295f2a9c87a2046fff4ab603c52ab9d7a7a6430a8b787b1574ae895849c603d262d1b22eef71736b5cb languageName: node linkType: hard "micromark-util-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-encode@npm:2.0.0" - checksum: 10c0/ebdaafff23100bbf4c74e63b4b1612a9ddf94cd7211d6a076bc6fb0bc32c1b48d6fb615aa0953e607c62c97d849f97f1042260d3eb135259d63d372f401bbbb2 + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: 10c0/b2b29f901093845da8a1bf997ea8b7f5e061ffdba85070dfe14b0197c48fda64ffcf82bfe53c90cf9dc185e69eef8c5d41cae3ba918b96bc279326921b59008a languageName: node linkType: hard @@ -12780,50 +12893,50 @@ __metadata: linkType: hard "micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-html-tag-name@npm:2.0.0" - checksum: 10c0/988aa26367449bd345b627ae32cf605076daabe2dc1db71b578a8a511a47123e14af466bcd6dcbdacec60142f07bc2723ec5f7a0eed0f5319ce83b5e04825429 + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: 10c0/ae80444db786fde908e9295f19a27a4aa304171852c77414516418650097b8afb401961c9edb09d677b06e97e8370cfa65638dde8438ebd41d60c0a8678b85b9 languageName: node linkType: hard "micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-normalize-identifier@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/93bf8789b8449538f22cf82ac9b196363a5f3b2f26efd98aef87c4c1b1f8c05be3ef6391ff38316ff9b03c1a6fd077342567598019ddd12b9bd923dacc556333 + checksum: 10c0/5299265fa360769fc499a89f40142f10a9d4a5c3dd8e6eac8a8ef3c2e4a6570e4c009cf75ea46dce5ee31c01f25587bde2f4a5cc0a935584ae86dd857f2babbd languageName: node linkType: hard "micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-resolve-all@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" dependencies: micromark-util-types: "npm:^2.0.0" - checksum: 10c0/3b912e88453dcefe728a9080c8934a75ac4732056d6576ceecbcaf97f42c5d6fa2df66db8abdc8427eb167c5ffddefe26713728cfe500bc0e314ed260d6e2746 + checksum: 10c0/bb6ca28764696bb479dc44a2d5b5fe003e7177aeae1d6b0d43f24cc223bab90234092d9c3ce4a4d2b8df095ccfd820537b10eb96bb7044d635f385d65a4c984a languageName: node linkType: hard "micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-sanitize-uri@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-encode: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/74763ca1c927dd520d3ab8fd9856a19740acf76fc091f0a1f5d4e99c8cd5f1b81c5a0be3efb564941a071fb6d85fd951103f2760eb6cff77b5ab3abe08341309 + checksum: 10c0/60e92166e1870fd4f1961468c2651013ff760617342918e0e0c3c4e872433aa2e60c1e5a672bfe5d89dc98f742d6b33897585cf86ae002cda23e905a3c02527c languageName: node linkType: hard "micromark-util-subtokenize@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-subtokenize@npm:2.0.1" + version: 2.0.3 + resolution: "micromark-util-subtokenize@npm:2.0.3" dependencies: devlop: "npm:^1.0.0" micromark-util-chunked: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/000cefde827db129f4ed92b8fbdeb4866c5f9c93068c0115485564b0426abcb9058080aa257df9035e12ca7fa92259d66623ea750b9eb3bcdd8325d3fb6fc237 + checksum: 10c0/75501986ecb02a6f06c0f3e58b584ae3ff3553b520260e8ce27d2db8c79b8888861dd9d3b26e30f5c6084fddd90f96dc3ff551f02c2ac4d669ebe920e483b6d6 languageName: node linkType: hard @@ -12835,9 +12948,9 @@ __metadata: linkType: hard "micromark-util-symbol@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-symbol@npm:2.0.0" - checksum: 10c0/4e76186c185ce4cefb9cea8584213d9ffacd77099d1da30c0beb09fa21f46f66f6de4c84c781d7e34ff763fe3a06b530e132fa9004882afab9e825238d0aa8b3 + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: 10c0/f2d1b207771e573232436618e78c5e46cd4b5c560dd4a6d63863d58018abbf49cb96ec69f7007471e51434c60de3c9268ef2bf46852f26ff4aacd10f9da16fe9 languageName: node linkType: hard @@ -12849,15 +12962,15 @@ __metadata: linkType: hard "micromark-util-types@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-types@npm:2.0.0" - checksum: 10c0/d74e913b9b61268e0d6939f4209e3abe9dada640d1ee782419b04fd153711112cfaaa3c4d5f37225c9aee1e23c3bb91a1f5223e1e33ba92d33e83956a53e61de + version: 2.0.1 + resolution: "micromark-util-types@npm:2.0.1" + checksum: 10c0/872ec9334bb42afcc91c5bed8b7ee03b75654b36c6f221ab4d2b1bb0299279f00db948bf38ec6bc1ec03d0cf7842c21ab805190bf676157ba587eb0386d38b71 languageName: node linkType: hard "micromark@npm:^4.0.0": - version: 4.0.0 - resolution: "micromark@npm:4.0.0" + version: 4.0.1 + resolution: "micromark@npm:4.0.1" dependencies: "@types/debug": "npm:^4.0.0" debug: "npm:^4.0.0" @@ -12876,7 +12989,7 @@ __metadata: micromark-util-subtokenize: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10c0/7e91c8d19ff27bc52964100853f1b3b32bb5b2ece57470a34ba1b2f09f4e2a183d90106c4ae585c9f2046969ee088576fed79b2f7061cba60d16652ccc2c64fd + checksum: 10c0/b5d950c84664ce209575e5a54946488f0a1e1240d080544e657b65074c9b08208a5315d9db066b93cbc199ec05f68552ba8b09fd5e716c726f4a4712275a7c5c languageName: node linkType: hard @@ -13044,18 +13157,18 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" +"minipass-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass-fetch@npm:4.0.0" dependencies: encoding: "npm:^0.1.13" minipass: "npm:^7.0.3" minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" + minizlib: "npm:^3.0.1" dependenciesMeta: encoding: optional: true - checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b + checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b languageName: node linkType: hard @@ -13102,14 +13215,14 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 languageName: node linkType: hard -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": +"minizlib@npm:^2.1.1": version: 2.1.2 resolution: "minizlib@npm:2.1.2" dependencies: @@ -13119,6 +13232,16 @@ __metadata: languageName: node linkType: hard +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -13128,6 +13251,15 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d + languageName: node + linkType: hard + "mrmime@npm:^2.0.0": version: 2.0.0 resolution: "mrmime@npm:2.0.0" @@ -13173,11 +13305,11 @@ __metadata: linkType: hard "nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" bin: nanoid: bin/nanoid.cjs - checksum: 10c0/e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 + checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 languageName: node linkType: hard @@ -13195,7 +13327,14 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:^0.6.3, negotiator@npm:~0.6.4": +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"negotiator@npm:~0.6.4": version: 0.6.4 resolution: "negotiator@npm:0.6.4" checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea @@ -13281,14 +13420,14 @@ __metadata: linkType: hard "node-emoji@npm:^2.1.0": - version: 2.1.3 - resolution: "node-emoji@npm:2.1.3" + version: 2.2.0 + resolution: "node-emoji@npm:2.2.0" dependencies: "@sindresorhus/is": "npm:^4.6.0" char-regex: "npm:^1.0.2" emojilib: "npm:^2.4.0" skin-tone: "npm:^2.0.0" - checksum: 10c0/e688333373563aa8308df16111eee2b5837b53a51fb63bf8b7fbea2896327c5d24c9984eb0c8ca6ac155d4d9c194dcf1840d271033c1b588c7c45a3b65339ef7 + checksum: 10c0/9525defbd90a82a2131758c2470203fa2a2faa8edd177147a8654a26307fe03594e52847ecbe2746d06cfc5c50acd12bd500f035350a7609e8217c9894c19aad languageName: node linkType: hard @@ -13314,33 +13453,33 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.3.0": - version: 4.8.2 - resolution: "node-gyp-build@npm:4.8.2" + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 10c0/d816b43974d31d6257b6e87d843f2626c72389a285208394bc57a7766b210454d2642860a5e5b5c333d8ecabaeabad3b31b94f58cf8ca1aabdef0c320d02baaa + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 languageName: node linkType: hard "node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" + version: 11.0.0 + resolution: "node-gyp@npm:11.0.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" glob: "npm:^10.3.10" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^4.1.0" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" semver: "npm:^7.3.5" - tar: "npm:^6.2.1" - which: "npm:^4.0.0" + tar: "npm:^7.4.3" + which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b + checksum: 10c0/a3b885bbee2d271f1def32ba2e30ffcf4562a3db33af06b8b365e053153e2dd2051b9945783c3c8e852d26a0f20f65b251c7e83361623383a99635c0280ee573 languageName: node linkType: hard @@ -13358,14 +13497,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" +"nopt@npm:^8.0.0": + version: 8.0.0 + resolution: "nopt@npm:8.0.0" dependencies: abbrev: "npm:^2.0.0" bin: nopt: bin/nopt.js - checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 + checksum: 10c0/19cb986f79abaca2d0f0b560021da7b32ee6fcc3de48f3eaeb0c324d36755c17754f886a754c091f01f740c17caf7d6aea8237b7fbaf39f476ae5e30a249f18f languageName: node linkType: hard @@ -13455,20 +13594,20 @@ __metadata: linkType: hard "nx@npm:^20.1.3": - version: 20.1.3 - resolution: "nx@npm:20.1.3" + version: 20.1.4 + resolution: "nx@npm:20.1.4" dependencies: "@napi-rs/wasm-runtime": "npm:0.2.4" - "@nx/nx-darwin-arm64": "npm:20.1.3" - "@nx/nx-darwin-x64": "npm:20.1.3" - "@nx/nx-freebsd-x64": "npm:20.1.3" - "@nx/nx-linux-arm-gnueabihf": "npm:20.1.3" - "@nx/nx-linux-arm64-gnu": "npm:20.1.3" - "@nx/nx-linux-arm64-musl": "npm:20.1.3" - "@nx/nx-linux-x64-gnu": "npm:20.1.3" - "@nx/nx-linux-x64-musl": "npm:20.1.3" - "@nx/nx-win32-arm64-msvc": "npm:20.1.3" - "@nx/nx-win32-x64-msvc": "npm:20.1.3" + "@nx/nx-darwin-arm64": "npm:20.1.4" + "@nx/nx-darwin-x64": "npm:20.1.4" + "@nx/nx-freebsd-x64": "npm:20.1.4" + "@nx/nx-linux-arm-gnueabihf": "npm:20.1.4" + "@nx/nx-linux-arm64-gnu": "npm:20.1.4" + "@nx/nx-linux-arm64-musl": "npm:20.1.4" + "@nx/nx-linux-x64-gnu": "npm:20.1.4" + "@nx/nx-linux-x64-musl": "npm:20.1.4" + "@nx/nx-win32-arm64-msvc": "npm:20.1.4" + "@nx/nx-win32-x64-msvc": "npm:20.1.4" "@yarnpkg/lockfile": "npm:^1.1.0" "@yarnpkg/parsers": "npm:3.0.2" "@zkochan/js-yaml": "npm:0.0.7" @@ -13532,7 +13671,7 @@ __metadata: bin: nx: bin/nx.js nx-cloud: bin/nx-cloud.js - checksum: 10c0/83dfea829ff4c447198d7db7bcaadf388ac3670234985edf0510b8edbc27e075bb5baab6b0f945e3c99311ed7a233fad43bf8e78d8624ff7ccd385d1baada2df + checksum: 10c0/a9407ea70ecf9b2f465c94552124ef01d90828025540fa5733e1d3d35e6adab41adfe0c0545ebed37b0e7059e4dfee972351949fd9b643adb13e6daba4dd0214 languageName: node linkType: hard @@ -13544,9 +13683,9 @@ __metadata: linkType: hard "object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 10c0/b97835b4c91ec37b5fd71add84f21c3f1047d1d155d00c0fcd6699516c256d4fcc6ff17a1aced873197fe447f91a3964178fd2a67a1ee2120cdaf60e81a050b4 + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 languageName: node linkType: hard @@ -13748,6 +13887,13 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^7.0.2": + version: 7.0.2 + resolution: "p-map@npm:7.0.2" + checksum: 10c0/e10548036648d1c043153f9997112fe5a7de54a319210238628f8ea22ee36587fd6ee740811f88b60bbf29d932e23ae35df7fced40df477116c84c18e797047e + languageName: node + linkType: hard + "p-retry@npm:^4.5.0": version: 4.6.2 resolution: "p-retry@npm:4.6.2" @@ -14487,26 +14633,26 @@ __metadata: linkType: hard "postcss-modules-local-by-default@npm:^4.0.5": - version: 4.0.5 - resolution: "postcss-modules-local-by-default@npm:4.0.5" + version: 4.1.0 + resolution: "postcss-modules-local-by-default@npm:4.1.0" dependencies: icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" + postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.1.0" peerDependencies: postcss: ^8.1.0 - checksum: 10c0/f4ad35abeb685ecb25f80c93d9fe23c8b89ee45ac4185f3560e701b4d7372f9b798577e79c5ed03b6d9c80bc923b001210c127c04ced781f43cda9e32b202a5b + checksum: 10c0/d6e47d2488c6fcde2c91696d15ef094e6b1cdd8d5dcdf20c6ac72567fcc4778f5f80b8381839232b37242f200b4d83e98a947bf3b3315b0bf673ea42528a3caf languageName: node linkType: hard "postcss-modules-scope@npm:^3.2.0": - version: 3.2.0 - resolution: "postcss-modules-scope@npm:3.2.0" + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" dependencies: - postcss-selector-parser: "npm:^6.0.4" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.1.0 - checksum: 10c0/a2f5ffe372169b3feb8628cd785eb748bf12e344cfa57bce9e5cdc4fa5adcdb40d36daa86bb35dad53427703b185772aad08825b5783f745fcb1b6039454a84b + checksum: 10c0/bd2d81f79e3da0ef6365b8e2c78cc91469d05b58046b4601592cdeef6c4050ed8fe1478ae000a1608042fc7e692cb51fecbd2d9bce3f4eace4d32e883ffca10b languageName: node linkType: hard @@ -14822,7 +14968,7 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16": version: 6.1.2 resolution: "postcss-selector-parser@npm:6.1.2" dependencies: @@ -14903,18 +15049,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.26, postcss@npm:^8.4.33, postcss@npm:^8.4.38": - version: 8.4.47 - resolution: "postcss@npm:8.4.47" - dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.1.0" - source-map-js: "npm:^1.2.1" - checksum: 10c0/929f68b5081b7202709456532cee2a145c1843d391508c5a09de2517e8c4791638f71dd63b1898dba6712f8839d7a6da046c72a5e44c162e908f5911f57b5f44 - languageName: node - linkType: hard - -"postcss@npm:^8.4.49": +"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.26, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.43": version: 8.4.49 resolution: "postcss@npm:8.4.49" dependencies: @@ -14932,21 +15067,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.3.3": - version: 3.3.3 - resolution: "prettier@npm:3.3.3" - bin: - prettier: bin/prettier.cjs - checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26 - languageName: node - linkType: hard - -"prettier@npm:^3.4.1": - version: 3.4.1 - resolution: "prettier@npm:3.4.1" +"prettier@npm:^3.3.3, prettier@npm:^3.4.1": + version: 3.4.2 + resolution: "prettier@npm:3.4.2" bin: prettier: bin/prettier.cjs - checksum: 10c0/2d6cc3101ad9de72b49c59339480b0983e6ff6742143da0c43f476bf3b5ef88ede42ebd9956d7a0a8fa59f7a5990e8ef03c9ad4c37f7e4c9e5db43ee0853156c + checksum: 10c0/99e076a26ed0aba4ebc043880d0f08bbb8c59a4c6641cdee6cdadf2205bdd87aa1d7823f50c3aea41e015e99878d37c58d7b5f0e663bba0ef047f94e36b96446 languageName: node linkType: hard @@ -14997,10 +15123,10 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 languageName: node linkType: hard @@ -15514,26 +15640,26 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^6.1.1": - version: 6.1.1 - resolution: "regexpu-core@npm:6.1.1" +"regexpu-core@npm:^6.2.0": + version: 6.2.0 + resolution: "regexpu-core@npm:6.2.0" dependencies: regenerate: "npm:^1.4.2" regenerate-unicode-properties: "npm:^10.2.0" regjsgen: "npm:^0.8.0" - regjsparser: "npm:^0.11.0" + regjsparser: "npm:^0.12.0" unicode-match-property-ecmascript: "npm:^2.0.0" unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10c0/07d49697e20f9b65977535abba4858b7f5171c13f7c366be53ec1886d3d5f69f1b98cc6a6e63cf271adda077c3366a4c851c7473c28bbd69cf5a6b6b008efc3e + checksum: 10c0/bbcb83a854bf96ce4005ee4e4618b71c889cda72674ce6092432f0039b47890c2d0dfeb9057d08d440999d9ea03879ebbb7f26ca005ccf94390e55c348859b98 languageName: node linkType: hard "registry-auth-token@npm:^5.0.1": - version: 5.0.2 - resolution: "registry-auth-token@npm:5.0.2" + version: 5.0.3 + resolution: "registry-auth-token@npm:5.0.3" dependencies: "@pnpm/npm-conf": "npm:^2.1.0" - checksum: 10c0/20fc2225681cc54ae7304b31ebad5a708063b1949593f02dfe5fb402bc1fc28890cecec6497ea396ba86d6cca8a8480715926dfef8cf1f2f11e6f6cc0a1b4bde + checksum: 10c0/f92313032fae7dca787aa878cc7fa8499ee5da960802777f6b9f168a5d8f24a97fcfa0cf30a604bcf38b050a5db5f034b1e2fec18a3326f41822a6aff9514c85 languageName: node linkType: hard @@ -15553,14 +15679,14 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.11.0": - version: 0.11.2 - resolution: "regjsparser@npm:0.11.2" +"regjsparser@npm:^0.12.0": + version: 0.12.0 + resolution: "regjsparser@npm:0.12.0" dependencies: jsesc: "npm:~3.0.2" bin: regjsparser: bin/parser - checksum: 10c0/764e762de1b26a0cf48b45728fc1b2087f9c55bd4cea858cce28e4d5544c237f3f2dd6d40e2c41b80068e9cb92cc7d731a4285bc1f27d6ebc227792c70e4af1b + checksum: 10c0/99d3e4e10c8c7732eb7aa843b8da2fd8b647fe144d3711b480e4647dc3bff4b1e96691ccf17f3ace24aa866a50b064236177cb25e6e4fbbb18285d99edaed83b languageName: node linkType: hard @@ -15894,6 +16020,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^5.0.5": + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc + languageName: node + linkType: hard + "rimraf@npm:^6.0.1": version: 6.0.1 resolution: "rimraf@npm:6.0.1" @@ -15906,97 +16043,28 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.23.0": - version: 4.27.4 - resolution: "rollup@npm:4.27.4" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.27.4" - "@rollup/rollup-android-arm64": "npm:4.27.4" - "@rollup/rollup-darwin-arm64": "npm:4.27.4" - "@rollup/rollup-darwin-x64": "npm:4.27.4" - "@rollup/rollup-freebsd-arm64": "npm:4.27.4" - "@rollup/rollup-freebsd-x64": "npm:4.27.4" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.27.4" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.27.4" - "@rollup/rollup-linux-arm64-gnu": "npm:4.27.4" - "@rollup/rollup-linux-arm64-musl": "npm:4.27.4" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.27.4" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.27.4" - "@rollup/rollup-linux-s390x-gnu": "npm:4.27.4" - "@rollup/rollup-linux-x64-gnu": "npm:4.27.4" - "@rollup/rollup-linux-x64-musl": "npm:4.27.4" - "@rollup/rollup-win32-arm64-msvc": "npm:4.27.4" - "@rollup/rollup-win32-ia32-msvc": "npm:4.27.4" - "@rollup/rollup-win32-x64-msvc": "npm:4.27.4" - "@types/estree": "npm:1.0.6" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-powerpc64le-gnu": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/1442650cfea5e4617ce14743784f6f578817e31db56f9c8aaf96a82daa9bc20b6ccd66c0d677dbf302a4da3e70664dc3bef11a1aec85e6aff3cecccb945b1d35 - languageName: node - linkType: hard - -"rollup@npm:^4.24.0": - version: 4.24.4 - resolution: "rollup@npm:4.24.4" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.24.4" - "@rollup/rollup-android-arm64": "npm:4.24.4" - "@rollup/rollup-darwin-arm64": "npm:4.24.4" - "@rollup/rollup-darwin-x64": "npm:4.24.4" - "@rollup/rollup-freebsd-arm64": "npm:4.24.4" - "@rollup/rollup-freebsd-x64": "npm:4.24.4" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.24.4" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.24.4" - "@rollup/rollup-linux-arm64-gnu": "npm:4.24.4" - "@rollup/rollup-linux-arm64-musl": "npm:4.24.4" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.24.4" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.24.4" - "@rollup/rollup-linux-s390x-gnu": "npm:4.24.4" - "@rollup/rollup-linux-x64-gnu": "npm:4.24.4" - "@rollup/rollup-linux-x64-musl": "npm:4.24.4" - "@rollup/rollup-win32-arm64-msvc": "npm:4.24.4" - "@rollup/rollup-win32-ia32-msvc": "npm:4.24.4" - "@rollup/rollup-win32-x64-msvc": "npm:4.24.4" +"rollup@npm:^4.20.0, rollup@npm:^4.24.0": + version: 4.28.0 + resolution: "rollup@npm:4.28.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.28.0" + "@rollup/rollup-android-arm64": "npm:4.28.0" + "@rollup/rollup-darwin-arm64": "npm:4.28.0" + "@rollup/rollup-darwin-x64": "npm:4.28.0" + "@rollup/rollup-freebsd-arm64": "npm:4.28.0" + "@rollup/rollup-freebsd-x64": "npm:4.28.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.28.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.28.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.28.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.28.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.28.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.28.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.28.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.28.0" + "@rollup/rollup-linux-x64-musl": "npm:4.28.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.28.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.28.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.28.0" "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -16040,7 +16108,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/8e9e9ce4dc8cc48acf258a26519ed1bbbbdac99fd701e89d11c31271e01b4663fe61d839f7906a49c0983b1a49e2acc622948d7665ff0f57ecc48d872835d1ce + checksum: 10c0/98d3bc2b784eff71b997cfc2be97c00e2f100ee38adc2f8ada7b9b9ecbbc96937f667a6a247a45491807b3f2adef3c73d1f5df40d71771bff0c2d8c0cca9b369 languageName: node linkType: hard @@ -16423,9 +16491,9 @@ __metadata: linkType: hard "shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.1": - version: 1.8.1 - resolution: "shell-quote@npm:1.8.1" - checksum: 10c0/8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a + version: 1.8.2 + resolution: "shell-quote@npm:1.8.2" + checksum: 10c0/85fdd44f2ad76e723d34eb72c753f04d847ab64e9f1f10677e3f518d0e5b0752a176fd805297b30bb8c3a1556ebe6e77d2288dbd7b7b0110c7e941e9e9c20ce1 languageName: node linkType: hard @@ -16778,12 +16846,12 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" dependencies: minipass: "npm:^7.0.3" - checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d languageName: node linkType: hard @@ -16817,14 +16885,7 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.7.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 10c0/60edf2d130a4feb7002974af3d5a5f3343558d1ccf8d9b9934d225c638606884db4a20d2fe6440a09605bca282af6b042ae8070a10490c0800d69e82e478f41e - languageName: node - linkType: hard - -"std-env@npm:^3.8.0": +"std-env@npm:^3.7.0, std-env@npm:^3.8.0": version: 3.8.0 resolution: "std-env@npm:3.8.0" checksum: 10c0/f560a2902fd0fa3d648d7d0acecbd19d664006f7372c1fba197ed4c216b4c9e48db6e2769b5fe1616d42a9333c9f066c5011935035e85c59f45dc4f796272040 @@ -17131,7 +17192,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.2.1": +"tar@npm:^6.1.11": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -17145,6 +17206,20 @@ __metadata: languageName: node linkType: hard +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + languageName: node + linkType: hard + "terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.9": version: 5.3.10 resolution: "terser-webpack-plugin@npm:5.3.10" @@ -17168,8 +17243,8 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.26.0": - version: 5.36.0 - resolution: "terser@npm:5.36.0" + version: 5.37.0 + resolution: "terser@npm:5.37.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -17177,7 +17252,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10c0/f4ed2bead19f64789ddcfb85b7cef78f3942f967b8890c54f57d1e35bc7d547d551c6a4c32210bce6ba45b1c738314bbfac6acbc6c762a45cd171777d0c120d9 + checksum: 10c0/ff0dc79b0a0da821e7f5bf7a047eab6d04e70e88b62339a0f1d71117db3310e255f5c00738fa3b391f56c3571f800a00047720261ba04ced0241c1f9922199f4 languageName: node linkType: hard @@ -17266,9 +17341,9 @@ __metadata: linkType: hard "tinypool@npm:^1.0.1": - version: 1.0.1 - resolution: "tinypool@npm:1.0.1" - checksum: 10c0/90939d6a03f1519c61007bf416632dc1f0b9c1a9dd673c179ccd9e36a408437384f984fc86555a5d040d45b595abc299c3bb39d354439e98a090766b5952e73d + version: 1.0.2 + resolution: "tinypool@npm:1.0.2" + checksum: 10c0/31ac184c0ff1cf9a074741254fe9ea6de95026749eb2b8ec6fd2b9d8ca94abdccda731f8e102e7f32e72ed3b36d32c6975fd5f5523df3f1b6de6c3d8dfd95e63 languageName: node linkType: hard @@ -17363,11 +17438,11 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.3.0": - version: 1.4.0 - resolution: "ts-api-utils@npm:1.4.0" + version: 1.4.3 + resolution: "ts-api-utils@npm:1.4.3" peerDependencies: typescript: ">=4.2.0" - checksum: 10c0/1b2bfa50ea52771d564bb143bb69010d25cda03ed573095fbac9b86f717012426443af6647e00e3db70fca60360482a30c1be7cf73c3521c321f6bf5e3594ea0 + checksum: 10c0/e65dc6e7e8141140c23e1dc94984bf995d4f6801919c71d6dc27cf0cd51b100a91ffcfe5217626193e5bea9d46831e8586febdc7e172df3f1091a7384299e23a languageName: node linkType: hard @@ -17389,7 +17464,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.3, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.0": +"tslib@npm:^2.0.3, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.0, tslib@npm:^2.8.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -17503,19 +17578,19 @@ __metadata: linkType: hard "typedoc-plugin-merge-modules@npm:^6.0.3": - version: 6.0.3 - resolution: "typedoc-plugin-merge-modules@npm:6.0.3" + version: 6.1.0 + resolution: "typedoc-plugin-merge-modules@npm:6.1.0" peerDependencies: - typedoc: 0.26.x - checksum: 10c0/1a1687c1dcbe521e7868384d1a58c05a9f1ebf210f55d89b6e5f386ced5d04219464909b809d29008314bf826af5e194ff75f417605497e2673c659242f16a7e + typedoc: 0.26.x || ^0.27.1 + checksum: 10c0/32a89f8411cef9fcf57711225f492ffaaefd8933cc36bd9980da30066f90a45b43a0fe8cde4dd155c095e5b4683b2295c8e784ed70835e838c5c8406dbc8102d languageName: node linkType: hard "typedoc@npm:^0.27.1": - version: 0.27.1 - resolution: "typedoc@npm:0.27.1" + version: 0.27.3 + resolution: "typedoc@npm:0.27.3" dependencies: - "@gerrit0/mini-shiki": "npm:^1.23.2" + "@gerrit0/mini-shiki": "npm:^1.24.0" lunr: "npm:^2.3.9" markdown-it: "npm:^14.1.0" minimatch: "npm:^9.0.5" @@ -17524,23 +17599,23 @@ __metadata: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x bin: typedoc: bin/typedoc - checksum: 10c0/28e62707c7157c1f07a24e5422143de5e8f6ed0967a7fb4f76ae220824e14d79d43589ec963ed6b7327eb4e5066c7037adad7a1a523a7d4a6aab259ef0f22570 + checksum: 10c0/e772715d6b6fed48d682187abc48b9c7bf72fe11dd8afba536b3307e94f07cd77719ef4f2f137964a530561c0982ea8a14118a48b059185142510f6b4fd790c2 languageName: node linkType: hard "typescript-eslint@npm:^8.16.0": - version: 8.16.0 - resolution: "typescript-eslint@npm:8.16.0" + version: 8.17.0 + resolution: "typescript-eslint@npm:8.17.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.16.0" - "@typescript-eslint/parser": "npm:8.16.0" - "@typescript-eslint/utils": "npm:8.16.0" + "@typescript-eslint/eslint-plugin": "npm:8.17.0" + "@typescript-eslint/parser": "npm:8.17.0" + "@typescript-eslint/utils": "npm:8.17.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/3da9401d6c2416b9d95c96a41a9423a5379d233a120cd3304e2c03f191d350ce91cf0c7e60017f7b10c93b4cc1190592702735735b771c1ce1bf68f71a9f1647 + checksum: 10c0/b148525769b9afa789ad3c2d52249fa78e67a225d48d17f2f0117b0e8b52566112be3a35de6cd26bcaffba3114be87c1070f7f4b4e2b730c059668fec4a530bc languageName: node linkType: hard @@ -17571,17 +17646,17 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:^6.20.0, undici-types@npm:~6.20.0": - version: 6.20.0 - resolution: "undici-types@npm:6.20.0" - checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf +"undici-types@npm:^6.20.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 languageName: node linkType: hard -"undici-types@npm:~6.19.8": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf languageName: node linkType: hard @@ -17645,21 +17720,21 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" dependencies: imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 languageName: node linkType: hard @@ -17916,49 +17991,44 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:2.1.6": - version: 2.1.6 - resolution: "vite-node@npm:2.1.6" +"vite-node@npm:2.1.8": + version: 2.1.8 + resolution: "vite-node@npm:2.1.8" dependencies: cac: "npm:^6.7.14" debug: "npm:^4.3.7" es-module-lexer: "npm:^1.5.4" pathe: "npm:^1.1.2" - vite: "npm:^5.0.0 || ^6.0.0" + vite: "npm:^5.0.0" bin: vite-node: vite-node.mjs - checksum: 10c0/513c815a6d4ca09a48fc8741bd4bfb1a6cbfe5555b009081b194069863326aede7d66197c2b60927514d22cc6efc2c793d1ca1bb70e13dca120e01a507bcf35b + checksum: 10c0/cb28027a7425ba29780e216164c07d36a4ff9eb60d83afcad3bc222fd5a5f3e36030071c819edd6d910940f502d49e52f7564743617bc1c5875485b0952c72d5 languageName: node linkType: hard -"vite@npm:^5.0.0 || ^6.0.0": - version: 6.0.1 - resolution: "vite@npm:6.0.1" +"vite@npm:^5.0.0": + version: 5.4.11 + resolution: "vite@npm:5.4.11" dependencies: - esbuild: "npm:^0.24.0" + esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.49" - rollup: "npm:^4.23.0" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" peerDependencies: - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: ">=1.21.0" + "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 sass: "*" sass-embedded: "*" stylus: "*" sugarss: "*" - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 + terser: ^5.4.0 dependenciesMeta: fsevents: optional: true peerDependenciesMeta: "@types/node": optional: true - jiti: - optional: true less: optional: true lightningcss: @@ -17973,27 +18043,23 @@ __metadata: optional: true terser: optional: true - tsx: - optional: true - yaml: - optional: true bin: vite: bin/vite.js - checksum: 10c0/e4d853eb9042ff29fa4d7cee1484738faaee4b1d9dcf786a94783bebb736b39af0afa7ac1a209000530638098d0a1b240b51f509d32addb028b222453f862916 + checksum: 10c0/d536bb7af57dd0eca2a808f95f5ff1d7b7ffb8d86e17c6893087680a0448bd0d15e07475270c8a6de65cb5115592d037130a1dd979dc76bcef8c1dda202a1874 languageName: node linkType: hard "vitest@npm:^2.1.6": - version: 2.1.6 - resolution: "vitest@npm:2.1.6" - dependencies: - "@vitest/expect": "npm:2.1.6" - "@vitest/mocker": "npm:2.1.6" - "@vitest/pretty-format": "npm:^2.1.6" - "@vitest/runner": "npm:2.1.6" - "@vitest/snapshot": "npm:2.1.6" - "@vitest/spy": "npm:2.1.6" - "@vitest/utils": "npm:2.1.6" + version: 2.1.8 + resolution: "vitest@npm:2.1.8" + dependencies: + "@vitest/expect": "npm:2.1.8" + "@vitest/mocker": "npm:2.1.8" + "@vitest/pretty-format": "npm:^2.1.8" + "@vitest/runner": "npm:2.1.8" + "@vitest/snapshot": "npm:2.1.8" + "@vitest/spy": "npm:2.1.8" + "@vitest/utils": "npm:2.1.8" chai: "npm:^5.1.2" debug: "npm:^4.3.7" expect-type: "npm:^1.1.0" @@ -18004,14 +18070,14 @@ __metadata: tinyexec: "npm:^0.3.1" tinypool: "npm:^1.0.1" tinyrainbow: "npm:^1.2.0" - vite: "npm:^5.0.0 || ^6.0.0" - vite-node: "npm:2.1.6" + vite: "npm:^5.0.0" + vite-node: "npm:2.1.8" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - "@vitest/browser": 2.1.6 - "@vitest/ui": 2.1.6 + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 2.1.8 + "@vitest/ui": 2.1.8 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -18029,7 +18095,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10c0/a183e4f573aacccf14d6466fdee0cee9ecd3f258bf98ebffa2da33c4d5aa1886d156f50d9eeb3d751c634679257e2196d8b3c9988256f2e860b9a1d7070bd4df + checksum: 10c0/e70631bad5662d6c60c5cf836a4baf58b890db6654fef1f608fe6a86aa49a2b9f078aac74b719d4d3c87c5c781968cc73590a7935277b48f3d8b6fb9c5b4d276 languageName: node linkType: hard @@ -18230,14 +18296,14 @@ __metadata: linkType: hard "webpack@npm:^5.88.1, webpack@npm:^5.95.0": - version: 5.96.1 - resolution: "webpack@npm:5.96.1" + version: 5.97.0 + resolution: "webpack@npm:5.97.0" dependencies: "@types/eslint-scope": "npm:^3.7.7" "@types/estree": "npm:^1.0.6" - "@webassemblyjs/ast": "npm:^1.12.1" - "@webassemblyjs/wasm-edit": "npm:^1.12.1" - "@webassemblyjs/wasm-parser": "npm:^1.12.1" + "@webassemblyjs/ast": "npm:^1.14.1" + "@webassemblyjs/wasm-edit": "npm:^1.14.1" + "@webassemblyjs/wasm-parser": "npm:^1.14.1" acorn: "npm:^8.14.0" browserslist: "npm:^4.24.0" chrome-trace-event: "npm:^1.0.2" @@ -18261,7 +18327,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10c0/ae6052fde9a546f79f14987b65823ba4024c6642a8489339ecfee7a351dff93325842aad453295bbdc6b65fb1690e4ef07529db63aa84ece55c7869e991a0039 + checksum: 10c0/a8714d42defbf52382b61c157f68e161a16d0edf228d8d9abaa7a165f3ee0ac7386a08d28d4dcf8d6740ea5bda0c4d4abfeeb838df029e636c1c28bb2454ac56 languageName: node linkType: hard @@ -18344,14 +18410,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" dependencies: isexe: "npm:^3.1.1" bin: node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b languageName: node linkType: hard @@ -18511,6 +18577,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + "yaml@npm:^1.7.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" From 9d6b14c74aaca930683937daa06531246725e6fc Mon Sep 17 00:00:00 2001 From: calintje Date: Fri, 6 Dec 2024 03:46:03 +0100 Subject: [PATCH 10/18] Revert change nx.json --- nx.json | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/nx.json b/nx.json index 9964a7c5..c3622462 100644 --- a/nx.json +++ b/nx.json @@ -15,13 +15,5 @@ "dependsOn": ["build"] } }, - "$schema": "./node_modules/nx/schemas/nx-schema.json", - "defaultBase": "main", - "projects": { - "whirlpools-example-rust-repositioning-bot": { - "root": "examples/rust-sdk/whirlpools-example-rust-repositioning-bot", - "sourceRoot": "examples/rust-sdk/whirlpools-example-rust-repositioning-bot", - "projectType": "application" - } - } + "$schema": "./node_modules/nx/schemas/nx-schema.json" } From 96f24d5fa36d0a72d640028bbdaaa964d5b25ebe Mon Sep 17 00:00:00 2001 From: calintje Date: Fri, 6 Dec 2024 03:46:59 +0100 Subject: [PATCH 11/18] Revert change nx.json --- nx.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nx.json b/nx.json index c3622462..1ac33171 100644 --- a/nx.json +++ b/nx.json @@ -15,5 +15,6 @@ "dependsOn": ["build"] } }, - "$schema": "./node_modules/nx/schemas/nx-schema.json" + "$schema": "./node_modules/nx/schemas/nx-schema.json", + "defaultBase": "main" } From 584d06cb79b342ea1f5d0400f19df53fba209713 Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 7 Dec 2024 00:57:04 +0100 Subject: [PATCH 12/18] Improve calculations with prices. Update send transaction (wip) --- .../src/position_manager.rs | 14 ++++-- .../whirlpool_repositioning_bot/src/utils.rs | 45 +++++++++++++++---- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs index a0bc3016..5f5e738e 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs @@ -10,7 +10,7 @@ use orca_whirlpools::{ close_position_instructions, open_position_instructions, IncreaseLiquidityParam, }; use orca_whirlpools_client::{get_position_address, Position}; -use orca_whirlpools_core::{sqrt_price_to_price, tick_index_to_price}; +use orca_whirlpools_core::{sqrt_price_to_price, tick_index_to_price, tick_index_to_sqrt_price}; use solana_client::nonblocking::rpc_client::RpcClient; use solana_sdk::signer::Signer; use spl_token_2022::state::Mint; @@ -30,6 +30,13 @@ pub async fn run_position_manager( .await .expect("Failed to fetch Whirlpool data."); + let current_price_sqrt = whirlpool.sqrt_price; + let position_lower_price_sqrt = tick_index_to_sqrt_price(position.tick_lower_index); + let position_upper_price_sqrt = tick_index_to_sqrt_price(position.tick_upper_index); + let position_center_price_sqrt = (position_lower_price_sqrt + position_upper_price_sqrt) / 2; + let deviation_sqrt = (current_price_sqrt as i128 - position_center_price_sqrt as i128).abs() as u128; + let deviation_float = (deviation_sqrt as f64 * 100.0) / (position_center_price_sqrt as f64); + let current_price = sqrt_price_to_price( whirlpool.sqrt_price, token_mint_a.decimals, @@ -47,16 +54,15 @@ pub async fn run_position_manager( ); let position_center_price = (position_lower_price + position_upper_price) / 2.0; - let deviation = ((current_price - position_center_price).abs() / position_center_price) * 100.0; println!("Current pool price: {:.6}", current_price); println!( "Position price range: [{:.6}, {:.6}]", position_lower_price, position_upper_price ); println!("Position center price: {:.6}", position_center_price); - println!("Price deviation from center: {:.2}%", deviation); + println!("Price deviation from center: {:.2}%", deviation_float); - if deviation >= args.threshold { + if deviation_float >= args.threshold { println!( "{}", "Deviation exceeds threshold. Rebalancing position." diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs index a9e803b3..4005fab7 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs @@ -2,6 +2,8 @@ use clap::ValueEnum; use orca_whirlpools::close_position_instructions; use orca_whirlpools_client::{Position, Whirlpool}; use solana_client::nonblocking::rpc_client::RpcClient; +use solana_client::rpc_config::RpcSendTransactionConfig; +use solana_sdk::commitment_config::CommitmentLevel; use solana_sdk::compute_budget::ComputeBudgetInstruction; use solana_sdk::{ message::Message, program_pack::Pack, pubkey::Pubkey, signature::Signature, signer::Signer, @@ -10,7 +12,7 @@ use solana_sdk::{ use spl_associated_token_account::get_associated_token_address_with_program_id; use spl_token_2022::state::Mint; use std::error::Error; -use tokio::time::Duration; +use tokio::time::{sleep, Duration, Instant}; use tokio_retry::strategy::ExponentialBackoff; use tokio_retry::Retry; @@ -161,12 +163,39 @@ pub async fn send_transaction( all_signers.extend(additional_signers.clone()); let transaction = Transaction::new(&all_signers, message, recent_blockhash); - let signature = rpc.send_and_confirm_transaction(&transaction).await?; - Ok(signature) + let transaction_config = RpcSendTransactionConfig { + skip_preflight: true, + preflight_commitment: Some(CommitmentLevel::Confirmed), + ..Default::default() + }; + let signature = rpc.send_transaction_with_config(&transaction, transaction_config).await?; + confirm_transaction(rpc, &signature, 60).await }) .await } +async fn confirm_transaction( + rpc: &RpcClient, + signature: &Signature, + timeout_secs: u64, +) -> Result> { + let start_time = Instant::now(); + let timeout = Duration::from_secs(timeout_secs); + + loop { + match rpc.get_signature_status(signature).await? { + Some(Ok(())) => return Ok(*signature), + Some(Err(err)) => return Err(format!("Transaction failed: {:?}", err).into()), + None => { + if start_time.elapsed() >= timeout { + return Err("Transaction confirmation timed out".into()); + } + sleep(Duration::from_secs(1)).await; + } + } + } +} + pub async fn get_compute_unit_instructions( rpc: &RpcClient, instructions: &[solana_sdk::instruction::Instruction], @@ -195,16 +224,16 @@ pub async fn get_compute_unit_instructions( if let Some(priority_fee_micro_lamports) = calculate_priority_fee(rpc, tier).await? { let mut compute_unit_price = priority_fee_micro_lamports; let total_priority_fee_lamports = - (units_consumed as u64 * priority_fee_micro_lamports) / 1_000_000; + (units_consumed_safe as u64 * priority_fee_micro_lamports) / 1_000_000; if total_priority_fee_lamports > max_priority_fee_lamports { - compute_unit_price = (max_priority_fee_lamports * 1_000_000) / units_consumed; + compute_unit_price = (max_priority_fee_lamports * 1_000_000) / units_consumed_safe as u64; } display_priority_fee_details( compute_unit_price, - units_consumed, - (units_consumed as u64 * compute_unit_price) / 1_000_000, + units_consumed_safe, + (units_consumed_safe as u64 * compute_unit_price) / 1_000_000, ); let priority_fee_instruction = @@ -218,7 +247,7 @@ pub async fn get_compute_unit_instructions( fn display_priority_fee_details( compute_unit_price: u64, - units_consumed: u64, + units_consumed: u32, total_priority_fee_lamports: u64, ) { println!( From c21acfb8a956fbbb3cc4917b9dcdd984756559a0 Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 7 Dec 2024 00:57:16 +0100 Subject: [PATCH 13/18] Improve calculations with prices. Update send transaction (wip) --- examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs index 1e625be0..92dee21f 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs @@ -18,7 +18,7 @@ use utils::{ }; pub const RPC_URL: &str = - "https://mainnet.helius-rpc.com/?api-key=e1bbe936-f564-4d9a-ae4e-a69e6f99e9b1"; + "https://mainnet.helius-rpc.com/?api-key="; #[tokio::main] async fn main() { From 6760b096936fae6574c1f97694b1d5bef2996daa Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 7 Dec 2024 04:34:00 +0100 Subject: [PATCH 14/18] Fix send_transaction. Add .env.template for RPC_URL. Fix calculation for sqrt_prices. Remove unnecessary retries. --- .../whirlpool_repositioning_bot/.env.template | 1 + .../whirlpool_repositioning_bot/Cargo.toml | 1 + .../whirlpool_repositioning_bot/README.md | 12 +- .../whirlpool_repositioning_bot/src/cli.rs | 10 +- .../whirlpool_repositioning_bot/src/main.rs | 15 +- .../src/position_manager.rs | 31 +-- .../whirlpool_repositioning_bot/src/utils.rs | 191 +++++++++--------- 7 files changed, 130 insertions(+), 131 deletions(-) create mode 100644 examples/rust-sdk/whirlpool_repositioning_bot/.env.template diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/.env.template b/examples/rust-sdk/whirlpool_repositioning_bot/.env.template new file mode 100644 index 00000000..52c2a22d --- /dev/null +++ b/examples/rust-sdk/whirlpool_repositioning_bot/.env.template @@ -0,0 +1 @@ +RPC_URL="https://api.mainnet-beta.solana.com" \ No newline at end of file diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/Cargo.toml b/examples/rust-sdk/whirlpool_repositioning_bot/Cargo.toml index ba72bc76..5a60e9b8 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/Cargo.toml +++ b/examples/rust-sdk/whirlpool_repositioning_bot/Cargo.toml @@ -16,3 +16,4 @@ spl-token-2022 = { version = "^3.0" } spl-associated-token-account = { version = "^3.0" } tokio = { version = "^1.41.1" } tokio-retry = { version = "^0.3.0" } +dotenv = { version = "^0.15.0"} diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/README.md b/examples/rust-sdk/whirlpool_repositioning_bot/README.md index 42516955..b3279e86 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/README.md +++ b/examples/rust-sdk/whirlpool_repositioning_bot/README.md @@ -42,14 +42,12 @@ A Rust-based CLI bot for interacting with the Orca Whirlpools program on Solana. --- ## RPC Configuration -The bot connects to Solana Mainnet Beta by default using: +The bot connects to an SVM network by using an RPC URL. Make a local copy of `.env.template` to `.env` and set your RPC URL there. It is strongly recommended to you use a URL from an RPC provider, or your own RPC node. -```rust -const RPC_URL: &str = "https://api.mainnet-beta.solana.com"; +```bash +RPC_URL="https://your-rpc-url.com" ``` -It is strongly recommended to modify this with URL from an RPC provider like Helius or Quicknod. You can update the RPC_URL constant in main.rs. - --- ## Usage @@ -70,8 +68,8 @@ Run the bot with the following arguments - `none`: No priority fee. - `low`: Lower 25th quartile prioritization fee. - `medium`: Median prioritization fee (default). - - `high`: Upper 75th quartile prioritization fee. - - `turbo`: Upper 95th quartile prioritization fee. + - `high`: Upper 80th quartile prioritization fee. + - `turbo`: Upper 99th quartile prioritization fee. - `max_priority_fee_lamports` (optional): Maximum total priority fee in lamports. Default: 10_000_000 (0.01 SOL). - `slippage_tolerance_bps` (optional): Slippage tolerance in basis points (bps). Default: 100. diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/cli.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/cli.rs index 24aa9eb1..24e44251 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/src/cli.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/cli.rs @@ -15,10 +15,10 @@ pub struct Args { #[arg( short = 't', long, - default_value_t = 1.0, - help = "Threshold for repositioning in percentage.\n" + default_value_t = 100, + help = "Threshold for repositioning in bps.\n" )] - pub threshold: f64, + pub threshold: u16, #[arg( short = 'i', @@ -37,8 +37,8 @@ pub struct Args { - `none`: No priority fee\n \ - `low`: Lower 25th quartile prioritization fee\n \ - `medium`: Median prioritization fee\n \ - - `high`: Upper 75th quartile prioritization fee\n \ - - `turbo`: Upper 95th quartile prioritization fee\n" + - `high`: Upper 80th quartile prioritization fee\n \ + - `turbo`: Upper 99th quartile prioritization fee\n" )] pub priority_fee_tier: PriorityFeeTier, diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs index 92dee21f..aede08c2 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/main.rs @@ -3,29 +3,30 @@ mod position_manager; mod utils; mod wallet; -use std::str::FromStr; - use clap::Parser; use cli::Args; +use colored::Colorize; +use dotenv::dotenv; use orca_whirlpools::{set_funder, set_whirlpools_config_address, WhirlpoolsConfigInput}; use orca_whirlpools_client::get_position_address; use position_manager::run_position_manager; use solana_client::nonblocking::rpc_client::RpcClient; use solana_sdk::pubkey::Pubkey; +use std::env; +use std::str::FromStr; use tokio::time::{sleep, Duration}; use utils::{ display_position_balances, display_wallet_balances, fetch_mint, fetch_position, fetch_whirlpool, }; -pub const RPC_URL: &str = - "https://mainnet.helius-rpc.com/?api-key="; - #[tokio::main] async fn main() { let args = Args::parse(); + dotenv().ok(); + let rpc_url = env::var("RPC_URL").unwrap(); + let rpc = RpcClient::new(rpc_url.to_string()); set_whirlpools_config_address(WhirlpoolsConfigInput::SolanaMainnet) .expect("Failed to set Whirlpools config address for specified network."); - let rpc = RpcClient::new(RPC_URL.to_string()); let wallet = wallet::load_wallet(); set_funder(wallet.pubkey()).expect("Failed to set funder address."); @@ -93,7 +94,7 @@ async fn main() { ) .await { - eprintln!("Error: {}", err); + eprintln!("{}", format!("Error: {}", err).to_string().red()); } sleep(Duration::from_secs(args.interval)).await; } diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs index 5f5e738e..f0fd72d9 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs @@ -28,15 +28,19 @@ pub async fn run_position_manager( let whirlpool_address = position.whirlpool; let whirlpool = fetch_whirlpool(&rpc, &whirlpool_address) .await - .expect("Failed to fetch Whirlpool data."); + .map_err(|_| "Failed to fetch Whirlpool data.")?; let current_price_sqrt = whirlpool.sqrt_price; let position_lower_price_sqrt = tick_index_to_sqrt_price(position.tick_lower_index); let position_upper_price_sqrt = tick_index_to_sqrt_price(position.tick_upper_index); let position_center_price_sqrt = (position_lower_price_sqrt + position_upper_price_sqrt) / 2; - let deviation_sqrt = (current_price_sqrt as i128 - position_center_price_sqrt as i128).abs() as u128; - let deviation_float = (deviation_sqrt as f64 * 100.0) / (position_center_price_sqrt as f64); - + let deviation_amount_sqrt = if current_price_sqrt > position_center_price_sqrt { + current_price_sqrt - position_center_price_sqrt + } else { + position_center_price_sqrt - current_price_sqrt + }; + let deviation_bps = (deviation_amount_sqrt * 10000) / (position_center_price_sqrt); + let current_price = sqrt_price_to_price( whirlpool.sqrt_price, token_mint_a.decimals, @@ -60,9 +64,9 @@ pub async fn run_position_manager( position_lower_price, position_upper_price ); println!("Position center price: {:.6}", position_center_price); - println!("Price deviation from center: {:.2}%", deviation_float); + println!("Price deviation from center: {:.2} bps", deviation_bps); - if deviation_float >= args.threshold { + if deviation_bps as u16 >= args.threshold { println!( "{}", "Deviation exceeds threshold. Rebalancing position." @@ -77,7 +81,7 @@ pub async fn run_position_manager( None, ) .await - .expect("Failed to generate close position instructions."); + .map_err(|_| "Failed to generate close position instructions.")?; let new_lower_price = current_price - (position_upper_price - position_lower_price) / 2.0; let new_upper_price = current_price + (position_upper_price - position_lower_price) / 2.0; @@ -94,7 +98,7 @@ pub async fn run_position_manager( None, ) .await - .expect("Failed to generate open position instructions."); + .map_err(|_| "Failed to generate open position instructions.")?; let mut all_instructions = vec![]; all_instructions.extend(close_position_instructions.instructions); @@ -117,22 +121,23 @@ pub async fn run_position_manager( let signature = send_transaction( &rpc, wallet.as_ref(), + &whirlpool_address, all_instructions, signers, args.priority_fee_tier, args.max_priority_fee_lamports, ) .await - .expect("Failed to send rebalancing transaction."); + .map_err(|_| "Failed to send rebalancing transaction.")?; println!("Rebalancing transaction signature: {}", signature); let position_mint_address = open_position_instructions.position_mint; println!("New position mint address: {}", position_mint_address); let (position_address, _) = get_position_address(&position_mint_address) - .expect("Failed to derive new position address."); + .map_err(|_| "Failed to derive new position address.")?; *position = fetch_position(&rpc, &position_address) .await - .expect("Failed to fetch new position data."); + .map_err(|_| "Failed to fetch new position data.")?; display_wallet_balances( &rpc, @@ -141,7 +146,7 @@ pub async fn run_position_manager( &whirlpool.token_mint_b, ) .await - .expect("Failed to display wallet balances."); + .map_err(|_| "Failed to display wallet balances.")?; display_position_balances( &rpc, @@ -153,7 +158,7 @@ pub async fn run_position_manager( args.slippage_tolerance_bps, ) .await - .expect("Failed to display position balances."); + .map_err(|_| "Failed to display position balances.")?; } else { println!( "{}", diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs index 4005fab7..e2df46bd 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs @@ -75,29 +75,31 @@ pub async fn fetch_token_balance( wallet_address: &Pubkey, token_mint_address: &Pubkey, ) -> Result> { - Retry::spawn(retry_strategy(), || async { - let mint_account = rpc.get_account(token_mint_address).await?; - let token_program_id = mint_account.owner; - let token_address = get_associated_token_address_with_program_id( - wallet_address, - token_mint_address, - &token_program_id, - ); - let balance = rpc.get_token_account_balance(&token_address).await?; - Ok(balance.ui_amount_string) - }) - .await + let mint_account = rpc.get_account(token_mint_address).await?; + let token_program_id = mint_account.owner; + let token_address = get_associated_token_address_with_program_id( + wallet_address, + token_mint_address, + &token_program_id, + ); + let balance = rpc.get_token_account_balance(&token_address).await?; + Ok(balance.ui_amount_string) } pub async fn fetch_position( rpc: &RpcClient, position_address: &Pubkey, ) -> Result> { - Retry::spawn(retry_strategy(), || async { - let position_account = rpc.get_account(position_address).await?; - let position = Position::from_bytes(&position_account.data)?; - Ok(position) - }) + Retry::spawn( + ExponentialBackoff::from_millis(500) + .max_delay(Duration::from_secs(5)) + .take(5), + || async { + let position_account = rpc.get_account(position_address).await?; + let position = Position::from_bytes(&position_account.data)?; + Ok(position) + }, + ) .await } @@ -105,21 +107,15 @@ pub async fn fetch_whirlpool( rpc: &RpcClient, whirlpool_address: &Pubkey, ) -> Result> { - Retry::spawn(retry_strategy(), || async { - let whirlpool_account = rpc.get_account(whirlpool_address).await?; - let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data)?; - Ok(whirlpool) - }) - .await + let whirlpool_account = rpc.get_account(whirlpool_address).await?; + let whirlpool = Whirlpool::from_bytes(&whirlpool_account.data)?; + Ok(whirlpool) } pub async fn fetch_mint(rpc: &RpcClient, mint_address: &Pubkey) -> Result> { - Retry::spawn(retry_strategy(), || async { - let mint_account = rpc.get_account(mint_address).await?; - let mint = Mint::unpack(&mint_account.data)?; - Ok(mint) - }) - .await + let mint_account = rpc.get_account(mint_address).await?; + let mint = Mint::unpack(&mint_account.data)?; + Ok(mint) } #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] @@ -134,72 +130,71 @@ pub enum PriorityFeeTier { pub async fn send_transaction( rpc: &RpcClient, wallet: &dyn Signer, + whirlpool_address: &Pubkey, instructions: Vec, additional_signers: Vec<&dyn Signer>, tier: PriorityFeeTier, max_priority_fee: u64, ) -> Result> { - Retry::spawn(retry_strategy(), || async { - let mut all_instructions = vec![]; - - let recent_blockhash = rpc.get_latest_blockhash().await?; - - let compute_unit_instructions = get_compute_unit_instructions( - rpc, - &instructions, - wallet, - &additional_signers, - tier, - max_priority_fee, - recent_blockhash, - ) - .await?; - all_instructions.extend(compute_unit_instructions); - - all_instructions.extend(instructions.clone()); - - let message = Message::new(&all_instructions, Some(&wallet.pubkey())); - let mut all_signers = vec![wallet]; - all_signers.extend(additional_signers.clone()); - - let transaction = Transaction::new(&all_signers, message, recent_blockhash); - let transaction_config = RpcSendTransactionConfig { - skip_preflight: true, - preflight_commitment: Some(CommitmentLevel::Confirmed), - ..Default::default() - }; - let signature = rpc.send_transaction_with_config(&transaction, transaction_config).await?; - confirm_transaction(rpc, &signature, 60).await - }) - .await -} + let mut all_instructions = vec![]; + + let recent_blockhash = rpc.get_latest_blockhash().await?; + + let compute_unit_instructions = get_compute_unit_instructions( + rpc, + &instructions, + wallet, + whirlpool_address, + &additional_signers, + tier, + max_priority_fee, + recent_blockhash, + ) + .await?; + all_instructions.extend(compute_unit_instructions); -async fn confirm_transaction( - rpc: &RpcClient, - signature: &Signature, - timeout_secs: u64, -) -> Result> { + all_instructions.extend(instructions.clone()); + + let message = Message::new(&all_instructions, Some(&wallet.pubkey())); + let mut all_signers = vec![wallet]; + all_signers.extend(additional_signers.clone()); + + let transaction = Transaction::new(&all_signers, message, recent_blockhash); + let transaction_config = RpcSendTransactionConfig { + skip_preflight: true, + preflight_commitment: Some(CommitmentLevel::Confirmed), + max_retries: Some(0), + ..Default::default() + }; let start_time = Instant::now(); - let timeout = Duration::from_secs(timeout_secs); - - loop { - match rpc.get_signature_status(signature).await? { - Some(Ok(())) => return Ok(*signature), - Some(Err(err)) => return Err(format!("Transaction failed: {:?}", err).into()), - None => { - if start_time.elapsed() >= timeout { - return Err("Transaction confirmation timed out".into()); - } - sleep(Duration::from_secs(1)).await; - } + let timeout = Duration::from_secs(90); + + let send_transaction_result = loop { + if start_time.elapsed() >= timeout { + break Err(Box::::from("Transaction timed out")); } - } + let signature: Signature = rpc + .send_transaction_with_config(&transaction, transaction_config) + .await?; + let statuses = rpc.get_signature_statuses(&[signature]).await?.value; + if let Some(status) = statuses[0].clone() { + break Ok((status, signature)); + } + sleep(Duration::from_millis(100)).await; + }; + send_transaction_result.and_then(|(status, signature)| { + status + .status + .map(|_| signature) + .map_err(|e| Box::new(e) as Box) + }) } -pub async fn get_compute_unit_instructions( +async fn get_compute_unit_instructions( rpc: &RpcClient, instructions: &[solana_sdk::instruction::Instruction], wallet: &dyn Signer, + whirlpool_address: &Pubkey, additional_signers: &[&dyn Signer], tier: PriorityFeeTier, max_priority_fee_lamports: u64, @@ -221,13 +216,16 @@ pub async fn get_compute_unit_instructions( ComputeBudgetInstruction::set_compute_unit_limit(units_consumed_safe); compute_unit_instructions.push(compute_limit_instruction); - if let Some(priority_fee_micro_lamports) = calculate_priority_fee(rpc, tier).await? { + if let Some(priority_fee_micro_lamports) = + calculate_priority_fee(rpc, tier, whirlpool_address).await? + { let mut compute_unit_price = priority_fee_micro_lamports; let total_priority_fee_lamports = (units_consumed_safe as u64 * priority_fee_micro_lamports) / 1_000_000; if total_priority_fee_lamports > max_priority_fee_lamports { - compute_unit_price = (max_priority_fee_lamports * 1_000_000) / units_consumed_safe as u64; + compute_unit_price = + (max_priority_fee_lamports * 1_000_000) / units_consumed_safe as u64; } display_priority_fee_details( @@ -252,9 +250,9 @@ fn display_priority_fee_details( ) { println!( "Priority Fee Details:\n\ - - Compute Unit Price: {} microlamports\n\ - - Compute Units Consumed: {}\n\ - - Total Priority Fee: {} lamports", + - Compute unit price: {} microlamports\n\ + - Estimated compute units: {}\n\ + - Total priority fee: {} lamports", compute_unit_price, units_consumed, total_priority_fee_lamports ); } @@ -262,8 +260,12 @@ fn display_priority_fee_details( async fn calculate_priority_fee( rpc: &RpcClient, tier: PriorityFeeTier, + whirlpool_address: &Pubkey, ) -> Result, Box> { - let prioritization_fees = rpc.get_recent_prioritization_fees(&[]).await.unwrap(); + let prioritization_fees = rpc + .get_recent_prioritization_fees(&[*whirlpool_address]) + .await + .unwrap(); if prioritization_fees.is_empty() || matches!(tier, PriorityFeeTier::None) { return Ok(None); @@ -272,24 +274,15 @@ async fn calculate_priority_fee( .iter() .map(|fee| fee.prioritization_fee) .collect(); - if fees.is_empty() { - return Ok(Some(0)); - } fees.sort_unstable(); let fee = match tier { PriorityFeeTier::Low => fees.get(fees.len() / 4).cloned(), PriorityFeeTier::Medium => fees.get(fees.len() / 2).cloned(), - PriorityFeeTier::High => fees.get((fees.len() * 3) / 4).cloned(), - PriorityFeeTier::Turbo => fees.get((fees.len() * 95) / 100).cloned(), + PriorityFeeTier::High => fees.get((fees.len() * 4) / 5).cloned(), + PriorityFeeTier::Turbo => fees.get((fees.len() * 99) / 100).cloned(), PriorityFeeTier::None => None, }; Ok(fee) } - -fn retry_strategy() -> std::iter::Take { - ExponentialBackoff::from_millis(100) - .max_delay(Duration::from_secs(2)) - .take(3) -} From 5cd3e90048ae727189db0fceae16d132c5a4b939 Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 7 Dec 2024 04:42:49 +0100 Subject: [PATCH 15/18] Fix yarn. Fix next example. --- examples/ts-sdk/next/app/page.tsx | 2 +- yarn.lock | 1082 +++++------------------------ 2 files changed, 168 insertions(+), 916 deletions(-) diff --git a/examples/ts-sdk/next/app/page.tsx b/examples/ts-sdk/next/app/page.tsx index d416fe31..0f0053bd 100644 --- a/examples/ts-sdk/next/app/page.tsx +++ b/examples/ts-sdk/next/app/page.tsx @@ -37,7 +37,7 @@ export default function Page() { onChange={(e) => setTickIndex(e.target.value)} />{" "} {" "} - {sqrtPrice && <>Sqrt Price: {sqrtPrice.toString()}} + {sqrtPrice !== undefined && <>Sqrt Price: {sqrtPrice.toString()}}

=20.0.0 "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 @@ -18505,7 +17775,6 @@ __metadata: stylus: "*" sugarss: "*" terser: ^5.4.0 - terser: ^5.4.0 dependenciesMeta: fsevents: optional: true @@ -18529,24 +17798,13 @@ __metadata: bin: vite: bin/vite.js checksum: 10c0/d536bb7af57dd0eca2a808f95f5ff1d7b7ffb8d86e17c6893087680a0448bd0d15e07475270c8a6de65cb5115592d037130a1dd979dc76bcef8c1dda202a1874 - checksum: 10c0/d536bb7af57dd0eca2a808f95f5ff1d7b7ffb8d86e17c6893087680a0448bd0d15e07475270c8a6de65cb5115592d037130a1dd979dc76bcef8c1dda202a1874 languageName: node linkType: hard "vitest@npm:^2.1.8": version: 2.1.8 resolution: "vitest@npm:2.1.8" -"vitest@npm:^2.1.6": - version: 2.1.8 - resolution: "vitest@npm:2.1.8" dependencies: - "@vitest/expect": "npm:2.1.8" - "@vitest/mocker": "npm:2.1.8" - "@vitest/pretty-format": "npm:^2.1.8" - "@vitest/runner": "npm:2.1.8" - "@vitest/snapshot": "npm:2.1.8" - "@vitest/spy": "npm:2.1.8" - "@vitest/utils": "npm:2.1.8" "@vitest/expect": "npm:2.1.8" "@vitest/mocker": "npm:2.1.8" "@vitest/pretty-format": "npm:^2.1.8" @@ -18566,17 +17824,12 @@ __metadata: tinyrainbow: "npm:^1.2.0" vite: "npm:^5.0.0" vite-node: "npm:2.1.8" - vite: "npm:^5.0.0" - vite-node: "npm:2.1.8" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@types/node": ^18.0.0 || >=20.0.0 "@vitest/browser": 2.1.8 "@vitest/ui": 2.1.8 - "@types/node": ^18.0.0 || >=20.0.0 - "@vitest/browser": 2.1.8 - "@vitest/ui": 2.1.8 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -18595,7 +17848,6 @@ __metadata: bin: vitest: vitest.mjs checksum: 10c0/e70631bad5662d6c60c5cf836a4baf58b890db6654fef1f608fe6a86aa49a2b9f078aac74b719d4d3c87c5c781968cc73590a7935277b48f3d8b6fb9c5b4d276 - checksum: 10c0/e70631bad5662d6c60c5cf836a4baf58b890db6654fef1f608fe6a86aa49a2b9f078aac74b719d4d3c87c5c781968cc73590a7935277b48f3d8b6fb9c5b4d276 languageName: node linkType: hard @@ -18796,8 +18048,8 @@ __metadata: linkType: hard "webpack@npm:^5.88.1, webpack@npm:^5.95.0": - version: 5.97.0 - resolution: "webpack@npm:5.97.0" + version: 5.97.1 + resolution: "webpack@npm:5.97.1" dependencies: "@types/eslint-scope": "npm:^3.7.7" "@types/estree": "npm:^1.0.6" @@ -18827,7 +18079,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10c0/a8714d42defbf52382b61c157f68e161a16d0edf228d8d9abaa7a165f3ee0ac7386a08d28d4dcf8d6740ea5bda0c4d4abfeeb838df029e636c1c28bb2454ac56 + checksum: 10c0/a12d3dc882ca582075f2c4bd88840be8307427245c90a8a0e0b372d73560df13fcf25a61625c9e7edc964981d16b5a8323640562eb48347cf9dd2f8bd1b39d35 languageName: node linkType: hard From ea55dbbc700a9164b3ed2957805e75d58ae1cd37 Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 7 Dec 2024 04:43:47 +0100 Subject: [PATCH 16/18] Format --- .../src/position_manager.rs | 16 ++++++++-------- .../whirlpool_repositioning_bot/src/utils.rs | 2 +- examples/ts-sdk/next/next.config.js | 12 +++++++----- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs index f0fd72d9..abec665c 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/position_manager.rs @@ -26,7 +26,7 @@ pub async fn run_position_manager( println!("Checking position."); let whirlpool_address = position.whirlpool; - let whirlpool = fetch_whirlpool(&rpc, &whirlpool_address) + let whirlpool = fetch_whirlpool(rpc, &whirlpool_address) .await .map_err(|_| "Failed to fetch Whirlpool data.")?; @@ -75,7 +75,7 @@ pub async fn run_position_manager( ); let close_position_instructions = close_position_instructions( - &rpc, + rpc, position.position_mint, Some(args.slippage_tolerance_bps), None, @@ -89,7 +89,7 @@ pub async fn run_position_manager( let increase_liquidity_param = IncreaseLiquidityParam::Liquidity(close_position_instructions.quote.liquidity_delta); let open_position_instructions = open_position_instructions( - &rpc, + rpc, whirlpool_address, new_lower_price, new_upper_price, @@ -119,7 +119,7 @@ pub async fn run_position_manager( ); let signature = send_transaction( - &rpc, + rpc, wallet.as_ref(), &whirlpool_address, all_instructions, @@ -135,12 +135,12 @@ pub async fn run_position_manager( println!("New position mint address: {}", position_mint_address); let (position_address, _) = get_position_address(&position_mint_address) .map_err(|_| "Failed to derive new position address.")?; - *position = fetch_position(&rpc, &position_address) + *position = fetch_position(rpc, &position_address) .await .map_err(|_| "Failed to fetch new position data.")?; display_wallet_balances( - &rpc, + rpc, &wallet.pubkey(), &whirlpool.token_mint_a, &whirlpool.token_mint_b, @@ -149,8 +149,8 @@ pub async fn run_position_manager( .map_err(|_| "Failed to display wallet balances.")?; display_position_balances( - &rpc, - &position, + rpc, + position, &whirlpool.token_mint_a, &whirlpool.token_mint_b, token_mint_a.decimals, diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs b/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs index e2df46bd..7b4b2f65 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs +++ b/examples/rust-sdk/whirlpool_repositioning_bot/src/utils.rs @@ -26,7 +26,7 @@ pub async fn display_position_balances( slippage_tolerance_bps: u16, ) -> Result<(), Box> { let close_position_instructions = close_position_instructions( - &rpc, + rpc, position.position_mint, Some(slippage_tolerance_bps), None, diff --git a/examples/ts-sdk/next/next.config.js b/examples/ts-sdk/next/next.config.js index 29d30ebe..817af15c 100644 --- a/examples/ts-sdk/next/next.config.js +++ b/examples/ts-sdk/next/next.config.js @@ -11,11 +11,13 @@ const nextConfig = { // (local dependencies are symlinked and next doesn't like that) config.plugins.push( new CopyWebpackPlugin({ - patterns: [{ - from: "../../../ts-sdk/core/dist/nodejs/orca_whirlpools_core_js_bindings_bg.wasm", - to: "./server/app" - }], - }) + patterns: [ + { + from: "../../../ts-sdk/core/dist/nodejs/orca_whirlpools_core_js_bindings_bg.wasm", + to: "./server/app", + }, + ], + }), ); // The following supresses a warning about using top-level-await and is optional From 294a041d2263b0405700fb550c923ae8c9b04f24 Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 7 Dec 2024 15:31:50 +0100 Subject: [PATCH 17/18] Remove test script from package.json --- examples/rust-sdk/whirlpool_repositioning_bot/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/package.json b/examples/rust-sdk/whirlpool_repositioning_bot/package.json index de7b1d45..2a6dbf9c 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/package.json +++ b/examples/rust-sdk/whirlpool_repositioning_bot/package.json @@ -3,7 +3,6 @@ "version": "0.0.1", "scripts": { "build": "cargo build", - "test": "cargo test --lib", "format": "cargo clippy --fix --allow-dirty --allow-staged && cargo fmt", "lint": "cargo clippy", "clean": "cargo clean" From bf1504be5b6a0561714e3406e8de9a79b9577168 Mon Sep 17 00:00:00 2001 From: calintje Date: Sat, 7 Dec 2024 21:03:45 +0100 Subject: [PATCH 18/18] Update lint script --- examples/rust-sdk/whirlpool_repositioning_bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rust-sdk/whirlpool_repositioning_bot/package.json b/examples/rust-sdk/whirlpool_repositioning_bot/package.json index 2a6dbf9c..7c8f2a23 100644 --- a/examples/rust-sdk/whirlpool_repositioning_bot/package.json +++ b/examples/rust-sdk/whirlpool_repositioning_bot/package.json @@ -4,7 +4,7 @@ "scripts": { "build": "cargo build", "format": "cargo clippy --fix --allow-dirty --allow-staged && cargo fmt", - "lint": "cargo clippy", + "lint": "cargo clippy && cargo fmt --check", "clean": "cargo clean" }, "devDependencies": {