Install
openclaw skills install fuegoLocal Solana agent wallet with local infra for transfers (SOL, USDC, USDT), Jupiter swaps, and x402 purch.
openclaw skills install fuegoLocal Solana agent wallet with local infra for transfers (SOL, USDC, USDT), Jupiter swaps, and x402 purch.
npm install -g fuego-cli
fuego create
# Output:
# Address: DmFyLRiJtc4Bz75hjAqPaEJpDfRe4GEnRLPwc3EgeUZF
# Wallet config: ~/.fuego/wallet-config.json
# Backup: ~/.config/solana/fuego-backup.json
Prerequisites: Rust 1.85+ and Cargo are required to build the server.
# For OpenClaw agents (auto-detects ~/.openclaw/workspace)
fuego install
# For manual installs (specify path)
fuego install --path ~/projects/fuego
If you want to do token swaps via Jupiter, you need an API key:
~/.fuego/config.json:{
"rpcUrl": "https://api.mainnet-beta.solana.com",
"network": "mainnet-beta",
"jupiterKey": "your-jupiter-api-key-here"
}
Without this key, swaps will not work. Balance checks and transfers work without it.
fuego serve
# Output:
# Fuego server running on http://127.0.0.1:8080
fuego address
# Output:
# Your Fuego Address
# Name: default
# Public Key: DmFy...eUZF
Share this address so humans can fund the wallet. They can send SOL from any Solana wallet (Phantom, Solflare, etc.).
Option A: MoonPay (for fiat → crypto)
Option B: Manual transfer
Use the CLI - this is the recommended approach:
fuego send <recipient> <amount> --token USDC --yes
This single command:
--token flagExample:
fuego send GvCoHGGBR97Yphzc6SrRycZyS31oUYBM8m9hLRtJT7r5 0.25 --token USDC --yes
Always show the user the expected rate before executing:
fuego quote --input BONK --output USDC --amount 100000
Output shows:
After user confirms the quote:
fuego swap --input BONK --output USDC --amount 100000 --slippage 1.0
Parameters:
--input - Input token symbol (SOL, USDC, BONK, etc.) or mint address--output - Output token symbol or mint address--amount - Amount in token units (e.g., 100000 for 100000 BONK)--slippage - Slippage tolerance in percent (default: 0.5%)The swap script automatically:
Prerequisites:
~/.fuego/config.jsonAgent/Script
↓ POST /build-transfer-sol
Fuego Server (localhost:8080)
• Builds unsigned transaction with fresh blockhash
• Returns base64-encoded transaction + memo
↓ Unsigned Transaction
Agent/Script
• Loads ~/.fuego/wallet.json (simple JSON, no password!)
• Signs transaction locally
↓ Signed Transaction
Fuego Server (localhost:8080)
• POST /submit-transaction
• Broadcasts to Solana mainnet
↓ On-chain
Solana Network
Security Model:
One Exception - x402 Payments:
The /x402-purch endpoint handles the complete payment flow internally (including signing) because x402 requires server-side proof-of-payment generation. This is a deliberate security trade-off: the server temporarily accesses the private key only to sign the specific x402 payment transaction, then immediately clears it from memory. This enables seamless agent purchasing while maintaining the local-first architecture for all other operations.
Get the local wallet address dynamically.
curl http://127.0.0.1:8080/wallet-address
Response:
{
"success": true,
"data": {
"address": "DmFyLRiJtc4Bz75hjAqPaEJpDfRe4GEnRLPwc3EgeUZF",
"network": "mainnet-beta",
"source": "wallet"
}
}
curl -X POST http://127.0.0.1:8080/balance \
-H "Content-Type: application/json" \
-d '{"network": "mainnet-beta", "address": "YOUR_ADDRESS"}'
Response:
{
"success": true,
"data": {
"sol": 1.234567890,
"lamports": 1234567890,
"network": "mainnet-beta"
}
}
curl -X POST http://127.0.0.1:8080/tokens \
-H "Content-Type: application/json" \
-d '{"network": "mainnet-beta", "address": "YOUR_ADDRESS"}'
Returns SOL + all SPL token balances (USDC, USDT, BONK, etc.)
curl -X POST http://127.0.0.1:8080/build-transfer-sol \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"from_address": "YOUR_ADDRESS",
"to_address": "RECIPIENT_ADDRESS",
"amount": "0.001",
"yid": "agent-transfer-123"
}'
Response:
{
"success": true,
"data": {
"transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEDAb...",
"blockhash": "J7rBdM33dHKtJwjp...AbCdEfGhIjKl",
"memo": "fuego|SOL|f:YOUR_ADDRESS|t:RECIPIENT|a:1000000|yid:agent-transfer-123|n:",
"network": "mainnet-beta"
}
}
curl -X POST http://127.0.0.1:8080/build-transfer-usdc \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"from_address": "YOUR_ADDRESS",
"to_address": "RECIPIENT_ADDRESS",
"amount": "10.50",
"yid": "agent-usdc-456"
}'
curl -X POST http://127.0.0.1:8080/build-transfer-usdt \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"from_address": "YOUR_ADDRESS",
"to_address": "RECIPIENT_ADDRESS",
"amount": "25.75",
"yid": "agent-usdt-789"
}'
curl -X POST http://127.0.0.1:8080/submit-transaction \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"transaction": "BASE64_SIGNED_TRANSACTION"
}'
Response:
{
"success": true,
"data": {
"signature": "5J7XzY...9KpQrS",
"explorer_link": "https://explorer.solana.com/tx/5J7XzY...9KpQrS?cluster=mainnet-beta"
}
}
Just call the CLI via subprocess. That's it.
The CLI handles everything: building, signing, submitting, error handling. Don't wrap it in a class — just use it directly.
Node.js/TypeScript:
import { execSync } from 'child_process';
// Send payment
const result = execSync(
'fuego send GvCo... 0.25 --token USDC --yes',
{ encoding: 'utf-8' }
);
console.log(result);
If you absolutely must use raw API calls instead of the CLI, use the endpoints documented below. But the CLI is strongly preferred.
Root endpoint - returns server status.
curl http://127.0.0.1:8080/
Response:
Fuego Server
Health check endpoint.
curl http://127.0.0.1:8080/health
Response:
{
"status": "healthy",
"service": "fuego-server",
"version": "0.1.0"
}
Get the default network configuration.
curl http://127.0.0.1:8080/network
Response:
{
"network": "mainnet-beta"
}
Get the local wallet address dynamically.
curl http://127.0.0.1:8080/wallet-address
Response:
{
"success": true,
"data": {
"address": "DmFyLRiJtc4Bz75hjAqPaEJpDfRe4GEnRLPwc3EgeUZF",
"network": "mainnet-beta",
"source": "wallet"
}
}
Get the latest blockhash for transaction building.
curl -X POST http://127.0.0.1:8080/latest-hash \
-H "Content-Type: application/json" \
-d '{"network": "mainnet-beta"}'
Response:
{
"success": true,
"data": {
"blockhash": "J7rBdM33dHKtJwjp...",
"network": "mainnet-beta"
}
}
curl -X POST http://127.0.0.1:8080/sol-balance \
-H "Content-Type: application/json" \
-d '{"network": "mainnet-beta", "address": "YOUR_ADDRESS"}'
Response:
{
"success": true,
"data": {
"address": "YOUR_ADDRESS",
"lamports": 105113976,
"sol": 0.105113976,
"network": "mainnet-beta"
}
}
curl -X POST http://127.0.0.1:8080/usdc-balance \
-H "Content-Type: application/json" \
-d '{"network": "mainnet-beta", "address": "YOUR_ADDRESS"}'
Response:
{
"success": true,
"data": {
"usdc": 150.250000,
"raw_amount": "150250000",
"network": "mainnet-beta"
}
}
curl -X POST http://127.0.0.1:8080/usdt-balance \
-H "Content-Type: application/json" \
-d '{"network": "mainnet-beta", "address": "YOUR_ADDRESS"}'
Response:
{
"success": true,
"data": {
"usdt": 75.500000,
"raw_amount": "75500000",
"network": "mainnet-beta"
}
}
curl -X POST http://127.0.0.1:8080/tokens \
-H "Content-Type: application/json" \
-d '{"network": "mainnet-beta", "address": "YOUR_ADDRESS"}'
Returns SOL + all SPL token balances (USDC, USDT, BONK, etc.)
Response:
{
"success": true,
"data": {
"wallet": "DmFyLRiJtc4Bz75hjAqPaEJpDfRe4GEnRLPwc3EgeUZF",
"network": "mainnet",
"sol_balance": 0.105113976,
"sol_lamports": 105113976,
"token_count": 2,
"tokens": [
{
"symbol": "USDC",
"ui_amount": 28.847897,
"decimals": 6,
"mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
}
]
}
}
curl -X POST http://127.0.0.1:8080/all-transactions \
-H "Content-Type: application/json" \
-d '{"network": "mainnet-beta", "address": "YOUR_ADDRESS", "limit": 20}'
Returns all wallet transactions. Fuego transactions (those with fuego| in the memo) are styled with rich details in the dashboard.
curl -X POST http://127.0.0.1:8080/build-transfer-sol \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"from_address": "YOUR_ADDRESS",
"to_address": "RECIPIENT_ADDRESS",
"amount": "0.001",
"yid": "agent-transfer-123"
}'
Response:
{
"success": true,
"data": {
"transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEDAb...",
"blockhash": "J7rBdM33dHKtJwjp...AbCdEfGhIjKl",
"memo": "fuego|SOL|f:YOUR_ADDRESS|t:RECIPIENT|a:1000000|yid:agent-transfer-123|n:",
"network": "mainnet-beta"
}
}
curl -X POST http://127.0.0.1:8080/build-transfer-usdc \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"from_address": "YOUR_ADDRESS",
"to_address": "RECIPIENT_ADDRESS",
"amount": "10.50",
"yid": "agent-usdc-456"
}'
curl -X POST http://127.0.0.1:8080/build-transfer-usdt \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"from_address": "YOUR_ADDRESS",
"to_address": "RECIPIENT_ADDRESS",
"amount": "25.75",
"yid": "agent-usdt-789"
}'
curl -X POST http://127.0.0.1:8080/submit-transaction \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"transaction": "BASE64_SIGNED_TRANSACTION"
}'
Response:
{
"success": true,
"data": {
"signature": "5J7XzY...9KpQrS",
"explorer_link": "https://explorer.solana.com/tx/5J7XzY...9KpQrS?cluster=mainnet-beta"
}
}
curl -X POST http://127.0.0.1:8080/submit-versioned-transaction \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"transaction": "BASE64_VERSIONED_TRANSACTION"
}'
Complete x402 payment flow including server-side signing. Used for Purch.xyz integrations.
curl -X POST http://127.0.0.1:8080/x402-purch \
-H "Content-Type: application/json" \
-d '{
"network": "mainnet-beta",
"product_url": "https://amazon.com/dp/B071G6PFDR",
"email": "user@example.com",
"shipping_name": "John Doe",
"shipping_address_line1": "123 Main St",
"shipping_city": "Austin",
"shipping_state": "TX",
"shipping_postal_code": "78701",
"shipping_country": "US"
}'
File Permissions = Real Security
# Wallet files are chmod 600 (user read/write only)
ls -la ~/.fuego/wallet.json
# -rw------- 1 user user 658 Feb 18 15:01 wallet.json
Client-Side Signing (with one exception)
Localhost-Only Server
Standard Format Compatibility
# Compatible with Solana CLI tools
solana-keygen pubkey ~/.fuego/wallet.json # Works
solana balance ~/.fuego/wallet.json # Works
~/.fuego/wallet.json secure (it's your private key!)~/.config/solana/fuego-backup.json"Wallet not initialized" error
# Solution: Create wallet with fuego-cli
fuego create
"Server not running" error
# Solution: Start server
fuego serve
"Connection refused" error
# Check if server is running
curl http://127.0.0.1:8080/health
# If not running, start it
fuego serve
"Fuego server not found" error
# Solution: Install the fuego project
fuego install
"Transaction simulation failed" error
# Usual cause: Insufficient balance
# Check all token balances first
curl -X POST http://127.0.0.1:8080/tokens \
-H "Content-Type: application/json" \
-d '{"network": "mainnet-beta", "address": "YOUR_ADDRESS"}'
"Invalid signature" error
# Wallet file might be corrupted
# Restore from backup
cp ~/.config/solana/fuego-backup.json ~/.fuego/wallet.json
Version mismatch / unexpected behavior
# Ensure all components are up to date
fuego update
# This updates both fuego-cli and the fuego project
# Restart server after updating: fuego serve
These tokens are supported by fuego send:
| Token | Mint Address | Decimals | Status |
|---|---|---|---|
| SOL | Native | 9 | Live |
| USDC | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | 6 | Live |
| USDT | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenEqw | 6 | Live |
fuego swap supports any token tradable on Jupiter, including:
See https://jup.ag for full token list.
Ready to build autonomous Solana agents? Start with Fuego.