一键导入
Guide user through depositing crypto and transferring funds to the trading wallet
npx skills add https://github.com/EternaHybridExchange/openclaw-plugin --skill deposit复制此命令并粘贴到 Claude Code 中以安装该技能
Guide user through depositing crypto and transferring funds to the trading wallet
npx skills add https://github.com/EternaHybridExchange/openclaw-plugin --skill deposit复制此命令并粘贴到 Claude Code 中以安装该技能
Close positions and cancel orders on Eterna
Live market scanning, technical analysis, and trade idea generation using Eterna CLI
Place trades on Eterna with proper sizing, leverage, and risk management
Always-active router for Eterna trading — detects user state and invokes the right skill
Withdraw crypto from Eterna to an external wallet
| name | deposit |
| description | Guide user through depositing crypto and transferring funds to the trading wallet |
| metadata.openclaw.requires.bins | [{"name":"eterna","install":"npm install -g @eterna-hybrid-exchange/cli","postInstall":"eterna login"}] |
Guide the user through depositing funds into their Eterna trading account.
Critical flow: Deposit address → send crypto → monitor with getDepositRecords() → transfer to trading wallet → confirm balance.
transferToTrading() before funds are usable.getBalance() checks the trading wallet — it will show zero until you transfer. Do NOT use getBalance() to check if a deposit has arrived.getDepositRecords() to monitor incoming deposits.const coins = await eterna.getAllowedDepositCoins("USDT");
return coins.configList.map((c) => ({
coin: c.coin, chain: c.chain, chainName: c.chainType,
minDeposit: c.minDepositAmount, confirmations: c.blockConfirmNumber,
}));
Present as a simple choice: "I'd recommend Arbitrum — fast and cheap. Which chain works for your wallet?"
If the user wants a different coin (BTC, ETH, USDC), run getAllowedDepositCoins for that coin.
// Replace coin/chain based on user's choice
const addr = await eterna.getDepositAddress("USDT", "ARBI");
return addr;
Show address clearly. If there's a tag/memo, emphasize it — missing tags can lose funds.
Once the user says they've sent funds, check getDepositRecords():
const records = await eterna.getDepositRecords("USDT");
const pending = records.rows.filter((r) => r.status !== 3 && r.status !== 4);
const confirmed = records.rows.filter((r) => r.status === 3);
return { pending, confirmed };
Status codes:
Check when the user asks. If they ask you to poll, check every minute.
This step is mandatory. Funds sit in the Funding wallet until transferred.
If they deposited USDT:
const transfer = await eterna.transferToTrading("USDT", "ALL_BALANCE");
return transfer;
If they deposited a non-USDT coin, swap first:
const swap = await eterna.swapToUsdt("ETH"); // omit amount for full balance
const transfer = await eterna.transferToTrading("USDT", "ALL_BALANCE");
return { swap, transfer };
const balance = await eterna.getBalance();
const account = balance.list[0];
return {
totalEquity: account.totalEquity,
availableBalance: account.totalAvailableBalance,
coins: account.coin.filter((c) => parseFloat(c.equity) > 0).map((c) => ({
coin: c.coin, equity: c.equity, usdValue: c.usdValue,
})),
};
Celebrate: "You're funded! $X ready to trade." Then suggest looking at trade ideas.
| Method | Returns |
|---|---|
eterna.getAllowedDepositCoins(coin?, chain?) | { configList: [{ coin, chain, chainType, minDepositAmount, blockConfirmNumber }] } |
eterna.getDepositAddress(coin, chainType) | { coin, chains: { chainType, addressDeposit, tagDeposit } } |
eterna.getDepositRecords(coin?) | { rows: [{ coin, chain, amount, txID, status, confirmations }] } — status: 0-4 |
eterna.transferToTrading(coin, amount) | { transferId: string } — use "ALL_BALANCE" for full transfer |
eterna.swapToUsdt(coin, amount?) | { coin, orderId, qty, success, message } — omit amount for full balance |
eterna.getBalance() | { list: [{ totalEquity, totalAvailableBalance, coin: [...] }] } — trading wallet only |
eterna.getAllCoinsBalance(accountType) | Balance by account type: "FUND", "UNIFIED", "SPOT" |