Appearance
资产与网络
网络(networkKey)与资产(assetId)由平台统一配置,并按租户开通。请不要硬编码资产精度、最小额与手续费,启动时及定期(例如每 5 分钟)从本页接口拉取。
网络列表
http
GET /v1/networks返回本租户已开通的网络。
响应 200 OK
json
[
{ "networkKey": "ethereum", "chainFamily": "EVM", "displayName": "Ethereum", "isTestnet": false, "enabled": true },
{ "networkKey": "bsc", "chainFamily": "EVM", "displayName": "BNB Chain", "isTestnet": false, "enabled": true },
{ "networkKey": "tron", "chainFamily": "TRON", "displayName": "TRON", "isTestnet": false, "enabled": true }
]| 字段 | 类型 | 说明 |
|---|---|---|
networkKey | string | 网络标识,用于 deposit_address 等接口(上例取值仅为示例) |
chainFamily | string | EVM / TRON / BTC / SOL。同一链族的网络共用钱包与地址 |
displayName | string | 展示名称 |
isTestnet | boolean | 是否测试网 |
enabled | boolean | 恒为 true(只返回已开通的网络) |
支持的资产
http
GET /v1/supported_assets返回本租户可见的全部资产(已开通网络上、状态为 ENABLED 或 DEPOSIT_PAUSED、未被租户隐藏),以及本租户当前生效的充值费与提现费。
响应 200 OK
json
[
{
"assetId": "USDT_ERC20",
"networkKey": "ethereum",
"chainFamily": "EVM",
"kind": "TOKEN",
"contract": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"tokenProgram": null,
"symbol": "USDT",
"name": "Tether USD",
"decimals": 6,
"status": "ENABLED",
"withdrawEnabled": true,
"minDeposit": "1000000",
"minWithdraw": "10000000",
"withdrawFeeFloor": "1000000",
"depositFeeFloor": "0",
"singleLimitCap": null,
"dailyLimitCap": null,
"iconUrl": null,
"networkWithdrawEnabled": true,
"networkDepositEnabled": true,
"depositFeeRaw": "500000",
"withdrawFeeRaw": "2500000"
}
]| 字段 | 类型 | 说明 |
|---|---|---|
assetId | string | 资产 ID |
networkKey | string | 所在网络 |
chainFamily | string | 所在链族 |
kind | string | NATIVE(原生币)或 TOKEN(合约代币) |
contract | string | null | 代币合约地址(TRON 为 Base58,SOL 为 mint);原生币为 null |
tokenProgram | string | null | 仅 SOL 代币:Token Program ID |
symbol / name | string | 符号 / 名称 |
decimals | integer | 精度,金额换算用 |
status | string | ENABLED:正常;DEPOSIT_PAUSED:暂停充值(到账转人工处理,不自动入账) |
withdrawEnabled | boolean | 资产是否允许提现 |
networkWithdrawEnabled / networkDepositEnabled | boolean | 网络级提现 / 充值开关 |
minDeposit | string(最小单位) | 最小充值额,低于此金额的充值不自动入账 |
minWithdraw | string(最小单位) | 最小提现额(仅链上提现校验) |
withdrawFeeFloor / depositFeeFloor | string(最小单位) | 平台默认手续费(保留历史字段名;租户可自行覆盖) |
singleLimitCap / dailyLimitCap | string | null | 平台默认单笔 / 每日限额(null = 不限);已配置租户使用自己的限额,允许高于默认值,显式 null 表示不限额 |
iconUrl | string | null | 图标地址 |
depositFeeRaw | string(最小单位) | 当前生效的充值手续费,入账时从充值金额中扣除 |
withdrawFeeRaw | string(最小单位) | 当前生效的链上提现手续费,从用户余额中额外扣除 |
minDeposit、minWithdraw 等字段同样是最小单位字符串,只是字段名没有 Raw 后缀。
可以发起链上提现的条件:status = "ENABLED" 且 withdrawEnabled = true 且 networkWithdrawEnabled = true,否则返回 422 ASSET_DISABLED。
手续费如何计算
- 提现手续费 = max(租户提现费(未配置时用平台默认
withdrawFeeFloor),动态下限)。 - 充值手续费 = max(租户充值费(未配置时用平台默认
depositFeeFloor),动态下限)。 - 动态下限:平台按该网络最近实际的链上成本(提现:近 20 笔同类提现的最高网络费;充值:近 20 次同类归集成本,代币另加补 Gas 成本)× (1 + 安全系数),并按币价换算成该资产后向上取整。BTC 充值没有归集成本,不产生动态充值下限。
- 站内转账(收款方为本租户其他用户)只收租户设置的站内转账费,不收网络费;本人钱包之间互转免费。
因此 depositFeeRaw、withdrawFeeRaw 会随链上成本波动。提现前请用 POST /v1/transactions/estimate_fee 获取准确金额。网络费(矿工费)由平台承担,不向用户另收。
地址校验
http
GET /v1/transactions/validate_address/{assetId}/{address}校验一个地址能否作为该资产的收款地址,并返回规范化后的地址以及是否为本租户内部地址。
| 路径参数 | 说明 |
|---|---|
assetId | 资产 ID(决定校验哪条链、哪个网络的地址格式) |
address | 待校验地址(需 URL 编码) |
响应 200 OK
json
{ "isValid": true, "normalized": "0x90f79bf6eb2c4f870365e785982e1f101e93b906", "isInternal": false }json
{ "isValid": false, "isInternal": false }| 字段 | 说明 |
|---|---|
isValid | 地址格式是否合法 |
normalized | 规范化地址(仅 isValid = true 时返回)。EVM 统一转为小写;大小写混合的 EVM 地址必须通过 EIP-55 校验;零地址视为非法;BTC 地址必须属于该网络(主网/测试网) |
isInternal | true 表示这是本租户某个钱包的充值地址,向它转账会自动站内结算(不上链、无网络费) |
常见错误
| HTTP | code | 场景 |
|---|---|---|
| 422 | ASSET_NOT_SUPPORTED | 未知 assetId |
| 422 | INTERNAL_DESTINATION_NOT_ALLOWED | 该地址是平台运营地址(热钱包、归集、Gas 等),不允许作为收款地址 |
TIP
Solana 提现时还要求地址是钱包(owner)地址,而不是程序地址或代币账户(ATA);本接口不做这项检查,不满足时在估算/提现时返回 422 INVALID_ADDRESS。