Onchain (Solana)¶
Bullpen uses Onchain (Solana) for Solana trading and token intelligence.
The experimental solana namespace covers Bullpen-managed Solana balances,
discovery, mint-based token reads, token transactions and charts, Jupiter Ultra
swaps, Jupiter Trigger limit orders, Jupiter Recurring DCA schedules, recent
activity, withdraw, and web-app deposit guidance. It also exposes token
visibility preferences that mirror the web app's hidden-token preference where
supported.
Memescope is one discovery source inside the Onchain (Solana) surface. The CLI
keeps the discover memescope command name because it names that source.
If you want a guided first live flow, start with Onchain Solana First Trade. This page is the product overview and reference-style map.
Your Bullpen-managed Solana Wallet¶
Your Solana wallet is Bullpen-managed (custodial): Bullpen holds the signing key in Turnkey custody, so you do not import or paste a private key. The wallet already exists once you are logged in — you fund it by depositing SOL or SPL tokens to its address.
Find the address and current balances with either read-only command:
To fund it, open the Bullpen web app for the canonical deposit flow. The CLI intentionally does not print a raw deposit address:
deposit opens app.bullpen.fi and does not print a raw deposit address, which
prevents sending the wrong token or using the wrong chain. After a deposit
settles, reconcile with bullpen solana balance --refresh.
Example output
Command: Output:Availability¶
Solana commands are behind a runtime experimental flag:
The canonical namespace is bullpen solana; bullpen sol is the short alias.
Live Solana signing currently uses a separate Turnkey ed25519 signing session.
If a live Solana buy, sell, swap, limit-order, DCA, or withdraw command fails
with an auth or signing-session error, run bullpen status --output json and
bullpen doctor auth --output json before retrying. bullpen doctor auth
reports stored Turnkey session metadata; it is diagnostic, not proof that
Solana sign_raw_payload will succeed. Run bullpen login only when
diagnostics or the failing command report requires_login: true,
AUTH_REQUIRED, AUTH_REAUTHENTICATION_REQUIRED,
AUTH_REFRESH_REJECTED_LOGIN_REQUIRED, or an expired Turnkey signing session.
Preview can pass while live signing is expired.
Reads¶
bullpen solana balance
bullpen solana balance --refresh
bullpen solana portfolio --output json
bullpen solana search WIF
bullpen solana search dog --min-market-cap 100000 --min-volume 10000 --protocol Pump.fun --output json
bullpen solana discover memescope --category newly-launched
bullpen solana discover runners
bullpen solana trending --output json
bullpen solana price <MINT>
bullpen solana token <MINT> --output json
bullpen solana token holders <MINT> --limit 25 --output json
bullpen solana token traders <MINT> --period month --output json
bullpen solana token transactions <MINT> --limit 25 --output json
bullpen solana token whales <MINT> --limit 25 --output json
bullpen solana token whales <MINT> --transaction-type buy --sort biggest --output json
bullpen solana token chart <MINT> --interval 1h --countback 50 --output json
bullpen solana token performance <MINT> --timeframe all --output json
bullpen solana token developer <MINT> --output json
bullpen solana token risk <MINT> --output json
bullpen solana token hidden --output json
Trade, read, and withdraw commands require explicit base58 mint addresses. Use
bullpen solana search <QUERY> to find mints by symbol or name. Search accepts
service-backed filters such as market cap, volume, price, holders,
transactions, buy/sell counts, bonding percent, max age, last transaction age,
protocol, and scam inclusion. Balance and portfolio output filters dust and
hidden/spam rows by default; use --show-hidden, --show-spam, or
--show-all when troubleshooting filtered rows.
When a Solana RPC service is configured, balance --refresh first requests a
Bullpen portfolio refresh and then overlays fresh on-chain SOL and SPL-token
amounts from RPC before printing results. That makes it the preferred
post-trade reconciliation command after live Solana swaps. If a just-filled
token still looks stale, wait briefly and run balance --refresh again.
Example output
The search query is positional; v0.1.102 also accepts hidden --query <QUERY>
for legacy script compatibility.
Discovery and Token Intelligence¶
Discovery commands are read-only and require login because they use Bullpen market-data services for the Onchain (Solana) product area:
bullpen solana discover memescope --category newly-launched
bullpen solana discover memescope --category graduated --limit 25 --output json
bullpen solana discover memescope --category newly-launched --min-market-cap 100000 --max-age 24h --protocol Pump.fun --output json
bullpen solana discover memescope watch --limit 10 --max-events 5 --output json
bullpen solana discover memescope watch --category graduated --duration 30s --output json
bullpen solana discover runners --include-dev-metrics --output json
bullpen solana trending --limit 25 --output json
bullpen solana trending --min-volume 50000 --min-holders 250 --output json
discover memescope supports graduated, graduating, and
newly-launched categories. Use --cursor for pagination when the upstream
service returns one. Use discover memescope watch when you need a bounded CLI
view of Bullpen's Memescope stream. The watch command is deliberately bounded
by --max-events and optional --duration, so it is safe for agents and CI
jobs. JSON output is one stable document with an events array, not an endless
stream. trending is an alias for
discover runners.
Advanced Memescope and search filters are applied server-side when backed by
Bullpen market data. Runner/trending high-signal filters such as
--min-market-cap, --min-volume, and --min-holders are applied to the
fetched page. JSON output labels them under filter_application.client_side so
agents do not mistake page-scoped filtering for an upstream contract.
Token page reads are also exposed as read-only CLI commands:
bullpen solana token transactions <MINT>
bullpen solana token transactions <MINT> --event-type swap --event-action buy --output json
bullpen solana token whales <MINT> --limit 25 --skip 0 --output json
bullpen solana token whales <MINT> --transaction-type buy --min-trade-amount 1000 --max-token-market-cap 5000000 --sort biggest --output json
bullpen solana token chart <MINT> --interval 1h --countback 50
bullpen solana token performance <MINT> --timeframe 24h --output json
bullpen solana token developer <MINT> --output json
bullpen solana token risk <MINT> --output json
token transactions supports maker, event-type, event-action, limit, and
cursor filters. token whales reads the same token-specific whale transaction
feed as the web app Whales tab and supports --limit, --skip,
--transaction-type buy|sell, --min-trade-amount, --max-trade-amount,
--min-token-market-cap, --max-token-market-cap, and
--sort newest|biggest. token chart supports 1m, 5m, 15m, 1h,
4h, and 1d intervals with --countback from 1 through 50.
token developer uses token metadata to resolve the creator
address, then reports developer funding source, related tokens, and migration
metrics when Bullpen market-data services return them. token risk returns
Jupiter Shield warnings, the token overview holder count, and Bullpen Early
Holder analysis metrics when Bullpen services return them. Mint-level holder-stat fields can still appear in
structured unavailable entries when the overview contract does not include
them.
token whales and token chart depend on Bullpen market-data jobs for the
specific mint and interval. SOLANA_MARKET_DATA_INVALID_ARGS means the CLI or
analytics service rejected the supplied chart or filter arguments; fix the
arguments and retry. SOLANA_MARKET_DATA_UNAVAILABLE means the analytics job
does not currently have data for that supported request. Use token,
token transactions, or retry later; this does not by itself block buy, sell,
swap, limit, or DCA commands.
token performance exposes the web app's timeframe matrix for 5m, 1h,
4h, 12h, and 24h. Use --timeframe all to return every supported
timeframe in one JSON document.
Token Visibility¶
Token visibility commands update the hidden Solana token list for your Bullpen account. They do not move funds, change ownership, or submit a transaction.
Use hidden to inspect the current hidden-token list. Use hide or unhide
with an explicit base58 mint. Balance and portfolio views filter hidden rows by
default; add --show-hidden or --show-all when you need to audit them.
Activity History¶
bullpen solana history
bullpen solana history --limit 50
bullpen solana history --type trades --limit 50 --output json
bullpen solana history --type transfers --since 2026-04-01 --output json
bullpen solana history --type all --refresh
History groups Bullpen activity rows into complete transaction entries. Use
--type trades when reconciling swap activity, --type transfers
when checking deposits, withdrawals, or token moves, and --type all when you
need the full account timeline. JSON output keeps full transaction signatures;
table output truncates them for readability. Dust-token balance changes,
including scientific-notation amounts from the backend, are parsed instead of
failing the whole command.
For cleanup after a confirmed live swap, match the live report signature
against entries[].signature and use the matching received.amount for the
token you plan to sell. This avoids sizing cleanup from a stale balance
snapshot while the indexer is catching up.
The type filter is applied to the fetched account-history page. A command such
as bullpen solana history --type transfers --limit 20 can return fewer than
20 rows when that page contains trades or unknown events; increase --limit
when you need a wider reconciliation sample.
Example output
{
"address": "7qRkWTrM4DLpmeSnB8xT8p8mpqLQ9JdYatYczS4u1G8e",
"limit": 1,
"since_timestamp": null,
"since_utc": null,
"event_type": "transfers",
"classification_source": "usergate_paginated_pnl.tx_type",
"truncated": false,
"entries": [
{
"signature": "5n7yExampleSolanaSignature",
"timestamp": 1779920575,
"timestamp_utc": "2026-06-24 13:42:55Z",
"tx_order": 0,
"tx_type": "transfer",
"action": "receive",
"value_usd": "10",
"net_value_usd": null,
"sent": null,
"received": {
"mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"symbol": "USDC",
"amount": "10",
"value_usd": "10"
},
"fee": null,
"changes": []
}
]
}
Swaps¶
Solana swaps quote through Jupiter Ultra, sign with Turnkey ed25519, and submit through Bullpen transaction services.
bullpen solana buy <OUTPUT_MINT> <USD_AMOUNT> --preview --output json
bullpen solana sell <INPUT_MINT> <TOKEN_AMOUNT> --preview --output json
bullpen solana swap <INPUT_MINT> <OUTPUT_MINT> <INPUT_AMOUNT> --preview --output json
Preview does not sign or submit. It returns the Jupiter Ultra quote — input and
output mints, quoted amounts, price impact, slippage, fees, fixed SOL costs, and
would_submit: false equivalent context — so you can inspect the route before
spending anything.
Example output
{
"action": "buy",
"status": "preview",
"input_mint": "EPjF…Dt1v",
"input_symbol": "USDC",
"input_amount": "25",
"output_mint": "DezX…B263",
"output_symbol": "BONK",
"output_amount": "6226017.66316",
"effective_price_usd": "0.0000040154078180548095803099",
"price_impact_pct": "-0.0006683341442353899",
"slippage_bps": 50,
"fees_lamports": 18821,
"fixed_cost_lamports": 23821,
"would_submit": false,
"signature_requested": false,
"shield_warnings": null
}
Rerun with --yes only after the quote is acceptable:
bullpen solana buy <OUTPUT_MINT> <USD_AMOUNT> --yes
bullpen solana sell <INPUT_MINT> <TOKEN_AMOUNT> --yes
bullpen solana swap <INPUT_MINT> <OUTPUT_MINT> <INPUT_AMOUNT> --yes
Default slippage is 50 bps. Use --slippage-bps <BPS> only when the route
requires it; values above 500 bps require --i-know-what-im-doing.
--skip-shield-check skips the Jupiter Shield token-risk guard and is intended
only for bot workflows that already run their own token-risk checks.
Native SOL as the input side of a live sell or swap may require a Jupiter
auxiliary signature that Bullpen cannot provide. When that happens, the CLI
fails before submission with SOLANA_SWAP_UNSUPPORTED_ROUTE. Preview remains
safe. For release validation or automation flows, prefer USDC-to-token buys or
SPL-token input routes and verify cleanup with bullpen solana balance
--refresh --output json.
Sizing units:
buyis a USDC-input swap sized in USD.sellamount is input-token units.swapis sized in input-token units.
Live --yes --output json swap reports include a stable result envelope:
kind: solana_swap_result, success, status, signature, tx_signature,
and readback_status. success=true means the Solana receipt status is
confirmed. readback_status reports balance refresh separately, so
readback_pending or readback_failed means the transaction can be confirmed
while the post-swap balance readback still needs a later
bullpen solana balance --refresh --output json check. Live reports also
include preview-compatible input_mint, input_amount,
input_amount_atomics, output_mint, output_amount, and
output_amount_atomics fields, nested input / output token details,
platform-fee and referral fields when configured, any Jupiter Shield warnings,
and either post_swap_balance or post_swap_balance_warning. When readback
lags, JSON also includes post_swap_balance_next_action with the exact balance
refresh command to run. When a sell leaves only sub-cent residual input-token
dust, JSON includes post_swap_dust and text output explains that no cleanup
is recommended unless the balance later grows enough for a normal sell route.
Preview JSON includes the quote, route, fees, fixed_cost_lamports, and
would_submit: false.
If Jupiter rate-limits a route, JSON output uses
SOLANA_JUPITER_RATE_LIMITED with retry_after_secs, cooldown_required, and
next_command_after. Wait for the cooldown, rerun preview when the command
supports --preview, then retry the same live command only if the refreshed
preview is still acceptable. If a prior buy or swap returned success: true
and a signature, assume inventory may exist; a rate-limited cleanup sell means
Jupiter rejected the cleanup request, not that the previous transaction failed.
For unattended cleanup flows, add --retry-after-rate-limit to a live
buy, sell, or swap to let the CLI wait for Jupiter's reported cooldown
and retry once when the first attempt was rate-limited before a transaction
signature existed. The flag does not replay a transaction after a signature or
receipt is returned.
Limit Orders and DCA¶
Solana limit orders use Jupiter Trigger V1. DCA orders use Jupiter Recurring.
bullpen solana limit-buy <OUTPUT_MINT> <USD_AMOUNT> --price <USD> --preview
bullpen solana limit-sell <INPUT_MINT> <TOKEN_AMOUNT> --price <USD> --preview
bullpen solana orders --status active
bullpen solana cancel-order <ORDER_KEY> --preview
bullpen solana cancel-all-orders --preview --output json
bullpen solana dca create <INPUT_MINT> <OUTPUT_MINT> --per-cycle 50 --cycles 10 --interval 1d --preview
bullpen solana dca create <INPUT_MINT> <OUTPUT_MINT> --per-cycle 50 --cycles 10 --interval 1d --min-price 0.00001 --max-price 0.00002 --start-at <RFC3339_START_TIME> --preview
bullpen solana dca list --output json
bullpen solana dca cancel <ORDER_KEY> --preview
Live create/cancel commands require confirmation or --yes;
BULLPEN_NON_INTERACTIVE does not imply consent. orders and dca list are
read-only. Jupiter Trigger requires at least about $5 per limit order; smaller
limit orders return SOLANA_TRIGGER_ORDER_TOO_SMALL before signing or provider
submission. DCA cycles must be between 2 and 1000; values outside that range
return SOLANA_DCA_INVALID_CYCLES before Jupiter is called. Jupiter Recurring
currently enforces a provider-side minimum of about $50 per DCA cycle; smaller
schedules return SOLANA_DCA_MINIMUM_PER_CYCLE before submission.
Jupiter Recurring can take about 30-60 seconds to index a newly created DCA
schedule. After live create, inspect index_status. If it is
index_timeout, wait for retry_after_secs and run the returned
next_command or bullpen solana dca list --all --output json. If immediate
cancel hits the indexing window, JSON returns SOLANA_DCA_INDEX_PENDING with
retry_after_secs and next_command, and exits nonzero because no cancel
transaction was submitted. Funds remain in Jupiter escrow until cancel succeeds
or the schedule executes.
Live limit-order and DCA JSON results use a stable order-result envelope. Read
kind, success, status, order_key, and signature. Limit-order results
also keep order and tx_signature; DCA results keep their existing fields and
add tx_signature as an alias when a transaction signature exists. After a
live limit-order or DCA cancel, run
bullpen solana balance --refresh --output json before relying on returned
funds. Cancel JSON includes readback_status, balance_refresh_recommended,
and next_command because cached balance reads can briefly lag confirmed
cancels.
Withdraw and Deposit¶
bullpen solana withdraw <DESTINATION> <AMOUNT> --preview --output json
bullpen solana withdraw <DESTINATION> <AMOUNT> --token <MINT> --preview --output json
bullpen solana withdraw <DESTINATION> <AMOUNT> --token <MINT> --use-own-sol --preview --output json
bullpen solana deposit
After reviewing a withdraw preview, rerun the same command with --yes only if
the destination, token mint, amount, fee payer, and associated-token-account
plan are correct.
Withdraw sends native SOL by default. Add --token <MINT> for SPL withdrawals.
Use --preview first to inspect source, destination, amount, token, estimated
value, destination warnings, and ATA/rent notes without Turnkey signing or
transaction submission.
SPL withdraws try the sponsored path first and can fall back to user-paid
transfers when sponsorship is unavailable. If the sponsored SPL path is missing
transfer approvals, JSON output returns SOLANA_SPL_TRANSFER_MISSING_APPROVALS
and points automation to retry with --use-own-sol when the source wallet has
SOL for fees. --use-own-sol spends the wallet's own SOL for transaction fees;
in current previews this is typically about 0.003 SOL.
Withdrawals to known exchange Solana hot wallets are blocked with
SOLANA_CEX_DESTINATION_GUARD unless you explicitly pass
--i-confirm-destination-supports-token after verifying the destination
supports the exact asset on Solana. deposit opens the Bullpen web app and does
not print a raw deposit address.
Generated References¶
Use generated references for exact flags:
buy,
sell,
swap,
search,
memescope,
memescope watch,
history,
withdraw,
dca create,
dca list,
dca cancel,
token risk,
token performance,
token whales,
token hidden,
token hide, and
token unhide.
Current Limitations¶
Solana is still experimental. Use bullpen solana buy <MINT> <USD_AMOUNT>
--preview followed by --yes for a token buy.
DCA price bands/start times, Jupiter Shield token-risk reads, Early Holder
analysis metrics, token performance, bounded Memescope watch, and token
hide/unhide preferences are exposed in the CLI. Raw EarlyHolder address/cohort
drilldowns, Bridge/cross-chain routing, and rich Solana dashboard/TUI surfaces
are not exposed as CLI commands today. Use the
command reference for the full flag
surface.