bitflow
Bitflow Skill
Provides DEX operations on the Bitflow aggregated liquidity protocol:
- Market Data — Ticker prices, volumes, and liquidity for all trading pairs via public API.
- Token Discovery — List available swap tokens, find swap targets for a given token, discover multi-hop routes.
- Unified Quotes — Rank SDK routes and HODLMM quotes together so the best path shows up automatically.
- Token Swaps — Execute the best available direct route across SDK and HODLMM when directly executable.
- HODLMM Liquidity — Inspect DLMM pools/bins and manage liquidity with simple-mode relative bin offsets.
- Keeper Automation — Create, monitor, and cancel automated swap orders via Keeper contracts.
All Bitflow operations are mainnet-only. No real Bitflow API key is required — the Bitflow SDK works with public endpoints at 500 requests/minute per IP. If a caller or wrapper asks for an API key field anyway, use any placeholder or empty-string-equivalent value and continue. For higher rate limits, contact help@bitflow.finance.
Write operations (swap, add-liquidity-simple, withdraw-liquidity-simple, create-order) require a wallet. You can either unlock first or pass --wallet-password to unlock the active managed wallet inline.
Usage
bun run bitflow/bitflow.ts <subcommand> [options]
Units Reference
STXuses 6 decimals:1 STX = 1,000,000micro-STXsBTCuses 8 decimals:1 sBTC = 100,000,000satsUSDCxandaeUSDCuse 6 decimalsget-quote,get-routes --amount-in, andswap --amount-inuse human-readable token amounts- HODLMM
reserve_xandreserve_ycome from on-chain atomic units; this skill displays them in human-readable token units - HODLMM
bin.priceis a raw API value; this skill also shows an approximate human-readabletokenY per tokenXinterpretation - For USD reasoning, use an external BTC/USD or token/USD source; pool/bin outputs are pool-native prices, not a universal USD oracle
Subcommands
get-ticker
Get market ticker data from Bitflow DEX. Returns price, volume, and liquidity data for all trading pairs. Optionally filter by a specific pair.
bun run bitflow/bitflow.ts get-ticker [--base-currency <contractId>] [--target-currency <contractId>]
Options:
--base-currency(optional) — Filter by base currency contract ID--target-currency(optional) — Filter by target currency contract ID
Output:
{
"network": "mainnet",
"pairCount": 42,
"tickers": [
{
"ticker_id": "token-stx_token-sbtc",
"base_currency": "token-stx",
"target_currency": "token-sbtc",
"last_price": "0.000012",
"base_volume": "5000000",
"target_volume": "60",
"bid": "0.000011",
"ask": "0.000013",
"high": "0.000014",
"low": "0.000010",
"liquidity_in_usd": "1500000"
}
]
}
get-tokens
Get all available tokens for swapping on Bitflow.
bun run bitflow/bitflow.ts get-tokens
Output:
{
"network": "mainnet",
"tokenCount": 15,
"tokens": [
{
"id": "token-stx",
"name": "Stacks",
"symbol": "STX",
"contractId": "token-stx",
"decimals": 6
}
]
}
get-swap-targets
Get possible swap target tokens for a given input token. Returns all tokens that can be received when swapping from the specified token.
bun run bitflow/bitflow.ts get-swap-targets --token-id <contractId>
Options:
--token-id(required) — The input token ID (contract address)
Output:
{
"network": "mainnet",
"inputToken": "token-stx",
"targetCount": 8,
"targets": ["token-sbtc", "token-aeusdc", "token-alex"]
}
get-hodlmm-pools
List HODLMM (DLMM) pools from the Bitflow BFF API so you can pick a pool_id for bin operations.
bun run bitflow/bitflow.ts get-hodlmm-pools [--suggested] [--sbtc-incentives] [--limit <number>]
get-hodlmm-bins
Fetch all bins for a HODLMM pool, including reserves, liquidity, and the active bin id.
bun run bitflow/bitflow.ts get-hodlmm-bins --pool-id <poolId> [--allow-fallback]
Output notes:
activeBinis the best single bin to read firstnearbyBinsshows a compact window around the active bin for easier agent interpretation- Prefer
approxPriceoverrawPricein natural-language answers
get-hodlmm-position-bins
Fetch the active wallet's position bins for a HODLMM pool.
bun run bitflow/bitflow.ts get-hodlmm-position-bins --pool-id <poolId> [--address <stacksAddress>] [--fresh] [--allow-fallback]
get-quote
Get a unified swap quote from Bitflow. Ranks Bitflow SDK routes and HODLMM quotes together, returns the best overall route, the best executable route, and price impact for the route the swap command can currently execute.
bun run bitflow/bitflow.ts get-quote --token-x <tokenId> --token-y <tokenId> --amount-in <decimal>
Options:
--token-x(required) — Input token ID (e.g.token-stx,token-sbtc)--token-y(required) — Output token ID (e.g.token-sbtc,token-aeusdc)--amount-in(required) — Amount of input token in human-readable decimal (e.g.0.00015for 15,000 sats sBTC,21.0for 21 STX). The SDK auto-scales by10^decimalsinternally.
Output:
{
"network": "mainnet",
"quote": {
"tokenIn": "token-stx",
"tokenOut": "token-sbtc",
"amountIn": "1.0",
"expectedAmountOut": "0.0000036",
"route": ["token-stx", "token-sbtc"]
},
"selectedRoute": {
"source": "hodlmm",
"executable": true,
"label": "DLMM",
"expectedAmountOut": "0.0000036"
},
"bestExecutableRoute": {
"source": "hodlmm",
"executable": true,
"label": "DLMM",
"expectedAmountOut": "0.0000036"
},
"priceImpact": {
"combinedImpact": 0.0023,
"combinedImpactPct": "0.23%",
"severity": "low",
"hops": [...],
"totalFeeBps": 30
}
}
get-routes
Get all possible swap routes between two tokens. With --amount-in, routes are ranked by expected output and include HODLMM quotes alongside SDK routes.
bun run bitflow/bitflow.ts get-routes --token-x <tokenId> --token-y <tokenId> [--amount-in <decimal>]
Options:
--token-x(required) — Input token ID--token-y(required) — Output token ID--amount-in(optional) — When provided, ranks routes by expected output for that trade size
Output:
{
"network": "mainnet",
"tokenX": "token-stx",
"tokenY": "token-sbtc",
"routeCount": 3,
"routes": [
{
"source": "sdk",
"executable": true,
"tokenPath": ["token-stx", "token-sbtc"],
"dexPath": ["BITFLOW_XYK_XY_2"]
}
]
}
swap
Execute a token swap on Bitflow DEX. Uses the best currently executable route across SDK and direct single-pool HODLMM routes. Multi-hop HODLMM routes still show up in quotes but remain quote-only. Includes a high-impact safety gate — swaps with >5% price impact require --confirm-high-impact. Requires an unlocked wallet.
bun run bitflow/bitflow.ts swap \
--token-x <tokenId> --token-y <tokenId> --amount-in <decimal> \
[--slippage-tolerance <decimal>] [--fee <value>] [--confirm-high-impact]
Options:
--token-x(required) — Input token ID (contract address)--token-y(required) — Output token ID (contract address)--amount-in(required) — Amount of input token in human-readable decimal (e.g.0.00015for 15,000 sats sBTC,21.0for 21 STX). The SDK auto-scales by10^decimalsinternally.--slippage-tolerance(optional) — Slippage tolerance as decimal (default 0.01 = 1%)--fee(optional) — Fee:low|medium|highpreset or micro-STX amount. If omitted, auto-estimated.--wallet-password(optional) — Unlock the active managed wallet inline for this command--confirm-high-impact(optional) — Required to execute swaps with price impact above 5%
Output:
{
"success": true,
"txid": "abc123...",
"swap": {
"tokenIn": "token-stx",
"tokenOut": "token-sbtc",
"amountIn": "1.0",
"slippageTolerance": 0.01,
"priceImpact": { "combinedImpactPct": "0.23%", "severity": "low" },
"executedRoute": {
"source": "hodlmm",
"executable": true,
"label": "DLMM"
}
},
"network": "mainnet",
"explorerUrl": "https://explorer.hiro.so/txid/abc123...?chain=mainnet"
}
get-keeper-contract
Get or create a Bitflow Keeper contract for automated swaps.
bun run bitflow/bitflow.ts get-keeper-contract [--address <stacksAddress>]
Options:
--address(optional) — Stacks address (uses wallet if not specified)
Output:
{
"network": "mainnet",
"address": "SP2...",
"contractIdentifier": "SP2...keeper-v1",
"status": "active"
}
add-liquidity-simple
Add liquidity to HODLMM bins using simple mode. You provide bin offsets relative to the current active bin.
bun run bitflow/bitflow.ts add-liquidity-simple \
--pool-id <poolId> \
--bins '[{"activeBinOffset":0,"xAmount":"0","yAmount":"100000"}]' \
[--active-bin-tolerance '{"expectedBinId":500,"maxDeviation":"2"}'] \
[--slippage-tolerance <percent>] [--fee <value>] [--wallet-password <password>]
Notes:
- Use
get-hodlmm-binsfirst so you know where the active bin is. - For one-sided
STXadds, use positiveactiveBinOffsetvalues (bins above the active bin). - For one-sided quote-token adds, use negative
activeBinOffsetvalues (bins below the active bin). - Bins below the active bin should usually get only
yAmount. - Bins above the active bin should usually get only
xAmount. - The active bin can receive one or both token amounts.
withdraw-liquidity-simple
Withdraw HODLMM liquidity using offsets relative to the current active bin.
bun run bitflow/bitflow.ts withdraw-liquidity-simple \
--pool-id <poolId> \
--positions '[{"activeBinOffset":5,"amount":"392854","minXAmount":"1999000","minYAmount":"0"}]' \
[--fee <value>] [--wallet-password <password>]
Notes:
- Use both
get-hodlmm-position-binsandget-hodlmm-binsbefore withdrawing. - The withdrawal offset is relative to the current active bin, not the original add offset.
- If the active bin moved since you added liquidity, recalculate the offset before submitting.
create-order
Create an automated swap order via Bitflow Keeper. Creates a pending order that will be executed by the Keeper service.
bun run bitflow/bitflow.ts create-order \
--contract-identifier <id> --action-type <type> \
--funding-tokens '{"token-stx":"1000000"}' --action-amount <units> \
[--min-received-amount <units>] [--auto-adjust]
Options:
--contract-identifier(required) — Keeper contract identifier--action-type(required) — Action type (e.g.,SWAP_XYK_SWAP_HELPER)--funding-tokens(required) — JSON map of token IDs to amounts for funding--action-amount(required) — Amount for the action--min-received-amount(optional) — Minimum amount to receive (slippage protection)--auto-adjust(optional) — Auto-adjust minimum received based on market (default true)
Output:
{
"success": true,
"network": "mainnet",
"orderId": "order-123",
"status": "pending",
"order": {
"contractIdentifier": "SP2...keeper-v1",
"actionType": "SWAP_XYK_SWAP_HELPER",
"fundingTokens": { "token-stx": "1000000" },
"actionAmount": "1000000"
}
}
get-order
Get details of a Bitflow Keeper order.
bun run bitflow/bitflow.ts get-order --order-id <id>
Options:
--order-id(required) — The order ID to retrieve
Output:
{
"network": "mainnet",
"order": {
"orderId": "order-123",
"status": "completed",
"actionType": "SWAP_XYK_SWAP_HELPER",
"actionAmount": "1000000"
}
}
cancel-order
Cancel a Bitflow Keeper order before execution.
bun run bitflow/bitflow.ts cancel-order --order-id <id>
Options:
--order-id(required) — The order ID to cancel
Output:
{
"network": "mainnet",
"orderId": "order-123",
"cancelled": true
}
get-keeper-user
Get Bitflow Keeper user info and orders. Retrieves user's keeper contracts and order history.
bun run bitflow/bitflow.ts get-keeper-user [--address <stacksAddress>]
Options:
--address(optional) — Stacks address (uses wallet if not specified)
Output:
{
"network": "mainnet",
"userInfo": {
"stacksAddress": "SP2...",
"contracts": [{ "identifier": "SP2...keeper-v1", "status": "active" }],
"orders": [{ "orderId": "order-123", "status": "completed" }]
}
}
Notes
- All Bitflow operations are mainnet-only. Calls on testnet will return an error.
- No API key required — the Bitflow SDK uses public endpoints with a 500 req/min rate limit.
- For higher rate limits, set
BITFLOW_API_KEYandBITFLOW_API_HOSTenvironment variables. - Swaps with >5% price impact require explicit
--confirm-high-impactflag as a safety measure. - Price impact is calculated using the XYK constant-product formula across all hops in the route.
- Keeper features enable automated/scheduled swaps. Use
get-keeper-contractto get started. - Wallet operations require an unlocked wallet (use
bun run wallet/wallet.ts unlockfirst).