fix slippage and get_buy_token_amount_from_sol_amount

This commit is contained in:
William
2025-05-14 22:11:16 +08:00
parent 07651638b9
commit 4198720c51
4 changed files with 65 additions and 37 deletions
+8 -22
View File
@@ -1,7 +1,6 @@
use anyhow::anyhow;
use solana_client::rpc_config::RpcSimulateTransactionConfig;
use solana_sdk::{
commitment_config::CommitmentConfig, compute_budget::ComputeBudgetInstruction, instruction::Instruction, message::{v0, VersionedMessage}, native_token::sol_to_lamports, pubkey::Pubkey, signature::{Keypair, Signature}, signer::Signer, system_instruction, transaction::{Transaction, VersionedTransaction}
compute_budget::ComputeBudgetInstruction, instruction::Instruction, message::{v0, VersionedMessage}, native_token::sol_to_lamports, pubkey::Pubkey, signature::Keypair, signer::Signer, system_instruction, transaction::{Transaction, VersionedTransaction}
};
use solana_hash::Hash;
use spl_associated_token_account::get_associated_token_address;
@@ -10,9 +9,9 @@ use tokio::task::JoinHandle;
use std::{str::FromStr, time::Instant, sync::Arc};
use crate::{common::{PriorityFee, SolanaRpcClient}, constants::trade::{DEFAULT_COMPUTE_UNIT_PRICE, DEFAULT_SLIPPAGE}, instruction, swqos::FeeClient};
use crate::{common::{PriorityFee, SolanaRpcClient}, instruction, swqos::FeeClient};
use super::common::{calculate_with_slippage_sell, get_bonding_curve_account, get_creator_vault_pda, get_global_account};
use super::common::{get_bonding_curve_account, get_creator_vault_pda, get_global_account};
async fn get_token_balance(rpc: &SolanaRpcClient, payer: &Keypair, mint: &Pubkey) -> Result<(u64, Pubkey), anyhow::Error> {
let ata = get_associated_token_address(&payer.pubkey(), mint);
@@ -32,10 +31,9 @@ pub async fn sell(
payer: Arc<Keypair>,
mint: Pubkey,
amount_token: Option<u64>,
slippage_basis_points: Option<u64>,
priority_fee: PriorityFee,
) -> Result<(), anyhow::Error> {
let instructions = build_sell_instructions(rpc.clone(), payer.clone(), mint.clone(), amount_token, slippage_basis_points).await?;
let instructions = build_sell_instructions(rpc.clone(), payer.clone(), mint.clone(), amount_token).await?;
let transaction = build_sell_transaction(rpc.clone(), payer.clone(), priority_fee, instructions).await?;
rpc.send_and_confirm_transaction(&transaction).await?;
@@ -48,7 +46,6 @@ pub async fn sell_by_percent(
payer: Arc<Keypair>,
mint: Pubkey,
percent: u64,
slippage_basis_points: Option<u64>,
priority_fee: PriorityFee,
) -> Result<(), anyhow::Error> {
if percent == 0 || percent > 100 {
@@ -57,7 +54,7 @@ pub async fn sell_by_percent(
let (balance_u64, _) = get_token_balance(rpc.as_ref(), payer.as_ref(), &mint).await?;
let amount = balance_u64 * percent / 100;
sell(rpc, payer, mint, Some(amount), slippage_basis_points, priority_fee).await
sell(rpc, payer, mint, Some(amount), priority_fee).await
}
pub async fn sell_by_percent_with_tip(
@@ -66,7 +63,6 @@ pub async fn sell_by_percent_with_tip(
payer: Arc<Keypair>,
mint: Pubkey,
percent: u64,
slippage_basis_points: Option<u64>,
priority_fee: PriorityFee,
) -> Result<(), anyhow::Error> {
if percent == 0 || percent > 100 {
@@ -75,7 +71,7 @@ pub async fn sell_by_percent_with_tip(
let (balance_u64, _) = get_token_balance(rpc.as_ref(), payer.as_ref(), &mint).await?;
let amount = balance_u64 * percent / 100;
sell_with_tip(rpc, fee_clients, payer, mint, Some(amount), slippage_basis_points, priority_fee).await
sell_with_tip(rpc, fee_clients, payer, mint, Some(amount), priority_fee).await
}
/// Sell tokens using Jito
@@ -85,13 +81,12 @@ pub async fn sell_with_tip(
payer: Arc<Keypair>,
mint: Pubkey,
amount_token: Option<u64>,
slippage_basis_points: Option<u64>,
priority_fee: PriorityFee,
) -> Result<(), anyhow::Error> {
let start_time = Instant::now();
let mut transactions = vec![];
let instructions = build_sell_instructions(rpc.clone(), payer.clone(), mint.clone(), amount_token, slippage_basis_points).await?;
let instructions = build_sell_instructions(rpc.clone(), payer.clone(), mint.clone(), amount_token).await?;
let recent_blockhash = rpc.get_latest_blockhash().await?;
for fee_client in fee_clients.clone() {
@@ -186,7 +181,6 @@ pub async fn build_sell_instructions(
payer: Arc<Keypair>,
mint: Pubkey,
amount_token: Option<u64>,
slippage_basis_points: Option<u64>,
) -> Result<Vec<Instruction>, anyhow::Error> {
let (balance_u64, ata) = get_token_balance(rpc.as_ref(), payer.as_ref(), &mint).await?;
let amount = amount_token.unwrap_or(balance_u64);
@@ -197,14 +191,6 @@ pub async fn build_sell_instructions(
let global_account = get_global_account(rpc.as_ref()).await?;
let (bonding_curve_account, bonding_curve_pda) = get_bonding_curve_account(&rpc, &mint).await?;
let min_sol_output = bonding_curve_account
.get_sell_price(amount, global_account.fee_basis_points)
.map_err(|e| anyhow!(e))?;
let min_sol_output_with_slippage = calculate_with_slippage_sell(
min_sol_output,
slippage_basis_points.unwrap_or(DEFAULT_SLIPPAGE),
);
let creator_vault_pda = get_creator_vault_pda(&bonding_curve_account.creator).unwrap();
let instructions = vec![
@@ -216,7 +202,7 @@ pub async fn build_sell_instructions(
&global_account.fee_recipient,
instruction::Sell {
_amount: amount,
_min_sol_output: min_sol_output_with_slippage,
_min_sol_output: 0,
},
),