P2P质押借贷相关操作 ( cli_wallet 命令 和 API )
基本概念:
* P2P质押借贷的资金池是个人池,与 AMM 池不同,与挂单比较类似。
* 每个账号可以建多个池,每个池内资产可相同也可不同。
1. 创建贷款要约(建池)
op name: credit_offer_create_operation
op code: 69
参数
fee 手续费,测试网默认手续费 1 TEST 基本手续费 + 交易大小费每 KB 加 1 BTS (类似转账 MEMO 费)
owner_account 账号,格式 1.2.x
asset_type 资产类型(币种),格式 1.3.x
balance 金额,整数表示,单位是聪
fee_rate 借款费率,整数表示,单位是百万分之一
max_duration_seconds 借款时长,单位是秒
min_deal_amount 最低借款金额(每笔),单位是聪
enabled 是否立即激活,可为 true 或者 false
auto_disable_time 自动下架时间,格式如 "2021-11-30T0:00:00"
acceptable_collateral 接受的抵押物列表及各抵押物折算价,二维数组格式
acceptable_borrowers 接受的借款人列表及各人最大借款额度,列表为空表示无限制,二维数组格式
注:
* 创建要约时,资金从账户余额锁定到要约中
* 抵押物列表为二维数组格式,可支持多种抵押资产, [[资产类型1,价格1],[资产类型2,价格2],...]
* 借款人列表(白名单)为二维数组格式,可为每人定义不同额度, [[账号1,额度1],[账号2,额度2],...]
* 由于上述两个列表可能很大,所以操作设置了KB费
* 如果借款人超过约定借款时长还没有还款,抵押资产自动全额划转给贷款人,借款人无需再还款
* 只能从已激活的池(要约)借款。“自动下架时间”表示到这个时间后,池(要约)自动变更为“未激活”状态。
* 贷款人应该根据市场行情及时调整抵押物折算价、借款时长、自动下架时间等参数(使用修改操作,另述)。
* 自动下架时间,是为了应对有时贷款人来不及调整参数的保守设置。
比如:
abit-test 新建P2P贷款要约,初始注资金额 1000 TEST,费率 万分之一,最长借款时长1天(86400秒),每笔最低借款20 TEST,立即激活,自动下架时间 2021年11月30号0点整,接受抵押物清单 [ CONTEST.BTC, CONTEST.USD1] , 价格分别为 100 TEST : 0.04 CONTEST.BTC, 1 TEST : 3 CONTEST.USD ,接受借款人清单 [ committee-account 额度 50 TEST, init0 额度 80 TEST ]。
注:由于有KB费存在,无法预估手续费,故采用交易构建器( transaction builder )来构造交易
begin_builder_transaction
(假设返回值为 0 )
add_operation_to_builder_transaction 0 [69,{"owner_account": "1.2.3833", "asset_type": "1.3.0", "balance": "100000000", "fee_rate": 100, "max_duration_seconds":86400, "min_deal_amount":2000000, "enabled":true, "auto_disable_time":"2021-11-30T0:00:00", "acceptable_collateral":[["1.3.1515",{"base":{"asset_id":"1.3.0","amount":10000000},"quote":{"asset_id":"1.3.1515","amount":4000000}}],["1.3.1516",{"base":{"asset_id":"1.3.0","amount":100000},"quote":{"asset_id":"1.3.1516","amount":3000}}]], "acceptable_borrowers":[["1.2.0", 5000000],["1.2.6",8000000]] }]
set_fees_on_builder_transaction 0 1.3.0
sign_builder_transaction 0 true
其中,
* TEST 资产精度是5位小数, 1000 TEST 等于 100000000 聪,所以金额 balance 填 100000000
* 万分之一 等于 百万分之100,所以费率 fee_rate 填 100
* CONTEST.BTC 的 id 是 1.3.1515 ,精度8位小数; CONTEST.USD1 的 id 是 1.3.1516 ,精度3位小数
* committee-account 是 1.2.0 , init0 是 1.2.6
1.1 检查操作结果
可以用 get_account_history 命令查看帐户操作历史,比如
get_account_history abit-test 10
结果示例
51517585 2021-11-08T18:21:12 credit_offer_create_operation abit-test (Fee: 1.10156 TEST) result: 1.21.0
格式为:块号 时间 操作 帐号 手续费 结果
上述结果 1.21.0 即贷款要约 ID ,可以通过 get_object 命令查看
>>> get_object 1.21.0
[{
"id": "1.21.0",
"owner_account": "1.2.3833",
"asset_type": "1.3.0",
"total_balance": 100000000,
"current_balance": 100000000,
"fee_rate": 100,
"max_duration_seconds": 86400,
"min_deal_amount": 2000000,
"enabled": true,
"auto_disable_time": "2021-11-30T00:00:00",
"acceptable_collateral": [[
"1.3.1515",{
"base": {
"amount": 10000000,
"asset_id": "1.3.0"
},
"quote": {
"amount": 4000000,
"asset_id": "1.3.1515"
}
}
],[
"1.3.1516",{
"base": {
"amount": 100000,
"asset_id": "1.3.0"
},
"quote": {
"amount": 3000,
"asset_id": "1.3.1516"
}
}
]
],
"acceptable_borrowers": [[
"1.2.0",
5000000
],[
"1.2.6",
8000000
]
]
}
]
结果与创建交易内容相同。
* "total_balance" 要约总金额
* "current_balance": 要约的当前可用金额
2. 撤回贷款要约(删池)
op name: credit_offer_delete_operation
op code: 70
参数
fee 手续费,测试网默认手续费 0 ,也就是免费
owner_account 账号,格式 1.2.x
offer_id 要约 ID ,格式 1.21.x
注:
* 只有要约发起人才可以撤回要约,撤回后要约锁定资金返回账户余额
* 如果要约已被接受,尚未还清或者过期清算,则不可撤回
比如:
abit-test 删除 1.21.0
sign_transaction { "operations": [[70,{ "fee": { "amount": 0, "asset_id": "1.3.0" }, "owner_account": "1.2.3833", "offer_id": "1.21.0"}]] } true
2.1 检查操作结果
可以用 get_account_history 命令查看帐户操作历史,比如
get_account_history abit-test 10
结果示例
51517968 2021-11-08T18:40:48 credit_offer_delete_operation abit-test (Fee: 0 TEST) result: 1000 TEST
格式为:块号 时间 操作 帐号 手续费 结果
结果里 1000 TEST ,表示返回 1000 TEST 到账户余额
3. 修改贷款要约
op name: credit_offer_update_operation
op code: 71
参数
fee 手续费,测试网默认手续费 1 TEST 基本手续费 + 交易大小费每 KB 加 1 BTS (类似转账 MEMO 费)
owner_account 账号,格式 1.2.x
offer_id 要约 ID ,格式 1.21.x
delta_amount 变化金额,可选(不填表示不变),标准金额格式(数量+币种),数量为正为增资,为负为撤资
fee_rate 新的借款费率,可选(不填表示不变),整数表示,单位是百万分之一
max_duration_seconds 新的借款时长,可选(不填表示不变),单位是秒
min_deal_amount 新的最低借款金额(每笔),可选(不填表示不变),单位是聪
enabled 是否激活,可选(不填表示不变),可为 true 或者 false
auto_disable_time 新的自动下架时间,可选(不填表示不变),格式如 "2021-11-30T0:00:00"
acceptable_collateral 新的接受的抵押物列表及各抵押物折算价,可选(不填表示不变),二维数组格式
acceptable_borrowers 新的接受的借款人列表及各人最大借款额度,可选(不填表示不变),二维数组格式
比如:
abit-test 修改要约 1.21.1,注资20 TEST,借款时长调整为5分钟(300秒),借款人增加 xbt ,借款额度 60 TEST ,其他不变
注:由于有KB费存在,无法预估手续费,故采用交易构建器( transaction builder )来构造交易
begin_builder_transaction
(假设返回值为 0 )
add_operation_to_builder_transaction 0 [71,{ "owner_account": "1.2.3833", "offer_id": "1.21.1", "delta_amount": {"asset_id":"1.3.0","amount":"2000000"}, "max_duration_seconds":300, "acceptable_borrowers":[["1.2.0", 5000000],["1.2.6",8000000],["1.2.25530",6000000]]}]
set_fees_on_builder_transaction 0 1.3.0
sign_builder_transaction 0 true
其中,
* TEST 资产精度是5位小数, 20 TEST 等于 2000000 聪,所以金额 delta_amount 填 2000000
* xbt 账号id是 1.2.25530
3.1 检查操作结果
可以用 get_account_history 命令查看帐户操作历史,比如
get_account_history abit-test 10
结果示例
51518361 2021-11-08T19:01:12 credit_offer_update_operation abit-test (Fee: 1.06250 TEST)
格式为:块号 时间 操作 帐号 手续费
表示操作成功
通过 get_object 命令查看数据
>>> get_object 1.21.1
[{
"id": "1.21.1",
"owner_account": "1.2.3833",
"asset_type": "1.3.0",
"total_balance": 102000000,
"current_balance": 102000000,
"fee_rate": 100,
"max_duration_seconds": 300,
"min_deal_amount": 2000000,
"enabled": true,
"auto_disable_time": "2021-11-30T00:00:00",
"acceptable_collateral": [[
"1.3.1515",{
"base": {
"amount": 10000000,
"asset_id": "1.3.0"
},
"quote": {
"amount": 4000000,
"asset_id": "1.3.1515"
}
}
],[
"1.3.1516",{
"base": {
"amount": 100000,
"asset_id": "1.3.0"
},
"quote": {
"amount": 3000,
"asset_id": "1.3.1516"
}
}
]
],
"acceptable_borrowers": [[
"1.2.0",
5000000
],[
"1.2.6",
8000000
],[
"1.2.25530",
6000000
]
]
}
]
可见要约已修改成功。
4. 接受贷款要约(借款)
op name: credit_offer_accept_operation
op code: 72
参数
fee 手续费,测试网默认手续费 1 TEST
borrower 借款人,格式 1.2.x
offer_id 要约 ID ,格式 1.21.x
borrow_amount 借款金额,标准金额格式(数量+币种)
collateral 抵押品,标准金额格式(数量+币种)
max_fee_rate 可接收的最高费率,单位是百万分之一
min_duration_seconds 可接受的最低借款时长,单位是秒
注:
* 借款时需指定“可接收的最高费率”和“可接受的最低借款时长”,可防止贷款人在要约被接受前突然修改贷款要约参数,降低借款人风险
* 借款成功后,会生成一个借款合约,之后如果贷款要约修改,不影响已存在的借款合约
比如:
xbt 接受要约 1.21.1 ,借款 30 TEST ,抵押品 0.012 CONTEST.BTC ,可接受最高费率 百万分之2,可接受最短借款时长 300秒。
sign_transaction { "operations": [[72, {"fee": { "amount": 100000, "asset_id": "1.3.0" },"borrower":"1.2.25530","offer_id":"1.21.1","borrow_amount":{"asset_id":"1.3.0","amount":3000000}, "collateral":{"asset_id":"1.3.1515","amount":"1200000"}, "max_fee_rate":200, "min_duration_seconds":300}]]} true
其中,
* xbt 账号id是 1.2.25530
* TEST 资产精度是5位小数, 30 TEST 等于 3000000 聪,所以借款金额填 3000000
* CONTEST.BTC id是1.3.1515,精度8位小数
4.1 检查操作结果
可以用 get_account_history 命令查看帐户操作历史,比如
get_account_history abit-test 10
get_account_history xbt 10
结果示例
51518802 2021-11-08T19:23:51 credit_offer_accept_operation xbt (Fee: 1 TEST) result: {"impacted_accounts":["1.2.3833"],"new_objects":["1.22.0"]}
格式为:块号 时间 操作 帐号 手续费 操作结果
操作结果中,
* impacted_accounts 里是贷款人
* new_objects 里是借款合约id
通过 get_object 命令查看贷款要约数据
>>> get_object 1.21.1
[{
"id": "1.21.1",
"owner_account": "1.2.3833",
"asset_type": "1.3.0",
"total_balance": 102000000,
"current_balance": 99000000,
...
可见 贷款合约的当前余额降低
通过 get_object 命令查看 借款合约数据
>>> get_object 1.22.0 [{
"id": "1.22.0",
"borrower": "1.2.25530",
"offer_id": "1.21.1",
"offer_owner": "1.2.3833",
"debt_asset": "1.3.0",
"debt_amount": 3000000,
"collateral_asset": "1.3.1515",
"collateral_amount": 1200000,
"fee_rate": 100,
"latest_repay_time": "2021-11-08T19:28:51"
}
]
其中,
* id 是借款合约 id
* borrower 借款人账号
* offer_id 贷款要约id
* offer_owner 贷款人账号
* debt_asset 借款资产类型(币种)
* debt_amount 借款金额,单位是聪
* collateral_asset 抵押品资产类型(币种)
* collateral_amount 抵押品金额,单位是聪
* fee_rate 费率,单位百万分之一
* last_repay_time 还款期限
另可通过 list_account_balances 命令查看账户余额变化。
5. 还款
op name: credit_deal_repay_operation
op code: 73
参数
fee 手续费,测试网默认手续费 1 TEST
account 还款人,格式 1.2.x
deal_id 借款合约 ID ,格式 1.22.x
repay_amount 还款金额,标准金额格式(数量+币种)
credit_fee 支付借款费用,标准金额格式(数量+币种)
注:
* 只有借款人才可还款
* 费用为额外支付,必须不低于借款合约里约定的费率
* 可部分还款,部分还款时按比例退回部分抵押品
* 全额还款则退回全部抵押品
比如:
xbt 为借款合约 1.22.2 还款 10 TEST,费用 0.001 TEST 。
sign_transaction { "operations": [[73, {"fee": { "amount": 100000, "asset_id": "1.3.0" },"account":"1.2.25530","deal_id":"1.22.2","repay_amount":{"asset_id":"1.3.0","amount":1000000}, "credit_fee":{"asset_id":"1.3.0","amount":"100"}}]]} true
其中,
* xbt 账号id是 1.2.25530
* TEST 资产精度是5位小数,所以还款金额 10 TEST 填 1000000 , 费用 0.001 TEST 填 100
5.1 检查操作结果
可以用 get_account_history 命令查看帐户操作历史,比如
get_account_history abit-test 10
get_account_history xbt 10
结果示例
51520181 2021-11-08T20:34:54 credit_deal_repay_operation xbt (Fee: 1 TEST) result: {"impacted_accounts":["1.2.3833"],"updated_objects":["1.21.1"],"removed_objects":["1.22.3"],"received":[{"amount":1200000,"asset_id":"1.3.1515"}]}
51519428 2021-11-08T19:56:12 credit_deal_repay_operation xbt (Fee: 1 TEST) result: {"impacted_accounts":["1.2.3833"],"updated_objects":["1.21.1","1.22.2"],"received":[{"amount":400000,"asset_id":"1.3.1515"}]}
格式为:块号 时间 操作 帐号 手续费 操作结果
操作结果中,
* impacted_accounts 里是贷款人
* 如果部分还款, updated_objects 里是贷款要约id和借款合约id,如果全额还款,借款合约id在 removed_objects 里
* received 是返还的抵押品数量
通过 get_object 命令查看贷款要约数据 和 借款合约数据,可见相应余额变化。此处略。
另可通过 list_account_balances 命令查看账户余额变化。
6. 逾期
如果逾期未还款,抵押品自动全额划转给贷款人,借款人无需再还款。借款合约自动解除。
双方账户历史中都会记录一笔类型为 credit_deal_expired_operation 的虚拟操作, op code = 74 。
可以用 get_account_history 命令查看帐户历史,比如
get_account_history abit-test 10
get_account_history xbt 10
结果示例
51519008 2021-11-08T19:34:27 credit_deal_expired_operation xbt (Fee: 0 TEST)
cli_wallet 中目前无法快速查看该操作详情。通过其他方式找到该条目 id 后,可查到其具体内容为
>>> get_object 1.11.84564441
[{
"id": "1.11.84564441",
"op": [
74,{
"fee": {
"amount": 0,
"asset_id": "1.3.0"
},
"deal_id": "1.22.1",
"offer_id": "1.21.1",
"offer_owner": "1.2.3833",
"borrower": "1.2.25530",
"unpaid_amount": {
"amount": 3000000,
"asset_id": "1.3.0"
},
"collateral": {
"amount": 1200000,
"asset_id": "1.3.1515"
},
"fee_rate": 100
}
],
"result": [
0,{}
],
"block_num": 51519008,
"trx_in_block": 5,
"op_in_trx": 0,
"virtual_op": 0
}
]
其中,
* "deal_id" 借款合约 id
* "offer_id" 贷款要约 id
* "offer_owner" 贷款人
* "borrower" 借款人
* "unpaid_amount" 逾期金额及币种
* "collateral" 被抵扣的抵押品金额及币种
* "fee_rate" 借款合约约定费率
7. 批量查询 API
查贷款要约
* 查所有贷款要约 list_credit_offers( limit, start_id )
* 按贷款人查贷款要约 get_credit_offers_by_owner( account_name_or_id, limit, start_id )
* 按资产类型查贷款要约 get_credit_offers_by_asset( asset_symbol_or_id, limit, start_id )
查借款合约
* 查所有借款合约 list_credit_deals( limit, start_id )
* 按贷款要约查借款合约 get_credit_deals_by_offer_id( offer_id, limit, start_id )
* 按贷款人查借款合约 get_credit_deals_by_offer_owner( account_name_or_id, limit, start_id )
* 按借款人查借款合约 get_credit_deals_by_offer_borrower( account_name_or_id, limit, start_id )
* 按资产类型查借款合约 get_credit_deals_by_debt_asset( asset_symbol_or_id, limit, start_id )
* 按抵押品类型查借款合约 get_credit_deals_by_collateral_asset( asset_symbol_or_id, limit, start_id )