Skip to content

定期解冻合约

QM edited this page Dec 21, 2020 · 1 revision

本文档通过rpc接口调用, 介绍chain33定期解冻合约基本用法

简介

定期解冻合约帮助用户锁定一定量的币, 按在指定的规制解冻给受益人, 适用于分期付款, 分期支付形式的员工激励等情景。

合约提供了3类操作

  1. 创建定期解冻合约:创建时需要指定支付的资产和总量,以及定期解冻的形式。
  2. 受益人提币:受益人提走解冻了的资产。
  3. 发起人终止合约: 发起人可以终止合约的履行。

解冻的形式目前支持两种

  1. 固定数额解冻:指定时间间隔,解冻固定的资产。
  2. 按剩余量的固定比例解冻:指定时间间隔,按剩余量的固定比例解冻。 这种方式,越到后面解冻的越少。

备注:在合约创建时, 就可以解冻一次。

固定数额解冻和合约举例

  1. 冻结总量为100, 一个月解冻10.
  2. 初始解冻:创建时可以由受益人提走10
  3. 第一个月后又可以提走10.
  4. 在受益人没有及时提币的情况下, 受益人在一段时间之后可以一次性提走本该解冻的所有的币。 即解冻的币是按指定形式解冻的,和受益人的提币时间和次数等都不会影响解冻的进程。

按剩余量的固定比例解冻的合约举例

  1. 冻结总量为100, 一个月解冻剩余的10%. 创建时可以由受益人提走10 (100× 10%), 第一个月后又可以提走9 (90 × 10%). 逐月递减
  2. 在受益人没有及时提币的情况下, 受益人在一段时间之后可以一次性提走本该解冻的所有的币。 即解冻的币是按指定形式解冻的,和受益人的提币时间和次数等都不会影响解冻的进程。

准备

beneficiary="12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
beneficiary_key="0x4257d8692ef7fe13c68b65d6a52f03933db2fa5ce8faf210b5b8b80c721ced01"
owner="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
owner_key="CC38546E9E659D15E6B4893F0AB32A06D103931A8230B0BDE71459D2B27D6944"
rpc_laddr="http://39.108.208.73:8801"

创建合约

创建固定数额解冻的交易

txHex=$(curl -sd '{"jsonrpc": "2.0", "method" :  "unfreeze.CreateRawUnfreezeCreate" , "params":[{"startTime":10000,"assetExec":"coins","assetSymbol":"bty","totalCount":10000000000,"beneficiary":"'$beneficiary'","means":"FixAmount","fixAmount": {"period":10,"amount":1000000000}}]}'  ${rpc_laddr}  | | jq .result)
signHex=$(curl -sd '{"method":"Chain33.SignRawTx","params":[{"expire":"300s", "privkey":"'$owner_key'","txHex":'$txHex'}]}' ${rpc_laddr}  |jq .result)
curl -sd '{"method":"Chain33.SendTransaction","params":[{"data":'$signHex'}]}' $rpc
{"id":null,"result":"'signHex'","error":null}' ${rpc_laddr} 

创建按剩余量的固定比例解冻的合约

txHex=$(curl -sd '{"jsonrpc": "2.0", "method" :  "unfreeze.CreateRawUnfreezeCreate" , "params":[{"startTime":10000,"assetExec":"coins","assetSymbol":"bty","totalCount":400000000,"beneficiary":"'$beneficiary'","means":"FixAmount","fixAmount": {"period":10,"tenThousandth":1000}}]}'  ${rpc_laddr} | | jq .result)
signHex=$(curl -sd '{"method":"Chain33.SignRawTx","params":[{"expire":"300s", "privkey":"'$owner_key'","txHex":'$txHex'}]}' ${rpc_laddr}  |jq .result)
curl -sd '{"method":"Chain33.SendTransaction","params":[{"data":'$signHex'}]}' $rpc
{"id":null,"result":"'signHex'","error":null}'   ${rpc_laddr} 

查询合约

可以通过指定合约ID, 查看合约信息

curl -sd  '{ "params" : [ { "funcName" : "GetUnfreeze", "payload" : { "data" : "1a8c91077df8e2be644f61b59706be8f7745f9b800868a73624956bd551abe41" }, "execer" : "unfreeze" } ], "id" : 0, "method" : "Chain33.Query" }'  ${rpc_laddr} 

如果在创建合约时, 没有记录ID, 可以通过创建者或收益人来查看合约列表

curl -sd  '{ "params" : [ { "funcName" : "ListUnfreezeByCreator", "payload" : { "initiator" : "1EDnnePAZN48aC2hiTDzhkczfF39g1pZZX" }, "execer" : "unfreeze" } ], "id" : 0, "method" : "Chain33.Query" }'  ${rpc_laddr} 

curl -sd  '{ "params" : [ { "funcName" : "ListUnfreezeByBeneficiary", "payload" : { "beneficiary" : "1EDnnePAZN48aC2hiTDzhkczfF39g1pZZX" }, "execer" : "unfreeze" } ], "id" : 0, "method" : "Chain33.Query" }' ${rpc_laddr} 

提币

由受益人签名,才能提取

req='{"method":"unfreeze.CreateRawUnfreezeWithdraw","params":[{"unfreezeID":"'${uid}'"}]}'

txHex=$(curl -sd "$req"  ${rpc_laddr}  | | jq .result)
signHex=$(curl -sd '{"method":"Chain33.SignRawTx","params":[{"expire":"300s", "privkey":"'$owner_key'","txHex":'$txHex'}]}' ${rpc_laddr}  |jq .result)
curl -sd '{"method":"Chain33.SendTransaction","params":[{"data":'$signHex'}]}' $rpc
{"id":null,"result":"'signHex'","error":null}'  ${rpc_laddr} 

终结合约

由创建者签名,才能提取

req='{"method":"unfreeze.CreateRawUnfreezeWithdraw","params":[{"unfreezeID":"'${uid}'"}]}'

txHex=$(curl -sd "$req"  ${rpc_laddr}  | | jq .result)
signHex=$(curl -sd '{"method":"Chain33.SignRawTx","params":[{"expire":"300s", "privkey":"'$beneficiary_key'","txHex":'$txHex'}]}' ${rpc_laddr}  |jq .result)
curl -sd '{"method":"Chain33.SendTransaction","params":[{"data":'$signHex'}]}' $rpc
{"id":null,"result":"'signHex'","error":null}'  ${rpc_laddr}