From 716611475b8ef9446efd4270382b53c07d7bd49f Mon Sep 17 00:00:00 2001 From: William Date: Wed, 9 Apr 2025 13:36:15 +0800 Subject: [PATCH] update readme --- README.md | 108 +++++++++++++++++++++++++++++++++++++++++----------- src/main.rs | 96 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 153 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 93f6121..5b91807 100755 --- a/README.md +++ b/README.md @@ -25,8 +25,7 @@ pumpfun-sdk = { path = "./pumpfun-sdk", version = "2.4.3" } ### logs subscription for token create and trade transaction ```rust -use std::sync::{Arc, OnceLock}; -use pumpfun_sdk::grpc::YellowstoneGrpc; +use pumpfun_sdk::{common::logs_events::PumpfunEvent, grpc::YellowstoneGrpc}; // create grpc client let grpc_url = "http://127.0.0.1:10000"; @@ -59,30 +58,80 @@ client.subscribe_pumpfun(callback, Some(payer_keypair.pubkey())).await?; ``` -### pumpfun Create, Buy, Sell +### Init Pumpfun instance for configs ```rust -use std::sync::{Arc, OnceLock}; -use solana_sdk::{ - signature::Keypair, - commitment_config::CommitmentConfig, -}; -use pumpfun_sdk::PumpFun; -use pumpfun_sdk::common::{Cluster, PriorityFee}; +use std::sync::Arc; +use pumpfun_sdk::{common::{Cluster, PriorityFee}, PumpFun}; +use solana_sdk::{commitment_config::CommitmentConfig, signature::Keypair, signer::Signer}; -let payer = Keypair::from_base58_string(&settings.dex.payer.clone()); -let cluster = Cluster::new( - rpc_url.clone(), - jito_url.clone(), - nextblock_url.clone(), - nextblock_auth_token.clone(), - zeroslot_url.clone(), - zeroslot_auth_token.clone(), +let priority_fee = PriorityFee{ + unit_limit: 72000, + unit_price: 1000000, + buy_tip_fee: 0.001, + sell_tip_fee: 0.0001, +}; + +let cluster = Cluster { + rpc_url: "https://api.mainnet-beta.solana.com".to_string(), + block_engine_url: "https://block-engine.example.com".to_string(), + nextblock_url: "https://nextblock.example.com".to_string(), + nextblock_auth_token: "nextblock_api_token".to_string(), + zeroslot_url: "https://zeroslot.example.com".to_string(), + zeroslot_auth_token: "zeroslot_api_token".to_string(), + use_jito: true, + use_nextblock: false, + use_zeroslot: false, priority_fee, - CommitmentConfig::processed(), - use_jito, - use_nextblock, - use_zeroslot, -); + commitment: CommitmentConfig::processed(), +}; + +// create pumpfun instance +let payer = Keypair::from_base58_string("your private key"); +let pumpfun = PumpFun::new( + Arc::new(payer), + &cluster, +).await; +``` + +### pumpfun Create Token +```rust +use std::sync::Arc; +use pumpfun_sdk::{ipfs, PumpFun}; +use solana_sdk::{native_token::sol_to_lamports, signature::Keypair, signer::Signer}; + +// create pumpfun instance +let pumpfun = PumpFun::new(Arc::new(payer), &cluster).await; + +// Mint keypair +let mint_pubkey: Keypair = Keypair::new(); + +let metadata = ipfs::CreateTokenMetadata { + name: "Doge".to_string(), + symbol: "DOGE".to_string(), + description: "Dogecoin".to_string(), + file: "/Users/joseph/Desktop/doge.png".to_string(), + twitter: None, + telegram: None, + website: None, + metadata_uri: None, +}; + +// ipfs_api_key for https://api.pinata.cloud +let ipfs_metadata = ipfs::create_token_metadata(metadata, &"".to_string()).await?; +println!("ipfs_metadata: {:?}", ipfs_metadata); + +pumpfun.create_and_buy( + mint, + ipfs_metadata, + sol_to_lamports(0.1), + None, +).await?; +``` + +### pumpfun Buy token +```rust +use pumpfun_sdk::PumpFun; +use solana_sdk::{native_token::sol_to_lamports, signature::Keypair, signer::Signer}; // create pumpfun instance let pumpfun = PumpFun::new(Arc::new(payer), &cluster).await; @@ -93,6 +142,19 @@ let mint_pubkey: Keypair = Keypair::new(); // buy token with tip pumpfun.buy_with_tip(mint_pubkey, 10000, None).await?; +``` + +### pumpfun Sell token +```rust +use pumpfun_sdk::PumpFun; +use solana_sdk::{native_token::sol_to_lamports, signature::Keypair, signer::Signer}; + +// create pumpfun instance +let pumpfun = PumpFun::new(Arc::new(payer), &cluster).await; + +// sell token with tip +pumpfun.sell_with_tip(mint_pubkey, 100000, None).await?; + // sell token by percent with tip pumpfun.sell_by_percent_with_tip(mint_pubkey, 100, None).await?; diff --git a/src/main.rs b/src/main.rs index 0d7bc57..1b6e664 100755 --- a/src/main.rs +++ b/src/main.rs @@ -1,52 +1,92 @@ -use pumpfun_sdk::common::{ - logs_events::PumpfunEvent, - logs_subscribe::{tokens_subscription, stop_subscription} -}; -use solana_sdk::commitment_config::CommitmentConfig; +use std::sync::Arc; +use pumpfun_sdk::{common::{logs_events::PumpfunEvent, Cluster, PriorityFee}, grpc::YellowstoneGrpc, ipfs, PumpFun}; +use solana_sdk::{commitment_config::CommitmentConfig, native_token::sol_to_lamports, signature::Keypair, signer::Signer}; #[tokio::main] async fn main() -> Result<(), Box> { - println!("Starting token subscription\n"); + // create grpc client + let grpc_url = "http://127.0.0.1:10000"; + let client = YellowstoneGrpc::new(grpc_url.to_string()); - let ws_url = "wss://api.mainnet-beta.solana.com"; - - // Set commitment - let commitment = CommitmentConfig::confirmed(); - // Define callback function let callback = |event: PumpfunEvent| { match event { - PumpfunEvent::NewDevTrade(trade_info) => { - println!("Received new dev trade event: {:?}", trade_info); - }, PumpfunEvent::NewToken(token_info) => { println!("Received new token event: {:?}", token_info); }, + PumpfunEvent::NewDevTrade(trade_info) => { + println!("Received dev trade event: {:?}", trade_info); + }, PumpfunEvent::NewUserTrade(trade_info) => { println!("Received new trade event: {:?}", trade_info); }, PumpfunEvent::NewBotTrade(trade_info) => { println!("Received new bot trade event: {:?}", trade_info); - }, + } PumpfunEvent::Error(err) => { println!("Received error: {}", err); } } }; - // Start subscription - let subscription = tokens_subscription( - ws_url, - commitment, - callback, - None - ).await.unwrap(); - - // Wait for a while to receive events - tokio::time::sleep(tokio::time::Duration::from_secs(60)).await; - - // Stop subscription - stop_subscription(subscription).await; + let payer_keypair = Keypair::from_base58_string("your private key"); + client.subscribe_pumpfun(callback, Some(payer_keypair.pubkey())).await?; Ok(()) +} + +async fn create_and_buy() -> Result<(), Box> { + let priority_fee = PriorityFee{ + unit_limit: 72000, + unit_price: 1000000, + buy_tip_fee: 0.001, + sell_tip_fee: 0.0001, + }; + + let cluster = Cluster { + rpc_url: "https://api.mainnet-beta.solana.com".to_string(), + block_engine_url: "https://block-engine.example.com".to_string(), + nextblock_url: "https://nextblock.example.com".to_string(), + nextblock_auth_token: "nextblock_api_token".to_string(), + zeroslot_url: "https://zeroslot.example.com".to_string(), + zeroslot_auth_token: "zeroslot_api_token".to_string(), + use_jito: true, + use_nextblock: false, + use_zeroslot: false, + priority_fee, + commitment: CommitmentConfig::processed(), + }; + + // create pumpfun instance + let payer = Keypair::new(); + let pumpfun = PumpFun::new( + Arc::new(payer), + &cluster, + ).await; + + let metadata = ipfs::CreateTokenMetadata { + name: "Doge".to_string(), + symbol: "DOGE".to_string(), + description: "Dogecoin".to_string(), + file: "/Users/joseph/Desktop/doge.png".to_string(), + twitter: None, + telegram: None, + website: None, + metadata_uri: None, + }; + + // ipfs_api_key for https://api.pinata.cloud + let ipfs_metadata = ipfs::create_token_metadata(metadata, &"".to_string()).await?; + println!("ipfs_metadata: {:?}", ipfs_metadata); + + let mint = Keypair::new(); + + pumpfun.create_and_buy( + mint, + ipfs_metadata, + sol_to_lamports(0.1), + None, + ).await?; + + Ok(()) // 添加返回值 } \ No newline at end of file