构建交易
网站使用的报价 → 计划 → 签名 → 跟踪流程,同样可供您的应用使用。服务器从不签名或广播交易。
流程
- 1.
POST /v1/quotes(请求头Idempotency-Key,8–128 个字符):服务器读取链上状态,计算输出、最低到账和费用,然后从您的钱包模拟最终交易。 - 2. 若
requiresApproval为真,先发送approvals交易(授权金额等于交易金额),然后重新请求报价。 - 3. 使用
quoteId调用POST /v1/transaction-plans→ 获得未签名交易{ id, to, data, value }。 - 4. 从钱包签名并发送,然后报告哈希:
POST /v1/transactions/:id/submissions。 - 5. 轮询
GET /v1/transactions/:id(submitted → confirmed → finalized / failed),或接收 SSE/webhook 事件transaction.finalized。
示例:在 Base 上将 ETH 兑换为 USDC
ts
import { createWalletClient, http } from 'viem';
import { base } from 'viem/chains';
import { privateKeyToAccount } from 'viem/accounts';
const API = 'https://banipool.com/api/v1';
const ETH = '0x0000000000000000000000000000000000000000';
const USDC = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as `0x${string}`);
const wallet = createWalletClient({ account, chain: base, transport: http() });
const auth = { authorization: `Bearer ${process.env.BANIPOOL_SESSION}`, 'content-type': 'application/json' };
// Rute terbaik (1–2 langkah)
const route = await fetch(`${API}/swap-routes`, { method: 'POST', headers: auth,
body: JSON.stringify({ chainRef: 'eip155:8453', tokenIn: ETH, tokenOut: USDC, amountIn: '1000000000000000' }) }).then((r) => r.json());
const [first, second] = route.data.steps;
// Quote (disimulasikan di mainnet dari wallet Anda)
const quote = await fetch(`${API}/quotes`, { method: 'POST',
headers: { ...auth, 'idempotency-key': crypto.randomUUID() },
body: JSON.stringify({ action: 'swap', deploymentId: first.deploymentId, poolAddress: first.poolAddress,
tokenIn: ETH, amountIn: '1000000000000000', unwrapNative: false, slippageBps: 100,
...(second ? { viaDeploymentId: second.deploymentId, viaPoolAddress: second.poolAddress } : {}) }) }).then((r) => r.json());
console.log('minimum:', quote.data.swap.minOut, 'fee platform:', quote.data.platformFee);
// Plan → tanda tangan → laporkan hash
const plan = await fetch(`${API}/transaction-plans`, { method: 'POST', headers: auth,
body: JSON.stringify({ quoteId: quote.data.id }) }).then((r) => r.json());
const hash = await wallet.sendTransaction({ to: plan.data.to, data: plan.data.data, value: BigInt(plan.data.value) });
await fetch(`${API}/transactions/${plan.data.id}/submissions`, { method: 'POST', headers: auth, body: JSON.stringify({ txHash: hash }) });签名前务必向用户展示最低到账、费用和合约地址。切勿将私钥放入前端代码。
支持的操作
| 操作 | 说明 |
|---|---|
swap | 通过资金池兑换代币(单笔交易 1–2 跳)。 |
mint / add | 开设新仓位或向仓位添加流动性。 |
mint + createPool | 创建新资金池并同时添加首笔流动性(createPool: true,initialPrice = 每个 token0 对应的 token1 数量;v4 还需 tickSpacing)。请先通过 GET /v1/pool-create/check 检查。Zap In(用一种代币支付):通过 POST /v1/pool-create/zap-plan 获取计划,逐步执行 swap,再用所得执行 mint。 |
remove / claim | 撤出流动性(部分/全部)或领取手续费。 |
compound / rebalance | 将手续费加回仓位,或移动到新区间。 |
stake / unstake | Aerodrome:将仓位质押到 gauge 以获取奖励。 |
Zap 使用专用的计划端点:POST /v1/zap-in-contract-plans 和 POST /v1/zap-out-contract-plans(通过 BaniZap 合约的单笔交易);响应包含 approvals、call、最低输出和 platformFee。
通过 API 跨链
bash
# Rute tersedia
curl -s https://banipool.com/api/v1/bridge/routes | jq '.data[] | {symbol, fromChainRef, toChainRef}'
# Kuota (sesi wallet; Idempotency-Key wajib) → transaction + approvals
curl -s -X POST https://banipool.com/api/v1/bridge/quotes \
-H "authorization: Bearer $BANIPOOL_SESSION" -H "idempotency-key: $(uuidgen)" \
-H "content-type: application/json" \
-d '{"fromChainRef":"eip155:8453","toChainRef":"eip155:1","symbol":"USDC","amount":"5000000"}'
# Setelah transaksi dikirim: daftarkan untuk dilacak sampai completed
curl -s -X POST https://banipool.com/api/v1/bridge/transfers -H "authorization: Bearer $BANIPOOL_SESSION" \
-H "content-type: application/json" -d '{"quoteId":"<id kuota>","txHash":"0x…"}'