钱包
钱包是用于管理数字资产的安全容器。Fystack 提供多种钱包类型以满足不同需求,包括 Hyper wallet 和 MPC(多方计算)钱包。
钱包类型
Fystack 支持两种钱包类型:
| Hyper | MPC | |
|---|---|---|
| 工作原理 | 每个工作区的密钥均从一个主种子派生(HD 派生) | 私钥被拆分为分片分布在各 Mpcium 节点上,从不在同一处组装 |
| 安全性 | 高 | 机构级,门限签名 |
| 创建速度 | 即时,立即返回 success |
7-15 秒 |
| 成本 | 较低 | 较高 |
| 恢复 | 从 HD 种子重新生成 | 多方恢复 |
| 适用场景 | 终端用户钱包、消费级应用、大批量生成 | 热钱包、托管、交易所和高价值钱包 |
创建钱包
要创建新钱包,请携带所需参数向 /wallets endpoint 发送 POST 请求。
参数
- Name
- name
- Type
- string
- Required
- required
- Description
钱包的描述性名称。
- Name
- wallet_type
- Type
- enum: standard | mpc | hd_mpc
- Required
- required
- Description
要创建的钱包类型:
standard:Hyper。从加密的工作区种子进行 HD 派生。单一密钥,高吞吐量。mpc:MPC Cloud。完全托管的 MPC 签名。每笔交易都由你的策略和审批决定。hd_mpc:Co-signed HD MPC。添加在你的 HD 主密钥之下,并与你的服务器 Cosigner 共同签名,因此 Fystack 无法单独签名。请先设置你的 Cosigner。
- Name
- wallet_purpose
- Type
- string
- Default
- default:general
- Description
钱包的用途。必须是
general、user、gas_tank、payment或one_time_use之一。如果设置为user,该钱包将不会在门户中显示。
- Name
- gas_sponsorship_enabled
- Type
- boolean
- Default
- default:false
- Description
为该钱包在 EVM、Solana 和 TRON 网络上的代币转账代付 gas,使钱包无需持有原生币。Gas 由工作区的 gas tank 支付,请参阅 Gas Station。之后也可以在钱包设置中更改此项。
- Name
- sweep_task_id
- Type
- string
- Description
要关联到该钱包的现有归集任务的 UUID。请先创建归集任务,然后从控制台的 Automation 页面复制其 ID。
什么是归集任务?自动将资金从新钱包中转出
归集任务会在钱包余额达到设定的美元价值时,自动将资金从该钱包转移到另一个钱包或地址,因此你无需手动归集充值。
为新钱包设置归集任务:
- 在控制台的 Automation > Add Sweep Task 下 创建归集任务。请参阅自动化。
- 从 Automation 页面 复制归集任务 ID。
- 创建每个钱包时,将其作为
sweep_task_id传入。
归集任务的工作原理
- 自动监控:系统持续监控钱包余额
- 阈值触发:当钱包的美元价值达到任务的最低触发值时,触发归集
- 灵活的目标地址:资金可以归集到内部钱包,或地址簿中的外部地址
在多个钱包间复用同一个归集任务
为所有应归集到同一目标的钱包关联相同的 sweep_task_id。之后只需更新这一个任务,就会应用到所有关联的钱包。
使用 hd_mpc 前请先设置服务器 Cosigner
hd_mpc 钱包派生自一个与服务器 Cosigner 共同签名的 HD-MPC 主密钥。调用此 endpoint 之前,请先安装并配对服务器 Cosigner,然后在 Fystack 控制台的创建钱包弹窗中创建 HD 主密钥。创建钱包时 Cosigner 必须在线。
响应
- Name
- success
- Type
- boolean
- Description
表示请求是否成功。
- Name
- message
- Type
- string
- Description
描述操作结果的消息。
- Name
- code
- Type
- integer
- Description
表示结果状态的数字代码(0 表示成功)。
- Name
- data
- Type
- object
- Description
包含钱包详细信息。
- Name
- wallet_id
- Type
- string
- Description
新创建钱包的 UUID。
- Name
- status
- Type
- string
- Description
钱包创建过程的当前状态。
请求:基础钱包
import { FystackSDK, Environment } from "@fystack/sdk"const apiCredentials = {apiKey: process.env.API_KEY,apiSecret: process.env.API_SECRET}const sdk = new FystackSDK({credentials: apiCredentials,environment: Environment.Sandbox,logger: true})await sdk.createWallet({name: 'Treasury wallet',walletType: WalletType.MPC})
请求:带归集任务
import { FystackSDK, Environment } from "@fystack/sdk"const apiCredentials = {apiKey: process.env.API_KEY,apiSecret: process.env.API_SECRET}const sdk = new FystackSDK({credentials: apiCredentials,environment: Environment.Sandbox,logger: true})await sdk.createWallet({name: 'User deposit wallet',walletType: WalletType.Standard,walletPurpose: WalletPurpose.User,sweepTaskId: '987f6543-e21c-43b2-a654-321098765432'})
Response
200{
"success": true,
"message": "success",
"code": 0,
"data": {
"wallet_id": "c2b71329-34c9-45aa-89d3-ddde8b15dec5",
"status": "pending"
}
}
钱包创建状态
钱包的创建过程是异步进行的。初始响应会包含一个 status 字段,其值为以下之一:
pending:钱包创建过程已开始,但尚未完成。success:钱包已成功创建。error:创建钱包时出错。
对于 standard 类型的钱包,创建后状态会立即变为 success。
对于 mpc 类型的钱包,由于需要在多个参与方之间安全地生成密钥,创建过程可能需要更长时间。
响应
- Name
- wallet_id
- Type
- string
- Description
正在创建的钱包的 UUID。
- Name
- status
- Type
- string
- Description
钱包创建过程的当前状态。可以是
pending、success或error。
请求
curl -X GET https://api.fystack.io/api/v1/wallets/creation-status/c2b71329-34c9-45aa-89d3-ddde8b15dec5 \
-H "ACCESS-API-KEY: your_api_key" \
-H "ACCESS-TIMESTAMP: 1667836889" \
-H "ACCESS-SIGN: YourBase64EncodedSignature=="
Response
200{
"wallet_id": "c2b71329-34c9-45aa-89d3-ddde8b15dec5",
"status": "pending"
}
列出所有钱包
此 endpoint 用于获取工作区中所有钱包的分页列表。
参数
- Name
- wallet_type
- Type
- string
- Description
按类型筛选钱包。
- Name
- limit
- Type
- integer
- Description
限制返回的钱包数量。
- Name
- offset
- Type
- integer
- Description
开始返回结果之前要跳过的钱包数量。
请求
import { FystackSDK, Environment } from "@fystack/sdk"const apiCredentials = {apiKey: process.env.API_KEY,apiSecret: process.env.API_SECRET}const sdk = new FystackSDK({credentials: apiCredentials,environment: Environment.Sandbox,logger: true})const wallets = await sdk.getWallets()console.log('wallets', wallets)
Response
200[
{
"id": "7f00773a-abbd-434b-b322-7b4016b3ff4a",
"name": "MPC wallet",
"role": "wallet_admin",
"wallet_type": "mpc",
"value_usd": "0",
"top_assets": [],
"wallet_purpose": "general"
},
{
"id": "8a91b223-4c9f-5ffc-0f1g-235787cfc3f1",
"name": "Hyper wallet",
"role": "wallet_admin",
"wallet_type": "standard",
"value_usd": "0",
"top_assets": [],
"wallet_purpose": "general"
}
]
获取充值地址
此 endpoint 返回指定钱包和资产的充值地址。
查询参数
- Name
- asset_id
- Type
- string
- Description
要获取充值地址的资产的 UUID。
- Name
- address_type
- Type
- string
- Description
要生成的区块链地址类型。必须是以下之一:
evm、sol、tron或btc。
响应
- Name
- success
- Type
- boolean
- Description
表示请求是否成功。
- Name
- data
- Type
- object
- Description
包含充值地址详细信息。
- Name
- asset_id
- Type
- string
- Description
资产的 UUID。
- Name
- address
- Type
- string
- Description
用于充值的区块链地址。
- Name
- qr_code
- Type
- string
- Description
充值地址二维码图片的 URL。
如果省略 address_type,Fystack 会尽可能根据所请求的资产选择地址类型。
请求
import { FystackSDK, Environment } from "@fystack/sdk"const apiCredentials = {apiKey: process.env.API_KEY,apiSecret: process.env.API_SECRET}const sdk = new FystackSDK({credentials: apiCredentials,environment: Environment.Sandbox,logger: true})const response = await sdk.getDepositAddress("c2b71329-34c9-45aa-89d3-ddde8b15dec5",AddressType.Evm)// Get Solana deposit addressconst response = await sdk.getDepositAddress("c2b71329-34c9-45aa-89d3-ddde8b15dec5",AddressType.Solana)// Get Tron deposit addressconst response = await sdk.getDepositAddress("c2b71329-34c9-45aa-89d3-ddde8b15dec5",AddressType.Tron)
Response
200{
"success": true,
"message": "success",
"code": 0,
"data": {
"address": "0xA793457d84CFD255Ed68295984300C4f799E759F",
"qr_code": "https://quickchart.io/qr?size=300&margin=2&text=0xA793457d84CFD255Ed68295984300C4f799E759F"
}
}
获取钱包资产概览
此 endpoint 返回钱包资产及其余额、有效冻结、美元价格和网络详情。可用于展示钱包资产组合。已隐藏的钱包资产和已禁用的网络不包含在内。
路径参数
- Name
- wallet_id
- Type
- string (uuid)
- Description
钱包的 UUID。
查询参数
- Name
- offset
- Type
- integer
- Description
要跳过的记录数。必须介于 0 到 100000 之间。
- Name
- limit
- Type
- integer
- Description
要返回的最大记录数。必须介于 0 到 1000 之间。省略此参数或将其设为 0 将返回所有匹配记录。
- Name
- is_native_only
- Type
- boolean
- Description
设置为
true时仅返回原生资产。
- Name
- search
- Type
- string
- Description
按资产名称或符号搜索。最多 100 个字符。
- Name
- sort_by
- Type
- string
- Description
按
balance、price_usd或value_usd排序。省略时按名称排序。
- Name
- sort_order
- Type
- string
- Description
排序方向:
asc或desc。提供sort_by时默认为asc。
- Name
- min_value_usd
- Type
- number
- Description
仅返回美元总价值不低于该金额的资产。必须大于或等于 0。
- Name
- network_ids
- Type
- array of strings (uuid)
- Description
按网络 UUID 筛选。重复该查询参数即可包含多个网络。
响应
- Name
- success
- Type
- boolean
- Description
表示请求是否成功。
- Name
- message
- Type
- string
- Description
描述操作结果的消息。
- Name
- code
- Type
- integer
- Description
表示结果状态的数字代码(0 表示成功)。
- Name
- data
- Type
- array
- Description
匹配的钱包资产。没有匹配的资产时返回空数组。
- Name
- balance
- Type
- string
- Description
资产总余额,以十进制字符串形式返回。
- Name
- on_hold
- Type
- string
- Description
有效冻结所占用的金额,以十进制字符串形式返回。
- Name
- available_balance
- Type
- string
- Description
可用余额:总余额减去有效冻结金额。
- Name
- price_usd
- Type
- string
- Description
资产的美元单价,以十进制字符串形式返回。
- Name
- value_usd
- Type
- string
- Description
总余额乘以美元价格的结果,以十进制字符串形式返回。
- Name
- asset
- Type
- object
- Description
资产详情,包括其 UUID、名称、符号、小数位数和网络 ID。资产字段请参阅资产。
- Name
- network
- Type
- object
- Description
网络详情:
id、name、chain_id、logo_url,以及explorer_tx(如有)。
请求
curl -X GET "https://api.fystack.io/api/v1/wallets/c2b71329-34c9-45aa-89d3-ddde8b15dec5/overview?sort_by=value_usd&sort_order=desc&limit=20" \
-H "ACCESS-API-KEY: your_api_key" \
-H "ACCESS-TIMESTAMP: 1667836889" \
-H "ACCESS-SIGN: YourBase64EncodedSignature=="
Response
200{
"success": true,
"message": "success",
"code": 0,
"data": [
{
"balance": "125",
"on_hold": "25",
"available_balance": "100",
"asset": {
"id": "bf130274-e80c-43f3-aac3-c7dbfcbd74cd",
"name": "USDC (Binance-Peg USD Coin)",
"symbol": "USDC",
"decimals": 18,
"logo_url": "https://bscscan.com/token/images/centre-usdc_28.png",
"address": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",
"asset_type": "erc20",
"is_native": false,
"address_type": "evm",
"network_id": "c03b242f-5091-499c-86c5-78dbc47ed719",
"price_usd": "1"
},
"price_usd": "1",
"value_usd": "125",
"network": {
"id": "c03b242f-5091-499c-86c5-78dbc47ed719",
"name": "BNB Mainnet",
"chain_id": 56,
"logo_url": "https://s2.coinmarketcap.com/static/img/coins/64x64/1839.png",
"explorer_tx": "https://bscscan.com/tx/%s"
}
}
]
}
获取钱包余额
此 endpoint 返回钱包资产余额的扁平列表,附带资产和网络标识符。可用于按精确符号、资产 ID 或网络查询余额。已隐藏的钱包资产和已禁用的网络不包含在内。
路径参数
- Name
- wallet_id
- Type
- string (uuid)
- Description
钱包的 UUID。
查询参数
- Name
- offset
- Type
- integer
- Description
要跳过的记录数。必须介于 0 到 100000 之间。
- Name
- limit
- Type
- integer
- Description
要返回的最大记录数。必须介于 0 到 1000 之间。省略此参数或将其设为 0 将返回所有匹配记录。
- Name
- symbol
- Type
- array of strings
- Description
按精确的资产符号筛选,例如
USDC。匹配不区分大小写。每个符号必须包含 1 到 20 个字母或数字。
- Name
- asset_id
- Type
- array of strings (uuid)
- Description
按资产 UUID 筛选。
- Name
- network_id
- Type
- array of strings (uuid)
- Description
按网络 UUID 筛选。
- Name
- network_code
- Type
- array of strings
- Description
按精确的网络代码筛选,例如
BSC_MAINNET。匹配不区分大小写。每个代码必须包含 1 到 50 个字符。请使用网络中的internal_code。
重复某个查询参数即可提供多个值,例如 symbol=USDC&symbol=USDT。同一筛选条件中的多个值只需匹配其一即可。不同的筛选条件会组合生效,因此符号和网络筛选条件必须同时匹配。
响应
- Name
- success
- Type
- boolean
- Description
表示请求是否成功。
- Name
- message
- Type
- string
- Description
描述操作结果的消息。
- Name
- code
- Type
- integer
- Description
表示结果状态的数字代码(0 表示成功)。
- Name
- data
- Type
- array
- Description
匹配的钱包资产。没有匹配的资产时返回空数组。
- Name
- wallet_id
- Type
- string (uuid)
- Description
钱包的 UUID。
- Name
- asset_id
- Type
- string (uuid)
- Description
资产的 UUID。
- Name
- symbol
- Type
- string
- Description
资产符号。
- Name
- asset_name
- Type
- string
- Description
资产名称。
- Name
- asset_logo
- Type
- string
- Description
资产图标的 URL。
- Name
- network_id
- Type
- string (uuid)
- Description
网络的 UUID。
- Name
- network_code
- Type
- string
- Description
网络的内部代码。
- Name
- network_name
- Type
- string
- Description
网络名称。
- Name
- network_logo
- Type
- string
- Description
网络图标的 URL。
- Name
- balance
- Type
- string
- Description
资产总余额,以十进制字符串形式返回。
- Name
- on_hold
- Type
- string
- Description
有效冻结所占用的金额,以十进制字符串形式返回。
- Name
- available_balance
- Type
- string
- Description
可用余额:总余额减去有效冻结金额。
- Name
- price_usd
- Type
- string
- Description
资产的美元单价,以十进制字符串形式返回。
- Name
- value_usd
- Type
- string
- Description
总余额乘以美元价格的结果,以十进制字符串形式返回。
请求
curl -X GET "https://api.fystack.io/api/v1/wallets/c2b71329-34c9-45aa-89d3-ddde8b15dec5/balances?symbol=USDC&symbol=USDT&network_code=BSC_MAINNET&limit=20" \
-H "ACCESS-API-KEY: your_api_key" \
-H "ACCESS-TIMESTAMP: 1667836889" \
-H "ACCESS-SIGN: YourBase64EncodedSignature=="
Response
200{
"success": true,
"message": "success",
"code": 0,
"data": [
{
"wallet_id": "c2b71329-34c9-45aa-89d3-ddde8b15dec5",
"asset_id": "bf130274-e80c-43f3-aac3-c7dbfcbd74cd",
"symbol": "USDC",
"asset_name": "USDC (Binance-Peg USD Coin)",
"asset_logo": "https://bscscan.com/token/images/centre-usdc_28.png",
"network_id": "c03b242f-5091-499c-86c5-78dbc47ed719",
"network_code": "BSC_MAINNET",
"network_name": "BNB Mainnet",
"network_logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/1839.png",
"balance": "125",
"on_hold": "25",
"available_balance": "100",
"price_usd": "1",
"value_usd": "125"
}
]
}
按资产 ID 获取钱包余额
此 endpoint 返回钱包中单个资产的总余额。如需获取有效冻结和可用余额,请使用获取钱包余额。
路径参数
- Name
- wallet_id
- Type
- string (uuid)
- Description
钱包的 UUID。
- Name
- asset_id
- Type
- string (uuid)
- Description
资产的 UUID。
响应
- Name
- success
- Type
- boolean
- Description
表示请求是否成功。
- Name
- message
- Type
- string
- Description
描述操作结果的消息。
- Name
- code
- Type
- integer
- Description
表示结果状态的数字代码(0 表示成功)。
- Name
- data
- Type
- string
- Description
所请求资产的总余额,以十进制字符串形式返回。
请求
curl -X GET "https://api.fystack.io/api/v1/wallets/c2b71329-34c9-45aa-89d3-ddde8b15dec5/balance/bf130274-e80c-43f3-aac3-c7dbfcbd74cd" \
-H "ACCESS-API-KEY: your_api_key" \
-H "ACCESS-TIMESTAMP: 1667836889" \
-H "ACCESS-SIGN: YourBase64EncodedSignature=="
Response
200{
"success": true,
"message": "success",
"code": 0,
"data": "125"
}