Espo Commands
The espo namespace provides access to the Espo indexer for alkanes data and AMM analytics. Espo offers two modules: Essentials for core alkanes data and AMM Data for trading analytics.
Example commands
These examples assume the Espo endpoint is configured as shown under Configuration.
Essentials Module
Ping the Espo server to check connectivity:
$ alkanes-cli -p mainnet espo ping
Get the current Espo indexer height:
$ alkanes-cli -p mainnet espo get-height
Get alkanes balances for an address:
$ alkanes-cli -p mainnet espo get-address-balances bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh
Get holders of an alkane token (paginated):
$ alkanes-cli -p mainnet espo get-holders 2:0
Get total holder count for an alkane:
$ alkanes-cli -p mainnet espo get-holders-count 2:0
AMM Data Module
Ping the AMM Data module:
$ alkanes-cli -p mainnet espo ammdata-ping
Get OHLCV candlestick data for a pool:
$ alkanes-cli -p mainnet espo get-candles 840100:5
Get all AMM pools with pagination:
$ alkanes-cli -p mainnet espo get-pools
Find optimal multi-hop swap route:
$ alkanes-cli -p mainnet espo find-best-swap-path 840000:1 840000:2
Commands Overview
Essentials Module
Core alkanes data queries including balances, holders, and storage.
ping: Ping the Espo serverget-height: Get current Espo indexer heightget-address-balances: Get alkanes balances for an addressget-address-outpoints: Get outpoints containing alkanes for an addressget-outpoint-balances: Get alkanes balances at a specific outpointget-holders: Get holders of an alkane token (paginated)get-holders-count: Get total holder count for an alkaneget-keys: Get storage keys for an alkane contract (paginated)
AMM Data Module
Trading and liquidity analytics for AMM pools.
ammdata-ping: Ping the AMM Data moduleget-candles: Get OHLCV candlestick data for a poolget-trades: Get trade history for a poolget-pools: Get all pools with paginationfind-best-swap-path: Find optimal multi-hop swap routeget-best-mev-swap: Find best MEV arbitrage opportunity
Configuration
Configure the Espo RPC endpoint:
# Using environment variable
export ESPO_RPC_URL=https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo
# Or as a flag
alkanes-cli --espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo espo ping
The API key is required: a request to https://mainnet.subfrost.io/v4/espo without a key returns HTTP 401 with {"code":"INVALID_API_KEY"}.
espo ping
Ping the Espo server to check connectivity.
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo ping
Example Output:
pong
espo get-height
Get the current block height processed by the Espo indexer.
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo get-height
Example Output:
Espo Height: 825000
espo get-address-balances
Get alkanes balances for a Bitcoin address. Optionally include detailed outpoint information.
# Basic balance query
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo get-address-balances bc1q...
# With outpoint details
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo get-address-balances bc1q... --include-outpoints
Example Output:
Alkanes Balances
═════════════════════════════════════
Address: bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh
Alkane ID Balance
───────────── ─────────────
840000:1 1000000
840000:2 500000
Total Alkanes: 2
espo get-holders
Get paginated list of holders for an alkane token.
# First page (100 holders)
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo get-holders 2:0
# Specific page with custom limit
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo get-holders 2:0 --page 2 --limit 50
Example Output:
Holders for Alkane 2:0
═════════════════════════════════════
Page: 0 | Limit: 100 | Total: 1523
Address Balance
────────────────────────────────────────────── ──────────
bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh 10000000
bc1q2j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9 5000000
...
Has More: true
espo get-candles
Get OHLCV candlestick data for a liquidity pool.
# Get 1-hour candles for base token
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo get-candles 840100:5 \
--timeframe 1h \
--side base \
--limit 100
# Get daily candles for quote token
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo get-candles 840100:5 \
--timeframe 1d \
--side quote \
--limit 30
Timeframe Options:
10m: 10 minutes1h: 1 hour1d: 1 day1w: 1 week1M: 1 month
Example Output:
Candles for Pool 840100:5
═════════════════════════════════════
Timeframe: 1h | Side: base | Page: 0
Time Open High Low Close Volume
────────────────── ──────── ──────── ──────── ──────── ──────────
2024-12-15 10:00 1000000 1050000 990000 1020000 5000000
2024-12-15 11:00 1020000 1080000 1010000 1050000 6000000
...
Total: 100
espo find-best-swap-path
Find the optimal multi-hop swap path between two tokens.
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo find-best-swap-path 840000:1 840000:2 \
--mode exact_in \
--amount-in 1000000 \
--amount-out-min 900000 \
--max-hops 3
Modes:
exact_in: Specify input amount, calculate outputexact_out: Specify output amount, calculate inputimplicit: Let the system determine the best approach
Example Output:
Best Swap Path
═════════════════════════════════════
Token In: 840000:1
Token Out: 840000:2
Mode: exact_in
Amount In: 1000000
Amount Out: 950000
Hops: 2
Route:
1. Pool 840100:5 (840000:1 → 840000:3)
Amount In: 1000000
Amount Out: 1500000
2. Pool 840100:6 (840000:3 → 840000:2)
Amount In: 1500000
Amount Out: 950000
espo get-best-mev-swap
Find the best MEV arbitrage opportunity for a token.
alkanes-cli -p mainnet \
--espo-rpc-url https://mainnet.subfrost.io/v4/YOUR_API_KEY/espo \
espo get-best-mev-swap 840000:1 \
--fee-bps 30 \
--max-hops 3
Example Output:
Best MEV Opportunity
═════════════════════════════════════
Token: 840000:1
Fee (bps): 30 (0.3%)
Max Hops: 3
Amount In: 1000000
Amount Out: 1050000
Profit: 50000 (5%)
Arbitrage Route:
1. Pool 840100:5 (840000:1 → 840000:2)
Amount: 1000000 → 2000000
2. Pool 840100:6 (840000:2 → 840000:1)
Amount: 2000000 → 1050000
Net Profit: 50000
Notes
- All pagination uses 0-based page numbers
- Alkane IDs are in format
block:tx(e.g.,840000:1) - Outpoints are in format
txid:vout - AMM Data methods require AMM pools to be indexed
- The Espo indexer must be configured and running
- Use
--helpon any command to see all available options
REST API Equivalent
These Espo commands correspond to JSON-RPC methods:
espo ping→pingespo get-height→get_espo_heightespo get-address-balances→get_address_balancesespo get-candles→ammdata.get_candlesespo find-best-swap-path→ammdata.find_best_swap_path
See the JSON-RPC Espo documentation for API details.