opentrade-gateway
OpenTrade Onchain Gateway CLI
6 commands for gas estimation, transaction simulation, broadcasting, and order tracking.
Pre-flight Checks
Every time before running any opentrade command, always follow these steps in order. Do not echo routine command output to the user; only provide a brief status update when installing, updating, or handling a failure.
-
Confirm installed: Run
which opentrade. If not found, install it:curl -sSL https://raw.githubusercontent.com/6551Team/openskills/main/skills/opentrade/install.sh | shIf the install script fails, ask the user to install manually following the instructions at: https://github.com/6551Team/openskills
-
Check for updates: Read
~/.opentrade/last_checkand compare it with the current timestamp:cached_ts=$(cat ~/.opentrade/last_check 2>/dev/null || true) now=$(date +%s)- If
cached_tsis non-empty and(now - cached_ts) < 43200(12 hours), skip the update and proceed. - Otherwise (file missing or older than 12 hours), run the installer to check for updates:
If a newer version is installed, tell the user and suggest updating their opentrade skills from https://github.com/6551Team/openskills to get the latest features.curl -sSL https://raw.githubusercontent.com/6551Team/openskills/main/skills/opentrade/install.sh | sh
- If
-
If any
opentradecommand fails with an unexpected error during this session, try reinstalling before giving up:curl -sSL https://raw.githubusercontent.com/6551Team/openskills/main/skills/opentrade/install.sh | sh -
Find or create a .env file in the project root to override the default API credentials, Load it before performing opentrade operations.
OPEN_TOKEN=your_token_here
Get your API token at: https://6551.io/mcp
Security warning: Never commit .env to git (add it to .gitignore) and never expose credentials in logs, screenshots, or chat messages.
Router Discovery
IMPORTANT: If the user has not specified a trading router, you MUST first discover available routers:
opentrade trade routers
Response format:
{
"data": [
{
"name": "okx test",
"router": "okx",
"version": "v1",
"quota_reward": 0,
"is_active": true,
"created_at": "2026-03-03 21:24:34",
"updated_at": "2026-03-03 21:24:34"
}
],
"success": true
}
Usage:
- Extract
routerandversionfrom the response - MANDATORY: ALL subsequent
opentradecommands in this session MUST include--trader <router>and--api <version>flags - Example:
opentrade gateway gas --chain ethereum --trader okx --api v1 - Default fallback: If the API returns no data or is empty, use
--trader okx --api v1
Skill Routing
- For swap quote and execution → use
opentrade-dex-swap - For market prices → use
opentrade-market - For token search → use
opentrade-token - For wallet balances / portfolio → use
opentrade-portfolio - For transaction broadcasting → use this skill (
opentrade-gateway)
Quickstart
# Get current gas price on XLayer
opentrade gateway gas --chain xlayer
# Estimate gas limit for a transaction
opentrade gateway gas-limit --from 0xYourWallet --to 0xRecipient --chain xlayer
# Simulate a transaction (dry-run)
opentrade gateway simulate --from 0xYourWallet --to 0xContract --data 0x... --chain xlayer
# Broadcast a signed transaction
opentrade gateway broadcast --signed-tx 0xf86c...signed --address 0xYourWallet --chain xlayer
# Track order status
opentrade gateway orders --address 0xYourWallet --chain xlayer --order-id 123456789
Chain Name Support
The CLI accepts human-readable chain names and resolves them automatically.
| Chain | Name | chainIndex |
|---|---|---|
| XLayer | xlayer |
196 |
| Solana | solana |
501 |
| Ethereum | ethereum |
1 |
| Base | base |
8453 |
| BSC | bsc |
56 |
| Arbitrum | arbitrum |
42161 |
Command Index
| # | Command | Description |
|---|---|---|
| 1 | opentrade gateway chains |
Get supported chains for gateway |
| 2 | opentrade gateway gas --chain <chain> |
Get current gas prices for a chain |
| 3 | opentrade gateway gas-limit --from ... --to ... --chain ... |
Estimate gas limit for a transaction |
| 4 | opentrade gateway simulate --from ... --to ... --data ... --chain ... |
Simulate a transaction (dry-run) |
| 5 | opentrade gateway broadcast --signed-tx ... --address ... --chain ... |
Broadcast a signed transaction |
| 6 | opentrade gateway orders --address ... --chain ... |
Track broadcast order status |
Cross-Skill Workflows
This skill is the final mile — it takes a signed transaction and sends it on-chain. It pairs with swap (to get tx data).
Workflow A: Swap → Broadcast → Track
User: "Swap 1 ETH for USDC and broadcast it"
1. opentrade-dex-swap opentrade swap swap --from ... --to ... --amount ... --chain ethereum --wallet <addr>
↓ user signs the tx locally
2. opentrade-gateway opentrade gateway broadcast --signed-tx <signed_hex> --address <addr> --chain ethereum
↓ orderId returned
3. opentrade-gateway opentrade gateway orders --address <addr> --chain ethereum --order-id <orderId>
Data handoff:
tx.data,tx.to,tx.value,tx.gasfrom swap → user builds & signs →--signed-txfor broadcastorderIdfrom broadcast →--order-idparam in orders query
Workflow B: Simulate → Broadcast → Track
User: "Simulate this transaction first, then broadcast if safe"
1. opentrade gateway simulate --from 0xWallet --to 0xContract --data 0x... --chain ethereum
↓ simulation passes (no revert)
2. opentrade gateway broadcast --signed-tx <signed_hex> --address 0xWallet --chain ethereum
3. opentrade gateway orders --address 0xWallet --chain ethereum --order-id <orderId>
Workflow C: Gas Check → Swap → Broadcast
User: "Check gas, swap for USDC, then send it"
1. opentrade gateway gas --chain ethereum → check gas prices
2. opentrade-dex-swap opentrade swap swap --from ... --to ... --chain ethereum --wallet <addr>
↓ user signs
3. opentrade gateway broadcast --signed-tx <signed_hex> --address <addr> --chain ethereum
4. opentrade gateway orders --address <addr> --chain ethereum --order-id <orderId>
Operation Flow
Step 1: Identify Intent
- Estimate gas for a chain →
opentrade gateway gas - Estimate gas limit for a specific tx →
opentrade gateway gas-limit - Test if a tx will succeed →
opentrade gateway simulate - Broadcast a signed tx →
opentrade gateway broadcast - Track a broadcast order →
opentrade gateway orders - Check supported chains →
opentrade gateway chains
Step 2: Collect Parameters
- Missing chain → recommend XLayer (
--chain xlayer, low gas, fast confirmation) as the default, then ask which chain the user prefers - Missing
--signed-tx→ remind user to sign the transaction first (this CLI does NOT sign) - Missing wallet address → ask user
Step 3: Execute & Display
- Run the command
- Parse JSON output
- Display human-readable summary (see each command section below)
1. Supported Chains
List all chains supported by the gateway.
opentrade gateway chains
Output:
{
"code": "0",
"data": [
{ "chainId": "196", "chainName": "XLayer" },
{ "chainId": "1", "chainName": "Ethereum" },
{ "chainId": "501", "chainName": "Solana" }
],
"msg": ""
}
Display to user:
- List chain names with IDs
- Highlight commonly used chains
2. Gas Price
Get current gas price for a specific chain.
opentrade gateway gas --chain <chain_name>
Parameters:
--chain: Chain name (e.g.,xlayer,ethereum,solana)
Example:
opentrade gateway gas --chain xlayer
Output:
{
"code": "0",
"data": [
{
"chainId": "196",
"eip1559Protocol": {
"suggestBaseFee": "100000000",
"proposePriorityFee": "0"
},
"normal": {
"maxFeePerGas": "100000000",
"baseFee": "100000000",
"gasPrice": "100000000",
"priorityFeePerGas": "0"
},
"fast": {
"maxFeePerGas": "100000000",
"baseFee": "100000000",
"gasPrice": "100000000",
"priorityFeePerGas": "0"
},
"slow": {
"maxFeePerGas": "100000000",
"baseFee": "100000000",
"gasPrice": "100000000",
"priorityFeePerGas": "0"
}
}
],
"msg": ""
}
Display to user:
- Convert wei to Gwei:
100000000 wei = 0.1 Gwei - Show all three speeds: slow, normal, fast
- Recommend "normal" for most transactions
3. Gas Limit Estimation
Estimate the gas limit required for a transaction.
opentrade gateway gas-limit \
--from <sender_address> \
--to <recipient_address> \
--chain <chain_name> \
[--value <amount_in_wei>] \
[--data <hex_data>]
Parameters:
--from: Sender wallet address (required)--to: Recipient address (required)--chain: Chain name (required)--value: Amount to send in wei (optional, default:0)--data: Transaction data in hex format (optional, default:0x)
Example:
opentrade gateway gas-limit \
--from 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb \
--to 0x1234567890abcdef1234567890abcdef12345678 \
--chain xlayer \
--value 1000000000000000000
Output:
{
"code": "0",
"data": [
{
"gasLimit": "21000"
}
],
"msg": ""
}
Display to user:
- Show gas limit as integer:
21000 - Estimate total gas cost:
gasLimit × gasPrice - Show USD equivalent if possible
4. Transaction Simulation
Simulate a transaction before broadcasting (dry-run).
opentrade gateway simulate \
--from <sender_address> \
--to <recipient_address> \
--chain <chain_name> \
[--value <amount_in_wei>] \
[--data <hex_data>] \
[--gas-limit <limit>] \
[--gas-price <price_in_wei>]
Parameters:
--from: Sender wallet address (required)--to: Recipient address (required)--chain: Chain name (required)--value: Amount to send in wei (optional, default:0)--data: Transaction data in hex format (optional, default:0x)--gas-limit: Gas limit (optional)--gas-price: Gas price in wei (optional)
Example:
opentrade gateway simulate \
--from 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb \
--to 0x1234567890abcdef1234567890abcdef12345678 \
--chain xlayer \
--value 1000000000000000000 \
--gas-limit 21000 \
--gas-price 100000000
Output (Success):
{
"code": "0",
"data": [
{
"executionResult": {
"used": 21000,
"success": true,
"gasLimit": 21000,
"gasUsed": 21000
}
}
],
"msg": ""
}
Output (Failure):
{
"code": "0",
"data": [
{
"executionResult": {
"used": 0,
"success": false,
"error": "execution reverted: insufficient balance"
}
}
],
"msg": ""
}
Display to user:
- If
success: true: "Simulation successful! Gas used: 21000" - If
success: false: "Simulation failed: [error message]" - Show revert reason if available
5. Broadcast Transaction
Broadcast a signed transaction to the blockchain.
opentrade gateway broadcast \
--signed-tx <signed_transaction_hex> \
--address <sender_address> \
--chain <chain_name>
Parameters:
--signed-tx: Signed transaction in hex format (EVM) or base58 (Solana) (required)--address: Sender wallet address (required)--chain: Chain name (required)
Example (EVM):
opentrade gateway broadcast \
--signed-tx 0xf86c808504a817c800825208941234567890abcdef1234567890abcdef12345678880de0b6b3a764000080820a96a0... \
--address 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb \
--chain xlayer
Example (Solana):
opentrade gateway broadcast \
--signed-tx 4hXTCkRzt9WyecNzV1XPgCDfGAZzQKNxLXgynz5QDuWWPSAZBZSHptvWRL3BjCvzUXRdKvHL2b7yGrRQcWyaqsaBCncVG7BFggS8w9snUts67BSh3EqKpXLUm5UMHfD7ZBe9GhARjbNQMLJ1QD3Spr6oMTBU6EhdB4RD8CP2xUxr2u3d6fos36PD98XS6oX8TQjLpsMwncs5DAMiD4nNnR8NBfyghGCWvCVifVwvA8B8TJxE1aHwYbgByseGmZJYDUSi5McBJdm7f9YY9d8FU7XMWoLM1gCWmoL92aPQuGHafb \
--address YourSolanaWalletAddress \
--chain solana
Output:
{
"code": "0",
"data": [
{
"orderId": "123456789",
"txHash": "0xabc123def456..."
}
],
"msg": ""
}
Display to user:
- "Transaction broadcast successfully!"
- "Order ID: 123456789"
- "Tx Hash: 0xabc123def456..."
- "Track status with: opentrade gateway orders --address <wallet_address> --chain <chain_name> --order-id 123456789"
6. Query Order Status
Query the status of a broadcast transaction by order ID.
opentrade gateway orders \
--address <wallet_address> \
--chain <chain_name> \
--order-id <order_id>
Parameters:
--address: Wallet address (required)--chain: Chain name (required)--order-id: Order ID from broadcast response (required)
Example:
opentrade gateway orders \
--address 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb \
--chain xlayer \
--order-id 123456789
Output:
{
"code": "0",
"data": [
{
"orderId": "123456789",
"txHash": "0xabc123def456...",
"txStatus": "2",
"chainId": "196",
"blockNumber": "12345678",
"timestamp": "1709876543"
}
],
"msg": ""
}
Transaction Status Codes:
0: Pending (not yet confirmed)1: Failed (transaction reverted or rejected)2: Success (confirmed on-chain)
Display to user:
- "Order 123456789: Success"
- "Tx Hash: 0xabc123def456..."
- "Block: 12345678"
- "Status: Confirmed on-chain"
Workflow Examples
User says: "What's the gas price on XLayer?"
opentrade gateway gas --chain xlayer
# → Display: Normal: 0.1 Gwei, Fast: 0.1 Gwei, Slow: 0.1 Gwei
User says: "How much gas do I need to send 1 ETH?"
opentrade gateway gas-limit \
--from 0xYourWallet \
--to 0xRecipient \
--chain ethereum \
--value 1000000000000000000
# → Display: Gas limit: 21000, Estimated cost: ~0.002 ETH ($5.50)
User says: "Simulate this transaction before I send it"
opentrade gateway simulate \
--from 0xYourWallet \
--to 0xContract \
--chain xlayer \
--data 0xa9059cbb... \
--gas-limit 100000
# → Display: Simulation successful! Gas used: 65432
User says: "Broadcast this signed transaction"
opentrade gateway broadcast \
--signed-tx 0xf86c...signed \
--address 0xYourWallet \
--chain xlayer
# → Display:
# Transaction broadcast! Order ID: 123456789
# Tx Hash: 0xabc...def
User says: "Check the status of my broadcast order"
opentrade gateway orders --address 0xYourWallet --chain xlayer --order-id 123456789
# → Display:
# Order 123456789: Success (txStatus=2)
# Tx Hash: 0xabc...def
# Confirmed on-chain
Edge Cases
- MEV protection: Broadcasting through OpenTrade nodes may offer MEV protection on supported chains.
- Solana special handling: Solana signed transactions use base58 encoding (not hex). Ensure the
--signed-txformat matches the chain. - Chain not supported: call
opentrade gateway chainsfirst to verify. - Node return failed: the underlying blockchain node rejected the transaction. Common causes: insufficient gas, nonce too low, contract revert. Retry with corrected parameters.
- Wallet type mismatch: the address format does not match the chain (e.g., EVM address on Solana chain).
- Network error: retry once, then prompt user to try again later
- Region restriction (error code 50125 or 80001): do NOT show the raw error code to the user. Instead, display a friendly message:
⚠️ Service is not available in your region. Please switch to a supported region and try again. - Transaction already broadcast: if the same
--signed-txis broadcast twice, the API may return an error or the sametxHash— handle idempotently.
Amount Display Rules
- Gas prices in Gwei for EVM chains (
18.5 Gwei), never raw wei - Gas limit as integer (
21000,145000) - USD gas cost estimate when possible
- Transaction values in UI units (
1.5 ETH), never base units
Global Notes
- This skill does NOT sign transactions — it only broadcasts pre-signed transactions
- Amounts in parameters use minimal units (wei/lamports)
- Gas price fields: use
eip1559Protocol.suggestBaseFee+proposePriorityFeefor EIP-1559 chains,normalfor legacy - EVM contract addresses must be all lowercase
- The CLI resolves chain names automatically (e.g.,
ethereum→1,solana→501) - The CLI handles authentication internally via environment variables — see Prerequisites step 4 for default values