编译器
0.6.12+commit.27d51765
文件 1 的 6:Context.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 2 的 6:IERC20.sol
pragma solidity >=0.6.0 <0.8.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);
}
文件 3 的 6: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;
}
文件 4 的 6:Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
import "../GSN/Context.sol";
abstract 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 virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 5 的 6:SafeMath.sol
pragma solidity >=0.6.0 <0.8.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;
}
}
文件 6 的 6:StacyWrapper.sol
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/math/SafeMath.sol';
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol';
pragma solidity ^0.6.0;
interface IStacy {
function transfer(address recipient, uint256 amount) external returns (bool);
function lock(address _holder, uint256 _amount) external;
function cherryPop() external;
function renounceOwnership() external;
function transferOwnership(address newOwner) external;
function setFeeDistributor(address _feeDistributor) external;
function setShouldTransferChecker(address _transferCheckerAddress) external;
function burnCherryPopRewards() external view returns (bool);
function setBurnCherryPopRewards(bool _burnCherryPopRewards) external;
function totalPopped() external view returns (uint256);
function cherryPopBurnCallerRewardPct() external view returns (uint256);
function setCherryPopBurnCallerRewardPct(uint _cherryPopBurnCallerRewardPct) external;
function setCherryPopBurnPct(uint _cherryPopBurnPct) external;
function getCherryPopAmount() external view returns (uint256);
}
contract StacyCherryPopWrapper is Ownable {
using SafeMath for uint256;
IStacy stacy;
address public stacyAddress;
address public uniswapPair;
uint256 public totalLocked;
IERC20 internal constant CHADS = IERC20(0x69692D3345010a207b759a7D1af6fc7F38b35c5E);
IERC20 internal constant EMTRG = IERC20(0xBd2949F67DcdC549c6Ebe98696449Fa79D988A9F);
constructor(address _stacyAddress, address stacyEthPair) public {
stacy = IStacy(_stacyAddress);
stacyAddress = _stacyAddress;
uniswapPair = stacyEthPair;
}
function correctStacySupply(uint256 _amount) external onlyOwner {
require(totalLocked.add(_amount) <= stacy.totalPopped(), "can't burn more STACY than was popped");
_lockUniswap(_amount);
totalLocked = totalLocked.add(_amount);
}
function cherryPop() external {
require(CHADS.balanceOf(msg.sender) >= 10000e18 || EMTRG.balanceOf(msg.sender) >= 1000e18, "must hold 10,000 CHADS or 1,000 EMTRG");
uint256 cherryPopFeeDistributionAmount = stacy.getCherryPopAmount();
stacy.cherryPop();
uint256 userReward = cherryPopFeeDistributionAmount.mul(stacy.cherryPopBurnCallerRewardPct()).div(100);
cherryPopFeeDistributionAmount = cherryPopFeeDistributionAmount.sub(userReward);
if (!stacy.burnCherryPopRewards()) {
_lockUniswap(cherryPopFeeDistributionAmount);
}
stacy.transfer(msg.sender, userReward);
totalLocked = totalLocked.add(cherryPopFeeDistributionAmount);
}
function _lockUniswap(uint256 _amount) internal {
stacy.lock(uniswapPair, _amount);
IUniswapV2Pair(uniswapPair).sync();
}
function renounceSTACYOwnership() external onlyOwner {
stacy.renounceOwnership();
}
function transferSTACYOwnership(address newOwner) external onlyOwner {
stacy.transferOwnership(newOwner);
}
function setSTACYBurnCherryPopRewards(bool _burnCherryPopRewards) external onlyOwner {
stacy.setBurnCherryPopRewards(_burnCherryPopRewards);
}
function setSTACYCherryPopBurnCallerRewardPct(uint _cherryPopBurnCallerRewardPct) external onlyOwner {
stacy.setCherryPopBurnCallerRewardPct(_cherryPopBurnCallerRewardPct);
}
function setSTACYCherryPopBurnPct(uint _cherryPopBurnPct) external onlyOwner {
stacy.setCherryPopBurnPct(_cherryPopBurnPct);
}
function setSTACYFeeDistributor(address _feeDistributor) external onlyOwner {
stacy.setFeeDistributor(_feeDistributor);
}
function setSTACYShouldTransferChecker(address _transferCheckerAddress) external onlyOwner {
stacy.setShouldTransferChecker(_transferCheckerAddress);
}
}
{
"compilationTarget": {
"contracts/StacyWrapper.sol": "StacyCherryPopWrapper"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_stacyAddress","type":"address"},{"internalType":"address","name":"stacyEthPair","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"cherryPop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"correctStacySupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceSTACYOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_burnCherryPopRewards","type":"bool"}],"name":"setSTACYBurnCherryPopRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cherryPopBurnCallerRewardPct","type":"uint256"}],"name":"setSTACYCherryPopBurnCallerRewardPct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cherryPopBurnPct","type":"uint256"}],"name":"setSTACYCherryPopBurnPct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeDistributor","type":"address"}],"name":"setSTACYFeeDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transferCheckerAddress","type":"address"}],"name":"setSTACYShouldTransferChecker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stacyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLocked","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":"newOwner","type":"address"}],"name":"transferSTACYOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]