【代码】合约分享:质押在合约中的cfx二次质押到内置staking合约获取利息

更新:近期要升级POS模式后,以下方式预计会有改变(升级前还能用)。等升级后本贴再更新

近两天在群里实现了“质押在合约中的cfx二次质押到内置staking合约获取利息”这个逻辑的智能合约demo。欢迎大家取用。特别是写有cfx质押逻辑的智能合约时候,一定要用。

参与者有chy、QB、lm、宇智波斑等。

https://shimo.im/docs/KDJpgDGJP9w8DxYG/ 《PrivateBank.sol 合约中质押cfx的例子(测试可用)》

===================改进后的0.2版本,测试可用,哈哈哈===============
pragma solidity 0.5.0;
//本合约用于在conflux链上建立个人私人银行合约。
//个人可以随时在本合约中存取cfx,并且可以将cfx进行质押获取4.08%年化收益。
//测试可用,欢迎使用本案例做各种有趣的事情。希望后续各种涉及到cfx质押的合约(例如flux,moon等,都值得加上cfx拿利息的代码,让大家享受额外的4.08%年化收益)
//参考案例合约:FC质押换CFX和利息。https://www.confluxscan.io/address/cfx:acdrd6ahf4fmdj6rgw4n9k4wdxrzfe6ex6jc7pw50m?accountAddress=cfx%3Aacdrd6ahf4fmdj6rgw4n9k4wdxrzfe6ex6jc7pw50m&tab=contract-viewer

import “./AdminControl.sol”;
import “./SponsorWhitelistControl.sol”;
import “./Staking.sol”;

contract PrivateBank {
// QB: 建议使用OZ的库,不用重复造轮子
// QB: 合约保留一点余额没有意义,可以全部质押(已完成)
// QB: 可以考虑额外记录质押利息(已完成,解除质押时可知利息,但即时利息没找到计算办法)
// QB: 可以考虑充值后立即质押(已完成)
// QB: 不需要重复判断balanceStaking>0(已完成)
// QB: 合约本身不能打交易,不需要考虑gas fee(已完成)

address private _owner; //合约拥有者。
uint256 private  _balanceStaking; //合约账户质押余额
uint256 private  _interest;//账户利息

// 内置合约,其中STAKING为质押合约
SponsorWhitelistControl public constant SPONSOR = SponsorWhitelistControl(address(0x0888000000000000000000000000000000000001));
Staking public constant STAKING = Staking(address(0x0888000000000000000000000000000000000002));
AdminControl public constant adminControl = AdminControl(address(0x0888000000000000000000000000000000000000));

//只有合约拥有者才能进行所有合约操作
modifier onlyOwner {
    require(msg.sender == _owner);
    _;
}

//初始化
constructor() public {
    _owner = msg.sender;
    _balanceStaking=0;
    _interest=0;
    
    //将所有账户注册到赞助白名单
    address[] memory users = new address[](1);
    users[0] = address(0);
    SPONSOR.addPrivilege(users);
}

//存cfx至合约,直接质押获取4.08%年化利息
function () external payable {
     _depositStaking(msg.value);//向合约转cfx直接触发内置合约质押生息。
}

//提取合约中所有的cfx本金和利息到管理者账户
function withdraw() onlyOwner public {
    _withdrawStaking();
    msg.sender.transfer(address(this).balance - _interest);//先转本金
    msg.sender.transfer(_interest);//再转利息
    _interest = 0;
}

//合约质押cfx
function _depositStaking(uint _number) internal {
    STAKING.deposit(_number);
    _balanceStaking += _number;
}

//合约解除cfx质押
function _withdrawStaking() internal {
    //如有质押余额则执行取款
    if(_balanceStaking>0){
        // QB: 提现之前记录合约balance,提现后可获取本次质押所获得的利息。至于利息如何处理,取决于业务需求
        // chy:目前先全部提取测试用,后续做成无损彩票~
        STAKING.withdraw(_balanceStaking);
        _interest = address(this).balance - _balanceStaking;
        _balanceStaking=0;        
    }
}

//获得质押余额(不含利息)
function getBalanceStaking() onlyOwner public view returns (uint)  {
    return _balanceStaking;
}

//获得显示余额
// LCX:Solidity 会自动为 public 变量创造同名函数,以获取函数值,无需再次声明函数。chy:有这种机制?太棒了。 不过本例中看来应该把这几个变量改成私有变量...

//获得含利息总质押余额(不知道怎么算利息)
//function getBalance() onlyOwner public pure returns (uint)  {
//    
//}

//换合约管理者账户,慎用。
function transferOwnership(address newOwner) onlyOwner public {
    if (newOwner != address(0)) {
        _owner = newOwner;
    }
}

}

3 Likes

楼上说的是另一件事。可以单独讨论。

本文说的是利用合约来获取cfx自带利息的代码,是另一件事。可以参考这一篇里的官方文章

虽然看不懂,但还是支持一波。社区有你更精彩,chy加油!