2 个不稳定版本

0.7.0-alpha12022年2月23日
0.6.1 2022年2月16日

#7#vesting

Apache-2.0

120KB
2.5K SLoC

作为合同的托管账户

托管账户

许多利益相关者将收到将在1-3年内分发的代币的托管账户。存在 Cosmos SDK 的实现,但它似乎并不适合。我们的一些设计要求

  • 收款人只有在收到未托管代币(他们可以出售以支付税款)时才应承担税务负担。这类似于私人公司的股票问题,虽然要纳税但无法出售以支付税款。
  • 如果托管代币属于验证者,则他们应该能够在托管期间对其进行质押(和解质押)(即使他们无法转让它们)
  • 完全托管的代币保证控制在最初定义的收款人手中。
  • 这可以作为一个 CosmWasm 合同来实现
  • (可选) 如果收款人违反了合同协议(例如,验证者在1个月后离开网络但仍获得所有代币),则可能有一种冻结支付的方法。请注意,验证者协议中有一个条款,验证者同意运行节点一段最低期限,如果违反协议,则可以采取法律手段追回代币。

在与 Martin 讨论法律/税务问题时,我们得出结论,所有未托管/未发放的代币都必须由 SOB 控制,以确保税务负担由 SOB 承担(在这里没有问题),而不是最终收款人。

关键税务考虑因素

在考虑哪些可以视为应税事件时很重要。

如果合同约定了固定日期(即行权期结束时),即使需要SOB多重签名,税务机关也可能认为这是一种模糊/避税行为,并可能忽略释放日期。如果SOB董事会具有裁量权,可以认为代币几乎没有价值,因为它们可能永远不会发放,因此从所得税的角度来看,您将以零或象征性的欧元收到代币,当您处置您的代币时,您将受到资本利得税的约束。

这进一步引发了人们是否信任SOB发放代币的问题。我们还需要确保董事会组成中有多数成员不会直接从该计划中受益(董事会即将有5名成员,其中2名来自Confio)以及作为受益人的董事会成员必须避免就发放代币的决议进行表决。

我们需要从员工居住的司法管辖区获取税务建议,并在适当的情况下,我们可能需要为相关司法管辖区创建不同的智能合约。并非所有司法管辖区都会接受基于SOB裁量的零价值。

参与者

  • 操作员 - 这可能是验证器或从SOB到“运营”员工的可选委托,可以批准将完全行权的代币支付给最终收款人。他们不能做其他任何事情。
  • 监督 - 这是由SOB提供的安全多重签名,可以在非常情况下使用,以更改操作员或在某些不当行为发生时停止未来代币的发放。
  • 收款人 - 这是收到代币的账户,一旦代币行权并释放。这不能更改。由于任何原因未释放的代币将实际上被销毁,因此SOB不能重新使用它们。

设置

行权合同可以在tgrade创世文件中轻松定义,也可以在运行链中创建(也可以由SOB以外的其他参与者创建)。在创建合同时,必须定义上述三个账户(操作员、监督和收款人)。我们还必须定义行权代币和计划。行权代币是要释放的代币总数,计划定义了它们何时可用。

我们现在将保持简单,并仅允许表示为分段线性曲线的计划。也就是说,从“开始时间”到100%,然后是两者之间的线性增长。虽然计划是连续的,但这并不意味着代币将在每个区块中全部释放,只是允许的限额增加。

发放代币

操作员负责发放代币。这名员工应该处理相对常规的工作,如工资单。一旦一个月,密钥可以签署所有行权账户以释放所有可用的代币到收款人账户,在开始时间和结束时间之间提供月收入。

人为因素使得定制变得容易。例如,某些合同可能定义每6个月分批发放行权代币。或者收款人可能要求延迟某些付款到更晚的日期(例如,“不要在2023年1月之前发放任何代币”)。未发放低于允许限额的代币不在区块链上强制执行,而是由双方之间达成的任何协议中的员工处理。

我们在合同中存储已发放代币的总数。

不当行为

如果操作员丢失密钥或由于任何原因拒绝释放适当的代币,监督密钥可以更换操作员密钥。

如果收款人违反了任何构成行权计划基础的协议,监督账户可以“冻结”这些代币。它可以部分冻结,并且可以通过监督账户的将来行动撤销。我们存储了冻结的代币数量以及已发放的代币数量。

注意:存在一个验证器协议,每个验证器都签署以换取代币的接收。

质押代币

如果归属受让人是验证者,他们将在归属期间使用代币进行质押。为此,运营商可以在向受让人释放代币之外执行两项操作——绑定和解绑。他们将在这个合同的地址下将代币绑定到验证者tg4-stake合约。这意味着归属合约必须是节点的官方运营商(并且收集该验证者的参与积分)。

在合同完全归属之前,受让人必须联系运营商以启动任何绑定/解绑操作。绑定的代币不会存储在合约中,但被视为“归属代币”。这可能导致可释放的代币数量超过合同中的代币数量,因此可能需要进行解绑操作来释放它们(由运营商和受让人之间的沟通处理)。

交接

大多数用户都会将最后一批代币提取到他们的正常账户,然后忽略现在的空归属账户。然而,验证者希望继续使用这个账户,并且在归属期结束后希望拥有完全控制权。我们在此定义了一种交接方式。目标是使这个归属合同转换为受让人控制的完全功能的“代理账户”,同时确保任何冻结的代币对他们不可用。

一旦合同的结束时间过去,受让人或监管方可以发起一个交接。这将首先烧毁(如果有的话)冻结的代币,并将冻结代币计数设置为0。如果合同中没有足够的代币可以烧毁(因为它们已经质押),这将失败,必须等待那些代币可以烧毁后再重复一次。在烧毁代币后,监管方和运营商密钥设置为受让人密钥,合同被标记为“已释放”。

一个“已释放”的合同可以执行一个正常归属合同的所有操作,监管方设置为受让人。这意味着受让人可以设置一个新的运营商密钥,该密钥只能绑定/解绑或将代币返还到预定义的受让人账户。它还将允许新的监管方修改受让人地址(因为我们认为这些都属于同一组织)。

此外,它允许监管方设置新的监管方地址(密钥轮换),并允许监管方地址代表合同地址执行任何消息——投票、在Dex中进行交换等。它将非常类似于标准的“代理合约”,如cw1-whitelist。

请注意,“交接”是一个应税事件,应作为将代币转让给受让人的记录。我们应该确保这个信息在事件系统中可用,以便我们可以使用报告工具跟踪它。这也意味着我们不应在归属期结束时自动交接账户,而应仅在受让人请求时才进行。

详细信息:计算可释放的代币

在计算可释放的代币时,我们使用以下公式

  • 可用代币 = 归属代币 - 已释放代币 - 冻结代币
  • 如果 t >= end_time,归属代币 = 合约余额 + 已释放代币
    • 这处理了后来发送给合约的代币更多的情况,并仅保持冻结代币保持冻结
  • 如果 start_time >= t,归属代币 = 0
  • 如果 start_time < t < end_time,归属代币 = 初始余额 * (t - start_time) / (end_time - start_time)

示例

12个月的时间表,总共400.000代币。
第2个月:不小心向合约发送了50.000代币,但它们不影响计划。
第3个月:释放了100.000代币。(从原始的400.000代币中归属的所有代币)
第5个月:因行为不当冻结了200.000代币
第6个月:没有代币可以释放(200.000 - 100.000 - 200.000)
第10月:释放了25,000个代币(共333,333 - 100,000 - 200,000 = 33,333)
第12月:释放所有剩余代币,即余额325,000 - 200,000冻结 = 125,000(这包括了已完全解封的75,000和直到计划结束才解锁的50,000)

初始化

...

消息

...

依赖项

~4–5.5MB
~122K SLoC