nest3.0从架构解析到克隆五(NestAbonus与NodeAssignment)

NestAbonus:Nest分红池合约。NodeAssignment:守护者节点合约。

返回总章
我们之前已经讲了NestOffer,NestToken和VoteContract。其中包含了token,mapping以及报价机部分。
而剩下的四个内容,本节讲的是NestAbonus与NodeAssignment;由于NTokenAuction和NTokenOffer属于额外功能累加,所以暂时就不讲了。
然后我们下一节将讲述如何的对nest进行简单的克隆。然后本系列教程就结束了。

NestAbonus

Nest分红池合约。其中由四个合约组成:
NEST 系统收益池合约(Nest_3_Abonus)
NEST 系统储蓄合约(Nest_3_Leveling)
NEST 系统收益锁仓验证合约(Nest_3_TokenSave)
NEST 系统收益分配逻辑合约(Nest_3_TokenAbonus)
我们这里只对最重要的Nest_3_Abonus进行解析。

/**
 * @title ETH bonus pool
 ETH分红池
 * @dev ETH collection and inquiry
 ETH领取与查询
 */
contract Nest_3_Abonus {
    using address_make_payable for address;
    using SafeMath for uint256;
  
    Nest_3_VoteFactory _voteFactory;                                //  Voting contract
	//投票合约
    address _nestAddress;                                           //  NEST contract address
	//NEST 合约地址
    mapping (address => uint256) ethMapping;                        //  ETH bonus ledger of corresponding tokens
	//  token对应 ETH 分红账本
    uint256 _mostDistribution = 40;                                 //  The highest allocation ratio of NEST bonus pool
    //  最高NEST分红池分配比例
	uint256 _leastDistribution = 20;                                //  The lowest allocation ratio of NEST bonus pool
     //  最低NEST分红池分配比例
	uint256 _distributionTime = 1200000;                            //  The decay time interval of NEST bonus pool allocation ratio 
    //  NEST分红池分配比例每次衰减时间间隔
	uint256 _distributionSpan = 5;                                  //  The decay degree of NEST bonus pool allocation ratio
    ////  NEST分红池分配比例每次衰减程度
    /**
    * @dev Initialization method
	初始化方法
    * @param voteFactory Voting contract address
	投票合约地址
    */
    constructor(address voteFactory) public {
        _voteFactory = Nest_3_VoteFactory(voteFactory);
        _nestAddress = address(_voteFactory.checkAddress("nest"));
    }
 
    /**
    * @dev Reset voting contract
	重置投票合约
    * @param voteFactory Voting contract address
	投票合约地址
    */
    function changeMapping(address voteFactory) public onlyOwner{
        _voteFactory = Nest_3_VoteFactory(voteFactory);
        _nestAddress = address(_voteFactory.checkAddress("nest"));
    }
  
    /**
    * @dev Transfer in bonus
	转入分红
    * @param token Corresponding to lock-up Token
	对应锁仓 NToken
    */
    function switchToEth(address token) public payable {
        ethMapping[token] = ethMapping[token].add(msg.value);
    }
  
    /**
    * @dev Transferin bonus - NToken offering fee
	转入分红-nToken报价手续费
    * @param token Corresponding to lock-up NToken
	对应锁仓 NToken
    */
    function switchToEthForNTokenOffer(address token) public payable {
        Nest_NToken nToken = Nest_NToken(token);
        (uint256 createBlock,) = nToken.checkBlockInfo();
        uint256 subBlock = block.number.sub(createBlock);
        uint256 times = subBlock.div(_distributionTime);
        uint256 distributionValue = times.mul(_distributionSpan);
        uint256 distribution = _mostDistribution;
        if (_leastDistribution.add(distributionValue) > _mostDistribution) {
            distribution = _leastDistribution;
        } else {
            distribution = _mostDistribution.sub(distributionValue);
        }
        uint256 nestEth = msg.value.mul(distribution).div(100);
        ethMapping[_nestAddress] = ethMapping[_nestAddress].add(nestEth);
        ethMapping[token] = ethMapping[token].add(msg.value.sub(nestEth));
    }
  
    /**
    * @dev Receive ETH
	领取
    * @param num Receive amount 
	领取数量
    * @param token Correspond to locked Token
	对应锁仓 NToken
    * @param target Transfer target
	转账目标
    */
    function getETH(uint256 num, address token, address target) public onlyContract {
        require(num <= ethMapping[token], "Insufficient storage balance");
        ethMapping[token] = ethMapping[token].sub(num);
        address payable addr = target.make_payable();
        addr.transfer(num);
    }
  
    /**
    * @dev Get bonus pool balance
	获取分红池余额
    * @param token Corresponded locked Token
	对应锁仓 NToken
    * @return uint256 Bonus pool balance
	分红池余额
    */
    function getETHNum(address token) public view returns (uint256) {
        return ethMapping[token];
    }
  
    // View NEST address
	//查看 NEST 地址
    function checkNestAddress() public view returns(address) {
        return _nestAddress;
    }
  
    // View the highest NEST bonus pool allocation ratio
	//查看最高 NEST 分红池分配比例
    function checkMostDistribution() public view returns(uint256) {
        return _mostDistribution;
    }
  
    // View the lowest NEST bonus pool allocation ratio
	// 查看最低 NEST 分红池分配比例
    function checkLeastDistribution() public view returns(uint256) {
        return _leastDistribution;
    }
  
    // View the decay time interval of NEST bonus pool allocation ratio 
	 // 查看 NEST 分红池分配比例每次衰减时间间隔
    function checkDistributionTime() public view returns(uint256) {
        return _distributionTime;
    }
  
    // View the decay degree of NEST bonus pool allocation ratio
	// 查看 NEST 分红池分配比例每次衰减程度
    function checkDistributionSpan() public view returns(uint256) {
        return _distributionSpan;
    }
  
    // Modify the highest NEST bonus pool allocation ratio
	// 修改最高 NEST 分红池分配比例
    function changeMostDistribution(uint256 num) public onlyOwner  {
        _mostDistribution = num;
    }
  
    // Modify the lowest NEST bonus pool allocation ratio
	// 修改 NEST 分红池分配比例每次衰减时间间隔
    function changeLeastDistribution(uint256 num) public onlyOwner  {
        _leastDistribution = num;
    }
  
    // Modify the decay time interval of NEST bonus pool allocation ratio 
	// 修改 NEST 分红池分配比例每次衰减时间间隔
    function changeDistributionTime(uint256 num) public onlyOwner  {
        _distributionTime = num;
    }
  
    // Modify the decay degree of NEST bonus pool allocation ratio
	// 修改 NEST 分红池分配比例每次衰减程度
    function changeDistributionSpan(uint256 num) public onlyOwner  {
        _distributionSpan = num;
    }
  
    // Withdraw ETH
	//取出ETH
    function turnOutAllEth(uint256 amount, address target) public onlyOwner {
        address payable addr = target.make_payable();
        addr.transfer(amount);  
    }
  
    // Only bonus logic contract
	//// 仅限分红逻辑合约
    modifier onlyContract(){
        require(_voteFactory.checkAddress("nest.v3.tokenAbonus") == address(msg.sender), "No authority");
        _;
    }
  
    // Administrator only
	// 仅限管理员
    modifier onlyOwner(){
        require(_voteFactory.checkOwners(address(msg.sender)), "No authority");
        _;
    }
}

NodeAssignment

守护者节点合约。
NEST_NodeAssignment:节点分配合约
NEST_NodeAssignmentData:NestNode 领取数据
NEST_NodeSave:分配nest存储

NEST_NodeSave

/**
 * @title Guardian node nest storage
 分配nest存储
 */
contract NEST_NodeSave {
    Nest_3_VoteFactory mappingContract;                  
    IBNEST nestContract;                         
  
    /**
    * @dev Initialization method
	//  初始化方法
    * @param map Mapping contract address
	//  投票合约地址
    */
    constructor (address map) public {
        mappingContract = Nest_3_VoteFactory(address(map));          
        nestContract = IBNEST(address(mappingContract.checkAddress("nest")));        
    }
  
    /**
    * @dev Change mapping contract
	重置投票合约
    * @param map Mapping contract address
	投票合约地址
    */
    function changeMapping(address map) public onlyOwner {
        mappingContract = Nest_3_VoteFactory(address(map));          
        nestContract = IBNEST(address(mappingContract.checkAddress("nest")));        
    }
  
    /**
    * @dev Transfer out nest
	 // 转出nest
    * @param amount Transfer out quantity
    * @param to Transfer out target
    * @return Actual transfer out quantity
    */
    function turnOut(uint256 amount, address to) public onlyMiningCalculation returns(uint256) {
        uint256 leftNum = nestContract.balanceOf(address(this));
        if (leftNum >= amount) {
            nestContract.transfer(to, amount);
            return amount;
        } else {
            return 0;
        }
    }
    // 仅限管理员
    modifier onlyOwner(){
        require(mappingContract.checkOwners(msg.sender) == true);
        _;
    }
// 仅限分配合约
    modifier onlyMiningCalculation(){
        require(address(mappingContract.checkAddress("nodeAssignment")) == msg.sender);
        _;
    }
  
}

NEST_NodeAssignmentData

/**
 * @title Guardian node receives data
 NestNode 领取数据
 */
contract NEST_NodeAssignmentData {
    using SafeMath for uint256;
    Nest_3_VoteFactory mappingContract;    ////  映射合约      
    uint256 nodeAllAmount = 9546345842385995696603;   //  节点分配 NEST 数量   
		//这个没搞清楚是什么
    mapping(address => uint256) nodeLatestAmount;         // //  上次领取数量  
  
    /**
    * @dev Initialization method
	初始化方法
    * @param map Mapping contract address
	投票合约地址
    */
    constructor (address map) public {
        mappingContract = Nest_3_VoteFactory(map); 
    }
  
    /**
    * @dev Change mapping contract
	重置投票合约
    * @param map Mapping contract address
	投票合约地址
    */
    function changeMapping(address map) public onlyOwner{
        mappingContract = Nest_3_VoteFactory(map); 
    }
  
    //  Add nest
	//增加nest
    function addNest(uint256 amount) public onlyNodeAssignment {
        nodeAllAmount = nodeAllAmount.add(amount);
    }
  
    //  View cumulative total
	//查看累计总数
    function checkNodeAllAmount() public view returns (uint256) {
        return nodeAllAmount;
    }
  
    //  Record last received quantity
	// 记录上次数量
    function addNodeLatestAmount(address add ,uint256 amount) public onlyNodeAssignment {
        nodeLatestAmount[add] = amount;
    }
  
    //  View last received quantity
	// 查看上次数量
    function checkNodeLatestAmount(address add) public view returns (uint256) {
        return nodeLatestAmount[address(add)];
    }
    // 仅限管理员
    modifier onlyOwner(){
        require(mappingContract.checkOwners(msg.sender) == true);
        _;
    }
    // 仅限分配合约
    modifier onlyNodeAssignment(){
        require(address(msg.sender) == address(mappingContract.checkAddress("nodeAssignment")));
        _;
    }
}

NEST_NodeAssignment

/**
 * @title Node assignment contract
 节点分配合约
 */
contract NEST_NodeAssignment {
  
    using SafeMath for uint256;
    Nest_3_VoteFactory mappingContract;                              //  Mapping contract
	//  映射合约
    IBNEST nestContract;                                    //  NEST contract
	//  NEST 合约
    SuperMan supermanContract;                              //  NestNode contract
	//  NestNode 合约
    NEST_NodeSave nodeSave;                                 //  NestNode save contract
	//  NestNode NEST锁仓
    NEST_NodeAssignmentData nodeAssignmentData;             //  NestNode data assignment contract
	//  NestNode 领取数据

    /**
    * @dev Initialization method
	初始化方法
    * @param map Voting contract address
	投票合约地址
    */
    constructor (address map) public {
        mappingContract = Nest_3_VoteFactory(map); 
        nestContract = IBNEST(address(mappingContract.checkAddress("nest")));
        supermanContract = SuperMan(address(mappingContract.checkAddress("nestNode")));
        nodeSave = NEST_NodeSave(address(mappingContract.checkAddress("nestNodeSave")));
        nodeAssignmentData = NEST_NodeAssignmentData(address(mappingContract.checkAddress("nodeAssignmentData")));
    }
  
    /**
    * @dev Reset voting contract
	重置投票合约
    * @param map Voting contract address
	投票合约地址
    */
    function changeMapping(address map) public onlyOwner{
        mappingContract = Nest_3_VoteFactory(map); 
        nestContract = IBNEST(address(mappingContract.checkAddress("nest")));
        supermanContract = SuperMan(address(mappingContract.checkAddress("nestNode")));
        nodeSave = NEST_NodeSave(address(mappingContract.checkAddress("nestNodeSave")));
        nodeAssignmentData = NEST_NodeAssignmentData(address(mappingContract.checkAddress("nodeAssignmentData")));
    }
  
    /**
    * @dev Deposit NEST token
	存入 NEST
    * @param amount Amount of deposited NEST
	amount 存入 NEST 数量
    */
    function bookKeeping(uint256 amount) public {
        require(amount > 0);
        require(nestContract.transferFrom(address(msg.sender), address(nodeSave), amount));
        nodeAssignmentData.addNest(amount);
    }
  
    // NestNode receive and settlement
	//领取结算
    function nodeGet() public {
        require(address(msg.sender) == address(tx.origin));
        require(supermanContract.balanceOf(address(msg.sender)) > 0);
        uint256 allAmount = nodeAssignmentData.checkNodeAllAmount();
        uint256 amount = allAmount.sub(nodeAssignmentData.checkNodeLatestAmount(address(msg.sender)));
        uint256 getAmount = amount.mul(supermanContract.balanceOf(address(msg.sender))).div(1500);
        require(nestContract.balanceOf(address(nodeSave)) >= getAmount);
        nodeSave.turnOut(getAmount,address(msg.sender));
        nodeAssignmentData.addNodeLatestAmount(address(msg.sender),allAmount);
    }
  
    // NestNode transfer settlement
	// NestNode 转账结算
    function nodeCount(address fromAdd, address toAdd) public {
        require(address(supermanContract) == address(msg.sender));
        require(supermanContract.balanceOf(address(fromAdd)) > 0);
        uint256 allAmount = nodeAssignmentData.checkNodeAllAmount();
        uint256 amountFrom = allAmount.sub(nodeAssignmentData.checkNodeLatestAmount(address(fromAdd)));
        uint256 getAmountFrom = amountFrom.mul(supermanContract.balanceOf(address(fromAdd))).div(1500);
        if (nestContract.balanceOf(address(nodeSave)) >= getAmountFrom) {
            nodeSave.turnOut(getAmountFrom,address(fromAdd));
            nodeAssignmentData.addNodeLatestAmount(address(fromAdd),allAmount);
        }
        uint256 amountTo = allAmount.sub(nodeAssignmentData.checkNodeLatestAmount(address(toAdd)));
        uint256 getAmountTo = amountTo.mul(supermanContract.balanceOf(address(toAdd))).div(1500);
        if (nestContract.balanceOf(address(nodeSave)) >= getAmountTo) {
            nodeSave.turnOut(getAmountTo,address(toAdd));
            nodeAssignmentData.addNodeLatestAmount(address(toAdd),allAmount);
        }
    }
  
    // NestNode receivable amount
	// 超级节点可领取金额
    function checkNodeNum() public view returns (uint256) {
         uint256 allAmount = nodeAssignmentData.checkNodeAllAmount();
         uint256 amount = allAmount.sub(nodeAssignmentData.checkNodeLatestAmount(address(msg.sender)));
         uint256 getAmount = amount.mul(supermanContract.balanceOf(address(msg.sender))).div(1500);
         return getAmount; 
    }
  
    // Administrator only
	// 仅限管理员
    modifier onlyOwner(){
        require(mappingContract.checkOwners(msg.sender));
        _;
    }
}

本节总结

本节主要是对NestAbonus(Nest分红池合约)和NodeAssignment(守护者节点合约)进行描述。

  • 学分: 5
  • 分类: NEST
  • 标签:
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
问答区块链
问答区块链
致力于人工智能与区块链相结合下的智能设备自治