Skip to content

bullpen solana limit-buy

Last updated: October 7, 2026

Place a Jupiter Trigger limit buy for a Solana token with USDC

Usage

bullpen solana limit-buy [OPTIONS] --price <PRICE> <MINT> <USD_AMOUNT>

Live Help

Place a Jupiter Trigger limit buy for a Solana token with USDC

Usage: bullpen solana limit-buy [OPTIONS] --price <PRICE> <MINT> <USD_AMOUNT>

Arguments:
  <MINT>
          Output SPL token mint address

  <USD_AMOUNT>
          USD/USDC amount to spend when the limit order fills

Options:
      --output <OUTPUT>
          Output format for command results

          [possible values: table, json]

      --price <PRICE>
          Trigger price in USD per output token; executes as a swap when crossed (not an exact resting limit order — the received amount is an estimate)

      --env <ENV>
          Target environment to connect to (overrides config.toml)

          [env: BULLPEN_ENV=]
          [possible values: staging, production]

      --expiry <EXPIRY>
          Expiry duration such as 1h, 24h, or 7d. Default is 30d; Jupiter Trigger v2 rejects 'never'

      --config <CONFIG>
          Path to a custom config.toml file (overrides $BULLPEN_CONFIG and the default location).

          Explicit --config and BULLPEN_CONFIG paths fail closed: if the file is missing, the CLI exits validation instead of silently loading defaults. Credentials still resolve via BULLPEN_HOME, so set BULLPEN_HOME too when isolating a session.

      --slippage-bps <SLIPPAGE_BPS>
          Slippage tolerance in basis points (0-10000) for the swap executed when the trigger fires. Defaults to the configured Solana swap slippage

      --yes
          Skip confirmation prompt

      --preview
          Show the Trigger order request without signing or submitting

      --read-only
          Enable read-only mode: blocks all mutating commands

      --non-interactive
          Suppress interactive prompts; does NOT imply --yes for money-moving commands

          [env: BULLPEN_NON_INTERACTIVE=]

  -h, --help
          Print help (see a summary with '-h')

EXAMPLES:
  # Preview a Trigger limit buy without signing or submitting
  bullpen solana limit-buy DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 50 --price 0.00003 --expiry 24h --preview

  # Export the Trigger limit-buy preview as JSON
  bullpen solana limit-buy DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 50 --price 0.00003 --expiry 24h --preview --output json

  # Submit a confirmed Trigger limit buy after reviewing the preview
  bullpen solana limit-buy DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 50 --price 0.00003 --expiry 24h --yes

Example Commands

Live: Run the matching preview first. Submit only when it matches the intended target, size, price guards, and account scope.

bullpen solana limit-buy DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 50 --price 0.00003 --expiry 24h --preview
bullpen solana limit-buy DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 50 --price 0.00003 --expiry 24h --preview --output json
bullpen solana limit-buy DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 50 --price 0.00003 --expiry 24h --yes

JSON Output

Contract: JSON Output Contract.

Preview (--preview --output json)

Preview output is a single JSON document emitted only when --preview --output json is passed. Live submit output uses the corresponding Solana Trigger mutation-report schema instead.

Schema version: 2 for Solana limit-order JSON output (ticket 1961 migrated Jupiter Trigger v1 to v2, renaming order to order_id and removing batches).

Top-level Keys

key type nullable notes
action string no limit_buy or limit_sell
side string no buy or sell
maker string no Bullpen Solana wallet used as the Trigger v2 maker
payer string no Bullpen Solana wallet used as the transaction payer
input object no Input mint, symbol, decimal amount, and atomics
output object no Output mint, symbol, decimal amount, and atomics — an ESTIMATE; not sent to Jupiter (see output_amount_is_estimate)
output_amount_is_estimate boolean no Always true: the order executes as a swap when the trigger fires, so the actual received amount can differ from output
price_usd string no Trigger price in USD per token
execution string no Always trigger_swap: this is a trigger-executed swap, not an exact resting limit order
plan object no Jupiter Trigger v2 order plan preview (inputMint, outputMint, inputAmount, triggerMint, expiresAt in ms, orderType, triggerCondition, triggerPriceUsd, slippageBps); live submission adds depositRequestId/depositSignedTx/userPubkey internally, not shown in preview

Example

Example output: This non-runnable command-and-response pair documents the JSON shape. Use the preview/live workflow in Example Commands when you intend to submit.

Example JSON output
bullpen solana limit-buy DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 50 --price 0.00003 --expiry 24h --preview --output json
{
  "action": "limit_buy",
  "side": "buy",
  "maker": "7qRkWTrM4DLpmeSnB8xT8p8mpqLQ9JdYatYczS4u1G8e",
  "payer": "7qRkWTrM4DLpmeSnB8xT8p8mpqLQ9JdYatYczS4u1G8e",
  "input": {
    "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "symbol": "USDC",
    "amount": "50",
    "amount_atomics": 50000000
  },
  "output": {
    "mint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
    "symbol": "BONK",
    "amount": "1666666.66666",
    "amount_atomics": 166666666666
  },
  "output_amount_is_estimate": true,
  "price_usd": "0.00003",
  "execution": "trigger_swap",
  "plan": {
    "inputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "outputMint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
    "inputAmount": "50000000",
    "triggerMint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
    "expiresAt": 1780000000000,
    "orderType": "single",
    "triggerCondition": "below",
    "triggerPriceUsd": 0.00003,
    "slippageBps": 50
  }
}

Stability

Patch releases may add nullable or optional fields. Minor releases may add required fields or increment schema_version. Major releases may remove or rename fields.

Solana Trigger Notes

  • --preview builds the order plan without Turnkey signing or Jupiter Trigger v2 authentication, deposit crafting, or order submission.
  • Public limit-buy/limit-sell submit static single trigger orders only; the CLI intentionally does not expose trailing-stop, OCO, or OTOCO order types.
  • These orders execute as a swap once the trigger price is crossed, not as an exact resting limit order: Trigger v2's create request carries only inputAmount/triggerPriceUsd, with no output-amount field, so the received amount is an estimate. --slippage-bps (0-10000) sets the swap's slippage tolerance and defaults to the configured Solana swap slippage; preview and live JSON mark execution: "trigger_swap" and output_amount_is_estimate: true.
  • Limit orders do not run JupiterShield and do not expose --skip-shield-check.
  • Jupiter Trigger v2 requires a deposit of at least $10 per limit order (raised from Trigger v1's $5).
  • --expiry defaults to 30d; Jupiter Trigger v2 has no never-expiring order, so --expiry never is rejected.
  • Live create crafts and signs a deposit transaction once and submits it to Jupiter's /orders/price endpoint; the CLI never calls a Trigger v2 /execute route and never broadcasts the deposit itself — Jupiter submits it.