编译器
0.6.12+commit.27d51765
文件 1 的 17:Address.sol
pragma solidity ^0.6.2;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
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");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 17:ChillFinance.sol
pragma solidity ^0.6.0;
import "../helper/SafeERC20.sol";
import "../helper/SafeMath.sol";
import "../helper/Ownable.sol";
import "./ChillToken.sol";
import "../uniswap/UniswapV2Library.sol";
import "./PairValue.sol";
import "../interfaces/IUniswapV2Pair.sol";
import "../interfaces/IUniStakingRewards.sol";
interface IMigratorChef {
function migrate(IERC20 token) external returns (IERC20);
}
contract ChillFinance is Ownable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
uint256 startedBlock;
}
struct PoolInfo {
IERC20 lpToken;
uint256 allocPoint;
uint256 lastRewardBlock;
uint256 accChillPerShare;
uint256 totalPoolBalance;
address nirvanaRewardAddress;
uint256 nirvanaFee;
}
ChillToken public chill;
address public devaddr;
uint256 public DEV_FEE = 0;
uint256 public DEV_TAX_FEE = 20;
PoolInfo[] public poolInfo;
uint256 public bonusEndBlock;
uint256 public constant BONUS_MULTIPLIER = 10;
uint256 public totalAllocPoint = 0;
uint256 public startBlockOfChill;
mapping (uint256 => mapping (address => UserInfo)) public userInfo;
mapping (uint256 => address[]) public poolUsers;
mapping (uint256 => mapping(address => bool)) public isUserExist;
mapping (address => bool) public stakingUniPools;
mapping (address => address) public uniRewardAddresses;
mapping (uint256 => bool) public isCheckInitialPeriod;
mapping (address => bool) private distributors;
IMigratorChef public migrator;
uint256 initialPeriod;
uint256 public initialAmt = 20000;
uint256[] public blockPerPhase;
uint256[] public blockMilestone;
uint256 public phase1time;
uint256 public phase2time;
uint256 public phase3time;
uint256 public phase4time;
uint256 public phase5time;
uint256 burnFlag = 0;
uint256 lastBurnedPhase1 = 0;
uint256 lastBurnedPhase2 = 0;
uint256 lastTimeOfBurn;
uint256 totalBurnedAmount;
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
modifier isDistributor(address _isDistributor) {
require(distributors[_isDistributor]);
_;
}
constructor(
ChillToken _chill,
address _devaddr,
uint256 _startBlockOfChill
) public {
chill = _chill;
devaddr = _devaddr;
startBlockOfChill = block.number.add(_startBlockOfChill);
bonusEndBlock = block.number;
initialPeriod = block.number.add(99999);
blockPerPhase.push(75e18);
blockPerPhase.push(100e18);
blockPerPhase.push(50e18);
blockPerPhase.push(25e18);
blockPerPhase.push(0);
blockMilestone.push(2201);
blockMilestone.push(4401);
blockMilestone.push(6600);
blockMilestone.push(8798);
blockMilestone.push(10997);
phase1time = block.number.add(92338);
phase2time = block.number.add(290201);
phase3time = block.number.add(488069);
phase4time = block.number.add(883804);
phase5time = block.number.add(0);
lastTimeOfBurn = block.timestamp.add(1 days);
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
function userPoollength(uint256 _pid) external view returns (uint256) {
return poolUsers[_pid].length;
}
function getPoolUsers(uint256 _pid) public view returns(address[] memory) {
return poolUsers[_pid];
}
function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner {
if (_withUpdate) {
massUpdatePools();
}
uint256 _lastRewardBlock = block.number > startBlockOfChill ? block.number : startBlockOfChill;
totalAllocPoint = totalAllocPoint.add(_allocPoint);
poolInfo.push(PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardBlock: _lastRewardBlock,
accChillPerShare: 0,
totalPoolBalance: 0,
nirvanaRewardAddress: address(0),
nirvanaFee: 0
}));
}
function set(uint256 _pid, uint256 _allocPoint, uint256 _nirvanaFee, address _nirvanaRewardAddress, bool _withUpdate) public onlyOwner {
if (_withUpdate) {
massUpdatePools();
}
totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
poolInfo[_pid].allocPoint = _allocPoint;
poolInfo[_pid].nirvanaRewardAddress = _nirvanaRewardAddress;
poolInfo[_pid].nirvanaFee = _nirvanaFee;
}
function setMigrator(address _migrator) public onlyOwner {
migrator = IMigratorChef(_migrator);
}
function migrate(uint256 _pid) public {
require(address(migrator) != address(0), "migrate: no migrator");
PoolInfo storage pool = poolInfo[_pid];
IERC20 lpToken = pool.lpToken;
uint256 bal = lpToken.balanceOf(address(this));
lpToken.safeApprove(address(migrator), bal);
IERC20 newLpToken = migrator.migrate(lpToken);
require(bal == newLpToken.balanceOf(address(this)), "migrate: bad");
pool.lpToken = newLpToken;
}
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
function deposit(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
if (isCheckInitialPeriod[_pid]) {
if (block.number <= initialPeriod) {
require(PairValue.countEthAmount(address(pool.lpToken), _amount) <= initialAmt, "Amount must be less than or equal to 20000 dollars.");
} else {
isCheckInitialPeriod[_pid] = false;
}
}
if (user.startedBlock <= 0) {
user.startedBlock = block.number;
}
updatePool(_pid);
if (user.amount > 0) {
userRewardAndTaxes(pool, user);
}
pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
pool.totalPoolBalance = pool.totalPoolBalance.add(_amount);
user.amount = user.amount.add(_amount);
user.rewardDebt = user.amount.mul(pool.accChillPerShare).div(1e12);
user.startedBlock = block.number;
if (stakingUniPools[address(pool.lpToken)] && _amount > 0) {
stakeInUni(_amount, address(pool.lpToken), uniRewardAddresses[address(pool.lpToken)]);
}
if (!isUserExist[_pid][msg.sender]) {
isUserExist[_pid][msg.sender] = true;
poolUsers[_pid].push(msg.sender);
}
emit Deposit(msg.sender, _pid, _amount);
}
function stakeInUni(uint256 amount, address v2address, address _stakeAddress) private {
IERC20(v2address).approve(address(_stakeAddress), amount);
IUniStakingRewards(_stakeAddress).stake(amount);
}
function withdraw(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(user.amount >= _amount, "withdraw is not valid");
if (user.startedBlock <= 0) {
user.startedBlock = block.number;
}
if (stakingUniPools[address(pool.lpToken)] && _amount > 0) {
withdrawUni(uniRewardAddresses[address(pool.lpToken)], _amount);
}
updatePool(_pid);
userRewardAndTaxes(pool, user);
user.amount = user.amount.sub(_amount);
user.rewardDebt = user.amount.mul(pool.accChillPerShare).div(1e12);
user.startedBlock = block.number;
pool.totalPoolBalance = pool.totalPoolBalance.sub(_amount);
pool.lpToken.safeTransfer(address(msg.sender), _amount);
emit Withdraw(msg.sender, _pid, _amount);
}
function withdrawUni(address _stakeAddress, uint256 _amount) private {
IUniStakingRewards(_stakeAddress).withdraw(_amount);
}
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.number <= pool.lastRewardBlock) {
return;
}
if (pool.totalPoolBalance == 0) {
pool.lastRewardBlock = block.number;
return;
}
uint256 chillReward;
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
if (block.number <= phase1time) {
chillReward = multiplier.mul(blockPerPhase[0]).mul(pool.allocPoint).div(totalAllocPoint);
} else if (block.number <= phase2time) {
chillReward = multiplier.mul(blockPerPhase[1]).mul(pool.allocPoint).div(totalAllocPoint);
} else if (block.number <= phase3time) {
chillReward = multiplier.mul(blockPerPhase[2]).mul(pool.allocPoint).div(totalAllocPoint);
} else if (block.number <= phase4time) {
chillReward = multiplier.mul(blockPerPhase[3]).mul(pool.allocPoint).div(totalAllocPoint);
} else {
chillReward = multiplier.mul(blockPerPhase[4]).mul(pool.allocPoint).div(totalAllocPoint);
}
if (chillReward > 0) {
if (DEV_FEE > 0) {
chill.mint(devaddr, chillReward.mul(DEV_FEE).div(100));
}
chill.mint(address(this), chillReward);
}
pool.accChillPerShare = pool.accChillPerShare.add(chillReward.mul(1e12).div(pool.totalPoolBalance));
pool.lastRewardBlock = block.number;
}
function userRewardAndTaxes(PoolInfo storage pool, UserInfo storage user) internal {
uint256 pending = user.amount.mul(pool.accChillPerShare).div(1e12).sub(user.rewardDebt);
uint256 tax = deductTaxByBlock(getCrossMultiplier(user.startedBlock, block.number));
if (tax > 0) {
uint256 pendingTax = pending.mul(tax).div(100);
uint256 devReward = pendingTax.mul(DEV_TAX_FEE).div(100);
safeChillTransfer(devaddr, devReward);
if (pool.nirvanaFee > 0) {
uint256 nirvanaReward = pendingTax.mul(pool.nirvanaFee).div(100);
safeChillTransfer(pool.nirvanaRewardAddress, nirvanaReward);
safeChillTransfer(msg.sender, pending.sub(devReward).sub(nirvanaReward));
chill.burn(msg.sender, pendingTax.sub(devReward).sub(nirvanaReward));
lastDayBurned(pendingTax.sub(devReward).sub(nirvanaReward));
} else {
safeChillTransfer(msg.sender, pending.sub(devReward));
chill.burn(msg.sender, pendingTax.sub(devReward));
lastDayBurned(pendingTax.sub(devReward));
}
} else {
safeChillTransfer(msg.sender, pending);
lastDayBurned(0);
}
}
function lastDayBurned(uint256 burnedAmount) internal {
if (block.timestamp >= lastTimeOfBurn) {
if (burnFlag == 0) {
burnFlag = 1;
lastBurnedPhase1 = 0;
} else {
burnFlag = 0;
lastBurnedPhase2 = 0;
}
lastTimeOfBurn = block.timestamp.add(1 days);
}
totalBurnedAmount = totalBurnedAmount.add(burnedAmount);
if (burnFlag == 0) {
lastBurnedPhase2 = lastBurnedPhase2.add(burnedAmount);
} else {
lastBurnedPhase1 = lastBurnedPhase1.add(burnedAmount);
}
}
function getBurnedDetails() public view returns (uint256, uint256, uint256, uint256) {
return (burnFlag, lastBurnedPhase1, lastBurnedPhase2, totalBurnedAmount);
}
function pendingChill(uint256 _pid, address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 pending;
uint256 accChillPerShare = pool.accChillPerShare;
uint256 lpSupply = pool.totalPoolBalance;
if (lpSupply != 0) {
uint256 chillReward;
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
if (block.number <= phase1time) {
chillReward = multiplier.mul(blockPerPhase[0]).mul(pool.allocPoint).div(totalAllocPoint);
} else if (block.number <= phase2time) {
chillReward = multiplier.mul(blockPerPhase[1]).mul(pool.allocPoint).div(totalAllocPoint);
} else if (block.number <= phase3time) {
chillReward = multiplier.mul(blockPerPhase[2]).mul(pool.allocPoint).div(totalAllocPoint);
} else if (block.number <= phase4time) {
chillReward = multiplier.mul(blockPerPhase[3]).mul(pool.allocPoint).div(totalAllocPoint);
} else {
chillReward = multiplier.mul(blockPerPhase[4]).mul(pool.allocPoint).div(totalAllocPoint);
}
accChillPerShare = accChillPerShare.add(chillReward.mul(1e12).div(pool.totalPoolBalance));
pending = user.amount.mul(accChillPerShare).div(1e12).sub(user.rewardDebt);
uint256 tax = deductTaxByBlock(getCrossMultiplier(user.startedBlock, block.number));
if (tax > 0) {
uint256 pendingTax = pending.mul(tax).div(100);
pending = pending.sub(pendingTax);
}
}
return pending;
}
function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
if (_to <= bonusEndBlock) {
return _to.sub(_from).mul(BONUS_MULTIPLIER);
} else if (_from >= bonusEndBlock) {
return _to.sub(_from);
} else {
return bonusEndBlock.sub(_from).mul(BONUS_MULTIPLIER).add(
_to.sub(bonusEndBlock)
);
}
}
function getCrossMultiplier(uint256 _from, uint256 currentblock) public view returns (uint256) {
uint256 multiplier;
if (currentblock > _from) {
multiplier = currentblock.sub(_from);
} else {
multiplier = _from.sub(currentblock);
}
return multiplier;
}
function getNirvanaStatus(uint256 _from) public view returns (uint256) {
uint256 multiplier = getCrossMultiplier(_from, block.number);
uint256 isNirvana = getTotalBlocksCovered(multiplier);
return isNirvana;
}
function getTotalBlocksCovered(uint256 _block) internal view returns(uint256) {
if (_block >= blockMilestone[4]) {
return 50;
} else if (_block >= blockMilestone[3]) {
return 40;
} else if (_block >= blockMilestone[2]) {
return 30;
} else if (_block >= blockMilestone[1]) {
return 20;
} else if (_block >= blockMilestone[0]) {
return 10;
} else {
return 0;
}
}
function deductTaxByBlock(uint256 _block) internal view returns(uint256) {
if (_block <= blockMilestone[0]) {
return 50;
} else if (_block <= blockMilestone[1]) {
return 40;
} else if (_block <= blockMilestone[2]) {
return 30;
} else if (_block <= blockMilestone[3]) {
return 20;
} else if (_block <= blockMilestone[4]) {
return 10;
} else {
return 0;
}
}
function safeChillTransfer(address _to, uint256 _amount) internal {
uint256 chillBal = chill.balanceOf(address(this));
if (_amount > chillBal) {
chill.transfer(_to, chillBal);
} else {
chill.transfer(_to, _amount);
}
}
function getUniReward(address _stakeAddress) public onlyOwner {
IUniStakingRewards(_stakeAddress).getReward();
}
function accessReward(address _uniAddress, address _to, uint256 _amount) public isDistributor(msg.sender) {
require(_amount <= IERC20(_uniAddress).balanceOf(address(this)), "Not Enough Uni Token Balance");
require(_to != address(0), "Not Vaild Address");
IERC20(_uniAddress).safeTransfer(_to, _amount);
}
function addStakeUniPool(address _uniV2Pool, address _stakingRewardAddress) public onlyOwner {
require(!stakingUniPools[_uniV2Pool], "This pool is already exist.");
uint256 _amount = IERC20(_uniV2Pool).balanceOf(address(this));
if(_amount > 0) {
stakeInUni(_amount, address(_uniV2Pool), address(_stakingRewardAddress));
}
stakingUniPools[_uniV2Pool] = true;
uniRewardAddresses[_uniV2Pool] = _stakingRewardAddress;
}
function removeStakeUniPool(address _uniV2Pool) public onlyOwner {
require(stakingUniPools[_uniV2Pool], "This pool is not exist.");
uint256 _amount = IUniStakingRewards(uniRewardAddresses[address(_uniV2Pool)]).balanceOf(address(this));
if (_amount > 0) {
IUniStakingRewards(uniRewardAddresses[address(_uniV2Pool)]).withdraw(_amount);
}
stakingUniPools[_uniV2Pool] = false;
uniRewardAddresses[_uniV2Pool] = address(0);
}
function dev(address _devaddr, uint256 _devFee, uint256 _devTaxFee) public {
require(msg.sender == devaddr, "dev adddress is not valid");
devaddr = _devaddr;
DEV_FEE = _devFee;
DEV_TAX_FEE = _devTaxFee;
}
function setCheckInitialPeriodAndAmount(uint256 _pid, bool _isCheck, uint256 _amount) public onlyOwner {
isCheckInitialPeriod[_pid] = _isCheck;
initialAmt = _amount;
}
function setBlockMilestoneByIndex(uint256 _index, uint256 _blockMilestone) public onlyOwner {
blockMilestone[_index] = _blockMilestone;
}
function setAndEditPhaseTime(uint256 _index, uint256 _time, uint256 _chillPerBlock) public onlyOwner {
blockPerPhase[_index] = _chillPerBlock;
if(_index == 0) {
phase1time = phase1time.add(_time);
} else if(_index == 1) {
phase2time = phase2time.add(_time);
} else if(_index == 2) {
phase3time = phase3time.add(_time);
} else if(_index == 3) {
phase4time = phase4time.add(_time);
} else if(_index == 4) {
phase5time = phase5time.add(_time);
}
}
function getPhaseTimeAndBlocks() public view returns(uint256, uint256) {
if (block.number <= phase1time) {
return ( phase1time, blockPerPhase[0] );
} else if (block.number <= phase2time) {
return ( phase2time, blockPerPhase[1] );
} else if (block.number <= phase3time) {
return ( phase3time, blockPerPhase[2] );
} else if (block.number <= phase4time) {
return ( phase4time, blockPerPhase[3] );
} else {
return ( phase5time, blockPerPhase[4] );
}
}
function setRewardDistributor(address _distributor, bool _isdistributor) public onlyOwner {
distributors[_distributor] = _isdistributor;
}
}
文件 3 的 17:ChillToken.sol
pragma solidity 0.6.12;
import "../helper/ERC20.sol";
import "../helper/Ownable.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/IUniswapV2Factory.sol";
import "../interfaces/IUniswapV2Router02.sol";
import "../interfaces/IWETH.sol";
contract ChillToken is ERC20("CHILLSWAP", "CHILL"), Ownable {
IUniswapV2Router02 public iUniswapV2Router02;
IUniswapV2Factory public iUniswapV2Factory;
IWETH public iWeth;
IERC20 public tokenA;
IERC20 public tokenB;
mapping (address => address) internal _delegates;
struct Checkpoint {
uint32 fromBlock;
uint256 votes;
}
mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
mapping (address => uint32) public numCheckpoints;
bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
mapping (address => uint) public nonces;
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
constructor(
address _uniswapRouter,
address _uniswapFactory,
address _wethAddress
) public {
iUniswapV2Factory = IUniswapV2Factory(_uniswapFactory);
iUniswapV2Router02 = IUniswapV2Router02(_uniswapRouter);
iWeth = IWETH(_wethAddress);
mint(msg.sender, 40000e18);
}
function createPair(address tokenA, address tokenB) public {
iUniswapV2Factory.createPair(tokenA, tokenB);
}
function mint(address _to, uint256 _amount) public onlyOwner {
_mint(_to, _amount);
_moveDelegates(address(0), _delegates[_to], _amount);
}
function burn(address _to, uint256 _amount) public onlyOwner {
_burn(_to, _amount);
}
function delegates(address delegator)
external
view
returns (address)
{
return _delegates[delegator];
}
function delegate(address delegatee) external {
return _delegate(msg.sender, delegatee);
}
function delegateBySig(
address delegatee,
uint nonce,
uint expiry,
uint8 v,
bytes32 r,
bytes32 s
)
external
{
bytes32 domainSeparator = keccak256(
abi.encode(
DOMAIN_TYPEHASH,
keccak256(bytes(name())),
getChainId(),
address(this)
)
);
bytes32 structHash = keccak256(
abi.encode(
DELEGATION_TYPEHASH,
delegatee,
nonce,
expiry
)
);
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
domainSeparator,
structHash
)
);
address signatory = ecrecover(digest, v, r, s);
require(signatory != address(0), "CHILL::delegateBySig: invalid signature");
require(nonce == nonces[signatory]++, "CHILL::delegateBySig: invalid nonce");
require(now <= expiry, "CHILL::delegateBySig: signature expired");
return _delegate(signatory, delegatee);
}
function getCurrentVotes(address account)
external
view
returns (uint256)
{
uint32 nCheckpoints = numCheckpoints[account];
return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
}
function getPriorVotes(address account, uint blockNumber)
external
view
returns (uint256)
{
require(blockNumber < block.number, "CHILL::getPriorVotes: not yet determined");
uint32 nCheckpoints = numCheckpoints[account];
if (nCheckpoints == 0) {
return 0;
}
if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
return checkpoints[account][nCheckpoints - 1].votes;
}
if (checkpoints[account][0].fromBlock > blockNumber) {
return 0;
}
uint32 lower = 0;
uint32 upper = nCheckpoints - 1;
while (upper > lower) {
uint32 center = upper - (upper - lower) / 2;
Checkpoint memory cp = checkpoints[account][center];
if (cp.fromBlock == blockNumber) {
return cp.votes;
} else if (cp.fromBlock < blockNumber) {
lower = center;
} else {
upper = center - 1;
}
}
return checkpoints[account][lower].votes;
}
function _delegate(address delegator, address delegatee)
internal
{
address currentDelegate = _delegates[delegator];
uint256 delegatorBalance = balanceOf(delegator);
_delegates[delegator] = delegatee;
emit DelegateChanged(delegator, currentDelegate, delegatee);
_moveDelegates(currentDelegate, delegatee, delegatorBalance);
}
function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
if (srcRep != dstRep && amount > 0) {
if (srcRep != address(0)) {
uint32 srcRepNum = numCheckpoints[srcRep];
uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
uint256 srcRepNew = srcRepOld.sub(amount);
_writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
}
if (dstRep != address(0)) {
uint32 dstRepNum = numCheckpoints[dstRep];
uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
uint256 dstRepNew = dstRepOld.add(amount);
_writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
}
}
}
function _writeCheckpoint(
address delegatee,
uint32 nCheckpoints,
uint256 oldVotes,
uint256 newVotes
)
internal
{
uint32 blockNumber = safe32(block.number, "CHILL::_writeCheckpoint: block number exceeds 32 bits");
if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
} else {
checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
numCheckpoints[delegatee] = nCheckpoints + 1;
}
emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
}
function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
require(n < 2**32, errorMessage);
return uint32(n);
}
function getChainId() internal pure returns (uint) {
uint256 chainId;
assembly { chainId := chainid() }
return chainId;
}
}
文件 4 的 17:Context.sol
pragma solidity ^0.6.0;
contract Context {
function _msgSender() internal view returns (address payable) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this;
return msg.data;
}
}
文件 5 的 17:ERC20.sol
pragma solidity ^0.6.0;
import "./Context.sol";
import "../interfaces/IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) public _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
event Deposit(address indexed dst, uint wad);
event Withdrawal(address indexed src, uint wad);
constructor (string memory name, string memory symbol) public {
_name = name;
_symbol = symbol;
_decimals = 18;
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns (uint8) {
return _decimals;
}
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
文件 6 的 17:IERC20.sol
pragma solidity ^0.6.0;
interface IERC20 {
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 的 17:IUniStakingRewards.sol
pragma solidity ^0.6.0;
interface IUniStakingRewards {
function stake(uint256 amount) external;
function withdraw(uint256 amount) external;
function getReward() external;
function exit() external;
function balanceOf(address account) external view returns (uint256);
}
文件 8 的 17:IUniswapV2Factory.sol
pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function migrator() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
function setMigrator(address) external;
}
文件 9 的 17:IUniswapV2Pair.sol
pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
文件 10 的 17:IUniswapV2Router01.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
文件 11 的 17:IUniswapV2Router02.sol
pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol';
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
文件 12 的 17:IWETH.sol
pragma solidity >=0.5.0;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
文件 13 的 17:Ownable.sol
pragma solidity ^0.6.0;
import "./Context.sol";
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 14 的 17:PairValue.sol
pragma solidity >=0.5.0;
import "../helper/SafeERC20.sol";
import "../helper/SafeMath.sol";
import "../uniswap/UniswapV2Library.sol";
import "../interfaces/IUniswapV2Pair.sol";
import "../interfaces/IUniStakingRewards.sol";
library PairValue {
using SafeMath for uint;
using SafeERC20 for IERC20;
function countEthAmount(address _countPair, uint256 _liquiditybalance) internal view returns(uint256) {
address countToken0 = IUniswapV2Pair(_countPair).token0();
(uint112 countReserves0, uint112 countReserves1, ) = IUniswapV2Pair(_countPair).getReserves();
uint256 countTotalSupply = IERC20(_countPair).totalSupply();
uint256 ethAmount;
uint256 tokenbalance;
if(countTotalSupply > 0) {
if(countToken0 != 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) {
tokenbalance = _liquiditybalance.mul(countReserves0).div(countTotalSupply);
ethAmount = UniswapV2Library.getAmountOut(tokenbalance, countReserves0, countReserves1);
} else {
tokenbalance = _liquiditybalance.mul(countReserves1).div(countTotalSupply);
ethAmount = UniswapV2Library.getAmountOut(tokenbalance, countReserves1, countReserves0);
}
} else {
return 0;
}
return countUsdtAmount(ethAmount);
}
function countUsdtAmount(uint256 ethAmount) internal view returns(uint256) {
address _stablePair = 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852;
address usdttoken0 = IUniswapV2Pair(_stablePair).token0();
(uint112 stableReserves0, uint112 stableReserves1, ) = IUniswapV2Pair(_stablePair).getReserves();
uint256 stableOutAmount;
if (usdttoken0 == 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) {
stableOutAmount = UniswapV2Library.getAmountOut(1e18, stableReserves0, stableReserves1);
} else {
stableOutAmount = UniswapV2Library.getAmountOut(1e18, stableReserves1, stableReserves0);
}
uint256 totalAmount = ((ethAmount.div(1e18)).mul(stableOutAmount.div(1e6))).mul(2);
return totalAmount;
}
}
文件 15 的 17:SafeERC20.sol
pragma solidity ^0.6.12;
import "../interfaces/IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 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(IERC20 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(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
文件 16 的 17:SafeMath.sol
pragma solidity ^0.6.0;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
文件 17 的 17:UniswapV2Library.sol
pragma solidity >=0.5.0;
import '../interfaces/IUniswapV2Pair.sol';
import "../helper/SafeMath.sol";
library UniswapV2Library {
using SafeMath for uint;
function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
}
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f'
))));
}
function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
(uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
(reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
amountB = amountA.mul(reserveB) / reserveA;
}
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
uint amountInWithFee = amountIn.mul(997);
uint numerator = amountInWithFee.mul(reserveOut);
uint denominator = reserveIn.mul(1000).add(amountInWithFee);
amountOut = numerator / denominator;
}
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
uint numerator = reserveIn.mul(amountOut).mul(1000);
uint denominator = reserveOut.sub(amountOut).mul(997);
amountIn = (numerator / denominator).add(1);
}
function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
amounts = new uint[](path.length);
amounts[0] = amountIn;
for (uint i; i < path.length - 1; i++) {
(uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
}
}
function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
amounts = new uint[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint i = path.length - 1; i > 0; i--) {
(uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
}
}
}
{
"compilationTarget": {
"browser/ChillFinance/chill/ChillFinance.sol": "ChillFinance"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"contract ChillToken","name":"_chill","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"uint256","name":"_startBlockOfChill","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEV_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEV_TAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_uniAddress","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"accessReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniV2Pool","type":"address"},{"internalType":"address","name":"_stakingRewardAddress","type":"address"}],"name":"addStakeUniPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blockMilestone","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blockPerPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chill","outputs":[{"internalType":"contract ChillToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_devTaxFee","type":"uint256"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"currentblock","type":"uint256"}],"name":"getCrossMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"}],"name":"getNirvanaStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPhaseTimeAndBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeAddress","type":"address"}],"name":"getUniReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isCheckInitialPeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"isUserExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingChill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase1time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase2time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase3time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase4time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase5time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accChillPerShare","type":"uint256"},{"internalType":"uint256","name":"totalPoolBalance","type":"uint256"},{"internalType":"address","name":"nirvanaRewardAddress","type":"address"},{"internalType":"uint256","name":"nirvanaFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_uniV2Pool","type":"address"}],"name":"removeStakeUniPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_nirvanaFee","type":"uint256"},{"internalType":"address","name":"_nirvanaRewardAddress","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_time","type":"uint256"},{"internalType":"uint256","name":"_chillPerBlock","type":"uint256"}],"name":"setAndEditPhaseTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_blockMilestone","type":"uint256"}],"name":"setBlockMilestoneByIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_isCheck","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setCheckInitialPeriodAndAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"},{"internalType":"bool","name":"_isdistributor","type":"bool"}],"name":"setRewardDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingUniPools","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlockOfChill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"uniRewardAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"startedBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"userPoollength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]