# 猴基金智能合约

By [Kingter](https://paragraph.com/@kingter) · 2021-11-15

---

分币智能合约的设计原则
-----------

透明性
---

*    白名单， 106名参与者地址作为白名单写入合约
    
*    数据上链，从白名单写入 到 白名单审核 再到 ETH 分发 所有过程都在链上进行
    

安全性
---

*   ETH 严格按照白名单分发， 分发过程由合约控制
    
*   合约保证白名单地址的变更一定由原地址的owner发起
    
*   白名单一旦审核确认后原则上不可更改
    
*   白名单被审核确认后才能开始Claim ETH
    
*   敏感操作例如白名单审核确认 只允许多签操作
    

可追溯
---

*    分发的次数、金额和每个地址接收的金额数据 链上永久可查
    

易用性
---

*     合约提供功能 方便查询ETH分发的历史信息
    

  

ETH分发流程
=======

合约部署 => 106名参与者原始白名单导入合约 =>  调用合约更改白名单 => 多签审核确认白名单 => ETH转入合约 => 合约按照白名单分发ETH

LP地址变更流程
--------

换LP的地址是一个很敏感的事情，要避免被冒领的情况发生。 合约提供对LP换地址的验证功能。所以这里需要我们LP用原有的钱包地址链接合约，发起更换地址的请求(request)，来证明自己对LP地址的ownership。 再在discord群里发自己的request的序号（Nonce），多签通过合约审核确认request，LP的新地址生效。

### 非法地址的处理

非法地址指的是交易所地址，当初打币的时候LP误从交易所直接打币的。

这样的地址只能是多签不经过钱包地址owner的验证，直接调用合约更改LP的钱包地址，属于**高风险操作**。因此在操作前会要在discord群里公示，而且在白名单审核确认后，不再允许绕过owner验证直接修改LP钱包地址的操作。

这样就可以基本保证各个LP的地址的安全，不会被轻易的冒领了。

合约部署在BSC链上
----------

现在合约支持有两个版本，一个是以太主网上的，一个是在BSC链上的， 部署在以太主网上的合约，大家claim的就直接是ETH（不是WETH）在BSC链上版本合约，大家claim的就是 BETH（Binance-peg eth）。考虑到现在主网上平均gas费一直在100以上，所以部署到BSC链上以节省大家claim的气费。

GP rewards的计算
-------------

合约里区分本金（Principal） 和利润（Profit），所有进入合约的资金都会被用来优先偿还本金，本金偿还完毕后（106个ETH），后续入账才会用来结算收益和GP的rewards。

利润部分合约会按3份奖励给GP预留，也就是利润部分最开始是除以109分给各个LP的。等大家投票结束，多签会根据投票的结果，通过合约设置最终是几份。如果最终是2份，之前预留多出来的一份，会再分发给各个LP。

Claimable的计算
------------

合约里记录了每一个人的已经claimed的历史记录，合约里的getClaimable()方法会先用当前的累积收入的总数量除来计算每个人应得的quota，这个quota每个人都是一样的，再用quota减去这个人已经claimed的数量，就是他还可以claimable的数量。 最后不管一个LP claim过几次，每个LP最后的拿到的一定符合下面的公式，和claim的次数和时机无关。

总累计ETH没超过 106： LP claimable = 总累计的ETH数量 / 106 总累计ETH超过106 ： LP claimable = 1 + (总累计的ETH数量 - 106) / (106 + rewards)

智能合约方法列表
--------

### 合约源代码

[https://github.com/kingster-will/liquid-dao/blob/main/contracts/ApeClaim.sol](https://github.com/kingster-will/liquid-dao/blob/main/contracts/ApeClaim.sol)

[https://github.com/kingster-will/liquid-dao/blob/main/contracts/ApeClaimErc20.sol](https://github.com/kingster-will/liquid-dao/blob/main/contracts/ApeClaimErc20.sol)

### Write Contract

*   `addLP` 增加一个LP \[只能多签\] \[只能在白名单确认前\]
    
*   `addReplaceLPAddressRequest` LP提交更换地址的申请 \[只能LP\]
    
*   `cancelReplaceLpRequest` LP撤销更换地址的申请 \[只能LP\]
    
*   `claim` LP claim自己目前的收益 \[只能LP\] \[只能在白名单确认后\]
    
*   `claimGPRewards` GP claim 奖励 \[只能GP\] \[只能在Rewards放开后\]
    
*   `confirmReplaceLPRequest` 多签确认LP申请的修改的地址生效 \[只能多签\]
    
*   `confirmWhiteList` 多签审核确认白名单 \[只能多签\]
    
*   `initialize` 部署时初始化合约
    
*   `pullFunds` 特殊情况时多签将合约里的资产转到多签钱包 \[只能多签\]
    
*   `rejectReplaceLPRequest` 多签拒绝某个LP地址更改请求 \[只能多签\]
    
*   `releaseToAll` 帮所有LP claim到LP各自的钱包 \[只能在白名单确认后\]
    
*   `releaseGPRewards` 确认GP的rewards份额，并放开提取 \[只能多签\]
    
*   `removeLP` 多签删除一个LP的地址 \[只能多签\] \[只能在白名单确认前\]
    
*   `renounceOwnership` 使合约无主化 \[只能多签\]
    
*   `replaceLP` 替换一个LP的地址 \[只能多签\] \[只能在白名单确认前\]
    
*   `transferOwnership` 多签转移合约的所有权给别人 \[只能多签\]
    

### Read Contract

*   `containsLP` 检查给定地址是否是LP
    
*   `getClaimable` 查询给定的LP目前能claim的ETH的数量
    
*   `getReplaceLPRequest` 查询给定序号对应的LP更换地址申请的详细信息
    
*   `lpAtIndex` 按给定序号查询对应LP的地址
    
*   `lpClaimed` 查询给定LP已经claim的数量

---

*Originally published on [Kingter](https://paragraph.com/@kingter/WSqSl3F49UN9oDq4YSRo)*
