赎回#
当用户要从 DeFi 协议取回资产(赎回)或偿还借款(还款)时,调用此接口。核心参数:investmentId、address。关键提示:赎回时务必传入 redeemPercent(如 "1" 表示 100%),否则对于 aToken 等动态余额的代币,链上执行可能因余额变动而 revert。V3 Pool 赎回必须传 tokenId。
URL:POST /api/v6/defi/transaction/exit
请求参数#
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| investmentId | String | 是 | — | 投资品 ID |
| address | String | 是 | — | 用户钱包地址 |
| tokenId | String | 否 | — | V3 Pool 的 NFT position token ID。isV3Pool=true 时赎回必传 |
| redeemPercent | String | 建议传 | — | 赎回比例,如 "1"=100%, "0.5"=50%。不传时 Zap calldata 的 tokenIn amount 取 userInputList.coinAmount 的精确值;传了则使用 MAX_UINT256 表示全部余额 |
| userInputList | Array | 否 | — | Farm 和 v2pool 输入 LP Token信息,其他情况输入目标接收token信息 |
| > tokenAddress | String | 否 | — | 传入 userInputList 时必填;Token 合约地址 |
| > chainIndex | String | 否 | — | 传入 userInputList 时必填;链 ID |
| > coinAmount | String | 否 | — | 传入 userInputList 时必填;金额(人类可读,如 "0.05") |
| > tokenSymbol | String | 否 | — | 代币符号 |
| > tokenPrecision | Integer | 否 | — | 精度 |
| > tokenId | String | 否 | — | NFT token ID(V3 Pool 场景) |
| slippage | String | 否 | "0.01" | 交易滑点(adapter/Zap 路由时生效)。"0.01"=1%, "0.1"=10% |
关键注意事项#
redeemPercent 必传:当 type="REDEEM" 时,如果不传
redeemPercent,API 生成的 Zap calldata 中tokenIn.amount会使用精确数值(如 60009)而非 MAX_UINT256。对于 aToken 等利息动态增长的 token,从 API 返回到上链执行的时间窗口内余额会变化,导致SafeERC20: low-level call failed。传redeemPercent: "1"后 amount 设为 MAX_UINT256,合约会动态获取实际余额。
请求示例#
示例 1: BSC V3 Pool 纯赎回(50%,不带 userInputList)#
投资品: PancakeSwapV3 USDT-RIVER (id=1589649169)
{
"investmentId": "1589649169",
"address": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"tokenId": "6632738",
"redeemPercent": "0.5"
}
示例 2: Avalanche Aave V3 赎回(redeemPercent="1")#
投资品: Aave V3 USDC (id=124, chainIndex=43114)
{
"investmentId": "124",
"address": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"userInputList": [
{
"tokenAddress": "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e",
"chainIndex": "43114",
"coinAmount": "0.05"
}
],
"redeemPercent": "1"
}
示例 3: Sui NAVI 赎回#
投资品: NAVI USDC (id=32202, chainIndex=784)
{
"investmentId": "32202",
"address": "0x2791c11545a2fef7d8b3188002c80343bf6dc64130a603914238d8660b3bddde",
"userInputList": [
{
"tokenAddress": "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC",
"chainIndex": "784",
"coinAmount": "0.3"
}
]
}
示例 4: Solana Kamino 还款#
投资品: Kamino USDC Borrow (id=29130, chainIndex=501)
{
"investmentId": "29130",
"address": "4GK2VMnznuPpg8gG9vqD5MM6889pjJ8WS2HqzktaBfSo",
"userInputList": [
{
"tokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"chainIndex": "501",
"coinAmount": "0.05"
}
]
}
响应参数#
| 字段 | 类型 | 说明 |
|---|---|---|
| data.dataList | Array | calldata 结果列表(按顺序执行) |
| > callDataType | String | 操作类型(授权、申购、赎回、claim) |
| > from | String | from 地址(用户钱包地址) |
| > to | String | to 地址(目标合约地址) |
| > value | String | 转账金额(native token 数量)。无需发送原生币时为空字符串或 "0x0" |
| > serializedData | String | 序列化交易数据。EVM:hex calldata(0x 前缀);Solana:base58 编码;Sui:base64 编码的 BCS 字节 |
| > originalData | String | 辅助元数据(JSON 字符串) |
| > transactionPayload | String | 交易模板,仅 Aptos 链返回 |
| > signatureData | String | 签名数据 |
| > gas | String | Gas 限额,仅 Aptos 等非 EVM 链返回 |
赎回时常见的 dataList 组合:
- 单步:
[WITHDRAW]— 纯赎回/还款 - 两步:
[APPROVE, WITHDRAW]— 需要先授权 aToken 给 Zap - 两步:
[WITHDRAW, SWAP]— V3 取出后 swap 回目标 token(实际合并为单个 callDataType=WITHDRAW,SWAP)
响应示例#
EVM 链(Avalanche Aave V3 USDC 赎回,APPROVE + WITHDRAW 两步)
{
"code": 0,
"msg": "",
"data": {
"dataList": [
{
"callDataType": "APPROVE",
"from": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"to": "0x625e7708f30ca75bfd92586e17077590c60eb4cd",
"value": "0x0",
"serializedData": "0x095ea7b3000000000000000000000000...ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"originalData": "{\"callDataType\":\"APPROVE\",\"methodId\":\"0x095ea7b3\",\"methodDefine\":\"approve(address,uint256)\",...}",
"signatureData": ""
},
{
"callDataType": "WITHDRAW",
"from": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"to": "0x794a61358d6845594f94dc1db02a252b5b4814ad",
"value": "0x0",
"serializedData": "0x69328dec000000000000000000000000...0000000000000000000000001ae68a40b9f903a469aed01574f3a9ab6d45c563",
"originalData": "{\"callDataType\":\"WITHDRAW\",\"methodId\":\"0x69328dec\",\"methodDefine\":\"withdraw(address,uint256,address)\",...}",
"signatureData": ""
}
]
}
}
说明:当
redeemPercent="1"时,serializedData中的 amount 参数为 MAX_UINT256,合约会动态获取实际余额进行赎回,避免因 aToken 利息增长导致的余额不足问题。