@orderly.network/cli 0.9.2-alpha.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,127 @@
1
+ # @orderly.network/cli
2
+
3
+ CLI tool for Orderly Network trading with secure OS keychain authentication.
4
+
5
+ ## Features
6
+
7
+ - **Secure key storage** - Wallet and API keys stored in OS keychain (never in files)
8
+ - **AI-friendly** - Keys never exposed to AI context, CLI returns only results
9
+ - **Full trading support** - Place/cancel orders, manage positions, set leverage
10
+ - **Multi-chain** - Supports EVM (Arbitrum, Base, Optimism, etc.) and Solana
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ npm install -g @orderly.network/cli
16
+ ```
17
+
18
+ ### Requirements
19
+
20
+ - **Node.js >= 22**
21
+ - **Linux**: `sudo apt install libsecret-1-0 libsecret-1-dev` (for OS keychain support)
22
+
23
+ ## Quick Start (Testnet)
24
+
25
+ ```bash
26
+ # 1. Create a new EVM wallet
27
+ orderly wallet-create --type EVM --network testnet
28
+
29
+ # 2. Register Orderly account
30
+ orderly wallet-register --broker-id demo --network testnet
31
+
32
+ # 3. Request test USDC (wait a few minutes for delivery)
33
+ orderly faucet-usdc <address> --broker-id demo --chain-id 421614 --network testnet
34
+
35
+ # 4. Add API key for trading (generates Ed25519 key automatically)
36
+ orderly wallet-add-key --broker-id demo --scope read,trading --network testnet
37
+
38
+ # 5. List accounts to get your account ID
39
+ orderly auth-list --network testnet
40
+
41
+ # 6. Check balance
42
+ orderly account-balance --account <account-id> --network testnet
43
+
44
+ # 7. Place an order
45
+ orderly order-place PERP_ETH_USDC BUY MARKET 0.01 --account <account-id> --network testnet
46
+ ```
47
+
48
+ **Note:** The `--account` flag is required for all authenticated commands. Use `auth-list` to see available accounts.
49
+
50
+ ## Common Commands
51
+
52
+ ```bash
53
+ # Account management
54
+ orderly account-info --account <account-id>
55
+ orderly account-balance --account <account-id>
56
+
57
+ # Trading - Orders
58
+ orderly order-place PERP_ETH_USDC BUY LIMIT 0.01 --price 3500 --account <account-id>
59
+ orderly order-place PERP_ETH_USDC BUY MARKET 0.01 --client-order-id my-order-123 --account <account-id>
60
+ orderly order-cancel <order-id> --symbol PERP_ETH_USDC --account <account-id>
61
+ orderly order-list --status NEW --account <account-id>
62
+
63
+ # Trading - Algo Orders (TP/SL)
64
+ orderly algo-order-place PERP_ETH_USDC BUY STOP 0.01 --trigger-price 2000 --account <account-id>
65
+ orderly algo-order-place PERP_ETH_USDC SELL TP_SL 0.01 --tp-trigger-price 2500 --sl-trigger-price 1500 --account <account-id>
66
+ orderly algo-order-list --account <account-id>
67
+
68
+ # Positions
69
+ orderly positions-list --account <account-id>
70
+ orderly positions-close PERP_ETH_USDC --account <account-id>
71
+
72
+ # Market data
73
+ orderly market-price PERP_ETH_USDC
74
+ orderly market-trades PERP_ETH_USDC --limit 20
75
+ orderly funding-rates
76
+ orderly kline PERP_ETH_USDC 1h --limit 100 --account <account-id>
77
+ orderly symbols
78
+ ```
79
+
80
+ ## Output Format
81
+
82
+ By default, output is compact JSON (no whitespace) for AI/programmatic use:
83
+
84
+ ```bash
85
+ orderly market-price PERP_ETH_USDC
86
+ # {"symbol":"PERP_ETH_USDC","index_price":2124.82,"mark_price":2124.89,...}
87
+ ```
88
+
89
+ Use `--csv` for tabular data (more token-efficient for lists):
90
+
91
+ ```bash
92
+ orderly symbols --csv
93
+ # symbol,index_price,mark_price,...
94
+ # PERP_ETH_USDC,2124.82,2124.89,...
95
+ # PERP_BTC_USDC,71551.7,71551.7,...
96
+ ```
97
+
98
+ ## Security
99
+
100
+ - Private keys are stored in the OS keychain:
101
+ - **macOS**: Keychain
102
+ - **Windows**: Credential Manager
103
+ - **Linux**: libsecret/gnome-keyring
104
+
105
+ - Keys are **never**:
106
+ - Written to disk in plain text
107
+ - Exposed in CLI output
108
+ - Accessible to AI agents
109
+
110
+ ## Commands
111
+
112
+ Run `orderly --help` for the complete command reference.
113
+
114
+ ## Development
115
+
116
+ ```bash
117
+ yarn dev # Watch mode build
118
+ yarn build # Production build
119
+ yarn lint # Check for issues
120
+ yarn format # Format code
121
+ yarn typecheck # TypeScript check
122
+ yarn test # Run tests
123
+ ```
124
+
125
+ ## License
126
+
127
+ MIT
package/dist/index.js ADDED
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env node
2
+
3
+ var Qr=Object.defineProperty;var Zr=(e,t)=>()=>(e&&(t=e(e=0)),t);var Xr=(e,t)=>{for(var r in t)Qr(e,r,{get:t[r],enumerable:!0})};var st={};Xr(st,{error:()=>c,handleError:()=>g,isPrettyJson:()=>it,normalizeOptionalSymbol:()=>K,normalizeSymbol:()=>L,output:()=>p});import Ee from"kleur";import on from"axios";function it(){return process.argv.includes("--pretty")}function sn(e){if(e!==null&&typeof e=="object"&&"data"in e){let t=e;return t.success===!1?t:t.data}return e}function me(e,t="",r){let n={};for(let[o,i]of Object.entries(e)){let s=t?`${t}.${o}`:o;if(i==null){let a=r?.get(s);if(a&&a.length>0)for(let l of a)n[`${s}.${l}`]="";else n[s]=""}else if(typeof i=="object"&&!Array.isArray(i))Object.assign(n,me(i,s,r));else if(Array.isArray(i))if(i.filter(l=>typeof l=="object"&&l!==null&&!Array.isArray(l)).length>0){let l=0;for(let d=0;d<i.length;d++){let u=i[d];typeof u=="object"&&u!==null&&!Array.isArray(u)&&(Object.assign(n,me(u,`${s}.${l}`,r)),l++)}}else n[s]=JSON.stringify(i);else n[s]=String(i)}return n}function an(e){if(typeof e!="object"||e===null)return e;let t=e,r=["rows","list","data"];for(let i of r)if(i in t){if(Array.isArray(t[i]))return t[i];if(t[i]===null)return[]}let n=Object.keys(t),o=n.filter(i=>Array.isArray(t[i]));return o.length===1&&n.length<=2?t[o[0]]:e}function Ne(e,t=""){let r=new Map;if(typeof e!="object"||e===null||Array.isArray(e))return r;let n=e;for(let[o,i]of Object.entries(n)){let s=t?`${t}.${o}`:o;if(typeof i=="object"&&i!==null&&!Array.isArray(i)){let a=Object.keys(i);r.set(s,a);let l=Ne(i,s);for(let[d,u]of l){let m=r.get(d);if(m){let T=[...new Set([...m,...u])];r.set(d,T)}else r.set(d,u)}}else if(Array.isArray(i)){let a=i.filter(l=>typeof l=="object"&&l!==null&&!Array.isArray(l));if(a.length>0){r.set(s,["0"]);let l=new Set;for(let d=0;d<a.length;d++){let u=`${s}.${d}`,m=Object.keys(a[d]);r.set(u,m),m.forEach(w=>l.add(w));let T=Ne(a[d],u);for(let[w,P]of T){let S=r.get(w);S?r.set(w,[...new Set([...S,...P])]):r.set(w,P)}}}}}return r}function cn(e){let t=an(e);if(Array.isArray(t)){if(t.length===0)return"";let r=new Map;for(let a of t)if(typeof a=="object"&&a!==null){let l=Ne(a);for(let[d,u]of l){let m=r.get(d);m?r.set(d,[...new Set([...m,...u])]):r.set(d,u)}}let n=new Set,o=[];for(let a of t)if(typeof a=="object"&&a!==null){let l=me(a,"",r);Object.keys(l).forEach(d=>n.add(d)),o.push(l)}let i=Array.from(n),s=[i.join(",")];for(let a of o){let l=i.map(d=>ot(a[d]??""));s.push(l.join(","))}return s.join(`
4
+ `)}if(typeof t=="object"&&t!==null){let r=me(t),n=Object.keys(r);return`${n.join(",")}
5
+ ${n.map(o=>ot(r[o])).join(",")}`}return String(t)}function ot(e){return e.includes(",")||e.includes('"')||e.includes(`
6
+ `)?`"${e.replace(/"/g,'""')}"`:e}function p(e,t="json"){let r=sn(e);if(t==="csv"){let n=cn(r);n!==""?console.log(n):console.error(Ee.dim("(no data)"))}else console.log(JSON.stringify(r,null,it()?2:0))}function L(e){let t=e.trim().toUpperCase().replace(/\/|-/g,"_");return!t.includes("_")&&t.length>=3&&c(`Invalid symbol: "${e}". Expected format: PERP_<BASE>_<QUOTE> (e.g. PERP_ETH_USDC).`,["Run `orderly symbols` to see available symbols."]),t.startsWith("PERP_")||(t=`PERP_${t}`),ln.test(t.slice(5))||c(`Invalid symbol: "${e}". Expected format: PERP_<BASE>_<QUOTE> (e.g. PERP_ETH_USDC).`,["Run `orderly symbols` to see available symbols."]),t}function K(e){if(e)return L(e)}function c(e,t){if(console.error(Ee.red(e)),t?.length)for(let r of t)console.error(Ee.dim(r));process.exit(1)}function g(e){if(on.isAxiosError(e)&&e.response?.data){let t=e.response.status,r=e.response.data;t===429&&c("Rate limited. Please wait before trying again.");let n=typeof r=="object"&&r!==null?r:void 0,o=n?.code,i=typeof r=="string"&&r.startsWith("<")?`Request failed with status ${t}`:n?.message||JSON.stringify(r),s=[`API Error [${t}]`];o!==void 0&&s.push(`[${o}]`),s.push(`: ${i}`),c(s.join(" "))}else e instanceof Error?c(e.message):c(String(e))}var ln,$=Zr(()=>{"use strict";ln=/^[A-Z0-9]+_[A-Z0-9]+(_[A-Z0-9]+)*$/});import{cac as Kn}from"cac";import E from"kleur";import{readFileSync as Dn}from"fs";import{fileURLToPath as Ln}from"url";import{dirname as Un,join as Fn}from"path";import A from"kleur";import Q from"prompts";import{ed25519 as he}from"@noble/curves/ed25519.js";import{randomBytes as en}from"crypto";import je from"bs58";function ze(){let e=en(32),t=he.getPublicKey(e);return{publicKey:Buffer.from(t).toString("base64"),privateKey:Buffer.from(e).toString("base64")}}function Ve(e){return Buffer.from(e,"base64")}function Ye(e){let t=Ve(e),r=he.getPublicKey(t);return Buffer.from(r).toString("base64")}function He(e,t){let r=Ve(t),n=new TextEncoder().encode(e),o=he.sign(n,r);return Buffer.from(o).toString("base64url")}function ie(e){let t=Buffer.from(e,"base64");return je.encode(t)}function Ge(e){let t=je.decode(e);return Buffer.from(t).toString("base64")}function se(e){return ie(e)}import j from"keytar";var ae="orderly-cli",ce="orderly-cli-wallet";function ve(e,t){return`${e}:${t}`}function Pe(e,t){return`${e}:${t}`}async function le(e,t,r){await j.setPassword(ae,ve(e,t),JSON.stringify(r))}async function de(e,t){let r=await j.getPassword(ae,ve(e,t));return r?JSON.parse(r):null}async function _e(e,t){return j.deletePassword(ae,ve(e,t))}async function z(){return(await j.findCredentials(ae)).map(t=>{let r=JSON.parse(t.password);return{accountId:r.accountId,address:r.address,walletType:r.walletType,publicKey:r.publicKey,network:r.network}})}async function Se(e,t,r){await j.setPassword(ce,Pe(e,t),JSON.stringify(r))}async function W(e,t){let r=await j.getPassword(ce,Pe(e,t));return r?JSON.parse(r):null}async function xe(e,t){return j.deletePassword(ce,Pe(e,t))}async function J(){return(await j.findCredentials(ce)).map(t=>{let r=JSON.parse(t.password);return{address:r.address,walletType:r.walletType,network:r.network}})}async function Je(e,t){return await W(e,t)!==null}import re from"fs";import Ze from"path";import Xe from"os";var Qe="OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY",Ie={mainnet:{api:"https://api.orderly.org",ws:`wss://ws-evm.orderly.org/ws/stream/${Qe}`},testnet:{api:"https://testnet-api.orderly.org",ws:`wss://testnet-ws-evm.orderly.org/ws/stream/${Qe}`}},Te={defaultNetwork:"testnet"};var et=".orderly-cli",tn="config.json";function tt(){return Ze.join(Xe.homedir(),et,tn)}function rn(){return Ze.join(Xe.homedir(),et)}function rt(){let e=tt();if(!re.existsSync(e))return{...Te};let t=re.readFileSync(e,"utf-8");return{...Te,...JSON.parse(t)}}function nn(e){let t=rn();re.existsSync(t)||re.mkdirSync(t,{recursive:!0});let r=tt();re.writeFileSync(r,JSON.stringify(e,null,2))}function H(e){return Ie[e].api}function nt(e){return Ie[e].ws}function f(){return rt().defaultNetwork??"testnet"}function ue(e){let t=rt();t.defaultNetwork=e,nn(t)}import dn from"prompts";$();import at from"axios";var R=class{client;keyPair=null;network;constructor(t){this.network=t??f(),this.client=at.create({baseURL:H(this.network)})}getNetwork(){return this.network}setKeyPair(t){this.keyPair=t}getSignatureHeaders(t,r,n,o){if(!this.keyPair)throw new Error("No key pair set. Please authenticate first.");let i=o??Date.now(),s=`${i}${t.toUpperCase()}${r}${n||""}`,a=He(s,this.keyPair.privateKey);return{"orderly-timestamp":i.toString(),"orderly-account-id":this.keyPair.accountId,"orderly-key":`ed25519:${se(this.keyPair.publicKey)}`,"orderly-signature":a}}async request(t,r=!0){let n=t.method?.toUpperCase()??"GET",o=t.url??"",i=t.data?JSON.stringify(t.data):void 0,s={};if(n==="GET"||n==="DELETE"?s["Content-Type"]="application/x-www-form-urlencoded":s["Content-Type"]="application/json",r){let d=this.getSignatureHeaders(n,o,i);Object.assign(s,d)}let a={method:t.method,url:t.url,headers:s};return t.data!==void 0&&(a.data=t.data),(await this.client.request(a)).data}async get(t,r=!0){return this.request({method:"GET",url:t},r)}async post(t,r,n=!0){return this.request({method:"POST",url:t,data:r},n)}async delete(t,r=!0){return this.request({method:"DELETE",url:t},r)}async put(t,r,n=!0){return this.request({method:"PUT",url:t,data:r},n)}async getAccountInfo(){return this.get("/v1/client/info")}async getBrokerId(t){let r=await this.get(`/v1/public/account?account_id=${t}`,!1);if(!r.data?.broker_id)throw new Error(`Could not resolve broker_id for account ${t}`);return r.data.broker_id}async getBalances(){return this.get("/v1/client/holding")}async getStatistics(){return this.get("/v1/client/statistics")}async getOrders(t,r,n,o,i,s,a){let l=new URLSearchParams;t&&l.append("symbol",t),r&&l.append("status",r),n&&l.append("side",n),o&&l.append("order_type",o),i&&l.append("sort_by",i),s&&l.append("page",s.toString()),a&&l.append("size",a.toString());let d=l.toString();return this.get(d?`/v1/orders?${d}`:"/v1/orders")}async getOrder(t){return this.get(`/v1/order/${t}`)}async placeOrder(t){return this.post("/v1/order",t)}async cancelOrder(t,r){let n=r?`/v1/order?order_id=${t}&symbol=${r}`:`/v1/order?order_id=${t}`;return this.delete(n)}async editOrder(t,r,n){let o={order_id:Number(t),symbol:n,...r};return this.put("/v1/order",o)}async cancelAllOrders(t){let r=t?`/v1/orders?symbol=${t}`:"/v1/orders";return this.delete(r)}async placeBatchOrder(t){return this.post("/v1/batch-order",{orders:t})}async cancelBatchOrders(t){return this.delete(`/v1/batch-order?order_ids=${t.join(",")}`)}async cancelBatchOrdersByClientIds(t){return this.delete(`/v1/client/batch-order?client_order_ids=${t.join(",")}`)}async getPositions(){return this.get("/v1/positions")}async getPosition(t){return this.get(`/v1/position/${t}`)}async closePosition(t,r){let n=await this.getPosition(t);if(!n.success||!n.data)throw new Error(`No open position found for ${t}`);let{position_qty:o}=n.data;if(!o||o===0)throw new Error(`No open position found for ${t}`);let i=o>0?"SELL":"BUY",s=Math.abs(o);if(r!==void 0){if(r<=0)throw new Error("Quantity must be positive");if(r>s)throw new Error(`Quantity ${r} exceeds position size ${s}`)}let a=r!==void 0?r.toString():s.toString();return this.placeOrder({symbol:t,order_type:"MARKET",side:i,order_quantity:a,reduce_only:!0})}async getMarketPrice(t){return this.get(`/v1/public/futures/${t}`,!1)}async getMarketTrades(t,r){let n=new URLSearchParams;return n.append("symbol",t),r&&n.append("limit",r.toString()),this.get(`/v1/public/market_trades?${n.toString()}`,!1)}async getFundingRates(){return this.get("/v1/public/market_info/funding_history",!1)}async getSymbols(){return this.get("/v1/public/info",!1)}async getFutures(){return this.get("/v1/public/futures",!1)}async faucetUsdc(t,r,n){if(this.network!=="testnet")throw new Error("Faucet is only available on testnet. Use --network testnet.");let o=!t.startsWith("0x"),i=o?"https://testnet-operator-sol.orderly.org":"https://testnet-operator-evm.orderly.org",s={user_address:t,broker_id:r};return n&&!o&&(s.chain_id=n),(await at.post(`${i}/v1/faucet/usdc`,s,{headers:{"Content-Type":"application/json"}})).data}async getAccount(t,r,n){let o=`/v1/get_account?address=${t}&broker_id=${r}`;return n&&(o+=`&chain_type=${n}`),this.get(o,!1)}async getRegistrationNonce(){return this.get("/v1/registration_nonce",!1)}async registerAccount(t,r,n,o){let i={message:t,signature:r,userAddress:n};return o&&(i.chain_type=o),this.post("/v1/register_account",i,!1)}async addOrderlyKey(t,r,n,o){let i={message:t,signature:r,userAddress:n};return o&&(i.chain_type=o),this.post("/v1/orderly_key",i,!1)}async getSupportedChains(){return this.get("/v1/public/chain_info",!1)}async getLeverage(t){return this.get(`/v1/client/leverage?symbol=${t}`)}async setLeverage(t,r){return this.post("/v1/client/leverage",{symbol:t,leverage:r})}async getTrades(t,r,n,o,i){let s=new URLSearchParams;t&&s.append("symbol",t),r&&s.append("start_t",r.toString()),n&&s.append("end_t",n.toString()),o&&s.append("page",o.toString()),i&&s.append("size",i.toString());let a=s.toString();return this.get(a?`/v1/trades?${a}`:"/v1/trades")}async getPositionHistory(t,r,n,o,i){let s=new URLSearchParams;t&&s.append("symbol",t),r&&s.append("start_t",r.toString()),n&&s.append("end_t",n.toString()),s.append("page",(o??1).toString()),s.append("limit",(i??25).toString());let a=s.toString(),l=await this.get(`/v1/position_history?${a}`);return l?.data&&l.data.rows===null&&(l.data.rows=[]),l}async placeAlgoOrder(t){let r={symbol:t.symbol,algo_type:t.algoType};return t.type!==void 0&&(r.type=t.type),t.side!==void 0&&(r.side=t.side),t.quantity!==void 0&&(r.quantity=t.quantity),t.triggerPrice!==void 0&&(r.trigger_price=t.triggerPrice),t.price!==void 0&&(r.price=t.price),t.callbackRate!==void 0&&(r.callback_rate=t.callbackRate),t.reduceOnly&&(r.reduce_only=!0),t.clientOrderId!==void 0&&(r.client_order_id=t.clientOrderId),t.childOrders!==void 0&&(r.child_orders=t.childOrders),this.post("/v1/algo/order",r)}async cancelAlgoOrderByClientId(t,r){return this.delete(`/v1/algo/client/order?client_order_id=${encodeURIComponent(t)}&symbol=${r}`)}async cancelAlgoOrder(t,r){return this.delete(`/v1/algo/order?order_id=${t}&symbol=${r}`)}async cancelAllAlgoOrders(t,r){let n=new URLSearchParams;t&&n.append("symbol",t),r&&n.append("algo_type",r);let o=n.toString();return this.delete(o?`/v1/algo/orders?${o}`:"/v1/algo/orders")}async getAlgoOrders(t,r,n,o,i){let s=new URLSearchParams;t&&s.append("symbol",t),r&&s.append("status",r),n&&s.append("page",n.toString()),o&&s.append("size",o.toString()),i&&s.append("algo_type",i);let a=s.toString();return this.get(a?`/v1/algo/orders?${a}`:"/v1/algo/orders")}async editAlgoOrder(t,r,n){let o={order_id:Number(t),symbol:n};return r.price!==void 0&&(o.price=r.price),r.quantity!==void 0&&(o.quantity=r.quantity),r.trigger_price!==void 0&&(o.trigger_price=r.trigger_price),r.callback_rate!==void 0&&(o.callback_rate=r.callback_rate),this.put("/v1/algo/order",o)}async findAlgoOrderById(t){return this.get(`/v1/algo/order/${t}`)}async getSettleNonce(){return this.get("/v1/settle_nonce")}async getPnlSettlementHistory(t,r){let n=new URLSearchParams;return n.append("page",(t??1).toString()),n.append("size",(r??25).toString()),this.get(`/v1/pnl_settlement/history?${n.toString()}`)}async getReferralInfo(){return this.get("/v1/referral/info")}async getDistributionHistory(t,r,n,o,i,s){let a=new URLSearchParams;t&&a.append("status",t),r&&a.append("type",r),n&&a.append("start_t",n.toString()),o&&a.append("end_t",o.toString()),a.append("page",(i??1).toString()),a.append("size",(s??25).toString());let l=a.toString();return this.get(l?`/v1/client/distribution_history?${l}`:"/v1/client/distribution_history")}async getVolumeStats(){return this.get("/v1/volume/user/stats")}async getNotificationInbox(t,r,n){let o=new URLSearchParams;return t&&o.append("type",t),o.append("page",(r??1).toString()),o.append("size",(n??25).toString()),this.get(`/v1/notification/inbox/notifications?${o.toString()}`)}async getNotificationInboxUnread(){return this.get("/v1/notification/inbox/unread")}async cancelOrderByClientId(t,r){return this.delete(`/v1/client/order?client_order_id=${encodeURIComponent(t)}&symbol=${r}`)}async getOrderByOrderId(t){return this.get(`/v1/order/${t}`)}async getOrderByClientId(t){return this.get(`/v1/client/order/${encodeURIComponent(t)}`)}async getOrderTrades(t){return this.get(`/v1/order/${t}/trades`)}async getAlgoOrderTrades(t){return this.get(`/v1/algo/order/${t}/trades`)}async getLiquidations(t,r,n){let o=new URLSearchParams;t&&o.append("symbol",t),r&&o.append("page",r.toString()),n&&o.append("size",n.toString());let i=o.toString();return this.get(i?`/v1/liquidations?${i}`:"/v1/liquidations")}async getPriceChanges(){return this.get("/v1/public/market_info/price_changes",!1)}async getOpenInterest(){return this.get("/v1/public/market_info/traders_open_interests",!1)}async getLiquidatedPositions(t,r,n){let o=new URLSearchParams;t&&o.append("symbol",t),r&&o.append("page",r.toString()),n&&o.append("size",n.toString());let i=o.toString();return this.get(i?`/v1/public/liquidated_positions?${i}`:"/v1/public/liquidated_positions",!1)}async getSystemInfo(){return this.get("/v1/public/system_info",!1)}async getKeyInfo(){return this.get("/v1/client/key_info")}};async function Oe(e,t){if(e)return e;let n=(await z()).filter(i=>i.network===t);return n.length===0&&c(`No accounts found for ${t}.`,["Run `orderly wallet-add-key` to add an account."]),n.length===1?n[0].accountId:((!process.stdin.isTTY||!process.stdout.isTTY)&&c("Multiple accounts found. Specify --account in non-interactive mode.",["Available accounts:",...n.map(i=>` ${i.accountId} (${i.walletType})`),"Run `orderly auth-list` to see all accounts."]),(await dn({type:"select",name:"accountId",message:"Select account",choices:n.map(i=>({title:`${i.accountId} (${i.walletType})`,value:i.accountId}))})).accountId??null)}async function Ae(e,t){let r=await Oe(e,t);r||c("No account resolved.");let n=await de(r,t);return n||c(`No key found for account ${r} on ${t}`),{accId:r,keyPair:n}}async function h(e,t){let{accId:r,keyPair:n}=await Ae(e,t),o=new R(t);return o.setKeyPair(n),{accId:r,keyPair:n,client:o}}$();function un(e){let t=e.trim();return t.startsWith("ed25519:")&&(t=t.slice(8)),Buffer.from(t,"base64").length===32&&/^[A-Za-z0-9+/]+=*$/.test(t)?t:Ge(t)}async function ct(e,t,r){console.log(A.cyan(`
7
+ \u{1F511} Import Existing Key (${r})
8
+ `));let n=e??"",o=t??"";if((!n||!o)&&(process.stdin.isTTY||c("Missing required arguments. Usage: orderly auth-import <private-key> --account <account-id>")),!n){let l=await Q({type:"password",name:"privateKey",message:"Enter your Ed25519 private key (base64, base58, or ed25519: prefixed)",validate:d=>d.length>0?!0:"Private key is required"});l.privateKey||c("Cancelled."),n=l.privateKey.trim()}if(!o){let l=await Q({type:"text",name:"accountId",message:"Enter your Orderly Account ID",validate:d=>d.length>0?!0:"Account ID is required"});l.accountId||c("Cancelled."),o=l.accountId.trim()}let i,s;try{i=un(n),s=Ye(i)}catch{c("Invalid key format. Provide a valid Ed25519 private key in base64, base58, or ed25519: prefixed format.")}let a={accountId:o,address:"",publicKey:s,privateKey:i,network:r};try{await le(o,r,a)}catch(l){c(`Failed to store key: ${l}`)}ue(r),console.log(),console.log(A.green("\u2705 Key imported successfully!")),console.log(A.dim(`Account ID: ${o}`)),console.log(A.dim(`Public key: ${s}`))}function lt(e){return e.walletType?e.walletType:"Unknown"}async function dt(e,t="json",r=!1){let n=await z(),o=e?n.filter(s=>s.network===e):n;if(o.length===0){r||console.log(A.yellow("No keys stored. Run `orderly wallet-add-key` to get started."));return}if(r){for(let s of o)console.log(s.accountId);return}let i=o.map(s=>({accountId:s.accountId,address:s.address||"",network:s.network,walletType:lt(s),publicKey:ie(s.publicKey)}));p(i,t)}async function ut(e,t,r=!1){console.log(A.cyan(`
9
+ \u{1F6AA} Logout
10
+ `));let n=e;if(!n){(!process.stdin.isTTY||!process.stdout.isTTY)&&c("Error: --account is required in non-interactive mode.");let i=(await z()).filter(a=>a.network===t);if(i.length===0){console.log(A.yellow(`No keys stored for ${t}.`));return}let s=await Q({type:"select",name:"accountId",message:"Select account to logout",choices:i.map(a=>({title:`${a.accountId} [${a.network}]`,value:a.accountId}))});s.accountId||c("Cancelled."),n=s.accountId}n||c("No account selected."),r||(await Q({type:"confirm",name:"value",message:`Remove key for account ${n} on ${t}?`,initial:!1})).value||c("Cancelled.");try{let o=await _e(n,t);console.log(o?A.green(`Key removed for ${n} on ${t}`):A.yellow(`No key found for ${n} on ${t}`))}catch(o){c(`Failed to remove key: ${o}`)}}async function mt(e,t,r="json"){let n=await Oe(e,t);if(!n){process.exitCode=1,p({success:!1,message:"No account resolved."},r);return}let o=await de(n,t);if(!o){process.exitCode=1,p({success:!1,message:`No key found for account ${n} on ${t}`},r);return}let i={accountId:o.accountId,address:o.address||"",network:o.network,walletType:lt(o),publicKey:ie(o.publicKey)};p(i,r)}async function pt(e){console.log(A.cyan(`
11
+ \u{1F9F9} Cleaning up keys
12
+ `));let r=(await z()).filter(o=>o.network===e);if(r.length===0){console.log(A.green(`No keys found for ${e}.`));return}console.log(A.yellow(`Found ${r.length} key(s) for ${e}:`));for(let o of r)console.log(A.dim(` - ${o.accountId}`));console.log(),process.stdin.isTTY&&process.stdout.isTTY&&((await Q({type:"confirm",name:"value",message:`Delete all ${r.length} key(s)?`,initial:!1})).value||c("Cancelled."));let n=0;for(let o of r)try{await _e(o.accountId,e),console.log(A.green(`\u2713 Removed: ${o.accountId}`)),n++}catch(i){console.log(A.red(`Failed to remove ${o.accountId}: ${i}`))}console.log(A.green(`
13
+ \u2705 Cleanup complete. ${n} key(s) removed.`))}async function gt(e,t){(!process.stdin.isTTY||!process.stdout.isTTY)&&c("This command requires an interactive terminal."),console.log(A.cyan(`
14
+ \u{1F4E4} Export API Key
15
+ `)),console.log(A.yellow("\u26A0\uFE0F WARNING: This will display your private key on screen.")),console.log(A.yellow(" Make sure no one is watching your screen.")),console.log();let{keyPair:r}=await Ae(e,t);console.log(A.cyan("Account:"),A.white(r.accountId)),console.log(A.cyan("Network:"),A.white(r.network)),console.log(),(await Q({type:"text",name:"confirm",message:'Type "EXPORT" to confirm you want to export your private key:',validate:o=>o==="EXPORT"?!0:"You must type EXPORT exactly"})).confirm||c("Cancelled."),console.log(),console.log(A.green("\u2705 Key exported:")),console.log(),console.log(A.cyan("Public Key:")),console.log(A.white(r.publicKey)),console.log(),console.log(A.cyan("Private Key:")),console.log(A.white(r.privateKey)),console.log(),console.log(A.yellow("\u26A0\uFE0F Store your private key securely. Never share it with anyone."))}$();function Ce(e){let t=e;return t&&typeof t=="object"&&"data"in t&&t.success?t.data:t}function mn(e){let t={};for(let[r,n]of Object.entries(e))(typeof n!="object"||n===null)&&(t[r]=n);return t}function pn(e){let t=e.imr_factor,r=e.max_notional,n=new Set([...Object.keys(t||{}),...Object.keys(r||{})]),o=[];for(let i of n)o.push({symbol:i,max_leverage:e.max_leverage??"",imr_factor:t?.[i]??"",max_notional:r?.[i]??""});return o}async function yt(e,t,r="json"){let{client:n}=await h(e,t);try{let o=await n.getAccountInfo();r==="csv"?p(mn(Ce(o)),r):p(o,r)}catch(o){g(o)}}async function ft(e,t,r,n="json"){let{client:o}=await h(e,r);try{let i=await o.getAccountInfo(),s=Ce(i);if(t){let a;try{let d=await o.get(`/v1/public/info/${t}`,!1);d&&typeof d=="object"&&d.success&&(a=d.data)}catch{}if(a||c(`Symbol ${t} not found.`,['Use "orderly symbols" to see available symbols.']),n==="csv"){let l=s.imr_factor,d=s.max_notional;p({rows:[{symbol:t,account_max_leverage:s.max_leverage??"",account_imr_factor:l?.[t]??"",account_max_notional:d?.[t]??"",...a}]},n)}else p({account:s,symbol:{symbol:t,...a}},n)}else if(n==="csv")p({rows:pn(s)},n);else{let a={max_leverage:s.max_leverage??null,imr_factor:s.imr_factor??null,max_notional:s.max_notional??null};p(a,n)}}catch(i){g(i)}}async function wt(e,t,r="json"){let{client:n}=await h(e,t);try{let o=await n.getBalances();p(o,r)}catch(o){g(o)}}async function bt(e,t,r="json"){let{client:n}=await h(e,t);try{let o=await n.getStatistics();p(o,r)}catch(o){g(o)}}async function kt(e,t,r="json"){let{client:n}=await h(e,t);try{let o=await n.getKeyInfo();p(o,r)}catch(o){g(o)}}function gn(e){return{account_id:e.account_id,futures:{maker_fee_rate:e.futures_maker_fee_rate??null,taker_fee_rate:e.futures_taker_fee_rate??null},rwa:{maker_fee_rate:e.rwa_maker_fee_rate??null,taker_fee_rate:e.rwa_taker_fee_rate??null},default:{maker_fee_rate:e.maker_fee_rate??null,taker_fee_rate:e.taker_fee_rate??null}}}async function ht(e,t,r="json"){let{client:n}=await h(e,t);try{let o=await n.getAccountInfo(),i=Ce(o);p(gn(i),r)}catch(o){g(o)}}async function vt(e,t,r,n,o,i="json"){let{client:s}=await h(n,o);try{let a=await s.getLiquidations(e,t,r);p(a,i)}catch(a){g(a)}}import{existsSync as yn,readFileSync as fn}from"fs";$();var pe=["LIMIT","MARKET","IOC","FOK","POST_ONLY","ASK","BID"],Pt=["LIMIT","IOC","FOK","POST_ONLY"];async function _t(e,t,r,n,o,i,s,a,l,d="json"){let u=t.toUpperCase();u!=="BUY"&&u!=="SELL"&&c("Invalid side. Use BUY or SELL.");let m=r.toUpperCase();pe.includes(m)||c(`Invalid order type. Use one of: ${pe.join(", ")}`),Pt.includes(m)&&!o&&c(`Price is required for ${m} orders.`);let T=Number(n);(isNaN(T)||T<=0)&&c("Quantity must be a positive number.");let{client:w}=await h(a,l),P={symbol:e.toUpperCase(),order_type:m,side:u,order_quantity:n};o&&(P.order_price=o),i&&(P.client_order_id=i),s&&(P.reduce_only=!0);try{let S=await w.placeOrder(P);p(S,d)}catch(S){g(S)}}async function St(e,t,r,n,o="json"){let{client:i}=await h(r,n),s=t;if(!s)try{let a=await i.getOrder(e);(!a.success||!a.data)&&c(`Order ${e} not found.`),s=a.data.symbol}catch(a){g(a)}try{let a=await i.cancelOrder(e,s);p(a,o)}catch(a){g(a)}}async function xt(e,t,r,n,o,i,s="json"){!r&&!n&&c("At least one of --price or --quantity is required to edit an order.",["Examples:"," orderly order-edit 123456 --price 3500"," orderly order-edit 123456 --quantity 0.02"," orderly order-edit 123456 --price 3500 --quantity 0.02"]);let{client:a}=await h(o,i),l=t,d,u,m,T,w,P;try{let _=await a.getOrder(e);(!_.success||!_.data)&&c(`Order ${e} not found.`);let x=_.data;l||(l=x.symbol),d=x.type,u=x.side,x.price!==void 0&&x.price!==null&&(m=String(x.price)),x.quantity!==void 0&&x.quantity!==null&&(T=String(x.quantity)),x.visible_quantity!==void 0&&x.visible_quantity!==null&&(w=x.visible_quantity),x.client_order_id&&(P=x.client_order_id)}catch(_){g(_)}if(r!==void 0){let _=Number(r);(isNaN(_)||_<=0)&&c("Price must be a positive number.")}if(n!==void 0){let _=Number(n);(isNaN(_)||_<=0)&&c("Quantity must be a positive number.")}let S={order_type:d,side:u,order_price:Number(r!==void 0?r:m),order_quantity:Number(n!==void 0?n:T)};w!==void 0&&(S.visible_quantity=w),P!==void 0&&(S.client_order_id=P);try{let _=await a.editOrder(e,S,l);p(_,s)}catch(_){g(_)}}async function It(e,t,r,n="json"){let{client:o}=await h(t,r);try{let i=await o.cancelAllOrders(e);p(i,n)}catch(i){g(i)}}async function Tt(e,t,r,n,o,i,s,a,l,d="json"){let{client:u}=await h(a,l);try{let m=await u.getOrders(e,t?.toUpperCase(),r?.toUpperCase(),n?.toUpperCase(),o,i,s);p(m,d)}catch(m){g(m)}}function wn(e,t){let r=`[${t}]`;(typeof e!="object"||e===null)&&c(`Order ${r} must be an object.`);let n=e.symbol??e.s;(!n||typeof n!="string")&&c(`Order ${r}: "symbol" is required.`);let o=e.type??e.order_type??e.t;(!o||typeof o!="string")&&c(`Order ${r}: "type" is required.`);let i=o.toUpperCase();pe.includes(i)||c(`Order ${r}: invalid type "${o}". Use one of: ${pe.join(", ")}.`);let s=e.side??e.s;(!s||typeof s!="string")&&c(`Order ${r}: "side" is required (BUY or SELL).`),s.toUpperCase()!=="BUY"&&s.toUpperCase()!=="SELL"&&c(`Order ${r}: invalid side "${s}". Use BUY or SELL.`);let a=e.quantity??e.order_quantity??e.qty??e.q;a==null&&c(`Order ${r}: "quantity" is required.`);let l=String(a);(isNaN(Number(l))||Number(l)<=0)&&c(`Order ${r}: "quantity" must be a positive number.`);let d=e.price??e.order_price??e.p;Pt.includes(i)&&(d==null&&c(`Order ${r}: "price" is required for ${i} orders.`),(isNaN(Number(d))||Number(d)<=0)&&c(`Order ${r}: "price" must be a positive number.`));let u=e.client_order_id??e.clientOrderId;return{symbol:L(n),order_type:i,side:s.toUpperCase(),order_quantity:l,...d!=null?{order_price:String(d)}:{},...u!==void 0?{client_order_id:String(u)}:{}}}async function Et(e,t,r,n="json"){let o;try{if(yn(e)){let a=fn(e,"utf-8");o=JSON.parse(a)}else o=JSON.parse(e)}catch{c("Invalid JSON. Provide a valid JSON array or a path to a JSON file.")}(!Array.isArray(o)||o.length===0)&&c("Orders must be a non-empty array."),o.length>10&&c("Maximum 10 orders allowed per batch.");let i=o.map((a,l)=>wn(a,l)),{client:s}=await h(t,r);try{let a=await s.placeBatchOrder(i);p(a,n)}catch(a){g(a)}}async function Nt(e,t,r,n="json"){e.length===0&&c("At least one order ID is required.");let{client:o}=await h(t,r);try{let i=await o.cancelBatchOrders(e);p(i,n)}catch(i){g(i)}}async function Ot(e,t,r,n="json"){e.length===0&&c("At least one client order ID is required."),e.length>10&&c("Maximum 10 client order IDs allowed per batch.");let{client:o}=await h(t,r);try{let i=await o.cancelBatchOrdersByClientIds(e);p(i,n)}catch(i){g(i)}}async function At(e,t,r,n,o="json"){let{client:i}=await h(r,n);try{let s=await i.cancelOrderByClientId(e,t);p(s,o)}catch(s){g(s)}}async function Ct(e,t,r,n,o="json"){!e&&!t&&c("Provide either an order ID (positional) or --client-order-id.");let{client:i}=await h(r,n),s=t??(/^\d+$/.test(e)?void 0:e),a=/^\d+$/.test(e)?e:void 0;try{if(s){let l=await i.getOrderByClientId(s);p(l,o)}else if(a){let l=await i.getOrderByOrderId(a);p(l,o)}else c("Could not resolve order identifier. Provide a numeric order ID or use --client-order-id.")}catch(l){g(l)}}async function Rt(e,t,r,n="json"){let{client:o}=await h(t,r);try{let i=await o.getOrderTrades(e);p(i,n)}catch(i){g(i)}}$();async function $t(e,t,r="json"){let{client:n}=await h(e,t);try{let o=await n.getPositions();p(o,r)}catch(o){g(o)}}async function Kt(e,t,r,n="json",o){let{client:i}=await h(t,r);try{let s=await i.closePosition(e.toUpperCase(),o);p(s,n)}catch(s){g(s)}}async function Dt(e,t,r,n,o,i,s,a="json"){let{client:l}=await h(i,s);try{let d=await l.getPositionHistory(e,t,r,n,o);p(d,a)}catch(d){g(d)}}import bn from"axios";async function Lt(e,t,r,n=1e4){let o=nt(r);return new Promise(i=>{let s=!1,a=new WebSocket(o),l=u=>{if(!s){s=!0,clearTimeout(d);try{a.close()}catch{}i(u)}},d=setTimeout(()=>{l({success:!1,error:`WebSocket timeout after ${n}ms`})},n);a.addEventListener("open",()=>{a.send(JSON.stringify({id:"cli_snapshot",event:"subscribe",topic:`${e}@${t}`}))}),a.addEventListener("message",u=>{try{let m=JSON.parse(u.data);if(m.event==="ping"){a.send(JSON.stringify({event:"pong"}));return}if(m.event==="subscribe"){m.success===!1&&l({success:!1,error:m.errorMsg||"Subscription failed"});return}m.topic&&m.data!==void 0&&m.data!==null&&l({success:!0,data:m.data})}catch{}}),a.addEventListener("error",()=>{l({success:!1,error:`Failed to connect to WebSocket at ${o}`})}),a.addEventListener("close",u=>{l({success:!1,error:`WebSocket closed before receiving data (code: ${u.code})`})})})}$();var Ut=["1m","5m","15m","30m","1h","4h","12h","1d","1w","1mon"];async function Re(e,t){let r=await e.getMarketPrice(t);r!==null&&typeof r=="object"&&(!("data"in r)||r.data===null)&&c(`Symbol not found: "${t}".`,["Run `orderly symbols` to see available symbols."])}function $e(e,t){if(!t)return;let r=e.data,n=r?.rows??[];r&&(r.rows=n.filter(o=>o.symbol===t))}var kn={"1m":"1","5m":"5","15m":"15","30m":"30","1h":"60","4h":"240","12h":"720","1d":"1D","1w":"1W","1mon":"1M"},hn={1:60,3:180,5:300,15:900,30:1800,60:3600,240:14400,720:43200,"1D":86400,"3D":259200,"5D":432e3,"1W":604800,"1M":2592e3};async function Ft(e,t,r="json"){try{let o=await new R(t).getMarketPrice(e.toUpperCase());o!==null&&typeof o=="object"&&"data"in o&&o.data===null&&c(`Symbol not found: "${e}".`,["Run `orderly symbols` to see available symbols."]),o!==null&&typeof o=="object"&&!("data"in o)&&c(`Symbol not found: "${e}".`,["Run `orderly symbols` to see available symbols."]),p(o,r)}catch(n){g(n)}}async function qt(e,t,r,n,o="json"){let i=t.toLowerCase();Ut.includes(t)||c(`Invalid kline type. Use one of: ${Ut.join(", ")}`);let s=kn[i];s||c(`Kline type '${i}' is not supported via public API.`);let a=hn[s],l=r??100,d=Math.floor(Date.now()/1e3),u=d-l*a;try{let m=new R(n);await Re(m,e.toUpperCase());let T=H(n),{data:w}=await bn.get(`${T}/v1/tv/history`,{params:{symbol:e.toUpperCase(),resolution:s,from:u,to:d}});if(w.s!=="ok"||!w.t?.length){p({rows:[]},o);return}let P=w.t.map((S,_)=>({open:Number(w.o[_]),high:Number(w.h[_]),low:Number(w.l[_]),close:Number(w.c[_]),volume:Number(w.v[_]),amount:w.a?Number(w.a[_]):0,symbol:e.toUpperCase(),type:i,start_timestamp:S*1e3,end_timestamp:(S+a)*1e3}));p({rows:P},o)}catch(m){g(m)}}async function Bt(e,t,r="json",n){try{n!==void 0&&(!Number.isFinite(n)||n<1)&&c("--depth must be a positive integer.");let o=e.toUpperCase(),s=await new R(t).getMarketPrice(o);s!==null&&typeof s=="object"&&(!("data"in s)||s.data===null)&&c(`Symbol not found: "${e}".`,["Run `orderly symbols` to see available symbols."]);let a=await Lt(o,"orderbook",t);(!a.success||!a.data)&&c(a.error||"Failed to fetch orderbook");let l=(a.data.asks??[]).slice(0,n??a.data.asks.length).map(([u,m])=>({price:Number(u),quantity:Number(m)})),d=(a.data.bids??[]).slice(0,n??a.data.bids.length).map(([u,m])=>({price:Number(u),quantity:Number(m)}));if(r==="csv"){let u=[...l.map(m=>({side:"ask",...m})),...d.map(m=>({side:"bid",...m}))];p({rows:u},r)}else p({asks:l,bids:d},r)}catch(o){g(o)}}async function Mt(e,t,r="json"){try{let n=new R(t),o=e?await n.getSymbols():await n.getFutures();p(o,r)}catch(n){g(n)}}async function Wt(e,t,r,n="json"){try{let o=new R(r),i=e.toUpperCase();await Re(o,i);let s=await o.getMarketTrades(i,t);p(s,n)}catch(o){g(o)}}async function jt(e,t,r="json"){try{let o=await new R(t).getFundingRates();$e(o,e),p(o,r)}catch(n){g(n)}}async function zt(e,t,r="json"){try{let o=await new R(t).getPriceChanges();$e(o,e),p(o,r)}catch(n){g(n)}}async function Vt(e,t,r="json"){try{let n=new R(t);e&&await Re(n,e.toUpperCase());let o=await n.getOpenInterest();$e(o,e),p(o,r)}catch(n){g(n)}}async function Yt(e,t,r,n,o="json"){try{let s=await new R(n).getLiquidatedPositions(e,t,r);p(s,o)}catch(i){g(i)}}async function Ht(e,t="json"){try{let n=await new R(e).getSystemInfo();p(n,t)}catch(r){g(r)}}$();async function Gt(e,t,r,n="json",o){r!=="testnet"&&c("Faucet is only available on testnet. Use --network testnet"),t||c("--chain-id is required. Example: --chain-id 421614 (Arbitrum Sepolia), --chain-id 901901901 (SOL Devnet)");try{let s=await new R(r).faucetUsdc(e,o||"demo",t);s&&s.success===!1&&c(s.message||`Faucet request failed (code: ${s.code})`),p(s,n)}catch(i){g(i)}}import O from"kleur";import q from"prompts";import{Wallet as vn,TypedDataEncoder as ri,HDNodeWallet as Pn}from"ethers";var _n={name:"Orderly",version:"1",chainId:42161,verifyingContract:"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},Sn={mainnet:42161,testnet:421614};function Jt(e){return{..._n,chainId:Sn[e]}}function V(e){let t=new vn(e);return{address:t.address,signTypedData:async(r,n,o)=>t.signTypedData(r,n,o)}}function Ke(e){return/^0x[a-fA-F0-9]{40}$/.test(e)}function Qt(e){let t=e.startsWith("0x")?e.slice(2):e;return/^[a-fA-F0-9]{64}$/.test(t)}function ge(e){return e.startsWith("0x")?e:`0x${e}`}var xn={Registration:[{name:"brokerId",type:"string"},{name:"chainId",type:"uint256"},{name:"timestamp",type:"uint64"},{name:"registrationNonce",type:"uint256"}]},In={AddOrderlyKey:[{name:"brokerId",type:"string"},{name:"chainId",type:"uint256"},{name:"orderlyKey",type:"string"},{name:"scope",type:"string"},{name:"timestamp",type:"uint64"},{name:"expiration",type:"uint64"}]};async function Zt(e,t){let r=Jt(t.chainId===42161?"mainnet":"testnet");return e.signTypedData(r,xn,{brokerId:t.brokerId,chainId:t.chainId,timestamp:t.timestamp,registrationNonce:t.registrationNonce})}async function Xt(e,t){let r=Jt(t.chainId===42161?"mainnet":"testnet");return e.signTypedData(r,In,{brokerId:t.brokerId,chainId:t.chainId,orderlyKey:t.orderlyKey,scope:t.scope,timestamp:t.timestamp,expiration:t.expiration})}function er(){let e=Pn.createRandom();return{address:e.address,privateKey:e.privateKey,mnemonic:e.mnemonic?.phrase}}var Tn={Withdraw:[{name:"brokerId",type:"string"},{name:"chainId",type:"uint256"},{name:"receiver",type:"address"},{name:"token",type:"string"},{name:"amount",type:"uint256"},{name:"withdrawNonce",type:"uint64"},{name:"timestamp",type:"uint64"}]},tr={mainnet:"0x6F7a338F2aA472838dEFD3283eB360d4Dff5D203",testnet:"0x1826B75e2ef249173FC735149AE4B8e9ea10abff"};async function rr(e,t,r){let n={name:"Orderly",version:"1",chainId:t.chainId,verifyingContract:tr[r]};return e.signTypedData(n,Tn,t)}var En={SettlePnl:[{name:"brokerId",type:"string"},{name:"chainId",type:"uint256"},{name:"settleNonce",type:"uint64"},{name:"timestamp",type:"uint64"}]};async function nr(e,t,r){let n={name:"Orderly",version:"1",chainId:t.chainId,verifyingContract:tr[r]};return e.signTypedData(n,En,t)}import Z from"bs58";import{ed25519 as X}from"@noble/curves/ed25519.js";import{randomBytes as Nn}from"crypto";import{AbiCoder as ye,solidityPackedKeccak256 as G,keccak256 as ne,getBytes as fe}from"ethers";var De={mainnet:900900900,testnet:901901901};function we(e){return De[e]}function Y(e,t){let r;if(e.includes(",")||e.includes("[")){let i=e.replace(/[[\]]/g,"").split(",").map(s=>parseInt(s.trim(),10));r=new Uint8Array(i)}else try{r=Z.decode(e)}catch{if(/^[a-fA-F0-9]+$/.test(e)){let i=e.length===64?e:e.slice(0,64);r=new Uint8Array(i.length/2);for(let s=0;s<i.length;s+=2)r[s/2]=parseInt(i.slice(s,s+2),16)}else throw new Error("Invalid Solana private key format")}if(r.length===64&&(r=r.slice(0,32)),r.length!==32)throw new Error(`Invalid private key length: ${r.length}, expected 32 or 64 bytes`);let n=X.getPublicKey(r);return{address:Z.encode(n),privateKeyBytes:r}}function or(e){try{return Z.decode(e).length===32}catch{return!1}}function be(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function ir(e,t){let r=De[t.network],n={brokerId:t.brokerId,chainId:r,timestamp:t.timestamp,registrationNonce:t.registrationNonce},o=G(["string"],[n.brokerId]),s=ye.defaultAbiCoder().encode(["bytes32","uint256","uint256","uint256"],[o,n.chainId,n.timestamp,n.registrationNonce]),l=ne(fe(s)).slice(2),d=new TextEncoder().encode(l),u=X.sign(d,e.privateKeyBytes),m=`0x${be(u)}`;return{message:{...n,chainType:"SOL"},signature:m}}async function sr(e,t){let r=De[t.network],n={brokerId:t.brokerId,chainType:"SOL",orderlyKey:t.publicKey,scope:t.scope,chainId:r,timestamp:t.timestamp,expiration:t.expiration},o=G(["string"],[n.brokerId]),i=G(["string"],[n.orderlyKey]),s=G(["string"],[n.scope]),l=ye.defaultAbiCoder().encode(["bytes32","bytes32","bytes32","uint256","uint256","uint256"],[o,i,s,n.chainId,n.timestamp,n.expiration]),u=ne(fe(l)).slice(2),m=new TextEncoder().encode(u),T=X.sign(m,e.privateKeyBytes),w=`0x${be(T)}`;return{message:n,signature:w}}function ar(){let e=Nn(32),t=X.getPublicKey(e),r=Z.encode(t),n=Z.encode(e);return{address:r,privateKey:n}}async function cr(e,t){let r=t.timestamp??Date.now(),n={brokerId:t.brokerId,chainId:t.chainId,receiver:t.receiver,token:t.token,amount:t.amount,withdrawNonce:t.withdrawNonce,timestamp:r,chainType:"SOL"},o=G(["string"],[n.brokerId]),i=G(["string"],[n.token]),s=ne(Buffer.from("Orderly Network")),a=Z.decode(n.receiver),d=ye.defaultAbiCoder().encode(["bytes32","bytes32","uint256","bytes32","uint256","uint64","uint64","bytes32"],[o,i,n.chainId,a,n.amount,n.withdrawNonce,r,s]),m=ne(fe(d)).slice(2),T=new TextEncoder().encode(m),w=X.sign(T,e.privateKeyBytes),P=`0x${be(w)}`;return{message:n,signature:P}}async function lr(e,t){let r=t.timestamp??Date.now(),n={brokerId:t.brokerId,chainId:t.chainId,settleNonce:t.settleNonce,timestamp:r,chainType:"SOL"},o=G(["string"],[n.brokerId]),s=ye.defaultAbiCoder().encode(["bytes32","uint256","uint64","uint64"],[o,n.chainId,n.settleNonce,n.timestamp]),l=ne(fe(s)).slice(2),d=new TextEncoder().encode(l),u=X.sign(d,e.privateKeyBytes),m=`0x${be(u)}`;return{message:n,signature:m}}$();var ke=["EVM","SOL"];async function dr(e,t){let r=!!e;r||console.log(O.cyan(`
16
+ \u{1F510} Create New Wallet (${t})
17
+ `));let n=e?.toUpperCase();if(e&&!ke.includes(n)&&c(`Invalid wallet type: "${e}". Valid types: ${ke.join(", ")}`),!n){(!process.stdin.isTTY||!process.stdout.isTTY)&&c("--type is required in non-interactive mode.",["Example: orderly wallet-create --type EVM","Valid types: EVM, SOL"]);let a=await q({type:"select",name:"type",message:"Select wallet type",choices:[{title:"EVM (Ethereum, Arbitrum, etc.)",value:"EVM"},{title:"SOL",value:"SOL"}]});a.type||c("Cancelled."),n=a.type}let o,i;try{if(n==="EVM"){let a=er();o=a.address,i=a.privateKey}else{let a=ar();o=a.address,i=a.privateKey}}catch{c("Failed to generate wallet")}let s={address:o,privateKey:i,walletType:n,network:t};try{await Se(o,t,s)}catch{c("Failed to store wallet")}r?p({address:o,type:n,network:t}):(console.log(),console.log(O.green("\u2705 Wallet created successfully!")),console.log(O.dim(`Address: ${o}`)),console.log(O.dim(`Type: ${n}`)),console.log(O.dim(`Network: ${t}`)),console.log(),console.log(O.yellow("\u26A0\uFE0F Private key is stored in OS keychain and will never be shown again.")),console.log(O.dim("Make sure to back up your wallet if needed for external use.")))}async function ur(e,t,r,n){console.log(O.cyan(`
18
+ \u{1F511} Import Wallet (${n})
19
+ `));let o=e?.toUpperCase();if(e&&!ke.includes(o)&&c(`Invalid wallet type: "${e}". Valid types: ${ke.join(", ")}`),!o){(!process.stdin.isTTY||!process.stdout.isTTY)&&c("--type is required in non-interactive mode.",["Example: orderly wallet-import --type EVM","Valid types: EVM, SOL"]);let u=await q({type:"select",name:"type",message:"Select wallet type",choices:[{title:"EVM (Ethereum, Arbitrum, etc.)",value:"EVM"},{title:"SOL",value:"SOL"}]});u.type||c("Cancelled."),o=u.type}let i=t??"",s=r??"";if(!s){(!process.stdin.isTTY||!process.stdout.isTTY)&&c("Private key is required in non-interactive mode.",["Example: orderly wallet-import <private-key> --type EVM"]);let u=await q({type:"password",name:"privateKey",message:`Enter your ${o} private key`,validate:m=>m.length===0?"Private key is required":o==="EVM"&&!Qt(m)?"Invalid EVM private key format":!0});u.privateKey||c("Cancelled."),s=u.privateKey.trim()}let a;try{o==="EVM"?a=V(ge(s)).address:a=Y(s,n).address}catch(u){c(`Invalid private key: ${u instanceof Error?u.message:"Unknown error"}`)}i&&i.toLowerCase()!==a.toLowerCase()&&c("Provided address does not match private key"),i=a,await Je(i,n)&&((!process.stdin.isTTY||!process.stdout.isTTY)&&c(`Wallet already exists for ${i} on ${n}. Use wallet-logout first to remove it.`),console.log(O.yellow(`Wallet already exists for ${i} on ${n}`)),(await q({type:"confirm",name:"value",message:"Overwrite existing wallet?",initial:!1})).value||c("Cancelled."));let d={address:i,privateKey:s,walletType:o,network:n};try{await Se(i,n,d)}catch{c("Failed to store wallet")}console.log(),console.log(O.green("\u2705 Wallet imported successfully!")),console.log(O.dim(`Address: ${i}`)),console.log(O.dim(`Type: ${o}`))}async function mr(e,t="json"){let r=await J(),n=e?r.filter(i=>i.network===e):r;if(n.length===0){if(t==="csv")return;console.log(O.yellow("No wallets stored. Run `orderly wallet-import` to get started."));return}let o=n.map(i=>({address:i.address,network:i.network,walletType:i.walletType}));p(o,t)}async function pr(e,t,r="json"){let n=e;if(!n){(!process.stdin.isTTY||!process.stdout.isTTY)&&c("Address is required in non-interactive mode.",['Example: orderly wallet-show "0x1234..."',"Run `orderly wallet-list` to see available addresses."]);let s=(await J()).filter(l=>l.network===t);s.length===0&&c(`No wallets found for ${t}.`);let a=await q({type:"select",name:"address",message:"Select wallet",choices:s.map(l=>({title:`${l.address} (${l.walletType})`,value:l.address}))});a.address||c("Cancelled."),n=a.address}n||c("No address specified.");let o=await W(n,t);o||c(`No wallet found for ${n} on ${t}`),p({address:o.address,network:o.network,walletType:o.walletType},r)}async function gr(e,t){console.log(O.cyan(`
20
+ \u{1F6AA} Wallet Logout
21
+ `));let r=e;if(!r){(!process.stdin.isTTY||!process.stdout.isTTY)&&c("Address is required in non-interactive mode.",['Example: orderly wallet-logout "0x1234..."',"Run `orderly wallet-list` to see available addresses."]);let i=(await J()).filter(a=>a.network===t);if(i.length===0){console.log(O.yellow(`No wallets stored for ${t}.`));return}let s=await q({type:"select",name:"address",message:"Select wallet to logout",choices:i.map(a=>({title:`${a.address} (${a.walletType})`,value:a.address}))});s.address||c("Cancelled."),r=s.address}if(r||c("No address selected."),!process.stdin.isTTY||!process.stdout.isTTY){try{await xe(r,t)?p({removed:!0,address:r,network:t}):c(`No wallet found for ${r} on ${t}`)}catch{c("Failed to remove wallet")}return}(await q({type:"confirm",name:"value",message:`Remove wallet ${r} on ${t}?`,initial:!1})).value||c("Cancelled.");try{let o=await xe(r,t);console.log(o?O.green(`Wallet removed for ${r} on ${t}`):O.yellow(`No wallet found for ${r} on ${t}`))}catch{c("Failed to remove wallet")}}async function yr(e,t,r){let n=!!e&&!!t;!n&&(!process.stdin.isTTY||!process.stdout.isTTY)&&c("--broker-id and --address are required in non-interactive mode.",['Example: orderly wallet-register --broker-id demo --address "0x1234..."']),n||console.log(O.cyan(`
22
+ \u{1F4DD} Register Account (${r})
23
+ `));let o=e;if(!o){let w=await q({type:"text",name:"brokerId",message:"Enter your Broker ID",validate:P=>P.length>0?!0:"Broker ID is required"});w.brokerId||c("Cancelled."),o=w.brokerId.trim()}let i=t,s=null;if(!i){let P=(await J()).filter(_=>_.network===r);P.length===0&&c(`No wallets found for ${r}. Import a wallet first.`);let S=await q({type:"select",name:"address",message:"Select wallet to register",choices:P.map(_=>({title:`${_.address} (${_.walletType})`,value:_.address}))});S.address||c("Cancelled."),i=S.address}i||c("No address selected."),s=await W(i,r),s||c(`No wallet found for ${i} on ${r}`),o||c("Broker ID is required.");let a=new R(r);try{let w=await a.getAccount(i,o,s.walletType);if(w.success&&w.data?.account_id){let P=w.data.account_id;n?p({accountId:P,address:i,network:r,alreadyExists:!0}):(console.log(O.yellow(`Account already exists: ${P}`)),console.log(O.dim("Use `orderly wallet-add-key` to add an API key to this account.")));return}}catch{}let l=await a.getRegistrationNonce();(!l.success||!l.data?.registration_nonce)&&c("Failed to get registration nonce");let d=l.data.registration_nonce,u=Date.now(),m,T;try{if(s.walletType==="EVM"){let P={brokerId:o,chainId:r==="mainnet"?42161:421614,timestamp:String(u),registrationNonce:d};m={...P};let S=V(ge(s.privateKey));T=await Zt(S,P)}else{let w=Y(s.privateKey,r),P=await ir(w,{brokerId:o,timestamp:u,registrationNonce:d,network:r});m=P.message,T=P.signature}}catch{c("Failed to sign message")}try{let w=await a.registerAccount(m,T,i,s.walletType);if(w.success&&w.data?.account_id){let P=w.data.account_id;n?p({accountId:P,address:i,network:r}):(console.log(),console.log(O.cyan("Account ID:")),console.log(O.white(P)),console.log(),console.log(O.dim("Next step: Use `orderly wallet-add-key` to add an API key for trading.")))}else c("Failed to register account")}catch(w){g(w)}}async function fr(e,t,r,n){let o=!!e;if(!o&&(!process.stdin.isTTY||!process.stdout.isTTY)){let v=['Example: orderly wallet-add-key --address "0x1234..."'];n||v.push("Add --broker-id <id> to skip broker ID lookup."),c("--address is required in non-interactive mode.",v)}o||console.log(O.cyan(`
24
+ \u{1F510} Add Orderly API Key (${r})
25
+ `));let i=e,s=null;if(!i){let k=(await J()).filter(C=>C.network===r);k.length===0&&c(`No wallets found for ${r}. Import a wallet first.`);let N=await q({type:"select",name:"address",message:"Select wallet to add key for",choices:k.map(C=>({title:`${C.address} (${C.walletType})`,value:C.address}))});N.address||c("Cancelled."),i=N.address}i||c("No address selected."),s=await W(i,r),s||c(`No wallet found for ${i} on ${r}`);let a=new R(r),l,d;if(n){let v=n.trim(),k=await a.getAccount(i,v,s.walletType);(!k.success||!k.data?.account_id)&&c("Account not found. Run `orderly wallet-register` first."),l=k.data.account_id,d=v}else{let k=(await z()).find(N=>N.address===i&&N.network===r);if(k){l=k.accountId;try{d=await a.getBrokerId(l)}catch{c("Failed to resolve broker_id for account. Register the account first.")}}else{let N;(!process.stdin.isTTY||!process.stdout.isTTY)&&c("--broker-id is required when no API key is stored for this wallet.",['Example: orderly wallet-add-key --address "0x1234..." --broker-id demo']);let C=await q({type:"text",name:"brokerId",message:"Enter your Broker ID",validate:te=>te.length>0?!0:"Broker ID is required"});C.brokerId||c("Cancelled."),N=C.brokerId.trim();let U=await a.getAccount(i,N,s.walletType);(!U.success||!U.data?.account_id)&&c("Account not found. Run `orderly wallet-register` first."),l=U.data.account_id,d=N}}let u=["read","trading","asset"],m=t;if(m){let k=m.toLowerCase().split(",").map(C=>C.trim()).filter(Boolean),N=k.filter(C=>!u.includes(C));N.length>0&&c(`Invalid scope value(s): ${N.join(", ")}`,[`Valid scopes: ${u.join(", ")}`,`Example: --scope ${u.join(",")}`]),m=k.join(",")}if(!m&&(!process.stdin.isTTY||!process.stdout.isTTY)&&(m="read,trading"),!m){let v=await q({type:"multiselect",name:"scopes",message:"Select key scopes",choices:[{title:"read",value:"read",selected:!0},{title:"trading",value:"trading",selected:!0},{title:"asset",value:"asset"}],hint:"- Space to select. Return to submit"});(!v.scopes||v.scopes.length===0)&&c("Cancelled."),m=v.scopes.join(",")}m||c("Key scope is required.");let T=ze(),w=`ed25519:${se(T.publicKey)}`,P=Date.now(),S=P+365*24*60*60*1e3,_=s.walletType==="SOL"?we(r):r==="mainnet"?42161:421614,x,F;try{if(s.walletType==="EVM"){let v={brokerId:d,chainId:_,orderlyKey:w,scope:m,timestamp:P,expiration:S};x={...v};let k=V(ge(s.privateKey));F=await Xt(k,v)}else{let v=Y(s.privateKey,r),k=await sr(v,{brokerId:d,publicKey:w,scope:m,timestamp:P,expiration:S,network:r});x=k.message,F=k.signature}}catch{c("Failed to sign message")}try{let v=await a.addOrderlyKey(x,F,i,s.walletType==="SOL"?"SOL":void 0);if(v.success&&v.data?.orderly_key){let k={accountId:l,address:i,walletType:s.walletType,publicKey:T.publicKey,privateKey:T.privateKey,network:r};await le(l,r,k),ue(r),o?p({accountId:l,address:i,orderlyKey:w,network:r}):(console.log(),console.log(O.green("\u2705 Setup complete!")),console.log(O.dim(`Account ID: ${l}`)),console.log(O.dim(`Orderly Key: ${w}`)),console.log(),console.log(O.dim("You can now use trading commands like:")),console.log(O.cyan(` orderly account-info --account ${l}`)),console.log(O.cyan(` orderly order-place PERP_ETH_USDC BUY MARKET 0.01 --account ${l}`)))}else{let k=v?.message,N=k?`API response: ${k}`:`Request succeeded but no orderly_key was returned. Scopes requested: ${m}`;c("Failed to add Orderly key",[N])}}catch(v){g(v)}}import{parseUnits as Rn}from"ethers";$();import wr from"axios";var On={mainnet:"0x6F7a338F2aA472838dEFD3283eB360d4Dff5D203",testnet:"0x1826B75e2ef249173FC735149AE4B8e9ea10abff"},Le=new Map,Ue=new Map;async function An(e){if(Le.has(e))return Le.get(e);let t=H(e),r=await wr.get(`${t}/v1/public/chain_info`),n=r.data?.data?.rows??r.data?.rows??[];return Le.set(e,n),n}async function br(e){if(Ue.has(e))return Ue.get(e);let t=H(e),r=await wr.get(`${t}/v1/public/token`),n=r.data?.data?.rows??r.data?.rows??[];return Ue.set(e,n),n}async function Fe(e,t){return(await An(t)).find(n=>Number(n.chain_id)===e)??null}async function kr(e,t,r){let o=(await br(r)).find(s=>s.token===e.toUpperCase());return o?o.chain_details.find(s=>String(s.chain_id)===String(t))?.contract_address??null:null}async function qe(e,t){return await Fe(e,t)!==null}async function hr(e,t,r){let o=(await br(r)).find(s=>s.token===e.toUpperCase());if(!o)return null;let i=o.chain_details.find(s=>String(s.chain_id)===String(t));return i?{fee:i.withdrawal_fee,crossChainFee:i.cross_chain_withdrawal_fee}:null}function vr(e){return On[e]}$();var Cn={mainnet:"0x6F7a338F2aA472838dEFD3283eB360d4Dff5D203",testnet:"0x1826B75e2ef249173FC735149AE4B8e9ea10abff"};async function Be(e,t,r){let n=await e.getBrokerId(t.accountId),o=await e.getSettleNonce();if(!o.success||o.data?.settle_nonce===void 0)throw new Error("Failed to get settle nonce from API");let i=String(o.data.settle_nonce),s=await W(t.address,r);if(!s)throw new Error(`No wallet key found for ${t.address}`);let a=s.walletType||t.walletType||"EVM",l=a==="SOL"?we(r):r==="mainnet"?42161:421614,d,u,m=Date.now();if(a==="SOL"){let P=Y(s.privateKey,r),S=await lr(P,{brokerId:n,chainId:l,settleNonce:i,timestamp:m});d=S.signature,u=S.message}else{let P={brokerId:n,chainId:l,settleNonce:i,timestamp:m},S=V(s.privateKey);d=await nr(S,P,r),u=P}let T=await e.post("/v1/settle_pnl",{message:u,signature:d,userAddress:t.address,verifyingContract:Cn[r]});if(T.success&&T.data?.settle_pnl_id)return T.data;let w=T.message||T.code?.toString()||"Unknown error";throw new Error(`Settle PnL failed: ${w}`)}async function Pr(e){try{let r=(await e.get("/v1/positions"))?.data?.rows;return!r||r.length===0?!1:r.some(n=>n.unsettled_pnl!==void 0&&n.unsettled_pnl<0)}catch{return!1}}async function _r(e,t,r="json"){let{keyPair:n,client:o}=await h(e,t);try{let i=await Be(o,n,t);i?p(i,r):c("Failed to settle PnL")}catch(i){g(i)}}async function Sr(e,t,r,n,o="json"){let{client:i}=await h(r,n);try{let s=await i.getPnlSettlementHistory(e,t);p(s,o)}catch(s){g(s)}}async function xr(e,t="json",r,n=!1){let o=new R(e);try{let i=await o.get("/v1/public/chain_info",!1);i?.data?.rows&&(r&&(i.data.rows=i.data.rows.filter(s=>s.broker_ids&&s.broker_ids.includes(r))),n||(i.data.rows=i.data.rows.map(({broker_ids:s,...a})=>a))),p(i,t)}catch(i){g(i)}}async function Ir(e,t="json",r=!1){let n=new R(e);try{let o=await n.get("/v1/public/token",!1);!r&&o?.data?.rows&&(o.data.rows=o.data.rows.map(({chain_details:i,...s})=>s)),p(o,t)}catch(o){g(o)}}async function Tr(e,t,r,n="json"){await qe(t,r)||c(`Chain ID ${t} is not supported on ${r}. Use 'orderly chains' to see supported chains.`);let i=await Fe(t,r);i||c(`Chain ID ${t} not found in chain info.`);let s=await kr(e,t,r);s||c(`Token ${e.toUpperCase()} is not available on chain ${t}.`,["Use 'orderly tokens' to see supported tokens and 'orderly chains' to see supported chains."]);let{vault_address:a,...l}=i,d={...l,chainId:t,token:e.toUpperCase(),tokenAddress:s,vaultAddress:a??null};p(d,n)}async function Er(e,t,r,n,o,i,s=!1,a=!1,l="json"){let{keyPair:d,client:u}=await h(o,i),m=await u.getBrokerId(d.accountId);await qe(n,i)||c(`Chain ID ${n} is not supported on ${i}. Use 'orderly chains' to see supported chains.`);let w;if(s)(!t||isNaN(Number(t)))&&c(`Invalid amount: ${t}`,["Amount must be a valid positive number."]),w=t;else{(!t||isNaN(Number(t))||Number(t)<=0)&&c(`Invalid amount: ${t}`,["Amount must be a valid positive number (e.g., 10.5)"]);try{let S=await u.get("/v1/public/token");(!S.success||!S.data?.rows)&&c("Failed to fetch token info");let _=S.data.rows.find(v=>v.token===e.toUpperCase());_||c(`Token ${e.toUpperCase()} not found`);let F=_.chain_details.find(v=>String(v.chain_id)===String(n))?.decimals??_.decimals;w=Rn(t,F).toString()}catch{c(`Invalid amount: ${t}`,["Amount must be a valid number (e.g., 10.5)"])}}let P=await hr(e,n,i);if(P){let S=a?P.crossChainFee:P.fee;S>0&&Number(t)<=S&&c(`Withdrawal amount (${t} ${e.toUpperCase()}) must be greater than the withdrawal fee (${S} ${e.toUpperCase()}).`,[`Minimum withdrawal: slightly above ${S} ${e.toUpperCase()} (amount must exceed the fee).`])}try{let S=null;try{if(await Pr(u)){let D=await Be(u,d,i);D&&(S=D.settle_pnl_id)}}catch{}let _=await u.get("/v1/withdraw_nonce");(!_.success||!_.data?.withdraw_nonce)&&c("Failed to get withdrawal nonce");let x=String(_.data.withdraw_nonce),F=Date.now(),v=F.toString(),k=await W(d.address,i);k||c(`No wallet key found for address ${d.address}. Wallet keys are required for withdrawal signing. Use orderly wallet-import to import your wallet key.`);let N=r||k.address,C=k.walletType||d.walletType||"EVM";C==="SOL"&&Ke(N)&&c(`Cannot withdraw to an EVM address (${N}) using a SOL wallet.`,["SOL wallets can only withdraw to SOL (base58) addresses.","To withdraw to an EVM chain, use an EVM wallet account instead."]),C==="EVM"&&!Ke(N)&&or(N)&&c(`Cannot withdraw to a SOL address (${N}) using an EVM wallet.`,["EVM wallets can only withdraw to EVM (0x...) addresses.","To withdraw to a SOL chain, use a SOL wallet account instead."]);let U,te;if(C==="SOL"){let D=Y(k.privateKey,i),M=await cr(D,{brokerId:m,chainId:n,receiver:N,token:e.toUpperCase(),amount:w,withdrawNonce:x,timestamp:F});U=M.signature,te=M.message}else{let D=V(k.privateKey),M={brokerId:m,chainId:n,receiver:N,token:e.toUpperCase(),amount:w,withdrawNonce:x,timestamp:v};U=await rr(D,M,i),te=M}let We={message:te,signature:U,userAddress:d.address,verifyingContract:vr(i)};a&&(We.allow_cross_chain_withdrawal=!0);let oe=await u.post("/v1/withdraw_request",We);if(oe.success&&oe.data?.withdraw_id){let D={...oe.data};S!==null&&(D.auto_settled=!0,D.settle_pnl_id=S),p(D,l)}else{let D=oe.message,M=[];a?M.push("Check that the token and chain combination is valid."):M.push("If the error mentions cross-chain, use --allow-cross-chain flag."),D&&/amount/i.test(D)&&M.push("The amount may be below the minimum withdrawal or exceed your available balance."),c(`Failed to initiate withdrawal${D?`: ${D}`:""}`,M)}}catch(S){g(S)}}async function Nr(e,t,r,n,o,i,s,a="json"){let{client:l}=await h(i,s);try{let d=new URLSearchParams;e&&d.append("token",e.toUpperCase()),t&&d.append("side",t.toUpperCase()),r&&d.append("status",r.toUpperCase()),d.append("page",(n??1).toString()),d.append("size",(o??25).toString());let u=await l.get(`/v1/asset/history?${d.toString()}`);p(u,a)}catch(d){g(d)}}$();async function Or(e,t,r,n,o="json"){let{client:i}=await h(r,n);try{let s;t!==void 0?s=await i.setLeverage(e.toUpperCase(),t):s=await i.getLeverage(e.toUpperCase()),p(s,o)}catch(s){g(s)}}$();async function Ar(e,t,r,n,o,i,s,a="json"){let{client:l}=await h(i,s);try{let d=await l.getTrades(e?.toUpperCase(),t,r,n,o);p(d,a)}catch(d){g(d)}}import $n from"axios";$();var Cr=["STOP","TP_SL","POSITIONAL_TP_SL","TRAILING_STOP","BRACKET"],Rr=["BUY","SELL"];async function $r(e,t,r,n,o,i,s,a,l,d,u,m,T,w,P,S="json"){let _=t.toUpperCase();Rr.includes(_)||c(`Invalid side. Use ${Rr.join(" or ")}.`);let x=r.toUpperCase();if(Cr.includes(x)||c(`Invalid algo type. Use one of: ${Cr.join(", ")}`),x==="TRAILING_STOP"){i||c("--callback-rate is required for TRAILING_STOP orders.");let v=Number(i);v>=1&&(i=String(v/100));let k=Number(i);(k<.01||k>.15)&&c(`Callback rate must be between 1% and 15%. Got ${v}${v>=1?"%":` (${(k*100).toFixed(2)}%)`}.`,["Use percentage format: --callback-rate 5 (for 5%)","Or decimal format: --callback-rate 0.05 (for 5%)"])}else x==="TP_SL"||x==="POSITIONAL_TP_SL"?!a&&!d&&c("At least one of --tp-trigger-price or --sl-trigger-price is required for TP_SL/POSITIONAL_TP_SL orders."):x==="STOP"?o||c("--trigger-price is required for STOP orders."):x==="BRACKET"&&(o||c("--trigger-price is required for BRACKET orders."),!a&&!d&&c("At least one of --tp-trigger-price or --sl-trigger-price is required for BRACKET orders."));let{client:F}=await h(w,P);if((x==="TP_SL"||x==="POSITIONAL_TP_SL"||x==="BRACKET")&&(a||d)){let v;try{let k=await F.getMarketPrice(e.toUpperCase());v=(k?.data||k)?.mark_price}catch{}if(v!==void 0){let k=a?Number(a):void 0,N=d?Number(d):void 0;(x==="TP_SL"||x==="POSITIONAL_TP_SL"?_==="SELL":_==="BUY")?(k!==void 0&&k<=v&&c(`Take-profit trigger price (${k}) must be above current mark price (${v}) for a long position.`),N!==void 0&&N>=v&&c(`Stop-loss trigger price (${N}) must be below current mark price (${v}) for a long position.`)):(k!==void 0&&k>=v&&c(`Take-profit trigger price (${k}) must be below current mark price (${v}) for a short position.`),N!==void 0&&N<=v&&c(`Stop-loss trigger price (${N}) must be above current mark price (${v}) for a short position.`))}}try{let v;if(x==="TP_SL"||x==="POSITIONAL_TP_SL"){let k=[],N=_;if(a){let C={symbol:e.toUpperCase(),algo_type:"TAKE_PROFIT",side:N,type:x==="POSITIONAL_TP_SL"?"CLOSE_POSITION":l?"LIMIT":"MARKET",trigger_price:a,reduce_only:!0};l&&(C.price=l),k.push(C)}if(d){let C={symbol:e.toUpperCase(),algo_type:"STOP_LOSS",side:N,type:x==="POSITIONAL_TP_SL"?"CLOSE_POSITION":u?"LIMIT":"MARKET",trigger_price:d,reduce_only:!0};u&&(C.price=u),k.push(C)}v=await F.placeAlgoOrder({symbol:e.toUpperCase(),algoType:x,quantity:x==="POSITIONAL_TP_SL"?void 0:n,clientOrderId:T,childOrders:k})}else if(x==="BRACKET"){let k=_==="BUY"?"SELL":"BUY",N=[];if(a){let U={symbol:e.toUpperCase(),algo_type:"TAKE_PROFIT",side:k,type:l?"LIMIT":"MARKET",trigger_price:a,reduce_only:!0};l&&(U.price=l),N.push(U)}if(d){let U={symbol:e.toUpperCase(),algo_type:"STOP_LOSS",side:k,type:u?"LIMIT":"MARKET",trigger_price:d,reduce_only:!0};u&&(U.price=u),N.push(U)}let C={symbol:e.toUpperCase(),type:s?"LIMIT":"MARKET",algoType:x,side:_,quantity:n,triggerPrice:o,childOrders:[{symbol:e.toUpperCase(),algo_type:"TP_SL",quantity:n,child_orders:N}]};s&&(C.price=s),T&&(C.clientOrderId=T),v=await F.placeAlgoOrder(C)}else{let k={symbol:e.toUpperCase(),type:s?"LIMIT":"MARKET",algoType:x,side:_,quantity:n};o&&(k.triggerPrice=o),s&&(k.price=s),i&&(k.callbackRate=i),m&&(k.reduceOnly=!0),T&&(k.clientOrderId=T),v=await F.placeAlgoOrder(k)}p(v,S)}catch(v){g(v)}}function Kr(e){if(!$n.isAxiosError(e))return!1;let t=e.response?.data;return String(t?.message||"").toLowerCase().includes("already complete")}async function Dr(e,t){try{let r=await e.findAlgoOrderById(t);return r.success&&r.data?.algo_type==="BRACKET"}catch{return!1}}async function Lr(e,t,r,n,o="json"){let{client:i}=await h(r,n),s=t;if(!s)try{let a=await i.findAlgoOrderById(e);(!a.success||!a.data)&&c(`Algo order ${e} not found.`),s=a.data.symbol}catch(a){g(a)}try{let a=await i.cancelAlgoOrder(e,s);p(a,o)}catch(a){Kr(a)&&await Dr(i,e)&&c(`BRACKET root order ${e} has already triggered and cannot be cancelled.`,["BRACKET orders spawn TP/SL child orders once triggered.","Use `orderly algo-order-list` to find and cancel active child orders.","Or use `orderly algo-order-cancel-all` to cancel all open algo orders."]),g(a)}}async function Ur(e,t,r,n,o="json"){let{client:i}=await h(r,n);try{let s=await i.cancelAllAlgoOrders(e,t);p(s,o)}catch(s){g(s)}}async function Fr(e,t,r,n,o,i,s,a,l="json"){!r&&!n&&!o&&!i&&c("At least one of --price, --quantity, --trigger-price, or --callback-rate is required.",["Examples:"," orderly algo-order-edit 123456 --price 2500"," orderly algo-order-edit 123456 --quantity 0.02"," orderly algo-order-edit 123456 --trigger-price 1500"," orderly algo-order-edit 123456 --callback-rate 0.03"]);let{client:d}=await h(s,a),u=t;if(!u)try{let m=await d.findAlgoOrderById(e);(!m.success||!m.data)&&c(`Algo order ${e} not found.`),u=m.data.symbol}catch(m){g(m)}try{let m={};if(r&&(m.price=Number(r)),n&&(m.quantity=Number(n)),o&&(m.trigger_price=Number(o)),i){let w=Number(i);w>=1&&(i=String(w/100));let P=Number(i);(P<.01||P>.15)&&c(`Callback rate must be between 1% and 15%. Got ${w}${w>=1?"%":` (${(P*100).toFixed(2)}%)`}.`,["Use percentage format: --callback-rate 5 (for 5%)","Or decimal format: --callback-rate 0.05 (for 5%)"]),m.callback_rate=Number(i)}let T=await d.editAlgoOrder(e,m,u);p(T,l)}catch(m){Kr(m)&&await Dr(d,e)&&c(`BRACKET root order ${e} has already triggered and cannot be edited.`,["BRACKET orders spawn TP/SL child orders once triggered.","Use `orderly algo-order-list` to find and edit active child orders."]),g(m)}}async function qr(e,t,r,n,o,i,s,a="json"){let{client:l}=await h(i,s);try{let d=await l.getAlgoOrders(e,t,r,n,o);p(d,a)}catch(d){g(d)}}async function Br(e,t,r,n="json"){let{client:o}=await h(t,r);try{let i=await o.findAlgoOrderById(e);p(i,n)}catch(i){g(i)}}async function Mr(e,t,r,n,o="json"){let{client:i}=await h(r,n);try{let s=await i.cancelAlgoOrderByClientId(e,t);p(s,o)}catch(s){g(s)}}async function Wr(e,t,r,n="json"){let{client:o}=await h(t,r);try{let i=await o.getAlgoOrderTrades(e);p(i,n)}catch(i){g(i)}}$();async function jr(e,t,r,n,o,i,s,a="json"){let{client:l}=await h(i,s);try{let d=new URLSearchParams;e&&d.append("symbol",e.toUpperCase()),t&&d.append("start_t",t.toString()),r&&d.append("end_t",r.toString()),d.append("page",(n??1).toString()),d.append("size",(o??25).toString());let u=d.toString(),m=await l.get(`/v1/funding_fee/history?${u}`);p(m,a)}catch(d){g(d)}}$();async function zr(e,t,r="json"){let{client:n}=await h(e,t);try{let o=await n.getReferralInfo();p(o,r)}catch(o){g(o)}}$();async function Vr(e,t,r,n,o,i,s,a,l="json"){let{client:d}=await h(s,a);try{let u=await d.getDistributionHistory(e,t,r,n,o,i);p(u,l)}catch(u){g(u)}}async function Yr(e,t,r="json"){let{client:n}=await h(e,t);try{let o=await n.getVolumeStats();p(o,r)}catch(o){g(o)}}$();async function Hr(e,t,r,n,o,i="json"){let{client:s}=await h(n,o);try{let a=await s.getNotificationInbox(e,t,r);p(a,i)}catch(a){g(a)}}async function Gr(e,t,r="json"){let{client:n}=await h(e,t);try{let o=await n.getNotificationInboxUnread();p(o,r)}catch(o){g(o)}}$();var qn=Un(Ln(import.meta.url));function Bn(){try{return JSON.parse(Dn(Fn(qn,"..","package.json"),"utf8")).version||"0.0.0"}catch{return"0.0.0"}}function Me(e,t=!0){for(let r=0;r<process.argv.length-1;r++){if(process.argv[r]===`--${e}`){let i=process.argv[r+1];if(!t||i.startsWith("0x"))return i}let n=t?new RegExp(`^--${e}=(0x[a-fA-F0-9]+)$`):new RegExp(`^--${e}=(.+)$`),o=process.argv[r].match(n);if(o)return o[1]}}function Jr(e,t,r,n){if(e==null)return Me(t);let o=String(e);if(typeof e=="number"||o.includes("e+")||o.includes("e-")){let i=Me(t);if(i)return i;c(`Hex ${r} must be quoted to prevent parsing as numbers.`,[`Example: ${n}`])}return o}function ee(e){return Jr(e,"address","addresses",'--address "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"')}function Mn(e){let t=ee(e);return t||c("Address is required."),t}function I(e){return Jr(e,"account","account IDs",'--account "0x1e6b18f967e262ea4ee8a1efab67c578bcc45cdcfd435c15b6913dcf14d0217e"')}function Wn(e){return e==null?Me("scope",!1):String(e)}var jn=`
26
+ ${E.cyan().bold("QUICK START (Testnet)")}
27
+ ${E.dim("\u2500".repeat(50))}
28
+
29
+ 1. Create a new wallet:
30
+ ${E.green("orderly wallet-create --type EVM")}
31
+
32
+ 2. Register an Orderly account:
33
+ ${E.green("orderly wallet-register --broker-id demo")}
34
+
35
+ 3. Get test USDC (wait a few minutes for delivery):
36
+ ${E.green("orderly faucet-usdc <address> --chain-id 421614")}
37
+
38
+ 4. Add API key for trading:
39
+ ${E.green("orderly wallet-add-key")}
40
+
41
+ 5. Check balance:
42
+ ${E.green("orderly account-balance")}
43
+
44
+ 6. Place an order:
45
+ ${E.green("orderly order-place PERP_ETH_USDC BUY MARKET 0.01")}
46
+ `,zn=`
47
+ ${E.bold("Orderly Network CLI")}
48
+ ${E.dim("Secure keychain-based trading CLI for Orderly Network")}
49
+
50
+ This CLI uses your OS keychain (Keychain/Credential Manager/libsecret) to store
51
+ private keys securely. Keys are NEVER exposed to AI context or logged.
52
+
53
+ ${E.cyan().bold("SETUP FLOW")}
54
+ ${E.dim("\u2500".repeat(50))}
55
+
56
+ ${E.yellow("For new users:")}
57
+ wallet-create \u2192 Generate a new wallet (EVM or SOL)
58
+ wallet-register \u2192 Register wallet with Orderly (get account ID)
59
+ wallet-add-key \u2192 Generate & register Ed25519 API key for trading
60
+
61
+ ${E.yellow("For existing Orderly users with API keys:")}
62
+ auth-import \u2192 Import existing Ed25519 API key directly
63
+
64
+ ${E.cyan().bold("COMMANDS BY CATEGORY")}
65
+ ${E.dim("\u2500".repeat(50))}
66
+
67
+ ${E.yellow("Setup & Auth:")}
68
+ wallet-create, wallet-import, wallet-list, wallet-show, wallet-logout
69
+ wallet-register, wallet-add-key
70
+ auth-import, auth-list, auth-show, auth-logout, auth-cleanup, auth-export-key
71
+
72
+ ${E.yellow("Trading:")}
73
+ order-place, order-cancel, order-edit, order-cancel-all, order-list
74
+ order-get, order-cancel-by-client-id, order-trades
75
+ batch-order-place, batch-order-cancel, batch-order-cancel-by-client-id
76
+ algo-order-place, algo-order-cancel, algo-order-cancel-all, algo-order-edit, algo-order-list, algo-order-trades, algo-order-get, algo-order-cancel-by-client-id
77
+ positions-list, positions-close, positions-history
78
+ leverage, trades, funding-history
79
+
80
+ ${E.yellow("Account:")}
81
+ account-info, account-balance, account-statistics, account-limits
82
+ key-info, fee-tier, account-liquidations
83
+
84
+ ${E.yellow("Market Data:")}
85
+ market-price, market-orderbook, market-trades, funding-rates, kline, symbols
86
+ price-changes, open-interest, liquidated-positions, system-status
87
+
88
+ ${E.yellow("Assets:")}
89
+ chains, tokens, deposit-info, withdraw, asset-history
90
+
91
+ ${E.yellow("PnL:")}
92
+ settle-pnl, settle-pnl-history
93
+
94
+ ${E.yellow("Referral:")}
95
+ referral-info
96
+
97
+ ${E.yellow("Stats & Notifications:")}
98
+ distribution-history, volume-stats, notification-inbox, notification-unread
99
+
100
+ ${E.yellow("Testnet Only:")}
101
+ faucet-usdc
102
+ `,y=Kn("orderly");y.version(Bn()).help(()=>{let e=process.argv[2],t=e&&!e.startsWith("-")&&e!=="help";t||(console.log(zn),console.log(jn)),console.log(E.bold("Global Options:")),console.log(E.dim(" --network <network> Network: mainnet or testnet (default: testnet)")),console.log(E.dim(" --pretty Pretty-print JSON output (2-space indent)")),console.log(E.dim(" --csv Output as CSV instead of JSON (for list data)")),t||(console.log(""),console.log(E.dim("Run any command with --help for more details")),console.log(E.cyan(" orderly wallet-create --help")),console.log(E.cyan(" orderly order-place --help")))}).option("--network <network>","Network: mainnet or testnet",{default:f()}).option("--csv","Output as CSV instead of JSON (for list data)").option("--pretty","Pretty-print JSON output (2-space indent)");function b(e){return e.csv?"csv":"json"}y.command("wallet-create","Create a new EVM or SOL wallet").option("--type <type>","Wallet type: EVM or SOL (required in non-interactive mode)").example("orderly wallet-create --type EVM").example("orderly wallet-create --type SOL").action(e=>{let t=e.network||f();dr(e.type,t)});y.command("wallet-import [private-key]","Import an existing wallet private key").option("--type <type>","Wallet type: EVM or SOL (required in non-interactive mode)").option("--address <address>","Wallet address (optional, derived from key)").option("--private-key <key>","Private key (alternative to positional arg, for non-interactive use)").example("orderly wallet-import <private-key> --type EVM").example("orderly wallet-import --private-key <key> --type SOL").example("orderly wallet-import --type EVM").action((e,t)=>{let r=t.network||f();ur(t.type,ee(t.address),e??t.privateKey,r)});y.command("wallet-list","List all stored wallets").example("orderly wallet-list").example("orderly wallet-list --network testnet").action(e=>{let t=e.network;mr(t,b(e))});y.command("wallet-show [address]","Show wallet info (address required for AI/scripts, prompts if omitted)").example("orderly wallet-show").example("orderly wallet-show 0x1234...").action((e,t)=>{let r=t.network||f();pr(ee(e),r,b(t))});y.command("wallet-logout [address]","Remove wallet from keychain (address required for AI/scripts, prompts if omitted)").example("orderly wallet-logout").example("orderly wallet-logout 0x1234...").action((e,t)=>{let r=t.network||f();gr(ee(e),r)});y.command("wallet-register","Register an Orderly account with your wallet (Step 2 of setup)").option("--broker-id <id>",'Broker ID, e.g., "demo" (required for AI/scripts, prompts if omitted)').option("--address <address>","Wallet address (required for AI/scripts, prompts if omitted)").example("orderly wallet-register --broker-id demo").example("orderly wallet-register --broker-id demo --address 0x1234...").action(e=>{let t=e.network||f();yr(e.brokerId,ee(e.address),t)});y.command("wallet-add-key","Add Orderly API key for trading (Step 3 of setup)").option("--address <address>","Wallet address (required for AI/scripts, prompts if omitted)").option("--scope <scope>","Key scopes: read,trading,asset (default: read,trading)").option("--broker-id <id>","Broker ID (required when no API key stored for wallet)").example("orderly wallet-add-key").example("orderly wallet-add-key --scope read,trading").example('orderly wallet-add-key --address "0x1234..." --broker-id demo --scope read,trading').action(e=>{let t=e.network||f();fr(ee(e.address),Wn(e.scope),t,e.brokerId)});y.command("auth-import [private-key]","Import existing Ed25519 API key (for users who already have one)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly auth-import <base64-key> --account 12345").action((e,t)=>{let r=t.network||f();ct(e,I(t.account),r)});y.command("auth-list","List all stored API keys (public keys only)").option("--ids","Output only account IDs, one per line (for scripting/piping)").example("orderly auth-list").example("orderly auth-list --ids").example("orderly auth-list --network testnet --ids").action(e=>{let t=e.network;dt(t,b(e),e.ids||!1)});y.command("auth-show","Show public key for an account").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly auth-show").example("orderly auth-show --account 0x1e6b...").action(e=>{let t=e.network||f();mt(e.account?I(e.account):void 0,t,b(e))});y.command("auth-logout [account-id]","Remove API key from keychain").example("orderly auth-logout").example("orderly auth-logout 12345").action((e,t)=>{let r=t.network||f();ut(e,r)});y.command("auth-cleanup","Remove all stored API keys for a network").example("orderly auth-cleanup").example("orderly auth-cleanup --network testnet").action(e=>{let t=e.network||f();pt(t)});y.command("auth-export-key [account-id]","Export Ed25519 private key (requires interactive TTY)").example("orderly auth-export-key").action((e,t)=>{let r=t.network||f();gt(e,r)});y.command("account-info","Get account information").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly account-info").example("orderly account-info --account 0x1e6b...").action(e=>{let t=e.network||f();yt(I(e.account),t,b(e))});y.command("account-balance","Get account balances").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly account-balance").example("orderly account-balance --account 0x1e6b...").action(e=>{let t=e.network||f();wt(I(e.account),t,b(e))});y.command("account-statistics","Get account trading statistics (volume, fees, days since registration)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly account-statistics").example("orderly account-statistics --account 0x1e6b...").action(e=>{let t=e.network||f();bt(I(e.account),t,b(e))});y.command("account-limits",`Get margin requirements and position limits.
103
+ imr_factor: per-symbol factor used in initial margin calculation \u2014 IMR_i = max(1/max_leverage, base_imr, imr_factor * |notional|^0.8)
104
+ max_notional: max position size in USD per symbol
105
+ base_imr / base_mmr: minimum initial/maintenance margin ratios (shown with --symbol)
106
+ base_mmr: threshold for liquidation \u2014 MMR_i = max(base_mmr, (base_mmr/base_imr) * imr_factor * |notional|^0.8)`).option("--symbol <symbol>","Show limits for one symbol (includes base_imr, base_mmr, order rules)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly account-limits").example("orderly account-limits --symbol PERP_ETH_USDC").example("orderly account-limits --account 0x1e6b...").action(e=>{let t=e.network||f(),r=e.symbol?K(e.symbol):void 0;ft(I(e.account),r,t,b(e))});y.command("key-info","Get registered API key info and scopes").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly key-info").example("orderly key-info --account 0x1e6b...").action(e=>{let t=e.network||f();kt(I(e.account),t,b(e))});y.command("fee-tier","Get current fee rates (futures, RWA, default)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly fee-tier").example("orderly fee-tier --account 0x1e6b...").action(e=>{let t=e.network||f();ht(I(e.account),t,b(e))});y.command("account-liquidations","Get account liquidation history").option("--symbol <symbol>","Filter by symbol").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly account-liquidations").example("orderly account-liquidations --symbol PERP_ETH_USDC").example("orderly account-liquidations --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.page?parseInt(e.page,10):void 0,n=e.size?parseInt(e.size,10):void 0;vt(K(e.symbol),r,n,I(e.account),t,b(e))});y.command("order-place <symbol> <side> [type] <quantity>","Place a new order").usage(`order-place <symbol> <side> [type] <quantity>
107
+
108
+ Order types: MARKET, LIMIT, IOC, FOK, POST_ONLY, ASK, BID
109
+
110
+ If [type] is omitted, the short form is used \u2014 provide BID or ASK as <side>:
111
+ BID \u2192 market buy (equivalent to BUY MARKET)
112
+ ASK \u2192 market sell (equivalent to SELL MARKET)
113
+
114
+ orderly order-place PERP_ETH_USDC BID 0.01
115
+ orderly order-place PERP_ETH_USDC ASK 0.01
116
+
117
+ Side: BUY, SELL`).option("--price <price>","Order price (required for LIMIT, IOC, FOK, POST_ONLY)").option("--client-order-id <id>","Custom client order ID (optional)").option("--reduce-only","Reduce-only order (can only reduce existing position, not open new)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly order-place PERP_ETH_USDC BUY MARKET 0.01").example("orderly order-place PERP_ETH_USDC SELL LIMIT 0.01 --price 3500").example("orderly order-place PERP_ETH_USDC BUY IOC 0.01 --price 2100").example("orderly order-place PERP_ETH_USDC SELL FOK 0.01 --price 2100").example("orderly order-place PERP_ETH_USDC BUY POST_ONLY 0.01 --price 2000").example("# Short form (type omitted):").example("orderly order-place PERP_ETH_USDC ASK 0.01").example("orderly order-place PERP_ETH_USDC BID 0.01").example("orderly order-place PERP_ETH_USDC BUY MARKET 0.01 --client-order-id my-order-123").example("orderly order-place PERP_ETH_USDC SELL LIMIT 0.01 --price 3500 --reduce-only").action((e,t,r,n,o)=>{let i=o.network||f(),s=t,a=r,l;if(n===void 0)if(l=r,a=t.toUpperCase(),a==="BID")s="BUY";else if(a==="ASK")s="SELL";else{c("Invalid short form. Use BID (market buy) or ASK (market sell), or provide all 4 args: <symbol> <side> <type> <quantity>",["Examples:"," orderly order-place PERP_ETH_USDC BID 0.01"," orderly order-place PERP_ETH_USDC BUY MARKET 0.01"]);return}else l=n;_t(L(e),s,a,l,o.price,o.clientOrderId,o.reduceOnly===!0,I(o.account),i,b(o))});y.command("order-cancel <order-id>","Cancel an order").option("--symbol <symbol>","Symbol of the order (auto-fetched if not provided)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly order-cancel 123456").example("orderly order-cancel 123456 --symbol PERP_ETH_USDC").action((e,t)=>{let r=t.network||f();St(e,K(t.symbol),I(t.account),r,b(t))});y.command("order-edit <order-id>","Edit a pending order (only specify what to change)").option("--symbol <symbol>","Symbol of the order (auto-fetched if not provided)").option("--price <price>","New order price").option("--quantity <quantity>","New order quantity").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly order-edit 123456 --price 3500").example("orderly order-edit 123456 --quantity 0.02").example("orderly order-edit 123456 --price 3500 --quantity 0.01").action((e,t)=>{let r=t.network||f();xt(e,K(t.symbol),t.price,t.quantity,I(t.account),r,b(t))});y.command("order-cancel-all","Cancel all orders").option("--symbol <symbol>","Filter by symbol (optional)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly order-cancel-all").example("orderly order-cancel-all --symbol PERP_ETH_USDC").action(e=>{let t=e.network||f();It(K(e.symbol),I(e.account),t,b(e))});y.command("order-list","List orders (defaults to open/active orders)").option("--symbol <symbol>","Filter by symbol").option("--status <status>","Filter by status: NEW, FILLED, CANCELLED, PARTIAL_FILLED, REJECTED, INCOMPLETE, COMPLETED").option("--side <side>","Filter by side: BUY, SELL").option("--order-type <type>","Filter by type: LIMIT, MARKET").option("--sort-by <sort>","Sort: CREATED_TIME_ASC, CREATED_TIME_DESC, UPDATED_TIME_ASC, UPDATED_TIME_DESC").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25, max: 500)").option("--all","Show all orders (overrides default INCOMPLETE filter)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly order-list").example("orderly order-list --all").example("orderly order-list --symbol PERP_ETH_USDC").example("orderly order-list --status FILLED --symbol PERP_ETH_USDC").example("orderly order-list --side BUY --order-type LIMIT").example("orderly order-list --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.page?parseInt(e.page,10):void 0,n=e.size?parseInt(e.size,10):void 0,o=e.status??(e.all?void 0:"INCOMPLETE");Tt(K(e.symbol),o,e.side,e.orderType,e.sortBy,r,n,I(e.account),t,b(e))});y.command("batch-order-place <orders>","Place multiple orders (max 10)").option("--account <id>","Account ID (auto-resolves if single account)").usage(`batch-order-place <orders>
118
+
119
+ Each order object accepts these fields:
120
+
121
+ CLI name API name Required Description
122
+ symbol symbol Yes Trading pair (e.g. PERP_ETH_USDC)
123
+ type order_type Yes LIMIT, MARKET, IOC, FOK, POST_ONLY, ASK, BID
124
+ side side Yes BUY or SELL
125
+ quantity order_quantity Yes Order quantity (positive number)
126
+ price order_price Cond.* Order price (required for LIMIT, IOC, FOK, POST_ONLY)
127
+ client_order_id client_order_id No Custom ID, unique among open orders`).example("# Using CLI-style field names (recommended):").example(`orderly batch-order-place '[{"symbol":"PERP_ETH_USDC","type":"LIMIT","side":"BUY","quantity":"0.01","price":"2000"}]'`).example("# Using API field names (also accepted):").example(`orderly batch-order-place '[{"symbol":"PERP_ETH_USDC","order_type":"LIMIT","side":"BUY","order_quantity":"0.01","order_price":"2000"}]'`).example("# From file:").example("orderly batch-order-place orders.json").action((e,t)=>{let r=t.network||f();Et(e,I(t.account),r,b(t))});y.command("batch-order-cancel <order-ids...>","Cancel multiple orders by IDs").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly batch-order-cancel 123 456 789").action((e,t)=>{let r=t.network||f(),n=Array.isArray(e)?e:[e];Nt(n,I(t.account),r,b(t))});y.command("batch-order-cancel-by-client-id <client-order-ids...>","Cancel multiple orders by client order IDs (max 10)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly batch-order-cancel-by-client-id my-order-1 my-order-2 my-order-3").action((e,t)=>{let r=t.network||f(),n=Array.isArray(e)?e:[e];Ot(n,I(t.account),r,b(t))});y.command("order-get [order-id]","Get order details. Auto-detects numeric order ID vs client order ID").option("--client-order-id <id>","Explicitly look up by client order ID").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly order-get 123456").example("orderly order-get my-order-123").example("orderly order-get --client-order-id my-order-123").action((e,t)=>{let r=t.network||f();Ct(e,t.clientOrderId,I(t.account),r,b(t))});y.command("order-cancel-by-client-id <client-order-id> <symbol>","Cancel an order by client order ID").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly order-cancel-by-client-id my-order-123 PERP_ETH_USDC").action((e,t,r)=>{let n=r.network||f();At(e,L(t),I(r.account),n,b(r))});y.command("order-trades <order-id>","Get trades for a specific order").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly order-trades 123456").action((e,t)=>{let r=t.network||f();Rt(e,I(t.account),r,b(t))});y.command("positions-list","List open positions").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly positions-list").action(e=>{let t=e.network||f();$t(I(e.account),t,b(e))});y.command("positions-close <symbol>","Close a position").option("--account <id>","Account ID (auto-resolves if single account)").option("--quantity <n>","Partial close quantity (default: full position)").example("orderly positions-close PERP_ETH_USDC").example("orderly positions-close PERP_ETH_USDC --quantity 0.005").action((e,t)=>{let r=t.network||f(),n=t.quantity!==void 0?parseFloat(t.quantity):void 0;Kt(L(e),I(t.account),r,b(t),n)});y.command("market-orderbook <symbol>","Get orderbook snapshot").option("--depth <n>","Number of price levels per side (default: all)").example("orderly market-orderbook PERP_ETH_USDC").example("orderly market-orderbook PERP_ETH_USDC --depth 10").action((e,t)=>{let r=t.network||f(),n=t.depth!=null?parseInt(t.depth,10):void 0;Bt(L(e),r,b(t),n)});y.command("positions-history","Get position history").option("--symbol <symbol>","Filter by symbol").option("--start-time <timestamp>","Start timestamp (Unix ms)").option("--end-time <timestamp>","End timestamp (Unix ms)").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly positions-history").example("orderly positions-history --symbol PERP_ETH_USDC").example("orderly positions-history --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.startTime?parseInt(e.startTime,10):void 0,n=e.endTime?parseInt(e.endTime,10):void 0,o=e.page?parseInt(e.page,10):void 0,i=e.size?parseInt(e.size,10):void 0;Dt(K(e.symbol),r,n,o,i,I(e.account),t,b(e))});y.command("leverage <symbol> [value]","Get or set leverage for a symbol").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly leverage PERP_ETH_USDC").example("orderly leverage PERP_ETH_USDC 10").action((e,t,r)=>{let n=r.network||f(),o=t!==void 0?parseFloat(t):void 0;Or(L(e),o,I(r.account),n,b(r))});y.command("trades","Get trade history").option("--symbol <symbol>","Filter by symbol").option("--start-time <timestamp>","Start timestamp (Unix ms)").option("--end-time <timestamp>","End timestamp (Unix ms)").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25, max: 500)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly trades").example("orderly trades --symbol PERP_ETH_USDC").example("orderly trades --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.startTime?parseInt(e.startTime,10):void 0,n=e.endTime?parseInt(e.endTime,10):void 0,o=e.page?parseInt(e.page,10):void 0,i=e.size?parseInt(e.size,10):void 0;Ar(K(e.symbol),r,n,o,i,I(e.account),t,b(e))});y.command("algo-order-place <symbol> <side> <algoType> <quantity>",["Place an algo order.","","Valid algoTypes and their required flags:"," STOP --trigger-price"," TP_SL --tp-trigger-price and/or --sl-trigger-price"," POSITIONAL_TP_SL --tp-trigger-price and/or --sl-trigger-price (quantity must be 0)"," TRAILING_STOP --callback-rate (1-15%)"," BRACKET --trigger-price + --tp-trigger-price and/or --sl-trigger-price","","Valid sides: BUY, SELL"].join(`
128
+ `)).option("--trigger-price <price>","Trigger price (required for STOP and BRACKET)").option("--callback-rate <rate>","Trailing callback rate: 1-15 for percentage (e.g. 5 = 5%), or 0.01-0.15 as decimal. Required for TRAILING_STOP").option("--price <price>","Order price (for limit orders)").option("--tp-trigger-price <price>","Take-profit trigger price (for TP_SL/POSITIONAL_TP_SL/BRACKET)").option("--tp-price <price>","Take-profit order price (optional, MARKET if not set)").option("--sl-trigger-price <price>","Stop-loss trigger price (for TP_SL/POSITIONAL_TP_SL/BRACKET)").option("--sl-price <price>","Stop-loss order price (optional, MARKET if not set)").option("--reduce-only","Reduce-only order (can only reduce existing position, not open new)").option("--client-order-id <id>","Custom client order ID (optional)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly algo-order-place PERP_ETH_USDC SELL STOP 0.01 --trigger-price 2000").example("orderly algo-order-place PERP_ETH_USDC SELL TP_SL 0.01 --tp-trigger-price 2500 --sl-trigger-price 1500").example("orderly algo-order-place PERP_ETH_USDC SELL POSITIONAL_TP_SL 0 --tp-trigger-price 2500 --sl-trigger-price 1500").example("orderly algo-order-place PERP_ETH_USDC SELL TRAILING_STOP 0.01 --callback-rate 5").example("orderly algo-order-place PERP_ETH_USDC SELL BRACKET 0.01 --trigger-price 2300 --price 2300 --tp-trigger-price 2000 --sl-trigger-price 2500").action((e,t,r,n,o)=>{let i=o.network||f();$r(L(e),t,r,n,o.triggerPrice,o.callbackRate,o.price,o.tpTriggerPrice,o.tpPrice,o.slTriggerPrice,o.slPrice,o.reduceOnly,o.clientOrderId,I(o.account),i,b(o))});y.command("algo-order-cancel <order-id>","Cancel an algo order").option("--symbol <symbol>","Symbol of the order (auto-fetched if not provided)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly algo-order-cancel 123456").example("orderly algo-order-cancel 123456 --symbol PERP_ETH_USDC").action((e,t)=>{let r=t.network||f();Lr(e,K(t.symbol),I(t.account),r,b(t))});y.command("algo-order-edit <order-id>","Edit a pending algo order (only specify what to change: price, quantity, trigger-price, callback-rate)").option("--symbol <symbol>","Symbol of the order (auto-fetched if not provided)").option("--price <price>","New order price").option("--quantity <quantity>","New order quantity").option("--trigger-price <price>","New trigger price").option("--callback-rate <rate>","New callback rate: 1-15 for percentage, or 0.01-0.15 as decimal").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly algo-order-edit 123456 --price 2500").example("orderly algo-order-edit 123456 --quantity 0.02").example("orderly algo-order-edit 123456 --trigger-price 1500").example("orderly algo-order-edit 123456 --callback-rate 3").action((e,t)=>{let r=t.network||f();Fr(e,K(t.symbol),t.price,t.quantity,t.triggerPrice,t.callbackRate,I(t.account),r,b(t))});y.command("algo-order-cancel-all","Cancel all algo orders").option("--symbol <symbol>","Filter by symbol (optional)").option("--algo-type <type>","Filter by algo type: STOP, TP_SL, TRAILING_STOP, BRACKET").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly algo-order-cancel-all").example("orderly algo-order-cancel-all --symbol PERP_ETH_USDC").example("orderly algo-order-cancel-all --algo-type STOP").action(e=>{let t=e.network||f();Ur(K(e.symbol),e.algoType,I(e.account),t,b(e))});y.command("algo-order-list","List algo orders").option("--symbol <symbol>","Filter by symbol").option("--status <status>","Filter by status: NEW, CANCELLED, INCOMPLETE, COMPLETED").option("--algo-type <type>","Filter by algo type: STOP, TP_SL, POSITIONAL_TP_SL, TRAILING_STOP, BRACKET").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25, max: 500)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly algo-order-list").example("orderly algo-order-list --symbol PERP_ETH_USDC").example("orderly algo-order-list --status INCOMPLETE").example("orderly algo-order-list --algo-type STOP").example("orderly algo-order-list --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.page?parseInt(e.page,10):void 0,n=e.size?parseInt(e.size,10):void 0;qr(K(e.symbol),e.status,r,n,e.algoType,I(e.account),t,b(e))});y.command("algo-order-trades <order-id>","Get trades for a specific algo order").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly algo-order-trades 123456").action((e,t)=>{let r=t.network||f();Wr(e,I(t.account),r,b(t))});y.command("algo-order-get <order-id>","Get details for a specific algo order").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly algo-order-get 123456").action((e,t)=>{let r=t.network||f();Br(e,I(t.account),r,b(t))});y.command("algo-order-cancel-by-client-id <client-order-id> <symbol>","Cancel an algo order by client order ID").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly algo-order-cancel-by-client-id my-algo-123 PERP_ETH_USDC").action((e,t,r)=>{let n=r.network||f();Mr(e,L(t),I(r.account),n,b(r))});y.command("funding-history","Get funding fee history").option("--symbol <symbol>","Filter by symbol").option("--start-time <timestamp>","Start timestamp (Unix ms)").option("--end-time <timestamp>","End timestamp (Unix ms)").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly funding-history").example("orderly funding-history --symbol PERP_ETH_USDC").example("orderly funding-history --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.startTime?parseInt(e.startTime,10):void 0,n=e.endTime?parseInt(e.endTime,10):void 0,o=e.page?parseInt(e.page,10):void 0,i=e.size?parseInt(e.size,10):void 0;jr(K(e.symbol),r,n,o,i,I(e.account),t,b(e))});y.command("settle-pnl","Settle unrealized PnL into account balance").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly settle-pnl --account 0x1e6b...").action(e=>{let t=e.network||f();_r(I(e.account),t,b(e))});y.command("settle-pnl-history","Get on-chain PnL settlement history").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly settle-pnl-history").example("orderly settle-pnl-history --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.page?parseInt(e.page,10):void 0,n=e.size?parseInt(e.size,10):void 0;Sr(r,n,I(e.account),t,b(e))});y.command("referral-info","Get referral information (referrer/referee stats and codes)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly referral-info").example("orderly referral-info --account 0x1e6b...").action(e=>{let t=e.network||f();zr(I(e.account),t,b(e))});y.command("distribution-history","Get broker fee and referral rebate history").option("--status <status>","Filter by status: CREATED, SPLIT, COMPLETED").option("--type <type>","Filter by type: BROKER_FEE, REFEREE_REBATE, REFERRER_REBATE").option("--start-time <timestamp>","Start timestamp (Unix ms)").option("--end-time <timestamp>","End timestamp (Unix ms)").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly distribution-history").example("orderly distribution-history --type REFERRER_REBATE").example("orderly distribution-history --status COMPLETED --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.startTime?parseInt(e.startTime,10):void 0,n=e.endTime?parseInt(e.endTime,10):void 0,o=e.page?parseInt(e.page,10):void 0,i=e.size?parseInt(e.size,10):void 0;Vr(e.status,e.type,r,n,o,i,I(e.account),t,b(e))});y.command("volume-stats","Get perp trading volume statistics (today, 1d, 7d, 30d, YTD, LTD)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly volume-stats").example("orderly volume-stats --account 0x1e6b...").action(e=>{let t=e.network||f();Yr(I(e.account),t,b(e))});y.command("notification-inbox","List notification inbox messages").option("--type <type>","Filter by type: TRADE or SYSTEM").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly notification-inbox").example("orderly notification-inbox --type TRADE").example("orderly notification-inbox --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.page?parseInt(e.page,10):void 0,n=e.size?parseInt(e.size,10):void 0;Hr(e.type,r,n,I(e.account),t,b(e))});y.command("notification-unread","Get unread notification count and messages").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly notification-unread").example("orderly notification-unread --account 0x1e6b...").action(e=>{let t=e.network||f();Gr(I(e.account),t,b(e))});y.command("market-price <symbol>","Get current market price").example("orderly market-price PERP_ETH_USDC").example("orderly market-price PERP_BTC_USDC").action((e,t)=>{let r=t.network||f();Ft(L(e),r,b(t))});y.command("symbols","List trading symbols. Default: compact list (symbol, pair, prices). Use --info for full order rules (lot size, min notional, price tick, etc.)").option("--info","Show detailed per-symbol order rules instead of compact list (calls /v1/public/info instead of /v1/public/futures)").example("orderly symbols").example("orderly symbols --csv").example("orderly symbols --info").action(e=>{let t=e.network||f();Mt(e.info,t,b(e))});y.command("kline <symbol> <type>","Get candlestick/kline data. Valid intervals: 1m, 5m, 15m, 30m, 1h, 4h, 12h, 1d, 1w, 1mon").option("--size <n>","Number of candles (default: 100, max: 1000)").example("orderly kline PERP_ETH_USDC 1h").example("orderly kline PERP_BTC_USDC 1d --size 30").action((e,t,r)=>{let n=r.network||f(),o=r.size!=null?parseInt(String(r.size),10):100;if(isNaN(o)||o<=0){c(`Invalid --size value: "${r.size}". Must be a positive integer.`);return}qt(L(e),t,o,n,b(r))});y.command("market-trades <symbol>","Get recent public trades").option("--size <n>","Number of trades (default: 50)").example("orderly market-trades PERP_ETH_USDC").example("orderly market-trades PERP_BTC_USDC --size 20").action((e,t)=>{let r=t.network||f(),n=t.size!=null?parseInt(String(t.size),10):void 0;if(t.size!=null&&(isNaN(n)||n<=0)){c(`Invalid --size value: "${t.size}". Must be a positive integer.`);return}Wt(L(e),n,r,b(t))});y.command("funding-rates","Get public funding rates for all symbols (no auth required)").option("--symbol <symbol>","Filter by symbol").example("orderly funding-rates").example("orderly funding-rates --symbol PERP_ETH_USDC").example("orderly funding-rates --network mainnet").action(e=>{let t=e.network||f();jt(K(e.symbol),t,b(e))});y.command("price-changes","Get price changes for all symbols (5m, 30m, 1h, 24h, 7d, 30d) (no auth required)").example("orderly price-changes").example("orderly price-changes --symbol PERP_ETH_USDC").example("orderly price-changes --network mainnet").option("--symbol <symbol>","Filter by symbol").action(e=>{let t=e.network||f();zt(K(e.symbol),t,b(e))});y.command("open-interest","Get long/short open interest for all symbols (no auth required)").option("--symbol <symbol>","Filter by symbol").example("orderly open-interest").example("orderly open-interest --symbol PERP_ETH_USDC").example("orderly open-interest --network mainnet").action(e=>{let t=e.network||f();Vt(K(e.symbol),t,b(e))});y.command("liquidated-positions","Get public liquidated positions (no auth required)").option("--symbol <symbol>","Filter by symbol").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25)").example("orderly liquidated-positions").example("orderly liquidated-positions --symbol PERP_ETH_USDC").action(e=>{let t=e.network||f(),r=e.page?parseInt(e.page,10):void 0,n=e.size?parseInt(e.size,10):void 0;Yt(K(e.symbol),r,n,t,b(e))});y.command("system-status","Get Orderly system maintenance status (no auth required)").example("orderly system-status").example("orderly system-status --network mainnet").action(e=>{let t=e.network||f();Ht(t,b(e))});y.command("faucet-usdc <address>","Get test USDC from faucet (testnet only)").option("--chain-id <id>","Required. EVM: 421614 (Arbitrum Sepolia), 84532 (Base Sepolia). SOL: 901901901 (Devnet)").option("--broker-id <id>","Broker ID (default: demo)").example("# EVM (Arbitrum Sepolia):").example("orderly faucet-usdc 0x1234... --chain-id 421614").example("orderly faucet-usdc 0x1234... --chain-id 421614 --broker-id demo").example("# SOL (Devnet):").example("orderly faucet-usdc <sol-address> --chain-id 901901901").action((e,t)=>{let r=t.network||f(),n=t.chainId?String(t.chainId):void 0;Gt(Mn(e),n,r,b(t),t.brokerId)});y.command("chains","List supported chains (no auth required)").option("--broker-id <id>","Filter chains by broker ID").option("--verbose","Include broker_ids array for each chain").example("orderly chains").example("orderly chains --broker-id demo").example("orderly chains --verbose").action(e=>{let t=e.network||f();xr(t,b(e),e.brokerId,e.verbose)});y.command("tokens","List supported tokens (no auth required)").option("--verbose","Include chain_details array for each token").example("orderly tokens").example("orderly tokens --verbose").action(e=>{let t=e.network||f();Ir(t,b(e),e.verbose)});y.command("deposit-info <token> <chain-id>","Get deposit info for a token").example("orderly deposit-info USDC 421614").action((e,t,r)=>{let n=r.network||f(),o=r.csv?"csv":"json";Tr(e,Number(t),n,o)});y.command("withdraw <token> <chain-id>","Withdraw tokens (auto-signs with wallet key). Omit --receiver to withdraw to your own wallet address.").option("--receiver <address>","Destination address (defaults to your wallet address)").option("--amount <amount>","Amount to withdraw (required, e.g. 10.5)").option("--account <id>","Account ID (auto-resolves if single account)").option("--raw","Amount is in smallest units (default: false, use human-readable like 10.5)").option("--allow-cross-chain","Allow cross-chain withdrawal (required when destination chain differs from deposit chain)").example("# Withdraw 10 USDC to your own wallet address").example("orderly withdraw USDC 421614 --amount 10").example("# Withdraw 10 USDC to a specific address").example("orderly withdraw USDC 421614 --amount 10 --receiver 0x1234...").example("# Withdraw to SOL chain (50 USDC)").example("orderly withdraw USDC 901901901 --amount 50 --receiver <sol-address>").example("# Use raw amount (10000000 = 10 USDC with 6 decimals)").example("orderly withdraw USDC 421614 --amount 10000000 --raw --receiver 0x1234...").example("# Withdraw to different chain (cross-chain)").example("orderly withdraw USDC 84532 --amount 10 --receiver 0x1234... --allow-cross-chain").action((e,t,r)=>{let n=r.network||f();(r.amount===void 0||r.amount===null)&&c("Missing required option: --amount");let o;if(r.receiver!=null&&(o=String(r.receiver),/^\d+(\.\d+)?(e\+?\d+)?$/i.test(o))){let i=process.argv.indexOf("--receiver");i!==-1&&process.argv[i+1]&&(o=process.argv[i+1])}Er(e,String(r.amount),o,parseInt(t,10),I(r.account),n,r.raw,r.allowCrossChain,b(r))});y.command("asset-history","Get asset deposit/withdraw history").option("--token <token>","Filter by token").option("--side <side>","Filter by side: DEPOSIT or WITHDRAW").option("--status <status>","Filter by status: NEW, CONFIRM, PROCESSING, COMPLETED, FAILED, PENDING_REBALANCE").option("--page <n>","Page number (default: 1)").option("--size <n>","Page size (default: 25)").option("--account <id>","Account ID (auto-resolves if single account)").example("orderly asset-history").example("orderly asset-history --side DEPOSIT").example("orderly asset-history --status PROCESSING").example("orderly asset-history --page 2 --size 50").action(e=>{let t=e.network||f(),r=e.page?parseInt(e.page,10):void 0,n=e.size?parseInt(e.size,10):void 0;Nr(e.token,e.side,e.status,r,n,I(e.account),t,b(e))});var B=process.argv.slice(2);for(let e=2;e<B.length;e++)/^-\d+(\.\d+)?$/.test(B[e])&&(console.error(`Error: Invalid argument "${B[e]}". Negative numbers look like CLI flags.
129
+ Use a positive value, or quote the value to avoid shell parsing issues.`),process.exit(1));try{if(y.parse(),B.length>0&&!B[0].startsWith("-")){let e=B[0];if(!y.commands.some(r=>r.name===e||Array.isArray(r.aliasNames)&&r.aliasNames.includes(e))&&e!=="help"&&!B.includes("--help")&&!B.includes("-h")&&!B.includes("--version")&&!B.includes("-v")){let{error:r}=await Promise.resolve().then(()=>($(),st));r(`Unknown command: ${e}`,[`Run ${E.cyan("orderly --help")} to see available commands.`]),process.exit(1)}}}catch(e){if(e instanceof Error&&e.name==="CACError"){let t=e.message,r=t.match(/missing required args for command `(.+)`/);if(r){let o=r[1];c(`${t}`,["Usage examples:",` orderly ${o} --help`])}let n=t.match(/Unknown option `(.+)`/);if(n){let o=n[1],i=B[0]||"",s=[];if(o==="--account"){s.push(`This command does not accept ${E.cyan("--account")}.`);let a=y.commands.find(l=>l.name===i||Array.isArray(l.aliasNames)&&l.aliasNames.includes(i));a&&(a.options.some(u=>u.name==="address")&&s.push(`Did you mean ${E.cyan("--address <wallet-address>")}?`),a.args.some(u=>u.value==="account-id"||u.value==="account")&&s.push(`This command takes account ID as a positional argument: ${E.cyan(`orderly ${i} <account-id>`)}`))}s.length===0&&s.push(`Run ${E.cyan(`orderly ${i} --help`)} to see valid options.`),c(t,s)}c(t,[`Run ${E.cyan("orderly --help")} to see available commands.`])}throw e}
130
+ //# sourceMappingURL=index.js.map