编译器
0.6.12+commit.27d51765
文件 1 的 8:Address.sol
pragma solidity 0.6.12;
library Address {
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value:amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
文件 2 的 8:INNRewardPool.sol
pragma solidity ^0.6.12;
interface INNRewardPool {
function addNNReward(uint256 _amount) external;
function claimNNReward() external ;
function nodeCount(address fromAdd, address toAdd) external;
function unclaimedNNReward() external view returns (uint256 reward);
function loadContracts() external;
function loadGovernance() external;
event NNRewardAdded(uint256 reward, uint256 allRewards);
event NNRewardClaimed(address nnode, uint256 share);
event FlagSet(address gov, uint256 flag);
}
文件 3 的 8:INestMining.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
import "../lib/SafeERC20.sol";
interface INestMining {
struct Params {
uint8 miningEthUnit;
uint32 nestStakedNum1k;
uint8 biteFeeRate;
uint8 miningFeeRate;
uint8 priceDurationBlock;
uint8 maxBiteNestedLevel;
uint8 biteInflateFactor;
uint8 biteNestInflateFactor;
}
function priceOf(address token) external view returns(uint256 ethAmount, uint256 tokenAmount, uint256 bn);
function priceListOfToken(address token, uint8 num) external view returns(uint128[] memory data, uint256 bn);
function latestPriceOf(address token) external view returns (uint256 ethAmount, uint256 tokenAmount, uint256 bn);
function priceAvgAndSigmaOf(address token)
external view returns (uint128, uint128, int128, uint32);
function minedNestAmount() external view returns (uint256);
function loadContracts() external;
function loadGovernance() external;
function upgrade() external;
function setup(uint32 genesisBlockNumber, uint128 latestMiningHeight, uint128 minedNestTotalAmount, Params calldata initParams) external;
function setParams1(uint128 latestMiningHeight, uint128 minedNestTotalAmount) external;
}
文件 4 的 8:INestPool.sol
pragma solidity ^0.6.12;
import "../lib/SafeERC20.sol";
interface INestPool {
function addNest(address miner, uint256 amount) external;
function addNToken(address contributor, address ntoken, uint256 amount) external;
function depositEth(address miner) external payable;
function depositNToken(address miner, address from, address ntoken, uint256 amount) external;
function freezeEth(address miner, uint256 ethAmount) external;
function unfreezeEth(address miner, uint256 ethAmount) external;
function freezeNest(address miner, uint256 nestAmount) external;
function unfreezeNest(address miner, uint256 nestAmount) external;
function freezeToken(address miner, address token, uint256 tokenAmount) external;
function unfreezeToken(address miner, address token, uint256 tokenAmount) external;
function freezeEthAndToken(address miner, uint256 ethAmount, address token, uint256 tokenAmount) external;
function unfreezeEthAndToken(address miner, uint256 ethAmount, address token, uint256 tokenAmount) external;
function getNTokenFromToken(address token) external view returns (address);
function setNTokenToToken(address token, address ntoken) external;
function withdrawEth(address miner, uint256 ethAmount) external;
function withdrawToken(address miner, address token, uint256 tokenAmount) external;
function withdrawNest(address miner, uint256 amount) external;
function withdrawEthAndToken(address miner, uint256 ethAmount, address token, uint256 tokenAmount) external;
function withdrawNTokenAndTransfer(address miner, address ntoken, uint256 amount, address to) external;
function balanceOfNestInPool(address miner) external view returns (uint256);
function balanceOfEthInPool(address miner) external view returns (uint256);
function balanceOfTokenInPool(address miner, address token) external view returns (uint256);
function addrOfNestToken() external view returns (address);
function addrOfNestMining() external view returns (address);
function addrOfNTokenController() external view returns (address);
function addrOfNNRewardPool() external view returns (address);
function addrOfNNToken() external view returns (address);
function addrOfNestStaking() external view returns (address);
function addrOfNestQuery() external view returns (address);
function addrOfNestDAO() external view returns (address);
function addressOfBurnedNest() external view returns (address);
function setGovernance(address _gov) external;
function governance() external view returns(address);
function initNestLedger(uint256 amount) external;
function drainNest(address to, uint256 amount, address gov) external;
}
文件 5 的 8:NNRewardPool.sol
pragma solidity ^0.6.12;
import "./lib/SafeMath.sol";
import "./iface/INestPool.sol";
import "./lib/SafeERC20.sol";
import './lib/TransferHelper.sol';
import "./iface/INestMining.sol";
import "./iface/INNRewardPool.sol";
contract NNRewardPool is INNRewardPool {
using SafeMath for uint256;
uint8 public flag;
uint8 constant NNREWARD_FLAG_UNINITIALIZED = 0;
uint8 constant NNREWARD_FLAG_ACTIVE = 1;
uint8 constant NNREWARD_FLAG_PAUSED = 2;
uint256 public rewardSum;
uint256 public totalSupplyNN;
mapping(address => uint256) public rewardSumCheckpoint;
address public C_NNToken;
address public C_NestToken;
address public C_NestPool;
address public C_NestMining;
address public governance;
constructor(address NestPool, address NNToken) public
{
C_NestPool = NestPool;
C_NNToken = NNToken;
totalSupplyNN = uint128(ERC20(C_NNToken).totalSupply());
governance = msg.sender;
flag = NNREWARD_FLAG_UNINITIALIZED;
}
function start() external onlyGovernance
{
require(flag == NNREWARD_FLAG_UNINITIALIZED, "Nest:NTC:!flag");
flag = NNREWARD_FLAG_ACTIVE;
}
modifier onlyBy(address _account)
{
require(msg.sender == _account, "Nest:NN:!Auth");
_;
}
modifier noContract()
{
require(address(msg.sender) == address(tx.origin), "Nest:NN:BAN(contract)");
_;
}
modifier onlyGovernance()
{
require(msg.sender == governance, "Nest:NN:!governance");
_;
}
modifier onlyGovOrBy(address _account)
{
if (msg.sender != governance) {
require(msg.sender == _account,
"Nest:NN:!Auth");
}
_;
}
function loadGovernance() override external
{
governance = INestPool(C_NestPool).governance();
}
function loadContracts() override external onlyGovOrBy(C_NestPool)
{
C_NestToken = INestPool(C_NestPool).addrOfNestToken();
C_NNToken = INestPool(C_NestPool).addrOfNNToken();
C_NestMining = INestPool(C_NestPool).addrOfNestMining();
}
function pause() external onlyGovernance
{
require(flag == NNREWARD_FLAG_ACTIVE, "Nest:NN:!flag");
flag = NNREWARD_FLAG_PAUSED;
emit FlagSet(address(msg.sender), uint256(NNREWARD_FLAG_PAUSED));
}
function resume() external onlyGovernance
{
require(flag == NNREWARD_FLAG_PAUSED, "Nest:NN:!flag");
flag = NNREWARD_FLAG_ACTIVE;
emit FlagSet(address(msg.sender), uint256(NNREWARD_FLAG_ACTIVE));
}
function addNNReward(uint256 _amount) override external onlyBy(C_NestMining)
{
if (_amount > 0) {
uint256 _newSum = uint256(rewardSum).add(_amount);
rewardSum = uint128(_newSum);
emit NNRewardAdded(_amount, _newSum);
}
return;
}
function claimNNReward() override external noContract
{
require(flag == NNREWARD_FLAG_ACTIVE, "Nest:NN:!flag");
uint256 blnc = ERC20(C_NNToken).balanceOf(address(msg.sender));
require(blnc > 0, "Nest:NN:!(NNToken)");
uint256 total = totalSupplyNN;
uint256 sum = rewardSum;
uint256 reward = sum.sub(rewardSumCheckpoint[address(msg.sender)]);
uint256 share = reward.mul(blnc).div(total);
rewardSumCheckpoint[address(msg.sender)] = sum;
emit NNRewardClaimed(address(msg.sender), share);
INestPool(C_NestPool).withdrawNest(address(this), share);
require(ERC20(C_NestToken).transfer(address(msg.sender), share), "Nest:NN:!TRANS");
return;
}
function settleNNReward(address from, address to) internal
{
require(flag == NNREWARD_FLAG_ACTIVE, "Nest:NN:!flag");
uint256 fromBlnc = ERC20(C_NNToken).balanceOf(address(from));
require (fromBlnc > 0, "Nest:NN:!(fromBlnc)");
uint256 sum = rewardSum;
uint256 total = totalSupplyNN;
uint256 fromReward = sum.sub(rewardSumCheckpoint[from]).mul(fromBlnc).div(total);
rewardSumCheckpoint[from] = sum;
uint256 toBlnc = ERC20(C_NNToken).balanceOf(address(to));
uint256 toReward = sum.sub(rewardSumCheckpoint[to]).mul(toBlnc).div(total);
rewardSumCheckpoint[to] = sum;
if (fromReward > 0) {
INestPool(C_NestPool).withdrawNest(address(this), fromReward);
require(ERC20(C_NestToken).transfer(from, fromReward), "Nest:NN:!TRANS");
emit NNRewardClaimed(from, uint128(fromReward));
}
if (toReward > 0) {
INestPool(C_NestPool).withdrawNest(address(this), toReward);
require(ERC20(C_NestToken).transfer(to, toReward), "Nest:NN:!TRANS");
emit NNRewardClaimed(to, uint128(toReward));
}
return;
}
function nodeCount(address fromAdd, address toAdd)
override
external
onlyBy(address(C_NNToken))
{
settleNNReward(fromAdd, toAdd);
return;
}
function unclaimedNNReward() override external view returns (uint256 reward)
{
uint256 blnc = ERC20(C_NNToken).balanceOf(address(msg.sender));
uint256 sum = uint256(rewardSum);
uint256 total = uint256(totalSupplyNN);
reward = sum.sub(rewardSumCheckpoint[address(msg.sender)]).mul(blnc).div(total);
}
}
文件 6 的 8:SafeERC20.sol
pragma solidity 0.6.12;
import "./Address.sol";
import "./SafeMath.sol";
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(ERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(ERC20 token, address spender, uint256 value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(ERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(ERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function callOptionalReturn(ERC20 token, bytes memory data) private {
require(address(token).isContract(), "SafeERC20: call to non-contract");
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
interface ERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 7 的 8:SafeMath.sol
pragma solidity ^0.6.12;
library SafeMath {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, 'ds-math-add-overflow');
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, 'ds-math-sub-underflow');
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
}
function div(uint x, uint y) internal pure returns (uint z) {
require(y > 0, "ds-math-div-zero");
z = x / y;
}
}
文件 8 的 8:TransferHelper.sol
pragma solidity ^0.6.12;
library TransferHelper {
function safeApprove(address token, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
}
function safeTransferETH(address to, uint value) internal {
(bool success,) = to.call{value:value}(new bytes(0));
require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
}
}
{
"compilationTarget": {
"contracts/NNRewardPool.sol": "NNRewardPool"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"NestPool","type":"address"},{"internalType":"address","name":"NNToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gov","type":"address"},{"indexed":false,"internalType":"uint256","name":"flag","type":"uint256"}],"name":"FlagSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allRewards","type":"uint256"}],"name":"NNRewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nnode","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"NNRewardClaimed","type":"event"},{"inputs":[],"name":"C_NNToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NestMining","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NestPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NestToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addNNReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimNNReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flag","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loadContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"loadGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromAdd","type":"address"},{"internalType":"address","name":"toAdd","type":"address"}],"name":"nodeCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardSum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardSumCheckpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupplyNN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unclaimedNNReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"}]