分账就是按照一定比例分钱财。在现实中,经常会有“分赃不均”的事情发生;而在区块链的世界里,Code is Law
,我们可以事先把每个人应分的比例写在智能合约中,获得收入后,再由智能合约来进行分账。
分账合约,该合约允许将ETH
按权重转给一组账户中,进行分账。代码部分由oppenzepplin库的PaymentSplitter合约简化而来。
分账合约
分账合约(PaymentSplit
)具有以下几个特点:
- 在创建合约时定好分账受益人
payees
和每人的份额shares
。 - 份额可以是相等,也可以是其他任意比例。
- 在该合约收到的所有
ETH
中,每个受益人将能够提取与其分配的份额成比例的金额。 - 分账合约遵循
Pull Payment
模式,付款不会自动转入账户,而是保存在此合约中。受益人通过调用release()
函数触发实际转账。
事件
分账合约中共有3
个事件:
PayeeAdded
:增加受益人事件。PaymentReleased
:受益人提款事件。PaymentReceived
:分账合约收款事件。
// 事件
event PayeeAdded(address account, uint256 shares); // 增加受益人事件
event PaymentReleased(address to, uint256 amount); // 受益人提款事件
event PaymentReceived(address from, uint256 amount); // 合约收款事件
状态变量
分账合约中共有5
个状态变量,用来记录受益地址、份额、支付出去的ETH
等变量:
totalShares
:总份额,为shares
的和。totalReleased
:从分账合约向受益人支付出去的ETH
,为released
的和。payees
:address
数组,记录受益人地址shares
:address
到uint256
的映射,记录每个受益人的份额。released
:address
到uint256
的映射,记录分账合约支付给每个受益人的金额。
uint256 public totalShares; // 总份额
uint256 public totalReleased; // 总支付
mapping(address => uin