编译器
0.6.12+commit.27d51765
文件 1 的 7:Address.sol
pragma solidity >=0.6.2 <0.8.0;
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");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
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 的 7:GaugeD2_ETH.sol
pragma solidity ^0.6.11;
import "../openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../openzeppelin/contracts/token/ERC20/SafeERC20.sol";
import "../openzeppelin/contracts/math/SafeMath.sol";
import "../openzeppelin/contracts/utils/Address.sol";
import "../openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "../Interfaces/IFarmTokenV1.sol";
contract GaugeD2_ETH is IERC20, ReentrancyGuard {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
address payable public governance = 0xdD7A75CC6c04031629f13848Bc0D07e89C3961Be;
address public constant acceptToken = 0x70e51DFc7A9FC391995C2B2f027BC49D4fe01577;
address public constant STACK = 0xe0955F26515d22E347B17669993FCeFcc73c3a0a;
uint256 public emissionRate = 16806186020950591;
uint256 public depositedShares;
uint256 public constant startBlock = 12234861;
uint256 public endBlock = startBlock + 1190038;
uint256 public lastBlock;
uint256 public tokensAccrued;
struct DepositState {
uint256 userShares;
uint256 tokensAccrued;
}
mapping(address => DepositState) public shares;
event Deposit(address indexed from, uint256 amount);
event Withdraw(address indexed to, uint256 amount);
event STACKClaimed(address indexed to, uint256 amount);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor() public {
}
function setGovernance(address payable _new) external {
require(msg.sender == governance);
governance = _new;
}
function setEmissionRate(uint256 _new) external {
require(msg.sender == governance, "GAUGED2: !governance");
_kick();
emissionRate = _new;
}
function setEndBlock(uint256 _block) external {
require(msg.sender == governance, "GAUGED2: !governance");
require(block.number <= endBlock, "GAUGED2: distribution already done, must start another");
require(block.number <= _block, "GAUGED2: can't set endBlock to past block");
endBlock = _block;
}
function name() external view returns (string memory){
return string(abi.encodePacked("gauge-", IFarmTokenV1(acceptToken).name()));
}
function symbol() external view returns (string memory){
return string(abi.encodePacked("gauge-", IFarmTokenV1(acceptToken).symbol()));
}
function decimals() external view returns (uint8){
return IFarmTokenV1(acceptToken).decimals();
}
function totalSupply() external override view returns (uint256){
return IFarmTokenV1(acceptToken).getUnderlyingForShares(depositedShares);
}
function balanceOf(address _account) public override view returns (uint256){
return IFarmTokenV1(acceptToken).getUnderlyingForShares(shares[_account].userShares);
}
function transfer(address _recipient, uint256 _amount) external override returns (bool){
_recipient;
_amount;
revert("transfer not implemented. please withdraw first.");
}
function transferFrom(address _sender, address _recipient, uint256 _amount) external override returns (bool){
_sender;
_recipient;
_amount;
revert("transferFrom not implemented. please withdraw first.");
}
function allowance(address _owner, address _spender) external override view returns (uint256){
_owner;
_spender;
return 0;
}
function approve(address _spender, uint256 _amount) external override returns (bool){
_spender;
_amount;
revert("approve not implemented. please withdraw first.");
}
function deposit(uint256 _amount) nonReentrant external {
require(block.number <= endBlock, "GAUGED2: distribution over");
_claimSTACK(msg.sender);
IERC20(acceptToken).safeTransferFrom(msg.sender, address(this), _amount);
uint256 _sharesFor = IFarmTokenV1(acceptToken).getSharesForUnderlying(_amount);
DepositState memory _state = shares[msg.sender];
_state.userShares = _state.userShares.add(_sharesFor);
depositedShares = depositedShares.add(_sharesFor);
emit Deposit(msg.sender, _amount);
emit Transfer(address(0), msg.sender, _amount);
shares[msg.sender] = _state;
}
function withdraw(uint256 _amount) nonReentrant external {
_claimSTACK(msg.sender);
DepositState memory _state = shares[msg.sender];
uint256 _sharesFor = IFarmTokenV1(acceptToken).getSharesForUnderlying(_amount);
require(_sharesFor <= _state.userShares, "GAUGED2: insufficient balance");
_state.userShares = _state.userShares.sub(_sharesFor);
depositedShares = depositedShares.sub(_sharesFor);
emit Withdraw(msg.sender, _amount);
emit Transfer(msg.sender, address(0), _amount);
shares[msg.sender] = _state;
IERC20(acceptToken).safeTransfer(msg.sender, _amount);
}
function claimSTACK() nonReentrant external returns (uint256) {
return _claimSTACK(msg.sender);
}
function _claimSTACK(address _user) internal returns (uint256) {
_kick();
DepositState memory _state = shares[_user];
if (_state.tokensAccrued == tokensAccrued){
return 0;
}
else {
uint256 _tokensAccruedDiff = tokensAccrued.sub(_state.tokensAccrued);
uint256 _tokensGive = _tokensAccruedDiff.mul(_state.userShares).div(1e18);
_state.tokensAccrued = tokensAccrued;
shares[_user] = _state;
if (IERC20(STACK).balanceOf(address(this)) >= _tokensGive){
IERC20(STACK).safeTransfer(_user, _tokensGive);
}
emit STACKClaimed(_user, _tokensGive);
return _tokensGive;
}
}
function _kick() internal {
uint256 _totalDeposited = depositedShares;
if (_totalDeposited == 0){
return;
}
if (lastBlock == block.number || lastBlock >= endBlock || block.number < startBlock){
return;
}
uint256 _deltaBlock;
if (lastBlock <= startBlock && block.number >= endBlock){
_deltaBlock = endBlock.sub(startBlock);
}
else if (block.number >= endBlock){
_deltaBlock = endBlock.sub(lastBlock);
}
else if (lastBlock <= startBlock){
_deltaBlock = block.number.sub(startBlock);
}
else {
_deltaBlock = block.number.sub(lastBlock);
}
uint256 _tokensToAccrue = _deltaBlock.mul(emissionRate);
tokensAccrued = tokensAccrued.add(_tokensToAccrue.mul(1e18).div(_totalDeposited));
lastBlock = block.number;
}
function rescue(address _token, uint256 _amount) nonReentrant external {
require(msg.sender == governance, "GAUGED2: !governance");
if (_token != address(0)){
IERC20(_token).safeTransfer(governance, _amount);
}
else {
governance.transfer(_amount);
}
}
}
文件 3 的 7: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);
}
文件 4 的 7:IFarmTokenV1.sol
pragma solidity ^0.6.11;
interface IFarmTokenV1 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function getSharesForUnderlying(uint256 _amountUnderlying) external view returns (uint256);
function getUnderlyingForShares(uint256 _amountShares) external view returns (uint256);
}
文件 5 的 7:ReentrancyGuard.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () internal {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 6 的 7:SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/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");
}
}
}
文件 7 的 7:SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
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) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
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) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
{
"compilationTarget": {
"Token/GaugeD2_ETH.sol": "GaugeD2_ETH"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"STACKClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"STACK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimSTACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositedShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emissionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"setEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"setEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_new","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"userShares","type":"uint256"},{"internalType":"uint256","name":"tokensAccrued","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensAccrued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]