161 lines
6.7 KiB
Rust
Executable File
161 lines
6.7 KiB
Rust
Executable File
//! Instructions for interacting with the Pump.fun program.
|
|
//!
|
|
//! This module contains instruction builders for creating Solana instructions to interact with the
|
|
//! Pump.fun program. Each function takes the required accounts and instruction data and returns a
|
|
//! properly formatted Solana instruction.
|
|
//!
|
|
//! # Instructions
|
|
//!
|
|
//! - `create`: Instruction to create a new token with an associated bonding curve.
|
|
//! - `buy`: Instruction to buy tokens from a bonding curve by providing SOL.
|
|
//! - `sell`: Instruction to sell tokens back to the bonding curve in exchange for SOL.
|
|
|
|
pub mod logs_data;
|
|
pub mod logs_parser;
|
|
pub mod logs_filters;
|
|
pub mod logs_events;
|
|
pub mod logs_subscribe;
|
|
|
|
pub use logs_data::*;
|
|
pub use logs_parser::*;
|
|
pub use logs_filters::*;
|
|
pub use logs_events::*;
|
|
pub use logs_subscribe::*;
|
|
|
|
use crate::{constants, PumpFun};
|
|
use anchor_client::anchor_lang::InstructionData;
|
|
use anchor_spl::associated_token::get_associated_token_address;
|
|
use pumpfun_cpi as cpi;
|
|
use solana_sdk::{
|
|
instruction::{AccountMeta, Instruction},
|
|
pubkey::Pubkey,
|
|
signature::Keypair,
|
|
signer::Signer,
|
|
};
|
|
|
|
/// Creates an instruction to create a new token with bonding curve
|
|
///
|
|
/// Creates a new SPL token with an associated bonding curve that determines its price.
|
|
///
|
|
/// # Arguments
|
|
///
|
|
/// * `payer` - Keypair that will pay for account creation and transaction fees
|
|
/// * `mint` - Keypair for the new token mint account that will be created
|
|
/// * `args` - Create instruction data containing token name, symbol and metadata URI
|
|
///
|
|
/// # Returns
|
|
///
|
|
/// Returns a Solana instruction that when executed will create the token and its accounts
|
|
pub fn create(payer: &Keypair, mint: &Keypair, args: cpi::instruction::Create) -> Instruction {
|
|
let bonding_curve: Pubkey = PumpFun::get_bonding_curve_pda(&mint.pubkey()).unwrap();
|
|
Instruction::new_with_bytes(
|
|
constants::accounts::PUMPFUN,
|
|
&args.data(),
|
|
vec![
|
|
AccountMeta::new(mint.pubkey(), true),
|
|
AccountMeta::new(PumpFun::get_mint_authority_pda(), false),
|
|
AccountMeta::new(bonding_curve, false),
|
|
AccountMeta::new(
|
|
get_associated_token_address(&bonding_curve, &mint.pubkey()),
|
|
false,
|
|
),
|
|
AccountMeta::new_readonly(PumpFun::get_global_pda(), false),
|
|
AccountMeta::new_readonly(constants::accounts::MPL_TOKEN_METADATA, false),
|
|
AccountMeta::new(PumpFun::get_metadata_pda(&mint.pubkey()), false),
|
|
AccountMeta::new(payer.pubkey(), true),
|
|
AccountMeta::new_readonly(constants::accounts::SYSTEM_PROGRAM, false),
|
|
AccountMeta::new_readonly(constants::accounts::TOKEN_PROGRAM, false),
|
|
AccountMeta::new_readonly(constants::accounts::ASSOCIATED_TOKEN_PROGRAM, false),
|
|
AccountMeta::new_readonly(constants::accounts::RENT, false),
|
|
AccountMeta::new_readonly(constants::accounts::EVENT_AUTHORITY, false),
|
|
AccountMeta::new_readonly(constants::accounts::PUMPFUN, false),
|
|
],
|
|
)
|
|
}
|
|
|
|
/// Creates an instruction to buy tokens from a bonding curve
|
|
///
|
|
/// Buys tokens by providing SOL. The amount of tokens received is calculated based on
|
|
/// the bonding curve formula. A portion of the SOL is taken as a fee and sent to the
|
|
/// fee recipient account.
|
|
///
|
|
/// # Arguments
|
|
///
|
|
/// * `payer` - Keypair that will provide the SOL to buy tokens
|
|
/// * `mint` - Public key of the token mint to buy
|
|
/// * `fee_recipient` - Public key of the account that will receive the transaction fee
|
|
/// * `args` - Buy instruction data containing the SOL amount and maximum acceptable token price
|
|
///
|
|
/// # Returns
|
|
///
|
|
/// Returns a Solana instruction that when executed will buy tokens from the bonding curve
|
|
pub fn buy(
|
|
payer: &Keypair,
|
|
mint: &Pubkey,
|
|
fee_recipient: &Pubkey,
|
|
args: cpi::instruction::Buy,
|
|
) -> Instruction {
|
|
let bonding_curve: Pubkey = PumpFun::get_bonding_curve_pda(mint).unwrap();
|
|
Instruction::new_with_bytes(
|
|
constants::accounts::PUMPFUN,
|
|
&args.data(),
|
|
vec![
|
|
AccountMeta::new_readonly(PumpFun::get_global_pda(), false),
|
|
AccountMeta::new(*fee_recipient, false),
|
|
AccountMeta::new_readonly(*mint, false),
|
|
AccountMeta::new(bonding_curve, false),
|
|
AccountMeta::new(get_associated_token_address(&bonding_curve, mint), false),
|
|
AccountMeta::new(get_associated_token_address(&payer.pubkey(), mint), false),
|
|
AccountMeta::new(payer.pubkey(), true),
|
|
AccountMeta::new_readonly(constants::accounts::SYSTEM_PROGRAM, false),
|
|
AccountMeta::new_readonly(constants::accounts::TOKEN_PROGRAM, false),
|
|
AccountMeta::new_readonly(constants::accounts::RENT, false),
|
|
AccountMeta::new_readonly(constants::accounts::EVENT_AUTHORITY, false),
|
|
AccountMeta::new_readonly(constants::accounts::PUMPFUN, false),
|
|
],
|
|
)
|
|
}
|
|
|
|
/// Creates an instruction to sell tokens back to a bonding curve
|
|
///
|
|
/// Sells tokens back to the bonding curve in exchange for SOL. The amount of SOL received
|
|
/// is calculated based on the bonding curve formula. A portion of the SOL is taken as
|
|
/// a fee and sent to the fee recipient account.
|
|
///
|
|
/// # Arguments
|
|
///
|
|
/// * `payer` - Keypair that owns the tokens to sell
|
|
/// * `mint` - Public key of the token mint to sell
|
|
/// * `fee_recipient` - Public key of the account that will receive the transaction fee
|
|
/// * `args` - Sell instruction data containing token amount and minimum acceptable SOL output
|
|
///
|
|
/// # Returns
|
|
///
|
|
/// Returns a Solana instruction that when executed will sell tokens to the bonding curve
|
|
pub fn sell(
|
|
payer: &Keypair,
|
|
mint: &Pubkey,
|
|
fee_recipient: &Pubkey,
|
|
args: cpi::instruction::Sell,
|
|
) -> Instruction {
|
|
let bonding_curve: Pubkey = PumpFun::get_bonding_curve_pda(mint).unwrap();
|
|
Instruction::new_with_bytes(
|
|
constants::accounts::PUMPFUN,
|
|
&args.data(),
|
|
vec![
|
|
AccountMeta::new_readonly(PumpFun::get_global_pda(), false),
|
|
AccountMeta::new(*fee_recipient, false),
|
|
AccountMeta::new_readonly(*mint, false),
|
|
AccountMeta::new(bonding_curve, false),
|
|
AccountMeta::new(get_associated_token_address(&bonding_curve, mint), false),
|
|
AccountMeta::new(get_associated_token_address(&payer.pubkey(), mint), false),
|
|
AccountMeta::new(payer.pubkey(), true),
|
|
AccountMeta::new_readonly(constants::accounts::SYSTEM_PROGRAM, false),
|
|
AccountMeta::new_readonly(constants::accounts::ASSOCIATED_TOKEN_PROGRAM, false),
|
|
AccountMeta::new_readonly(constants::accounts::TOKEN_PROGRAM, false),
|
|
AccountMeta::new_readonly(constants::accounts::EVENT_AUTHORITY, false),
|
|
AccountMeta::new_readonly(constants::accounts::PUMPFUN, false),
|
|
],
|
|
)
|
|
}
|