DAO 合约

DAO 合约地址: 0xda0da00000000000000000000000000000000000

质押与退出质押

任何人可以向 DAO 合约质押与提取质押。即使一个地址成为了委员,也可以提取走全部质押,相应接口如下。

interface StakeVault {
    // 向合约转账,并以 staker 的名义质押
    function stakeTo(address staker) payable external;

    // 向合约转账并质押
    function stake() payable external;

    // 提取质押
    function withdraw(uint256 amount) external;

    // 提取质押至指定地址
    function withdrawTo(address payable beneficiary, uint256 amount) external;

    // 查看地址余额
    function stakeBalance(address staker) view external returns (uint256)
}

节点加入与退出

interface DaoManager {
    // 推断的发行总量,包括已经挖出的和 DAO 已经发出去的
    function totalIssued() view external returns(uint256);

    // 见下文
    function preemptOwner(address owner) external;

    // 见下文
    function electOwner(address oldOwner, address newOwner) external;

    // 见下文
    function impeachOwner() external;

    // 下次可以调用 electOwner 的区块高度
    function nextElection() external returns (uint);

    // 下次可以调用某些接口的区块高度,细节见下文
    function nextCall(string memory params) external returns (uint);

    // 查看委员会列表
    function getOwners() external view returns (address[] memory);
}

<aside> 💡 DaoManager 和 StakeVault 在同一个地址,一个地址是可以有多个接口的。

</aside>

网络中有 21 个委员会节点,用于对网络中 DAO 治理的相关议题投票。委员会在以下几种情况下可能会发生改变:

先占(Preempt)

在职委员不足 21 人时,任何满足条件的地址可以抢占委员会席位,先到先得。

**调用方式:**竞选者调用 preemptOwner 函数

限流要求:preemptOwner 调用成功后,需要等待 300 个区块(约 1 小时),其他人才可以再次调用。调用 nextCall("preemptOwner") 查看下次可调用区块高度。

弹劾(Impeach)

一个委员不满足最低质押代币要求时,任何人可以将该委员弹劾出委员会

**调用方式:**任何人调用 impeachOwner 函数。函数执行中会踢掉一个不符合要求的委员,当有多个不符合要求的委员时,踢掉谁是实现相关的。踢掉一个人后,则进入抢占模式。

**限流要求:**若某次弹劾将委员会从 N 人减至 N - 1 人,则 14400 个区块内(约 2 天),委员会的人数不会少于 N - 1 人。如果当前委员会有 18 人,调用 nextCall("preemptOwner18") 查看下次可调用区块高度。

选举(Elect)

从首次选满 21 人开始,每 648000 个区块(约 90 天),进行一次轮换,DAO 委员会替换掉一个质押不足 5% 的人,同时换上一个质押不少于 5% 的人。轮换由 DAO 进行多签后,调用相应接口实现。