- feat(gas): add comprehensive gas fee strategy management system * Implement GasFeeStrategyType with Default/LowTipHighCuPrice/HighTipLowCuPrice strategies * Add dynamic gas fee configuration per SWQOS service and trade type * Integrate arc-swap for thread-safe strategy updates - docs: restructure documentation with dedicated guides * Add ADDRESS_LOOKUP_TABLE.md/CN.md for lookup table configuration * Add NONCE_CACHE.md/CN.md for nonce management documentation * Add TRADING_PARAMETERS.md/CN.md for comprehensive parameter guides * Simplify main README.md with focused overview - refactor: update all examples with new gas fee strategy integration * Modernize 14 trading examples with consistent parameter handling * Improve error handling and configuration management * Enhance parallel trading implementation
2.7 KiB
2.7 KiB
Nonce Cache Guide
This guide explains how to use Nonce Cache in Sol Trade SDK to implement transaction replay protection and optimize transaction processing.
📋 What is Nonce Cache?
Nonce Cache is a global singleton cache system for managing durable nonce accounts in the Solana network. Durable nonce is a Solana feature that allows you to create transactions that remain valid for extended periods, not limited by the 150-block constraint of recent block hashes.
🚀 Core Benefits
- Transaction Replay Protection: Prevents the same transaction from being executed multiple times
- Extended Time Window: Transactions can remain valid for longer periods
- Network Performance Optimization: Reduces dependency on recent block hashes
- Transaction Determinism: Provides consistent transaction processing experience
- Offline Transaction Support: Supports offline processing of pre-signed transactions
🛠️ Implementation
Prerequisites:
You need to create a nonce account for your payer account first. Reference: https://solana.com/developers/guides/advanced/introduction-to-durable-nonces
1. Initialize Nonce Cache
First, set up the nonce account and initialize the cache:
use sol_trade_sdk::common::nonce_cache::NonceCache;
// Set nonce account
let nonce_account_str = "your_nonce_account_address_here";
NonceCache::get_instance().init(Some(nonce_account_str.to_string()));
2. Fetch Nonce Information
Get the latest nonce information from RPC:
// Fetch and update nonce information
NonceCache::get_instance().fetch_nonce_info_use_rpc(&client.rpc).await?;
// Get current nonce value
let nonce_info = NonceCache::get_instance().get_nonce_info();
let current_nonce = nonce_info.current_nonce;
println!("Current nonce: {}", current_nonce);
3. Use Nonce in Transactions
Pass the nonce as the recent_blockhash parameter to transactions:
let buy_params = sol_trade_sdk::TradeBuyParams {
dex_type: DexType::PumpFun,
mint: mint_pubkey,
sol_amount: buy_sol_amount,
slippage_basis_points: Some(100),
recent_blockhash: current_nonce, // Use nonce as blockhash
extension_params: Box::new(PumpFunParams::from_trade(&trade_info, None)),
lookup_table_key: None,
wait_transaction_confirmed: true,
create_wsol_ata: false,
close_wsol_ata: false,
create_mint_ata: true,
open_seed_optimize: false,
};
// Execute transaction
client.buy(buy_params).await?;
🔄 Nonce Lifecycle
- Initialize: Set nonce account address
- Fetch: Get the latest nonce value from RPC
- Use: Use as blockhash in transactions
- Refresh: Re-fetch new nonce value before next use