编译器
0.6.12+commit.27d51765
文件 1 的 8:EEVFarm.sol
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import './solidity-lib/libraries/TransferHelper.sol';
import './periphery/libraries/SafeMathSCRY.sol';
import './interfaces/IEEVFarmDelegate.sol';
import './interfaces/IEEVFarm.sol';
import './core/interfaces/ISCRYERC20Permit.sol';
contract EEVFarm is ReentrancyGuard, IEEVFarm {
using SafeMathSCRY for uint;
address public delegate;
mapping (address => mapping (address => uint)) public override userTokensStaked;
event Deposit(address indexed user, address indexed lpToken, uint256 depositedAmount, uint256 newBalance);
event Withdraw(address indexed user, address indexed lpToken, uint256 withdrawnAmount, address indexed to, uint256 newBalance);
event EmergencyWithdraw(address indexed user, address indexed lpToken, uint256 amount, address indexed to);
constructor(address _delegate) public {
delegate = _delegate;
}
function deposit(address _lpToken, uint256 amount) public nonReentrant {
uint256 balanceBefore = ISCRYERC20(_lpToken).balanceOf(address(this));
TransferHelper.safeTransferFrom(_lpToken, msg.sender, address(this), amount);
uint256 depositedAmount = ISCRYERC20(_lpToken).balanceOf(address(this)).sub(balanceBefore);
userTokensStaked[_lpToken][msg.sender] = userTokensStaked[_lpToken][msg.sender].add(depositedAmount);
IEEVFarmDelegate(delegate).userDepositedTokens(msg.sender, _lpToken, depositedAmount, userTokensStaked[_lpToken][msg.sender]);
emit Deposit(msg.sender, _lpToken, amount, userTokensStaked[_lpToken][msg.sender]);
}
function depositWithPermit(address _lpToken, uint256 amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
ISCRYERC20Permit(_lpToken).permit(msg.sender, address(this), amount, deadline, v, r, s);
deposit(_lpToken, amount);
}
function withdraw(address _lpToken, uint256 amount, address to) external nonReentrant {
userTokensStaked[_lpToken][msg.sender] = userTokensStaked[_lpToken][msg.sender].sub(amount);
TransferHelper.safeTransfer(_lpToken, to, amount);
IEEVFarmDelegate(delegate).userWithdrewTokens(msg.sender, _lpToken, amount, to, userTokensStaked[_lpToken][msg.sender]);
emit Withdraw(msg.sender, _lpToken, amount, to, userTokensStaked[_lpToken][msg.sender]);
}
function emergencyWithdraw(address _lpToken, address to) external nonReentrant returns (uint256) {
uint256 amount = userTokensStaked[_lpToken][msg.sender];
userTokensStaked[_lpToken][msg.sender] = 0;
TransferHelper.safeTransfer(_lpToken, to, amount);
emit EmergencyWithdraw(msg.sender, _lpToken, amount, to);
return amount;
}
}
文件 2 的 8:IEEVFarm.sol
pragma solidity >=0.5.0;
interface IEEVFarm {
function userTokensStaked(address lpToken, address user) external view returns (uint);
}
文件 3 的 8:IEEVFarmDelegate.sol
pragma solidity >=0.5.0;
interface IEEVFarmDelegate {
function userDepositedTokens(address sender, address lpToken, uint256 amount, uint256 newBalance) external;
function userWithdrewTokens(address sender, address lpToken, uint256 amount, address to, uint256 newBalance) external;
}
文件 4 的 8:ISCRYERC20.sol
pragma solidity >=0.5.0;
interface ISCRYERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view 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);
}
文件 5 的 8:ISCRYERC20Permit.sol
pragma solidity >=0.5.0;
import './ISCRYERC20.sol';
interface ISCRYERC20Permit is ISCRYERC20 {
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;
}
文件 6 的 8: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;
}
}
文件 7 的 8:SafeMathSCRY.sol
pragma solidity >=0.5.0;
library SafeMathSCRY {
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');
}
}
文件 8 的 8:TransferHelper.sol
pragma solidity >=0.6.0;
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeTransfer: transfer failed'
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 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::transferFrom: transferFrom failed'
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
}
{
"compilationTarget": {
"contracts/EEVFarm.sol": "EEVFarm"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 999999
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"delegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userTokensStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]