申购#
当用户要向 DeFi 协议存入资产(存款)或借出资产(借款)时,调用此接口。核心参数:investmentId(投资品 ID)、address(用户钱包地址)、userInputList(投入的代币地址、链 ID、金额)。返回的 dataList 中包含按顺序执行的交易步骤(如先 APPROVE 再 DEPOSIT),需依次签名广播上链。对于 V3 Pool 还需传入 tickLower、tickUpper 等参数。
URL:POST /api/v6/defi/transaction/enter
请求参数#
enter 和 exit 共用同一个请求模型,部分字段仅在特定操作下有效。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| investmentId | String | 是 | — | 投资品 ID |
| address | String | 是 | — | 用户钱包地址 |
| tickLower | String | 否 | — | V3 tick 下限。仅投资 Dex Pool 类型且新建仓位时需要 |
| tickUpper | String | 否 | — | V3 tick 上限。仅投资 Dex Pool 类型且新建仓位时需要 |
| tokenId | String | 否 | — | V3 Pool 的 NFT position token ID。isV3Pool=true 时:添加流动性必传(向已有仓位追加);赎回必传 |
| userInputList | Array | 否 | — | 投入币种和数量。申购时为投入的 token或token列表信息。 |
| > tokenAddress | String | 否 | — | 传入 userInputList 时必填;Token 合约地址 |
| > chainIndex | String | 否 | — | 传入 userInputList 时必填;链 ID |
| > coinAmount | String | 否 | — | 传入 userInputList 时必填;金额(人类可读,如 "0.2") |
| > tokenSymbol | String | 否 | — | 代币符号 |
| > tokenPrecision | Integer | 否 | — | 精度 |
| slippage | String | 否 | "0.01" | 交易滑点(adapter/Zap 路由时生效)。"0.01"=1%, "0.1"=10% |
请求示例#
示例 1: BSC V3 Pool 申购#
投资品: PancakeSwapV3 USDT-RIVER (id=1589649169, chainIndex=56)
{
"investmentId": "1589649169",
"address": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"tickLower": "-32150",
"tickUpper": "-31350",
"userInputList": [
{
"tokenAddress": "0x55d398326f99059fF775485246999027B3197955",
"chainIndex": "56",
"coinAmount": "0.2"
}
],
"slippage": "0.1"
}
示例 2: Avalanche Aave V3 存款(Single Earn)#
投资品: Aave V3 USDC (id=124, chainIndex=43114)
{
"investmentId": "124",
"address": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"userInputList": [
{
"tokenAddress": "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e",
"chainIndex": "43114",
"coinAmount": "0.05"
}
]
}
示例 3: Avalanche Aave V3 借款#
投资品: Aave V3 USDC Borrow (id=33901, chainIndex=43114)
{
"investmentId": "33901",
"address": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"userInputList": [
{
"tokenAddress": "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e",
"chainIndex": "43114",
"coinAmount": "0.01"
}
]
}
示例 4: Sui NAVI 借款#
投资品: NAVI SUI Borrow (id=40047, chainIndex=784)
{
"investmentId": "40047",
"address": "0x2791c11545a2fef7d8b3188002c80343bf6dc64130a603914238d8660b3bddde",
"userInputList": [
{
"tokenAddress": "0x2::sui::SUI",
"chainIndex": "784",
"coinAmount": "0.02"
}
]
}
示例 5: Solana Kamino 借款#
投资品: Kamino USDC Borrow (id=29130, chainIndex=501)
{
"investmentId": "29130",
"address": "4GK2VMnznuPpg8gG9vqD5MM6889pjJ8WS2HqzktaBfSo",
"userInputList": [
{
"tokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"chainIndex": "501",
"coinAmount": "0.05"
}
]
}
响应参数#
| 字段 | 类型 | 说明 |
|---|---|---|
| code | String | "0"=成功,非"0"=失败 |
| msg | String | 错误信息 |
| data.dataList | Array | calldata 结果列表(按顺序执行,如 APPROVE → DEPOSIT) |
| > callDataType | String | 操作类型(授权、申购、赎回、claim),见下方枚举表 |
| > from | String | from 地址(用户钱包地址) |
| > to | String | to 地址(目标合约地址)。根据产品类型和操作不同,可能是 Zap 合约或协议合约直连 |
| > value | String | 转账金额(native token 数量)。无需发送原生币时为空字符串或 "0x0" |
| > serializedData | String | 序列化交易数据。EVM:hex calldata(0x 前缀);Solana:base58 编码;Sui:base64 编码的 BCS 字节 |
| > originalData | String | 辅助元数据(JSON 字符串)。EVM 链包含函数 ABI(methodId/methodDefine/methodParams);Aptos 链包含模块 ABI JSON |
| > transactionPayload | String | 交易模板,仅 Aptos 链返回。包含 payload JSON,客户端需补充 sequence_number 后通过 SDK 构建完整交易 |
| > signatureData | String | 签名数据。EVM 链为 Zap 合约的 permit 签名;非 EVM 链为服务端签名凭证 |
| > gas | String | Gas 限额,仅 Aptos 等非 EVM 链返回。EVM 链需客户端自行估算或使用固定值 |
callDataType 枚举值#
| 值 | 说明 |
|---|---|
| APPROVE | ERC20 授权(approve spender) |
| DEPOSIT | 存入协议 |
| SWAP,DEPOSIT | 先兑换再存入(V3 Pool 场景,单币入双币池) |
| WITHDRAW | 从协议取出 |
| WITHDRAW,SWAP | 取出后兑换回目标 token(V3 Pool 场景) |
注意:Aave Borrow 返回 callDataType=WITHDRAW,Aave Repay 返回 callDataType=DEPOSIT。这是 Aave 协议内部方法语义(borrow=从池子 withdraw 资产,repay=向池子 deposit 资产),不影响实际业务操作。
各链 serializedData 处理方式#
| 链 | 编码 | 客户端处理流程 |
|---|---|---|
| EVM (BSC/AVAX/ETH) | Hex (0x 前缀) | 直接作为 tx.data 发送,to 作为目标地址 |
| Sui | Base64 BCS | base64 解码 → 前置 intent [0,0,0] → blake2b-256 哈希 → Ed25519 签名 → 提交 sui_executeTransactionBlock |
| Solana | Base58 | bs58 解码 → 跳过前 65 字节签名占位 → VersionedMessage.deserialize() → 签名 → 立即发送(blockhash ~60s 过期) |
| Aptos | — | 使用 transactionPayload 字段的 payload JSON,通过 SDK build.simple() 构建交易 → 签名 → 提交 |
响应示例#
EVM 链(BSC V3 Enter,APPROVE + SWAP,DEPOSIT 两步):
{
"code": 0,
"msg": "",
"data": {
"dataList": [
{
"callDataType": "APPROVE",
"from": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"to": "0xda7ad9dea9397cffddae2f8a052b82f1484252b3",
"value": "0x0",
"serializedData": "0x095ea7b3000000000000000000000000...ffffffff",
"originalData": "{\"callDataType\":\"APPROVE\",\"methodId\":\"0x095ea7b3\",\"methodDefine\":\"approve(address,uint256)\",...}",
"signatureData": "..."
},
{
"callDataType": "SWAP,DEPOSIT",
"from": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"to": "0x7251FEbEABB01eC9dE53ECe7a96f1C951F886Dd2",
"value": "0x0",
"serializedData": "0xec5b999d000000000000000000000000...",
"originalData": "{\"callDataType\":\"SWAP,DEPOSIT\",\"methodDefine\":\"{...executeWithPermit...}\",...}",
"signatureData": "..."
}
]
}
}
Sui 链(NAVI Deposit,单步):
{
"code": 0,
"msg": "",
"data": {
"dataList": [
{
"serializedData": "<base64 encoded Sui transaction bytes>",
"from": "0x2791c11545a2fef7d8b3188002c80343bf6dc64130a603914238d8660b3bddde",
"to": "...",
"value": "0"
}
]
}
}
Solana 链(Kamino Deposit,单步):
{
"code": 0,
"msg": "",
"data": {
"dataList": [
{
"serializedData": "<base58 encoded Solana VersionedTransaction>",
"from": "4GK2VMnznuPpg8gG9vqD5MM6889pjJ8WS2HqzktaBfSo",
"to": "...",
"value": "0"
}
]
}
}
V3 Pool 双币仓位比例计算#
注意,该接口仅在需要投资V3 Pool相关投资品时需调用:V3 Pool 申购前,需先调用此接口计算双币投入比例——用户只需提供一种代币的金额,接口即可根据当前池价格和所选价格区间,智能拆算出两种代币各需投入多少。返回的 investWithTokenList 可直接作为上方申购接口的 userInputList 传入。
URL:POST /api/v6/defi/calculator/enter/info
请求参数#
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| inputAmount | String | 是 | 用户输入的单币金额(人类可读格式,如 "0.05") |
| inputTokenAddress | String | 是 | 用户输入的 token 合约地址。可以是 V3 Pool 的 token0 或 token1 |
| tokenDecimal | String | 是 | 输入 token 的精度(如 "18", "6") |
| investmentId | String | 是 | 投资品 ID(V3 Pool 对应的 investmentId) |
| address | String | 是 | 用户钱包地址 |
| tickLower | String | 是 | V3 仓位的 tick 下限(如 "-33500") |
| tickUpper | String | 是 | V3 仓位的 tick 上限(如 "-30450") |
请求示例#
示例:BSC V3 Pool (USDT → 双币分配)
投资品: PancakeSwapV3 USDT-RIVER (id=1589649169, chainIndex=56)
{
"inputAmount": "0.05",
"inputTokenAddress": "0x55d398326f99059fF775485246999027B3197955",
"tokenDecimal": "18",
"investmentId": 1589649169,
"address": "0x1ae68a40b9f903a469aed01574f3a9ab6d45c563",
"tickLower": "-33500",
"tickUpper": "-30450"
}
响应参数#
data 对象
| 字段 | 类型 | 说明 |
|---|---|---|
| investWithTokenList | Array | 双币分配结果列表,通常包含 2 个元素(token0 和 token1) |
| > tokenAddress | String | Token 合约地址(小写格式) |
| > chainIndex | String | 链 ID(如 "56" = BSC) |
| > coinAmount | String | 分配金额(人类可读格式,如 "0.05")。高精度小数,直接用于 transaction/enter 的 userInputList |
响应示例#
成功:USDT 输入 → USDT + RIVER 双币分配
{
"code": 0,
"data": {
"investWithTokenList": [
{
"tokenAddress": "0x55d398326f99059ff775485246999027b3197955",
"chainIndex": "56",
"coinAmount": "0.05"
},
{
"tokenAddress": "0xda7ad9dea9397cffddae2f8a052b82f1484252b3",
"chainIndex": "56",
"coinAmount": "0.000275606738038671"
}
]
}
}
解读:用户投入 0.05 USDT,按当前 tick ≈ -32932 的价格比例,需要 0.05 USDT + 0.000275 RIVER 组成双币入场。
完整调用流程#
- POST
/api/v6/defi/calculator/enter/info(当前接口)— 输入:单币金额 + tick 区间 → 输出:investWithTokenList - 校验钱包余额 — 确保两个 token 余额均满足 investWithTokenList 中的 coinAmount
- POST
/api/v6/defi/transaction/enter— 传入 userInputList(= investWithTokenList)+ tickLower + tickUpper + slippage → 输出:calldata (DEPOSIT) - 签名 & 发送链上交易 — 双币入场为纯 DEPOSIT(无链上 swap)