# CoinSend篇

## CoinSend客户端详情 <a href="#undefined" id="undefined"></a>

请在Google Play商店，或CoinsDo官网下载应用程序，并运行在可靠的设备中。

使用CoinSend业务时，CoinSend客户端需保持在线。

### **接口描述**

* 查询下发钱包的详情

### **请求地址**

* `{URL}/v1/deviceDetail`

### **请求方式**

* POST
* Body 参数

<table><thead><tr><th width="131">参数名</th><th width="69">必填</th><th width="115">类型</th><th>说明</th></tr></thead><tbody><tr><td>data</td><td>是</td><td>string</td><td>内容（JSON字符串，如下）</td></tr></tbody></table>

```json
{
    "apiKey": "cd384rt80f5575dc",
    "deviceUuid": "2DEA1BEB-CFE9-4E1D-9D88-F983D84D2E4D"
}
```

* data 参数

<table><thead><tr><th width="148">参数名</th><th width="71">必填</th><th width="112">类型</th><th>说明</th></tr></thead><tbody><tr><td>apiKey</td><td>是</td><td>string</td><td>API KEY</td></tr><tr><td>deviceUuid</td><td>是</td><td>string</td><td>下发钱包标识</td></tr></tbody></table>

### **请求示例**

```json
{
    "data": "{\"apiKey\":\"cd384rt80f5575dc\",\"deviceUuid\":\"2DEA1BEB-CFE9-4E1D-9D88-F983D84D2E4D\"}",
    "sign": "d32bfb9905f0b6713be45fea2bce001449146a43b3319479076a6d8c2bf22055"
}
```

### **返回示例**

```json
{
    "code": 200, // 状态码
    "msg": "成功", // 提示信息
    "data": {
        "onlineStatus": 1,
        "useStatus": 1,
        "addressList": [{
            "flag": "TRX",
            "address": "TEN51U1W5hW5bJ833J6CLojvJdFGEQtz39",
            "balance": "222.1",
            "currency": "TRX"
        }, {
            "flag": "0xe7b0d9104aec8ea4ec6a02dfc5ae5180f9f78f95",
            "address": "TKU69qcQPoR5jDEE7ertPpdaxoLGCTX4xR",
            "balance": "6161.999",
            "currency": "TRC20"
        }],
        "devicePublicKey":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD311wvweaxTv9bJBz3dxxd8e1nhInyoS/my8zarbeyqwAcTjWkMsWQt5cquU5G463nd5nSAOUGDgdytOZu78ZT4OQPFyeKRM/TWC7ghibhi/FDxJvE7txj7QRjdY0vTDTM/6CYxi2F8PIgjzX9TKBP7DK6pZq/sN1VciBuRWz2kQIDAQAB"
        "deviceExpiryTime": "1628380800",
        "deviceRegisterTime": "1625802606"
    }
}
```

## 添加子账户的审批设备 <a href="#undefined" id="undefined"></a>

子账户仅可在已绑定CoinSign插件的Chrome/ Firefox浏览器或CoinSign客户端完成审批操作。\
CoinSend会对下发指令进行签名验证，确保指令不可篡改且来自授权角色的可信设备。

### **接口描述**

* 添加子账户的审批设备

### **请求地址**

* `{URL}/v1/reviewAdd`

### **请求方式**

* POST
* Body 参数

<table><thead><tr><th width="145">参数名</th><th width="75">必填</th><th width="99">类型</th><th>说明</th></tr></thead><tbody><tr><td>data</td><td>是</td><td>string</td><td>内容（JSON字符串，如下）</td></tr></tbody></table>

```json
{
    "apiKey": "cd384rt80f5575dc",
    "reviewPubkey":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi7RszjTelyGLJmpyXUPKo7xSUGQSv/5fUXO0npAGKP0oukx7tHQ6nJsnXdztX3yR3zhgjBnCdqN8DBPr+LzF4kSzG4t2/a6NdFlnPAUrtFZcqRbGDwliIqlKb5XCTu0Pgs6fNjx8tPE6XIW7OX/8NmQIbBw9Qjn28gjSuaTAD9QIDAQAB",
    "plainText":"test",
    "signature":"Fy6kcJsOY38jO+m/OsvmVj9kJdkC8CCl4WwPbMjWP/AAGS3dAAUHgIGQQlkIo3uBiEIIr85axpYmmsvXfeGg3MmYLim1XOeI65oOnDN084EaXjlCvTlFMqnt61YUYcN/9WPRjtbOsfSaK1ivOfKux9Fh8lGzRoNYKahCA1t69Kk=",
    "authorizationCode": "CFZQ-RJWN-VDDH"
}
```

* data参数

<table><thead><tr><th width="190">参数名</th><th width="70">必填</th><th width="92">类型</th><th>说明</th></tr></thead><tbody><tr><td>apiKey</td><td>是</td><td>string</td><td>API KEY</td></tr><tr><td>reviewPubkey</td><td>是</td><td>string</td><td>审核设备公钥</td></tr><tr><td>plainText</td><td>是</td><td>string</td><td>待验证字符串</td></tr><tr><td>signature</td><td>是</td><td>string</td><td>签名(对plainText字段进行SHA256withRSA签名)</td></tr><tr><td>authorizationCode</td><td>是</td><td>string</td><td>设备授权码</td></tr></tbody></table>

### **请求示例**

```json
{
    "data": "{\"apiKey\":\"cd384rt80f5575dc\",\"reviewPubkey\":\"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi7RszjTelyGLJmpyXUPKo7xSUGQSv/5fUXO0npAGKP0oukx7tHQ6nJsnXdztX3yR3zhgjBnCdqN8DBPr+LzF4kSzG4t2/a6NdFlnPAUrtFZcqRbGDwliIqlKb5XCTu0Pgs6fNjx8tPE6XIW7OX/8NmQIbBw9Qjn28gjSuaTAD9QIDAQAB\",\"plainText\":\"test\",\"signature\":\"Fy6kcJsOY38jO+m/OsvmVj9kJdkC8CCl4WwPbMjWP/AAGS3dAAUHgIGQQlkIo3uBiEIIr85axpYmmsvXfeGg3MmYLim1XOeI65oOnDN084EaXjlCvTlFMqnt61YUYcN/9WPRjtbOsfSaK1ivOfKux9Fh8lGzRoNYKahCA1t69Kk=\",\"authorizationCode\":\"CFZQ-RJWN-VDDH\"}",
    "sign": "ee7809433ed0200b55f79e85f3489d455a28ac3f14c8757b7799f890f42d74e8"
}
```

### **返回示例**

```json
{
    "code": 200, // 状态码
    "msg": "成功", // 提示信息
    "data": {
        "uuid": "2DEA1BEB-CFE9-4E1D-9D88-F983D84D2E4W"
    }
}
```

* data 参数

<table><thead><tr><th width="168">参数名</th><th width="74">必填</th><th width="99">类型</th><th>说明</th></tr></thead><tbody><tr><td>uuid</td><td>是</td><td>string</td><td>审核设备标识</td></tr></tbody></table>

### **返回状态码**

<table><thead><tr><th width="164">状态码</th><th>说明</th></tr></thead><tbody><tr><td>4015</td><td>查询授权码失败</td></tr><tr><td>4016</td><td>授权码失效或不存在</td></tr><tr><td>4018</td><td>添加审核设备失败</td></tr><tr><td>4019</td><td>SHA256withRSA验签失败</td></tr></tbody></table>

## 下发（提币） <a href="#transfer" id="transfer"></a>

企业可以通过CoinsDo API 来执行全自动下发或人工手动审批下发。

### 审批角色说明

数据提交：有这个权限的子账号可以添加下发记录。

数据审批：有这个权限的子账号可以审批提交者的下发记录。有数据审批权限的子账号（一审）会审核所提交的数据然后进行签名。一审审核的数据是业务ID、发送地址、下发数量、币种/协议、和标识/代币ID/合约地址。

执行审批：有这个权限的子账号可以执行审批后的下发记录。执行审批权限的子账号（二审）会审核一审所签名的数据然后进行签名。二审审核的数据是业务ID和选择下发钱包。二审签名后会执行下发记录。

### 手动下发

企业会先设置提交数据、数据审批、和执行审批权限给子账号。这三个角色都是由不同的人物来处理。首先，拥有数据提交权限的子账号会提交下发记录，填写币种/协议、标识/代币ID/合约地址、接受地址、和下发数量。其次，拥有数据审批权限的子账号会对提交的数据进行审批。签名后会提交给拥有执行审批的子账号签名然后执行下发。

<figure><img src="https://254105150-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fx1sJpsLJyJ12eTG1bUgP%2Fuploads%2FoBCxgXQaUZbg86SpsZcA%2Fimage.png?alt=media&#x26;token=73ccaf97-98cf-47c8-aac0-0ea8619c6131" alt=""><figcaption></figcaption></figure>

1. 具有提交数据权限的子账号可以使用企业业务服务器进行提款
2. 企业业务服务器透过CoinsDo API提交下发请求给CoinsDo服务器
3. 企业设置的审核人员A可以进行数据审批并签名
4. 企业设置的审核人员B可以进行执行审批并签名然后提交签名A和B给CoinsDo服务器
5. CoinsDo服务器收到企业设置的审核人员的签名后透过CoinsDo API提交带有签名的数据给企业下发钱包客户端
6. 企业下发钱包客户端对收到的签名A和签名B进行校签后执行下发

### 自动下发

企业必须把提交数据、数据审批、和执行审批权限分配给一个服务端账号才能执行自动下发方案。

企业也可以把自动下发的部分过程分配给服务端和普通账号。举个例子，服务端账号可以自动创建一个下发记录然后让其他两个普通账号来手动的数据审批和手动的执行审批那个下发记录。

<figure><img src="https://254105150-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fx1sJpsLJyJ12eTG1bUgP%2Fuploads%2FLimXn86gMd6anA5XZ7wY%2Fimage.png?alt=media&#x26;token=8e44293a-6700-4c7e-8086-c5119e0e1f1e" alt=""><figcaption></figcaption></figure>

1. 具有提交数据权限的子账号可以使用企业业务服务器进行提款
2. 企业业务服务器透过CoinsDo API提交下发请求和把数据签名后提交给CoinsDo服务器
3. CoinsDo服务器收到带有签名的数据后透过CoinsDo API提交给企业下发钱包客户端
4. 企业下发钱包客户端对收到带的签名的数据进行校签后执行下发

### **接口描述**

* 发起下发申请

#### **请求地址**

* `{URL}/v1/withdraw`

#### **请求方式**

* POST

#### **请求参数**

* Body 参数

<table><thead><tr><th width="173">参数名</th><th width="68">必填</th><th width="87">类型</th><th>说明</th></tr></thead><tbody><tr><td>data</td><td>是</td><td>string</td><td>内容（JSON字符串，如下）</td></tr></tbody></table>

```json
{
    "apiKey": "cd384rt80f5575dc",
    "submitAccount": "coinsdoTest",
    "address": "TKU69qcQPoR5jDEE7ertPpdaxoLGCTX4xR",
    "amount": "616.616",
    "coinsDoId": "3",
    "businessId": "TRX_999",
    "businessScene": "1",
    "timestamp": "1622775712229",
    "txMemo": "COINSDO TEST TRX",
    "reviewUuid": "A65F7B1C-8FF8-4E0D-ADF2-AE0BCB0F378B",
    "reviewSign": "DXoICpzZN7/yoHCLbb32czn0Goq9XLTdW9Dcn281qNNgcejzXPToGOJReA/wYMI0e3ikjAVxzXSDXImAFqslbjBbiR8PVnXImV6VBMYL5J3Lssfu4nZMPEPNgIFtAWlLk9drWoElGe/Ch6NaozD9VJx5xPNIPq7ErVwfeB+g2LM=",
    "reviewRemark": "trx test",
    "targetDeviceUuid": "2DEA1BEB-CFE9-4E1D-9D88-F983D84D2E4D",
    "approveUuid": "BD9D4D2C-6689-4FE1-88BB-C9DA5A251A30",
    "approveSign": "vPuFWmtV/KbemdN/5IqRhyfY63kp55HSZEErFa0rtJco861WkUsesaJ1U5kV0oX3bn5U8iVEKGeAzA37s/jMBy8hq62r1fstvhZ6vcgX5FuqtvvL8fTOeRuK9v85e7FR/89U2Jm/KbVt0US2Xe1oQz2D7lDvFW15ZtSQdp8JoVA=",
    "approveRemark": "trx test",
    "approveExpireTime": "1622775712"
}
```

* data 参数

<table><thead><tr><th width="171">参数名</th><th width="64">必填</th><th width="81">类型</th><th>说明</th></tr></thead><tbody><tr><td>apiKey</td><td>是</td><td>String</td><td>API KEY</td></tr><tr><td>submitAccount</td><td>是</td><td>String</td><td>提交账号(服务端审核账号)</td></tr><tr><td>address</td><td>是</td><td>String</td><td>下发地址</td></tr><tr><td>amount</td><td>是</td><td>String</td><td>下发数量</td></tr><tr><td>coinsDoId</td><td>是</td><td>String</td><td>币种ID(参数见币种列表)</td></tr><tr><td>businessId</td><td>是</td><td>String</td><td>业务ID(不可重复)</td></tr><tr><td>timestamp</td><td>是</td><td>String</td><td>时间戳(秒或毫秒)</td></tr><tr><td>businessScene</td><td>否</td><td>String</td><td>业务场景</td></tr><tr><td>txMemo</td><td>否</td><td>String</td><td>链上备注( XRP 和 EOS tag 填这里）</td></tr><tr><td>reviewUuid</td><td>否</td><td>String</td><td><p>数据审批(一审)设备标识</p><p>下发带一审自动审批时必填</p></td></tr><tr><td>reviewSign</td><td>否</td><td>String</td><td>数据审批(一审)数据签名<br>下发带一审自动审批时必填，进行RSA-SHA256签名：businessId=业务ID&#x26;address=地址&#x26;amount=数量&#x26;coinsDoId=coinsDoId，<br>❗注：数量字段需去除小数位后多余的零，<br>例：amount=1.010 应转换成 amount=1.01、amount=1.000 应转换成 amount=1)</td></tr><tr><td>reviewRemark</td><td>否</td><td>String</td><td>数据审批(一审)备注</td></tr><tr><td>targetDeviceUuid</td><td>否</td><td>String</td><td>审批执行(二审)指定下发钱包<br>下发带二审自动审批时必填</td></tr><tr><td>approveUuid</td><td>否</td><td>String</td><td>审批执行(二审)设备标识<br>下发带二审自动审批时必填</td></tr><tr><td>approveSign</td><td>否</td><td>String</td><td>审批执行(二审)数据签名<br>下发带二审自动审批时必填，需按所显示的参数顺序进行RSA-SHA256签名：businessId=业务ID&#x26;deviceUuid=CoinSend客户端标识&#x26;approveExpireTime=二审失效时间戳</td></tr><tr><td>approveRemark</td><td>否</td><td>String</td><td>审批执行(二审)备注</td></tr><tr><td>approveExpireTime</td><td>是</td><td>String</td><td>二审失效时间戳(精确到秒)<br>下发带二审自动审批时必填</td></tr><tr><td>targetAddrIndex</td><td>否</td><td>String</td><td>指定发送地址派生序号<br>指定发送地址后审批执行(二审)数据签名规则更改，需按所显示的参数顺序进行RSA-SHA256签名：businessId=业务ID&#x26;deviceUuid=CoinSend客户端标识&#x26;targetAddrIndex=指定发送地址派生序号&#x26;approveExpireTime=二审失效时间戳</td></tr><tr><td>keepApproveSign</td><td>否</td><td>Boolean</td><td>keepApproveSign传True时，若数据审批(一审)被拦截，仍可保留符合条件的审批执行(二审)签名即无需人工二审；如无需保留二审签名，请勿传keepApproveSign 参数，或将其传False</td></tr></tbody></table>

#### **请求示例**

```json
{
    "data": "{\"apiKey\":\"cd384rt80f5575dc\",\"submitAccount\":\"coinsdoTest\",\"address\":\"TKU69qcQPoR5jDEE7ertPpdaxoLGCTX4xR\",\"amount\":\"616.616\",\"coinsDoId\":\"3\",\"businessId\":\"TRX_999\",\"approveExpireTime\":\"1622775712\",\"businessScene\":\"1\",\"timestamp\":\"1622775712229\",\"txMemo\":\"COINSDOTESTTRX\",\"reviewUuid\":\"A65F7B1C-8FF8-4E0D-ADF2-AE0BCB0F378B\",\"reviewSign\":\"3pIsqtrXPG/I4o/YGLOvtIvBUUrBrRyFehlt0wkezWU4u0dj5xXEoZ9E4EXSes9WawqfpxrRfOIHgXV1BnPNM2tt0DLloCnJkzR7smC26+z6kuZb87s3hitZWgM3UaWWghB8/qNMQImvCZ6MREqChoNmEVyaqCnTbjorKsrU/V0=\",\"reviewRemark\":\"trxreview\",\"targetDeviceUuid\":\"2DEA1BEB-CFE9-4E1D-9D88-F983D84D2E4D\",\"approveUuid\":\"BD9D4D2C-6689-4FE1-88BB-C9DA5A251A30\",\"approveSign\":\"vPuFWmtV/KbemdN/5IqRhyfY63kp55HSZEErFa0rtJco861WkUsesaJ1U5kV0oX3bn5U8iVEKGeAzA37s/jMBy8hq62r1fstvhZ6vcgX5FuqtvvL8fTOeRuK9v85e7FR/89U2Jm/KbVt0US2Xe1oQz2D7lDvFW15ZtSQdp8JoVA=\",\"approveRemark\":\"trxapprove\",\"keepApproveSign\":True}",
    "sign": "d32bfb9905f0b6713be45fea2bce001449146a43b3319479076a6d8c2bf22055"
}
```

#### **返回示例**

```json
{
    "code": 200, // 状态码
    "msg": "成功", // 提示信息
    "data": null // 返回内容
}
```

#### **返回状态码**

<table><thead><tr><th width="138">状态码</th><th>说明</th></tr></thead><tbody><tr><td>4006</td><td>下发币种暂不支持</td></tr><tr><td>4008</td><td>业务ID已存在</td></tr><tr><td>4009</td><td>新增下发记录失败</td></tr><tr><td>4011</td><td>查询审核设备失败</td></tr><tr><td>4012</td><td>数据审批(一审)设备不存在</td></tr><tr><td>4013</td><td>审核设备未绑定审核账号</td></tr><tr><td>4014</td><td>数据审批(一审)签名验签失败</td></tr><tr><td>4015</td><td>查询授权码失败</td></tr><tr><td>4016</td><td>授权码失效或不存在</td></tr><tr><td>4017</td><td>查询审核设备失败</td></tr><tr><td>4018</td><td>添加审核设备失败</td></tr><tr><td>4019</td><td>SHA256withRSA验签失败</td></tr><tr><td>4020</td><td>查询商户子账户失败</td></tr><tr><td>4021</td><td>没有数据提交权限</td></tr><tr><td>4022</td><td>没有数据审批(一审)权限</td></tr><tr><td>4023</td><td>超过币种最大小数位</td></tr><tr><td>4024</td><td>数据审批(一审)参数不全</td></tr><tr><td>4025</td><td>下发地址格式有误</td></tr><tr><td>4026</td><td>审批执行(二审)参数不全</td></tr><tr><td>4027</td><td>审批执行(二审)设备不存在</td></tr><tr><td>4028</td><td>审批执行(二审)签名验签失败</td></tr><tr><td>4029</td><td>没有审批执行(二审)权限</td></tr><tr><td>4030</td><td>下发数量超过数据审批(一审)额度</td></tr><tr><td>4031</td><td>下发数量超过审批执行(二审)额度</td></tr><tr><td>4032</td><td>查询钱包失败</td></tr><tr><td>4033</td><td>钱包不存在</td></tr><tr><td>4038</td><td>校验下发地址失败</td></tr><tr><td>4039</td><td>提交账号已停用</td></tr><tr><td>4040</td><td>数据审批(一审)设备所绑定的账号已停用</td></tr><tr><td>4041</td><td>审批执行(二审)设备所绑定的账号已停用</td></tr><tr><td>4048</td><td>下发数量小于最低要求</td></tr><tr><td>4049</td><td>提交账号不是服务端账号</td></tr><tr><td>4056</td><td>数据审批账号当前绑定的审核设备未在钱包授权，请联系管理员重新授权钱包</td></tr><tr><td>4057</td><td>执行审批账号当前绑定的审核设备未在钱包授权，请联系管理员重新授权钱包</td></tr><tr><td>4065</td><td>检查业务ID失败</td></tr><tr><td>4066</td><td>检查支持的币种失败</td></tr><tr><td>4067</td><td>CoinsDoId应是整数</td></tr><tr><td>4069</td><td>商户子账户不存在</td></tr><tr><td>4070</td><td>请指定币种</td></tr><tr><td>4160</td><td>审批执行(二审)审核失效时间不能为空</td></tr><tr><td>4161</td><td>审批执行(二审)审核失效时间无效</td></tr><tr><td>4162</td><td>当前客户端版本不支持传入审核失效时间</td></tr></tbody></table>

### **回调通知**

<table><thead><tr><th width="143">参数名</th><th width="70">必填</th><th width="110">类型</th><th>说明</th></tr></thead><tbody><tr><td>data</td><td>是</td><td>string</td><td>内容（JSON字符串，如下）</td></tr></tbody></table>

```json
{
    "txTime": "1661336430",
    "businessId": "0x6305fb61_JDXqh_0_2",
    "mainnet": "TRX",
    "withdrawStatus": "1",
    "txMemo": "0",
    "feeSymbol": "TRX",
    "blockNumber": "29232059",
    "txFee": "8.34196",
    "coinName": "JST",
    "txHash": "b29e917066ed433b5d2753ae07a9b4bd71245509f8f9de51ec5a2e43425f91a8"
}
```

* data 参数

<table><thead><tr><th width="171">参数名</th><th width="66">必填</th><th width="103">类型</th><th>说明</th></tr></thead><tbody><tr><td>businessId</td><td>是</td><td>string</td><td>业务ID</td></tr><tr><td>withdrawStatus</td><td>是</td><td>string</td><td>下发状态码和说明：<br>1 - 成功<br>2 - 驳回<br>5 - 已取消<br>6 - 取消 (限制合约)<br>7 - 取消 (签名过期)<br>可扩展字段，后续会增加其他的状态回调</td></tr><tr><td>txHash</td><td>否</td><td>string</td><td>交易哈希</td></tr><tr><td>blockNumber</td><td>否</td><td>string</td><td>区块高度</td></tr><tr><td>txTime</td><td>否</td><td>string</td><td>交易确认时间戳(秒)</td></tr><tr><td>txFee</td><td>否</td><td>string</td><td>矿工费</td></tr><tr><td>feeSymbol</td><td>否</td><td>string</td><td>矿工费单位/标识</td></tr><tr><td>businessScene</td><td>否</td><td>string</td><td>业务场景(API提交该字段的原数据返回)</td></tr><tr><td>txMemo</td><td>否</td><td>string</td><td>链上备注</td></tr><tr><td>mainnet</td><td>是</td><td>string</td><td>主链名称</td></tr><tr><td>coinName</td><td>是</td><td>string</td><td>币种名称</td></tr></tbody></table>

#### **请求示例**

```json
{
    "data": "{\"txTime\":\"1661336430\",\"businessId\":\"0x6305fb61_JDXqh_0_2\",\"mainnet\":\"TRX\",\"withdrawStatus\":\"1\",\"txMemo\":\"0\",\"feeSymbol\":\"TRX\",\"blockNumber\":\"29232059\",\"txFee\":\"8.34196\",\"coinName\":\"JST\",\"txHash\":\"b29e917066ed433b5d2753ae07a9b4bd71245509f8f9de51ec5a2e43425f91a8\"}",
    "sign": "1b248bbf33dffb5004f4f179bb4b20e1a455e5c7d3be366c0b07e75ddc229d10"
}
```

#### **返回示例**

```json
{
    "code": 200, // 状态码
    "msg": "成功", // 提示信息
    "data": {
        "businessId": "TRX_999"
    } 
}
```

* data 参数

<table><thead><tr><th width="197">参数名</th><th width="80">必填</th><th width="100">类型</th><th>说明</th></tr></thead><tbody><tr><td>onlineStatus</td><td>是</td><td>string</td><td>在线状态(0.离线 1.在线)</td></tr><tr><td>useStatus</td><td>是</td><td>string</td><td>使用状态（0.停用 1.启用）</td></tr><tr><td>devicePublicKey</td><td>是</td><td>string</td><td>钱包公钥</td></tr><tr><td>deviceRegisterTime</td><td>是</td><td>string</td><td>钱包注册时间戳(秒)</td></tr><tr><td>deviceExpiryTime</td><td>是</td><td>string</td><td>钱包过期时间戳(秒)</td></tr><tr><td>addressList</td><td>否</td><td>array</td><td>发币地址列表</td></tr></tbody></table>

* addressList 参数

<table><thead><tr><th width="198">参数名</th><th width="82">必填</th><th width="99">类型</th><th>说明</th></tr></thead><tbody><tr><td>currency</td><td>是</td><td>string</td><td>币种/协议</td></tr><tr><td>flag</td><td>是</td><td>string</td><td>标识/代币ID/合约地址</td></tr><tr><td>address</td><td>是</td><td>string</td><td>钱包发币地址</td></tr><tr><td>balance</td><td>否</td><td>string</td><td>地址余额</td></tr></tbody></table>

#### **返回状态码**

<table><thead><tr><th width="199">状态码</th><th>说明</th></tr></thead><tbody><tr><td>4032</td><td>查询钱包失败</td></tr><tr><td>4033</td><td>钱包不存在</td></tr><tr><td>4034</td><td>查询地址失败</td></tr><tr><td>4035</td><td>查询币种失败</td></tr><tr><td>4036</td><td>查询余额失败</td></tr><tr><td>4037</td><td>查询钱包在线状态失败</td></tr></tbody></table>

## 下发记录详情 <a href="#transfer" id="transfer"></a>

### **接口描述**

* 查询下发记录详情

### **请求地址**

* `{URL}/v1/listWithdrawRecordDetail`

### **请求方式**

* POST
* Body 参数

<table><thead><tr><th width="105.84765625">参数名</th><th width="114.82421875">必填</th><th width="134.23828125">类型</th><th>说明</th></tr></thead><tbody><tr><td>data</td><td>是</td><td>string</td><td>内容（JSON字符串，如下）</td></tr></tbody></table>

```json
{
    "apiKey": "aa465953d55641b3",
    "businessIdList": "20241125T023627_615, 20241125T013051_799",
    "timestamp": "2847982343622"
}
```

* data参数

<table><thead><tr><th width="181.3046875">参数名</th><th width="63.38671875">必填</th><th width="87.125">类型</th><th>说明</th></tr></thead><tbody><tr><td>apiKey</td><td>是</td><td>string</td><td>API KEY</td></tr><tr><td>businessIdList</td><td>是</td><td>string</td><td>下发记录业务ID，多笔以逗号分隔</td></tr><tr><td>timestamp</td><td>是</td><td>string</td><td>时间戳 (秒或毫秒)</td></tr></tbody></table>

### **请求示例**

```json
{
    "data": "{\"apiKey\":\"aa465953d55641b3\",\"businessIdList\":\"20241125T023627_615, 20241125T013051_799\",\"timestamp\":\"2847982343622\"}",
    "sign": "22212634c772653e4074347d36040d9c51613c9a827591b12ea5888e6c301fbe"
}
```

### **返回示例**

```json
{
    "success": true,
    "code": 200,
    "msg": "Success",
    "data": [
        {
            "businessId": "20241125T013051_799",
            "chain": "TRX",
            "currency": "TRX",
            "flag": "TRX",
            "coinsDoId": null,
            "fromAddress": "TUsh9f5waEaHmeKPM1dTKg1DAvPYEktB9L",
            "toAddress": "T9yTVCyAvXpHE4MKji5e6nhZf7RqpxyiSZ",
            "amount": "100",
            "withdrawDeviceUuid": "12DEFEF7-6D5B-4C94-8967-4DEC062B790E",
            "dataApprover": "merchant_child_test2",
            "dataApproveTime": "1732498297",
            "executiveApprover": "merchant_child_test2",
            "executiveApproveTime": "1732498368",
            "withdrawStatus": 6,
            "txHash": "ec10197c20a1be2a3c07f98c3ac62ab11b3243a22849f7a77f7d4215499c6314",
            "txTime": "1732498386",
            "callbackStatus": -1,
            "callbackTime": null,
            "createTime": "1732498257",
            "unsentMsgList": null
        },
        {
            "businessId": "20241125T023627_615",
            "chain": "TRX",
            "currency": "TRX",
            "flag": "TRX",
            "coinsDoId": null,
            "fromAddress": "TUsh9f5waEaHmeKPM1dTKg1DAvPYEktB9L",
            "toAddress": "TQPrt12nsL9Ks7on5LUcG99UUXtFhJDgsK",
            "amount": "50",
            "withdrawDeviceUuid": "12DEFEF7-6D5B-4C94-8967-4DEC062B790E",
            "dataApprover": "merchant_child_test2",
            "dataApproveTime": "1732517994",
            "executiveApprover": "merchant_child_test2",
            "executiveApproveTime": "1732518023",
            "withdrawStatus": 6,
            "txHash": "e54b3c7b5ba6a2e46d7c99e2034578f0f5314644c88126a748e6333c6385bc74",
            "txTime": "1732518048",
            "callbackStatus": -1,
            "callbackTime": null,
            "createTime": "1732502211",
            "unsentMsgList": null
        }
    ]
}
```

## 获取下发统计 <a href="#transfer" id="transfer"></a>

### **接口描述**

* 查询下发统计

### **请求地址**

* `{URL}/v1/withdrawStatistic`

### **请求方式**

* POST
* Body 参数

<table><thead><tr><th width="105.84765625">参数名</th><th width="114.82421875">必填</th><th width="134.23828125">类型</th><th>说明</th></tr></thead><tbody><tr><td>data</td><td>是</td><td>string</td><td>内容（JSON字符串，如下）</td></tr></tbody></table>

```json
{
    "apiKey": "7bb52d79e46e47ab",
    "withdrawDeviceUuid": "3FA9B3EE-6275-49F4-8886-13B5A58F32CF",
    "startTime": "1738886400",
    "endTime": "1738943999",
    "timestamp": "1740379248"
}
```

* data 参数

<table><thead><tr><th width="181.3046875">参数名</th><th width="63.38671875">必填</th><th width="87.125">类型</th><th>说明</th></tr></thead><tbody><tr><td>apiKey</td><td>是</td><td>string</td><td>API KEY</td></tr><tr><td>withdrawDeviceUuid</td><td>是</td><td>string</td><td>设备UUID</td></tr><tr><td>startTime</td><td>是</td><td>string</td><td>开始时间 (時區UTC+0) (最多查一天且不可跨天)</td></tr><tr><td>endTime</td><td>是</td><td>string</td><td>结束时间 (時區UTC+0) (最多查一天且不可跨天)</td></tr><tr><td>timestamp</td><td>是</td><td>string</td><td>时间戳 (秒或毫秒)</td></tr></tbody></table>

### **请求示例**

```json
{
    "data":"{\"apiKey\":\"7bb52d79e46e47ab\",\"withdrawDeviceUuid\":\"3FA9B3EE-6275-49F4-8886-13B5A58F32CF\",\"startTime\":\"1738886400\",\"endTime\":\"1738943999\",\"timestamp\":\"1740379248\"}",
    "sign":"03dabf4073bad9d5fcde3b881bba076cae211ac28b11995289740f96f51162a5"
}
```

### **返回示例**

```json
{
    "code": 200,
    "msg": "Success",
    "success": true,
    "data": {
        "deviceName": "alpha",
        "deviceRemark": "Pixel 7-5be6",
        "withdrawDeviceUuid": "3FA9B3EE-6275-49F4-8886-13B5A58F32CF",
        "details": [
            {
              "chain": "ADA",
              "currency": "ADA",
              "currencyName": "ADA",
              "flag": "ADA",
              "customName": "ADA",
              "withdrawTotalAmount": 0,
              "balance": 0,
              "lastUpdateTime": null,
              "currencyType": 0
            },
            {
              "chain": "ALGO",
              "currency": "ALGO",
              "currencyName": "ALGO",
              "flag": "ALGO",
              "customName": "ALGO",
              "withdrawTotalAmount": 0,
              "balance": 0,
              "lastUpdateTime": null,
              "currencyType": 0
            }
        ]
    }
}
```

* data 参数

| 参数名                | 必填 | 类型     | 说明     |
| ------------------ | -- | ------ | ------ |
| deviceName         | 是  | string | 设备名称   |
| deviceRemark       | 是  | string | 设备备注   |
| withdrawDeviceUuid | 是  | string | 设备UUID |
| details            | 是  | array  | 统计资料   |

* details 参数

<table><thead><tr><th width="189.046875">参数名</th><th>必填</th><th>类型</th><th>说明</th></tr></thead><tbody><tr><td>chain</td><td>是</td><td>string</td><td>主链名称</td></tr><tr><td>currency</td><td>是</td><td>string</td><td>币种/协议</td></tr><tr><td>currencyName</td><td>是</td><td>string</td><td>币名称</td></tr><tr><td>flag</td><td>是</td><td>string</td><td>合约地址/币种</td></tr><tr><td>customName</td><td>否</td><td>string</td><td>自定义名称</td></tr><tr><td>withdrawTotalAmount</td><td>是</td><td>Decimal</td><td>下发集数量</td></tr><tr><td>balance</td><td>是</td><td>Decimal</td><td>余额</td></tr><tr><td>lastUpdateTime</td><td>否</td><td>string</td><td>最后更新时间</td></tr><tr><td>currencyType</td><td>是</td><td>Integer</td><td>币种类型 (0.主币 1.代币)</td></tr></tbody></table>

### **返回状态码**

<table><thead><tr><th width="105.85546875">状态码</th><th>说明</th></tr></thead><tbody><tr><td>4002</td><td>参数格式错误</td></tr><tr><td>4003</td><td>JSON数据转换异常</td></tr><tr><td>4004</td><td>APIKEY不存在</td></tr><tr><td>4005</td><td>ip受限，当前ip:</td></tr><tr><td>4007</td><td>验签失败</td></tr><tr><td>4010</td><td>请求过期</td></tr><tr><td>4032</td><td>查询钱包失败</td></tr><tr><td>4068</td><td>检查APIKEY失败</td></tr><tr><td>4099</td><td>请求次数太频繁</td></tr><tr><td>4116</td><td>选择时间超过时间限定范围</td></tr><tr><td>4117</td><td>查询下发统计数据异常</td></tr><tr><td>4118</td><td>查询币种配置失败</td></tr><tr><td>4119</td><td>查询支持的币种列表失败</td></tr><tr><td>4123</td><td>开始时间超过结束时间</td></tr><tr><td>4124</td><td>查询时间需为同一天</td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://coinsdo.gitbook.io/docs/cn/coinsdo-api-integration/coinsdo-api-jie-ru-wen-dang/coinsend-pian.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
