归属合约
该合约允许您锁定一定数量的Toncoin,并在指定时间内逐渐解锁。
归属参数
归属参数在部署期间设置且不变。
vesting_total_amount
- 以 nanoton 为单位,锁定的Toncoin总量。
vesting_start_time
- unix时间,归属周期的开始点,直到这一刻vesting_total_amount
被锁定,之后根据其他参数开始解锁。
vesting_total_duration
- 总归属持续时间,以秒为单位(例如,31104000
表示一年)。
unlock_period
- 解锁周期,以秒为单位(例如,2592000
表示每月一次)。
cliff_duration
- 初始悬崖期,以秒为单位(例如,5184000
表示2个月)。
vesting_sender_address
- 您可以随时将Toncoin退回到此地址(即使它们被锁定);此地址还可以添加到白名单中。
owner_address
- 归属发行给其的人,从此地址,他可以发起从归属合约发送Toncoin的请求。
您可以通过get_vesting_data()
get方法获取这些参数。
参数必须满足以下条件:
vesting_total_duration > 0
vesting_total_duration <= 135 years (2^32 seconds)
unlock_period > 0
unlock_period <= vesting_total_duration
cliff_duration >= 0
cliff_duration < vesting_total_duration
vesting_total_duration mod unlock_period == 0
cliff_duration mod unlock_period == 0
尽管智能合约不检查这些条件的符合性,但在合约部署后且在发送Toncoin之前,用户可以通过get方法验证所有参数是否OK。
锁定
在vesting_start_time
之前,所有vesting_total_amount
都被锁定。
从vesting_start_time
开始,金额开始按比例解锁。
例如,如果vesting_total_duration
为10个月,unlock_period
为1个月,且vesting_total_amount
为500 TON,则每月将解锁500*(10/100)=50 TON,10个月后将解锁全部500 TON。
如果有悬崖期,在此悬崖期内不解锁任何金额,过了悬崖期后,按上述公式解锁。
例如,如果cliff_period
为3个月,其他参数与前例相同,则前3个月不会解锁任何金额,3个月后一次性解锁150 TON(然后每个月解锁50 TON)。
Get方法get_locked_amount(int at_time)
允许您计算在某个时间点将锁定多少金额。
您只能将锁定的Toncoin发送到白名单地址或vesting_sender_address
。
您可以随时随地发送已解锁的Toncoin。
白名单
白名单是一系列地址,即使还有Toncoin被锁定,也可以向其发送Toncoin。
Get方法get_whitelist()
以(wc, hash_part)元组列表形式返回所有白名单地址。
Get方法is_whitelisted(slice address)
检查此地址是否在白名单上。
vesting_sender_address
可以随时通过op::add_whitelist
消息向白名单添加新地址。
无法从白名单中移除地址。
此外,始终可以将锁定的代币发送到vesting_sender_address
(无需单独添加到白名单)。
充值
您可以从任何地址向归属合约发送Toncoin。
钱包智能合约
该合约设计类似于标准钱包V3智能合约。
在其数据中,它保留seqno
、subwallet_id
、public_key
,并接受相同格式的外部消息。
Get方法seqno()
、get_subwallet_id()
和get_public_key()
可用。
与标准钱包不同,归属合约一次只允许发送一条消息。
发送
公钥的所有者可以通过外部消息发起从归属合约发送Toncoin的请求,就像在标准钱包中一样。
也可以通过从owner_address
发送的op::send
内部消息发起Toncoin的发送。
实际上,公钥和owner_address
通常由同一用户拥有。
白名单限制
可以发送到vesting_sender_address
的消息有以下限制:
- 仅允许
send_mode == 3
;
在大多数情况下,地址被添加到白名单中,以允许用户使用被锁定的硬币进行验证或将被锁定的硬币质押到池中。
为了避免Toncoin被盗,发送到白名单的消息有以下限制:
-
仅允许
send_mode == 3
; -
仅允许可弹回的消息;
-
不允许附加
state_init
;
如果目的地是系统选举人地址:
- 仅允许
op::elector_new_stake
、op::elector_recover_stake
、op::vote_for_complaint
、op::vote_for_proposal
操作;
如果目的地是系统配置地址:
- 仅允许
op::vote_for_proposal
操作;
对于其他目的地:
- 允许空消息和空文本消息;
- 允许以"d"、"w"、"D"、"W"开头的文本消息;
- 允许
op::single_nominator_pool_withdraw
、op::single_nominator_pool_change_validator
、op::ton_stakers_deposit
、op::jetton_burn
、op::ton_stakers_vote
、op::vote_for_proposal
、op::vote_for_complaint
操作;
对不在白名单上 的地址没有限制。
发送未锁定的 Toncoin 时不适用任何限制,即使我们发送到白名单vesting_sender_address
。
项目结构
contracts
- 项目所有智能合约及其依赖的源代码。wrappers
- 合约的封装类(实现ton-core的Contract
),包括任何[解]序列化原语和编译函数。tests
- 合约的测试。scripts
- 项目使用的脚本,主要是部署脚本。
如何使用
构建
npx blueprint build
或 yarn blueprint build
测试
npx blueprint test
或 yarn blueprint test
部署或运行其他脚本
npx blueprint run
或 yarn blueprint run
添加新合约
npx blueprint create ContractName
或 yarn blueprint create ContractName