Skip to content

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:

bullpen solana balance
bullpen wallet addresses

To fund it, open the Bullpen web app for the canonical deposit flow. The CLI intentionally does not print a raw deposit address:

bullpen solana deposit

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:
bullpen solana balance
Output:
Solana account: 7qRk…u1G8e
SOL balance:    0.42 SOL
Total value:    ~$125.55

Token      Amount     Value (USD)
USDC       125.55     $125.55

Availability

Solana commands are behind a runtime experimental flag:

bullpen experimental enable solana

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
$ bullpen solana balance --output json
{
  "address": "7qRk…u1G8e",
  "sol_balance": "0.42",
  "total_usd": "125.55",
  "last_updated_ms": 1779920575000,
  "tokens": [
    {
      "mint": "EPjF…Dt1v",
      "symbol": "USDC",
      "amount_ui": "125.55",
      "value_usd": "125.55"
    }
  ]
}

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.

bullpen solana token hidden
bullpen solana token hide <MINT>
bullpen solana token unhide <MINT>

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
$ bullpen solana history --type transfers --limit 1 --output json
{
  "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
$ bullpen solana buy DezX…B263 25 --preview --output json
{
  "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:

  • buy is a USDC-input swap sized in USD.
  • sell amount is input-token units.
  • swap is 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.