2025-09-19 00:49:45 +08:00
# 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?
2025-09-19 18:02:11 +08:00
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, beyond the 150-block limitation of recent block hashes.
2025-09-19 00:49:45 +08:00
## 🚀 Core Benefits
2025-09-19 18:02:11 +08:00
- **Transaction Replay Protection**: Prevents identical transactions from being executed multiple times
2025-09-19 00:49:45 +08:00
- **Extended Time Window**: Transactions can remain valid for longer periods
2025-09-19 18:02:11 +08:00
- **Network Performance Optimization**: Reduces dependency on the latest block hash
2025-09-19 00:49:45 +08:00
- **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:
```rust
use sol_trade_sdk ::common ::nonce_cache ::NonceCache ;
2025-09-19 18:02:11 +08:00
// Set up nonce account
2025-09-19 00:49:45 +08:00
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:
```rust
// Fetch and update nonce information
NonceCache ::get_instance (). fetch_nonce_info_use_rpc ( & client . rpc ). await ? ;
2025-09-19 18:02:11 +08:00
// Or manually manage nonce
// NonceCache::get_instance().update_nonce_info_partial(nonce_account, current_nonce, used);
2025-09-19 00:49:45 +08:00
let nonce_info = NonceCache ::get_instance (). get_nonce_info ();
let current_nonce = nonce_info . current_nonce ;
2025-09-19 18:02:11 +08:00
let nonce_account = nonce_info . nonce_account ;
2025-09-19 00:49:45 +08:00
println! ( "Current nonce: {} " , current_nonce );
```
### 3. Use Nonce in Transactions
2025-09-19 18:02:11 +08:00
Set nonce parameters: nonce_account and current_nonce
2025-09-19 00:49:45 +08:00
```rust
let buy_params = sol_trade_sdk ::TradeBuyParams {
dex_type : DexType ::PumpFun ,
mint : mint_pubkey ,
sol_amount : buy_sol_amount ,
slippage_basis_points : Some ( 100 ),
2025-09-19 18:02:11 +08:00
recent_blockhash : recent_blockhash ,
2025-09-19 00:49:45 +08:00
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 ,
2025-09-19 18:02:11 +08:00
nonce_account : nonce_account , // Set nonce account
current_nonce : Some ( current_nonce ), // Set nonce value
2025-09-19 00:49:45 +08:00
};
// Execute transaction
client . buy ( buy_params ). await ? ;
```
## 🔄 Nonce Lifecycle
1. **Initialize** : Set nonce account address
2. **Fetch** : Get the latest nonce value from RPC
2025-09-19 18:02:11 +08:00
3. **Use** : Set nonce parameters in transactions
4. **Refresh** : Fetch new nonce value before next use
2025-09-19 00:49:45 +08:00
## 🔗 Related Documentation
2025-09-19 18:02:11 +08:00
- [Example: Nonce Cache ](../examples/nonce_cache/ )