More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,547 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 16926019 | 465 days ago | IN | 0 ETH | 0.00128819 | ||||
Deposit | 16920811 | 466 days ago | IN | 0 ETH | 0.002879 | ||||
Deposit | 16920731 | 466 days ago | IN | 0 ETH | 0.00194044 | ||||
Desupport | 16920711 | 466 days ago | IN | 0 ETH | 0.00323453 | ||||
Withdraw | 15994502 | 595 days ago | IN | 0 ETH | 0.0013522 | ||||
Deposit | 15994500 | 595 days ago | IN | 0 ETH | 0.00131634 | ||||
Withdraw | 15608574 | 649 days ago | IN | 0 ETH | 0.00071062 | ||||
Deposit | 15565149 | 655 days ago | IN | 0 ETH | 0.00032054 | ||||
Withdraw | 15534335 | 660 days ago | IN | 0 ETH | 0.00033932 | ||||
Withdraw | 15534327 | 660 days ago | IN | 0 ETH | 0.00167678 | ||||
Withdraw | 15465662 | 671 days ago | IN | 0 ETH | 0.00061012 | ||||
Deposit | 15455612 | 673 days ago | IN | 0 ETH | 0.00115181 | ||||
Desupport | 15002166 | 745 days ago | IN | 0 ETH | 0.0025792 | ||||
Support | 15002157 | 745 days ago | IN | 0 ETH | 0.00303056 | ||||
Withdraw | 14927292 | 758 days ago | IN | 0 ETH | 0.00577592 | ||||
Desupport | 14901005 | 762 days ago | IN | 0 ETH | 0.00325476 | ||||
Support | 14901000 | 762 days ago | IN | 0 ETH | 0.0046503 | ||||
Withdraw | 14732005 | 790 days ago | IN | 0 ETH | 0.00240937 | ||||
Withdraw | 14677586 | 798 days ago | IN | 0 ETH | 0.00537487 | ||||
Deposit With Per... | 14636338 | 805 days ago | IN | 0 ETH | 0.01645578 | ||||
Deposit | 14628488 | 806 days ago | IN | 0 ETH | 0.003596 | ||||
Desupport | 14559783 | 817 days ago | IN | 0 ETH | 0.00531286 | ||||
Withdraw | 14427689 | 837 days ago | IN | 0 ETH | 0.00263696 | ||||
Withdraw | 14165711 | 878 days ago | IN | 0 ETH | 0.00399981 | ||||
Deposit | 14165711 | 878 days ago | IN | 0 ETH | 0.00426557 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TheMaster
Compiler Version
v0.8.5+commit.a4f2e591
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.5; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./uniswapv2/interfaces/IUniswapV2ERC20.sol"; import "./interfaces/ITheMaster.sol"; import "./libraries/MasterChefModule.sol"; contract TheMaster is Ownable, MasterChefModule, ITheMaster { using SafeERC20 for IERC20; struct UserInfo { uint256 amount; uint256 rewardDebt; } struct PoolInfo { address addr; bool delegate; ISupportable supportable; uint8 supportingRatio; //out of 100 uint256 allocPoint; uint256 lastRewardBlock; uint256 accRewardPerShare; uint256 supply; } uint256 private constant PRECISION = 1e20; uint256 public immutable override initialRewardPerBlock; uint256 public immutable override decreasingInterval; uint256 public immutable override startBlock; IMaidCoin public immutable override maidCoin; IRewardCalculator public override rewardCalculator; PoolInfo[] public override poolInfo; mapping(uint256 => mapping(uint256 => UserInfo)) public override userInfo; mapping(uint256 => mapping(address => uint256)) private sushiRewardDebt; mapping(address => bool) public override mintableByAddr; uint256 public override totalAllocPoint; constructor( uint256 _initialRewardPerBlock, uint256 _decreasingInterval, uint256 _startBlock, IMaidCoin _maidCoin, IUniswapV2Pair _lpToken, IERC20 _sushi ) MasterChefModule(_lpToken, _sushi) { initialRewardPerBlock = _initialRewardPerBlock; decreasingInterval = _decreasingInterval; startBlock = _startBlock; maidCoin = _maidCoin; } function poolCount() external view override returns (uint256) { return poolInfo.length; } function pendingReward(uint256 pid, uint256 userId) external view override returns (uint256) { PoolInfo storage pool = poolInfo[pid]; UserInfo storage user = userInfo[pid][userId]; (uint256 accRewardPerShare, uint256 supply) = (pool.accRewardPerShare, pool.supply); uint256 _lastRewardBlock = pool.lastRewardBlock; if (block.number > _lastRewardBlock && supply != 0) { uint256 reward = ((block.number - _lastRewardBlock) * rewardPerBlock() * pool.allocPoint) / totalAllocPoint; accRewardPerShare = accRewardPerShare + (reward * PRECISION) / supply; } uint256 pending = ((user.amount * accRewardPerShare) / PRECISION) - user.rewardDebt; uint256 _supportingRatio = pool.supportingRatio; if (_supportingRatio == 0) { return pending; } else { return pending - ((pending * _supportingRatio) / 100); } } function rewardPerBlock() public view override returns (uint256) { if (address(rewardCalculator) != address(0)) { return rewardCalculator.rewardPerBlock(); } uint256 era = (block.number - startBlock) / decreasingInterval; return initialRewardPerBlock / (era + 1); } function changeRewardCalculator(address addr) external override onlyOwner { rewardCalculator = IRewardCalculator(addr); emit ChangeRewardCalculator(addr); } function add( address addr, bool delegate, bool mintable, address supportable, uint8 supportingRatio, uint256 allocPoint ) external override onlyOwner { if (supportable != address(0)) { require(supportingRatio > 0 && supportingRatio <= 80, "TheMaster: Outranged supportingRatio"); } else { require(supportingRatio == 0, "TheMaster: Not supportable pool"); } massUpdatePools(); uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint += allocPoint; uint256 pid = poolInfo.length; poolInfo.push( PoolInfo(addr, delegate, ISupportable(supportable), supportingRatio, allocPoint, lastRewardBlock, 0, 0) ); if (mintable) { mintableByAddr[addr] = true; } emit Add(pid, addr, delegate, mintableByAddr[addr], supportable, supportingRatio, allocPoint); } function set(uint256[] calldata pids, uint256[] calldata allocPoints) external override onlyOwner { massUpdatePools(); for (uint256 i = 0; i < pids.length; i += 1) { totalAllocPoint = totalAllocPoint - poolInfo[pids[i]].allocPoint + allocPoints[i]; poolInfo[pids[i]].allocPoint = allocPoints[i]; emit Set(pids[i], allocPoints[i]); } } function updatePool(PoolInfo storage pool) internal { uint256 _lastRewardBlock = pool.lastRewardBlock; if (block.number <= _lastRewardBlock) { return; } uint256 supply = pool.supply; if (supply == 0 || pool.allocPoint == 0) { pool.lastRewardBlock = block.number; return; } uint256 reward = ((block.number - _lastRewardBlock) * rewardPerBlock() * pool.allocPoint) / totalAllocPoint; maidCoin.mint(address(this), reward); pool.accRewardPerShare = pool.accRewardPerShare + (reward * PRECISION) / supply; pool.lastRewardBlock = block.number; } function massUpdatePools() internal { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(poolInfo[pid]); } } function deposit( uint256 pid, uint256 amount, uint256 userId ) public override { PoolInfo storage pool = poolInfo[pid]; require(address(pool.supportable) == address(0), "TheMaster: Use support func"); UserInfo storage user = userInfo[pid][userId]; if (pool.delegate) { require(pool.addr == msg.sender, "TheMaster: Not called by delegate"); _deposit(pid, pool, user, amount, false); } else { require(address(uint160(userId)) == msg.sender, "TheMaster: Deposit to your address"); _deposit(pid, pool, user, amount, true); } emit Deposit(userId, pid, amount); } function _deposit( uint256 pid, PoolInfo storage pool, UserInfo storage user, uint256 amount, bool tokenTransfer ) internal { updatePool(pool); uint256 _accRewardPerShare = pool.accRewardPerShare; uint256 _amount = user.amount; if (_amount > 0) { uint256 pending = ((_amount * _accRewardPerShare) / PRECISION) - user.rewardDebt; if (pending > 0) safeRewardTransfer(msg.sender, pending); } if (amount > 0) { if (tokenTransfer) { IERC20(pool.addr).safeTransferFrom(msg.sender, address(this), amount); uint256 _mcPid = masterChefPid; if (_mcPid > 0 && pool.addr == address(lpToken)) { sushiRewardDebt[pid][msg.sender] = _depositModule( _mcPid, amount, _amount, sushiRewardDebt[pid][msg.sender] ); } } pool.supply += amount; _amount += amount; user.amount = _amount; } user.rewardDebt = (_amount * _accRewardPerShare) / PRECISION; } function depositWithPermit( uint256 pid, uint256 amount, uint256 userId, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external override { IUniswapV2ERC20(poolInfo[pid].addr).permit(msg.sender, address(this), amount, deadline, v, r, s); deposit(pid, amount, userId); } function depositWithPermitMax( uint256 pid, uint256 amount, uint256 userId, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external override { IUniswapV2ERC20(poolInfo[pid].addr).permit(msg.sender, address(this), type(uint256).max, deadline, v, r, s); deposit(pid, amount, userId); } function withdraw( uint256 pid, uint256 amount, uint256 userId ) public override { PoolInfo storage pool = poolInfo[pid]; require(address(pool.supportable) == address(0), "TheMaster: Use desupport func"); UserInfo storage user = userInfo[pid][userId]; if (pool.delegate) { require(pool.addr == msg.sender, "TheMaster: Not called by delegate"); _withdraw(pid, pool, user, amount, false); } else { require(address(uint160(userId)) == msg.sender, "TheMaster: Not called by user"); _withdraw(pid, pool, user, amount, true); } emit Withdraw(userId, pid, amount); } function _withdraw( uint256 pid, PoolInfo storage pool, UserInfo storage user, uint256 amount, bool tokenTransfer ) internal { uint256 _amount = user.amount; require(_amount >= amount, "TheMaster: Insufficient amount"); updatePool(pool); uint256 _accRewardPerShare = pool.accRewardPerShare; uint256 pending = ((_amount * _accRewardPerShare) / PRECISION) - user.rewardDebt; if (pending > 0) safeRewardTransfer(msg.sender, pending); if (amount > 0) { pool.supply -= amount; _amount -= amount; user.amount = _amount; if (tokenTransfer) { uint256 _mcPid = masterChefPid; if (_mcPid > 0 && pool.addr == address(lpToken)) { sushiRewardDebt[pid][msg.sender] = _withdrawModule( _mcPid, amount, _amount + amount, sushiRewardDebt[pid][msg.sender] ); } IERC20(pool.addr).safeTransfer(msg.sender, amount); } } user.rewardDebt = (_amount * _accRewardPerShare) / PRECISION; } function emergencyWithdraw(uint256 pid) external override { PoolInfo storage pool = poolInfo[pid]; require(address(pool.supportable) == address(0), "TheMaster: Use desupport func"); require(!pool.delegate, "TheMaster: Pool should be non-delegate"); UserInfo storage user = userInfo[pid][uint256(uint160(msg.sender))]; uint256 amounts = user.amount; user.amount = 0; user.rewardDebt = 0; pool.supply -= amounts; uint256 _mcPid = masterChefPid; if (_mcPid > 0 && pool.addr == address(lpToken)) { sushiRewardDebt[pid][msg.sender] = _withdrawModule( _mcPid, amounts, amounts, sushiRewardDebt[pid][msg.sender] ); } IERC20(pool.addr).safeTransfer(msg.sender, amounts); emit EmergencyWithdraw(msg.sender, pid, amounts); } function support( uint256 pid, uint256 amount, uint256 supportTo ) public override { PoolInfo storage pool = poolInfo[pid]; ISupportable supportable = pool.supportable; require(address(supportable) != address(0), "TheMaster: Use deposit func"); UserInfo storage user = userInfo[pid][uint256(uint160(msg.sender))]; updatePool(pool); uint256 _accRewardPerShare = pool.accRewardPerShare; uint256 _amount = user.amount; if (_amount > 0) { uint256 pending = ((_amount * _accRewardPerShare) / PRECISION) - user.rewardDebt; if (pending > 0) { (address to, uint256 amounts) = supportable.shareRewards(pending, msg.sender, pool.supportingRatio); if (amounts > 0) safeRewardTransfer(to, amounts); safeRewardTransfer(msg.sender, pending - amounts); } } if (amount > 0) { if (_amount == 0) { supportable.setSupportingTo(msg.sender, supportTo, amount); } else { supportable.changeSupportedPower(msg.sender, int256(amount)); } IERC20(pool.addr).safeTransferFrom(msg.sender, address(this), amount); uint256 _mcPid = masterChefPid; if (_mcPid > 0 && pool.addr == address(lpToken)) { sushiRewardDebt[pid][msg.sender] = _depositModule( _mcPid, amount, _amount, sushiRewardDebt[pid][msg.sender] ); } pool.supply += amount; _amount += amount; user.amount = _amount; } user.rewardDebt = (_amount * _accRewardPerShare) / PRECISION; emit Support(msg.sender, pid, amount); } function supportWithPermit( uint256 pid, uint256 amount, uint256 supportTo, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external override { IUniswapV2ERC20(poolInfo[pid].addr).permit(msg.sender, address(this), amount, deadline, v, r, s); support(pid, amount, supportTo); } function supportWithPermitMax( uint256 pid, uint256 amount, uint256 supportTo, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external override { IUniswapV2ERC20(poolInfo[pid].addr).permit(msg.sender, address(this), type(uint256).max, deadline, v, r, s); support(pid, amount, supportTo); } function desupport(uint256 pid, uint256 amount) external override { PoolInfo storage pool = poolInfo[pid]; ISupportable supportable = pool.supportable; require(address(supportable) != address(0), "TheMaster: Use withdraw func"); UserInfo storage user = userInfo[pid][uint256(uint160(msg.sender))]; uint256 _amount = user.amount; require(_amount >= amount, "TheMaster: Insufficient amount"); updatePool(pool); uint256 _accRewardPerShare = pool.accRewardPerShare; uint256 pending = ((_amount * _accRewardPerShare) / PRECISION) - user.rewardDebt; if (pending > 0) { (address to, uint256 amounts) = supportable.shareRewards(pending, msg.sender, pool.supportingRatio); if (amounts > 0) safeRewardTransfer(to, amounts); safeRewardTransfer(msg.sender, pending - amounts); } if (amount > 0) { supportable.changeSupportedPower(msg.sender, -int256(amount)); uint256 _mcPid = masterChefPid; if (_mcPid > 0 && pool.addr == address(lpToken)) { sushiRewardDebt[pid][msg.sender] = _withdrawModule( _mcPid, amount, _amount, sushiRewardDebt[pid][msg.sender] ); } pool.supply -= amount; _amount -= amount; user.amount = _amount; IERC20(pool.addr).safeTransfer(msg.sender, amount); } user.rewardDebt = (_amount * _accRewardPerShare) / PRECISION; emit Desupport(msg.sender, pid, amount); } function emergencyDesupport(uint256 pid) external override { PoolInfo storage pool = poolInfo[pid]; ISupportable supportable = pool.supportable; require(address(supportable) != address(0), "TheMaster: Use emergencyWithdraw func"); UserInfo storage user = userInfo[pid][uint256(uint160(msg.sender))]; uint256 amounts = user.amount; user.amount = 0; user.rewardDebt = 0; pool.supply -= amounts; supportable.changeSupportedPower(msg.sender, -int256(amounts)); uint256 _mcPid = masterChefPid; if (_mcPid > 0 && pool.addr == address(lpToken)) { sushiRewardDebt[pid][msg.sender] = _withdrawModule( _mcPid, amounts, amounts, sushiRewardDebt[pid][msg.sender] ); } IERC20(pool.addr).safeTransfer(msg.sender, amounts); emit EmergencyDesupport(msg.sender, pid, amounts); } function mint(address to, uint256 amount) external override { require(mintableByAddr[msg.sender], "TheMaster: Called from un-mintable"); maidCoin.mint(to, amount); } function safeRewardTransfer(address to, uint256 amount) internal { uint256 balance = maidCoin.balanceOf(address(this)); if (amount > balance) { maidCoin.transfer(to, balance); } else { maidCoin.transfer(to, amount); } } function pendingSushiReward(uint256 pid) external view override returns (uint256) { return _pendingSushiReward(userInfo[pid][uint256(uint160(msg.sender))].amount, sushiRewardDebt[pid][msg.sender]); } function claimSushiReward(uint256 pid) public override { PoolInfo storage pool = poolInfo[pid]; require(pool.addr == address(lpToken) && !pool.delegate, "TheMaster: Invalid pid"); sushiRewardDebt[pid][msg.sender] = _claimSushiReward( userInfo[pid][uint256(uint160(msg.sender))].amount, sushiRewardDebt[pid][msg.sender] ); } function claimAllReward(uint256 pid) public { PoolInfo storage pool = poolInfo[pid]; require(pool.addr == address(lpToken) && !pool.delegate, "TheMaster: Invalid pid"); UserInfo storage user = userInfo[pid][uint256(uint160(msg.sender))]; uint256 amount = user.amount; require(amount > 0, "TheMaster: Nothing can be claimed"); sushiRewardDebt[pid][msg.sender] = _claimSushiReward(amount, sushiRewardDebt[pid][msg.sender]); updatePool(pool); ISupportable supportable = pool.supportable; if (address(supportable) == address(0)) { uint256 _accRewardPerShare = pool.accRewardPerShare; uint256 pending = ((amount * _accRewardPerShare) / PRECISION) - user.rewardDebt; if (pending > 0) safeRewardTransfer(msg.sender, pending); user.rewardDebt = (amount * _accRewardPerShare) / PRECISION; } else { uint256 _accRewardPerShare = pool.accRewardPerShare; uint256 pending = ((amount * _accRewardPerShare) / PRECISION) - user.rewardDebt; if (pending > 0) { (address to, uint256 amounts) = supportable.shareRewards(pending, msg.sender, pool.supportingRatio); if (amounts > 0) safeRewardTransfer(to, amounts); safeRewardTransfer(msg.sender, pending - amounts); } user.rewardDebt = (amount * _accRewardPerShare) / PRECISION; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface IUniswapV2ERC20 { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./IMaidCoin.sol"; import "./IRewardCalculator.sol"; import "./ISupportable.sol"; import "./IMasterChefModule.sol"; interface ITheMaster is IMasterChefModule { event ChangeRewardCalculator(address addr); event Add( uint256 indexed pid, address addr, bool indexed delegate, bool indexed mintable, address supportable, uint8 supportingRatio, uint256 allocPoint ); event Set(uint256 indexed pid, uint256 allocPoint); event Deposit(uint256 indexed userId, uint256 indexed pid, uint256 amount); event Withdraw(uint256 indexed userId, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event Support(address indexed supporter, uint256 indexed pid, uint256 amount); event Desupport(address indexed supporter, uint256 indexed pid, uint256 amount); event EmergencyDesupport(address indexed user, uint256 indexed pid, uint256 amount); event SetIsSupporterPool(uint256 indexed pid, bool indexed status); function initialRewardPerBlock() external view returns (uint256); function decreasingInterval() external view returns (uint256); function startBlock() external view returns (uint256); function maidCoin() external view returns (IMaidCoin); function rewardCalculator() external view returns (IRewardCalculator); function poolInfo(uint256 pid) external view returns ( address addr, bool delegate, ISupportable supportable, uint8 supportingRatio, uint256 allocPoint, uint256 lastRewardBlock, uint256 accRewardPerShare, uint256 supply ); function poolCount() external view returns (uint256); function userInfo(uint256 pid, uint256 user) external view returns (uint256 amount, uint256 rewardDebt); function mintableByAddr(address addr) external view returns (bool); function totalAllocPoint() external view returns (uint256); function pendingReward(uint256 pid, uint256 userId) external view returns (uint256); function rewardPerBlock() external view returns (uint256); function changeRewardCalculator(address addr) external; function add( address addr, bool delegate, bool mintable, address supportable, uint8 supportingRatio, uint256 allocPoint ) external; function set(uint256[] calldata pid, uint256[] calldata allocPoint) external; function deposit( uint256 pid, uint256 amount, uint256 userId ) external; function depositWithPermit( uint256 pid, uint256 amount, uint256 userId, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function depositWithPermitMax( uint256 pid, uint256 amount, uint256 userId, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function withdraw( uint256 pid, uint256 amount, uint256 userId ) external; function emergencyWithdraw(uint256 pid) external; function support( uint256 pid, uint256 amount, uint256 supportTo ) external; function supportWithPermit( uint256 pid, uint256 amount, uint256 supportTo, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function supportWithPermitMax( uint256 pid, uint256 amount, uint256 supportTo, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function desupport(uint256 pid, uint256 amount) external; function emergencyDesupport(uint256 pid) external; function mint(address to, uint256 amount) external; function claimSushiReward(uint256 id) external; function pendingSushiReward(uint256 id) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.5; import "@openzeppelin/contracts/access/Ownable.sol"; import "../interfaces/IMasterChefModule.sol"; abstract contract MasterChefModule is Ownable, IMasterChefModule { IUniswapV2Pair public immutable override lpToken; IERC20 public immutable override sushi; IMasterChef public override sushiMasterChef; uint256 public override masterChefPid; uint256 public override sushiLastRewardBlock; uint256 public override accSushiPerShare; bool private initialDeposited; constructor(IUniswapV2Pair _lpToken, IERC20 _sushi) { lpToken = _lpToken; sushi = _sushi; } function _depositModule( uint256 _pid, uint256 depositAmount, uint256 supportedLPTokenAmount, uint256 sushiRewardDebt ) internal returns (uint256 newRewardDebt) { uint256 _totalSupportedLPTokenAmount = sushiMasterChef.userInfo(_pid, address(this)).amount; uint256 _accSushiPerShare = _depositToSushiMasterChef(_pid, depositAmount, _totalSupportedLPTokenAmount); uint256 pending = (supportedLPTokenAmount * _accSushiPerShare) / 1e18 - sushiRewardDebt; if (pending > 0) safeSushiTransfer(msg.sender, pending); return ((supportedLPTokenAmount + depositAmount) * _accSushiPerShare) / 1e18; } function _withdrawModule( uint256 _pid, uint256 withdrawalAmount, uint256 supportedLPTokenAmount, uint256 sushiRewardDebt ) internal returns (uint256 newRewardDebt) { uint256 _totalSupportedLPTokenAmount = sushiMasterChef.userInfo(_pid, address(this)).amount; uint256 _accSushiPerShare = _withdrawFromSushiMasterChef(_pid, withdrawalAmount, _totalSupportedLPTokenAmount); uint256 pending = (supportedLPTokenAmount * _accSushiPerShare) / 1e18 - sushiRewardDebt; if (pending > 0) safeSushiTransfer(msg.sender, pending); return ((supportedLPTokenAmount - withdrawalAmount) * _accSushiPerShare) / 1e18; } function _claimSushiReward(uint256 supportedLPTokenAmount, uint256 sushiRewardDebt) internal returns (uint256 newRewardDebt) { uint256 _pid = masterChefPid; require(_pid > 0, "MasterChefModule: Unclaimable"); uint256 _totalSupportedLPTokenAmount = sushiMasterChef.userInfo(_pid, address(this)).amount; uint256 _accSushiPerShare = _depositToSushiMasterChef(_pid, 0, _totalSupportedLPTokenAmount); uint256 pending = (supportedLPTokenAmount * _accSushiPerShare) / 1e18 - sushiRewardDebt; require(pending > 0, "MasterChefModule: Nothing can be claimed"); safeSushiTransfer(msg.sender, pending); return (supportedLPTokenAmount * _accSushiPerShare) / 1e18; } function _pendingSushiReward(uint256 supportedLPTokenAmount, uint256 sushiRewardDebt) internal view returns (uint256) { uint256 _pid = masterChefPid; if (_pid == 0) return 0; uint256 _totalSupportedLPTokenAmount = sushiMasterChef.userInfo(_pid, address(this)).amount; uint256 _accSushiPerShare = accSushiPerShare; if (block.number > sushiLastRewardBlock && _totalSupportedLPTokenAmount != 0) { uint256 reward = sushiMasterChef.pendingSushi(masterChefPid, address(this)); _accSushiPerShare += ((reward * 1e18) / _totalSupportedLPTokenAmount); } return (supportedLPTokenAmount * _accSushiPerShare) / 1e18 - sushiRewardDebt; } function setSushiMasterChef(IMasterChef _masterChef, uint256 _pid) external onlyOwner { require(address(_masterChef.poolInfo(_pid).lpToken) == address(lpToken), "MasterChefModule: Invalid pid"); if (!initialDeposited) { initialDeposited = true; lpToken.approve(address(_masterChef), type(uint256).max); sushiMasterChef = _masterChef; masterChefPid = _pid; _depositToSushiMasterChef(_pid, lpToken.balanceOf(address(this)), 0); } else { IMasterChef oldChef = sushiMasterChef; uint256 oldpid = masterChefPid; _withdrawFromSushiMasterChef(oldpid, oldChef.userInfo(oldpid, address(this)).amount, 0); if (_masterChef != oldChef) { lpToken.approve(address(oldChef), 0); lpToken.approve(address(_masterChef), type(uint256).max); } sushiMasterChef = _masterChef; masterChefPid = _pid; _depositToSushiMasterChef(_pid, lpToken.balanceOf(address(this)), 0); } } function _depositToSushiMasterChef( uint256 _pid, uint256 _amount, uint256 _totalSupportedLPTokenAmount ) internal returns (uint256 _accSushiPerShare) { return _toSushiMasterChef(true, _pid, _amount, _totalSupportedLPTokenAmount); } function _withdrawFromSushiMasterChef( uint256 _pid, uint256 _amount, uint256 _totalSupportedLPTokenAmount ) internal returns (uint256 _accSushiPerShare) { return _toSushiMasterChef(false, _pid, _amount, _totalSupportedLPTokenAmount); } function _toSushiMasterChef( bool deposit, uint256 _pid, uint256 _amount, uint256 _totalSupportedLPTokenAmount ) internal returns (uint256) { uint256 reward; if (block.number <= sushiLastRewardBlock) { if (deposit) sushiMasterChef.deposit(_pid, _amount); else sushiMasterChef.withdraw(_pid, _amount); return accSushiPerShare; } else { uint256 balance0 = sushi.balanceOf(address(this)); if (deposit) sushiMasterChef.deposit(_pid, _amount); else sushiMasterChef.withdraw(_pid, _amount); uint256 balance1 = sushi.balanceOf(address(this)); reward = balance1 - balance0; } sushiLastRewardBlock = block.number; if (_totalSupportedLPTokenAmount > 0 && reward > 0) { uint256 _accSushiPerShare = accSushiPerShare + ((reward * 1e18) / _totalSupportedLPTokenAmount); accSushiPerShare = _accSushiPerShare; return _accSushiPerShare; } else { return accSushiPerShare; } } function safeSushiTransfer(address _to, uint256 _amount) internal { uint256 sushiBal = sushi.balanceOf(address(this)); if (_amount > sushiBal) { sushi.transfer(_to, sushiBal); } else { sushi.transfer(_to, _amount); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ 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"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ 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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (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 { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface IMaidCoin { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function INITIAL_SUPPLY() external pure returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function mint(address to, uint256 amount) external; function burn(uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface IRewardCalculator { function rewardPerBlock() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface ISupportable { event SupportTo(address indexed supporter, uint256 indexed to); event ChangeSupportingRoute(uint256 indexed from, uint256 indexed to); event ChangeSupportedPower(uint256 indexed id, int256 power); event TransferSupportingRewards(address indexed supporter, uint256 indexed id, uint256 amounts); function supportingRoute(uint256 id) external view returns (uint256); function supportingTo(address supporter) external view returns (uint256); function supportedPower(uint256 id) external view returns (uint256); function totalRewardsFromSupporters(uint256 id) external view returns (uint256); function setSupportingTo( address supporter, uint256 to, uint256 amounts ) external; function checkSupportingRoute(address supporter) external returns (address, uint256); function changeSupportedPower(address supporter, int256 power) external; function shareRewards( uint256 pending, address supporter, uint8 supportingRatio ) external returns (address nurseOwner, uint256 amountToNurseOwner); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./IMasterChef.sol"; import "../uniswapv2/interfaces/IUniswapV2Pair.sol"; interface IMasterChefModule { function lpToken() external view returns (IUniswapV2Pair); function sushi() external view returns (IERC20); function sushiMasterChef() external view returns (IMasterChef); function masterChefPid() external view returns (uint256); function sushiLastRewardBlock() external view returns (uint256); function accSushiPerShare() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IMasterChef { struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block. uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs. uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below. } function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory); function userInfo(uint256 pid, address user) external view returns (IMasterChef.UserInfo memory); function pendingSushi(uint256 _pid, address _user) external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); 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 (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_initialRewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_decreasingInterval","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"contract IMaidCoin","name":"_maidCoin","type":"address"},{"internalType":"contract IUniswapV2Pair","name":"_lpToken","type":"address"},{"internalType":"contract IERC20","name":"_sushi","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"bool","name":"delegate","type":"bool"},{"indexed":true,"internalType":"bool","name":"mintable","type":"bool"},{"indexed":false,"internalType":"address","name":"supportable","type":"address"},{"indexed":false,"internalType":"uint8","name":"supportingRatio","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"Add","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ChangeRewardCalculator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"userId","type":"uint256"},{"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":"supporter","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Desupport","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":"EmergencyDesupport","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":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"SetIsSupporterPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"supporter","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Support","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"userId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"accSushiPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"delegate","type":"bool"},{"internalType":"bool","name":"mintable","type":"bool"},{"internalType":"address","name":"supportable","type":"address"},{"internalType":"uint8","name":"supportingRatio","type":"uint8"},{"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"changeRewardCalculator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"claimAllReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"claimSushiReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decreasingInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"userId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"userId","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":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"userId","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":"depositWithPermitMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"desupport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"emergencyDesupport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialRewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maidCoin","outputs":[{"internalType":"contract IMaidCoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChefPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintableByAddr","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"userId","type":"uint256"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"pendingSushiReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"delegate","type":"bool"},{"internalType":"contract ISupportable","name":"supportable","type":"address"},{"internalType":"uint8","name":"supportingRatio","type":"uint8"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardCalculator","outputs":[{"internalType":"contract IRewardCalculator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"},{"internalType":"uint256[]","name":"allocPoints","type":"uint256[]"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMasterChef","name":"_masterChef","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"setSushiMasterChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"supportTo","type":"uint256"}],"name":"support","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"supportTo","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":"supportWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"supportTo","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":"supportWithPermitMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sushi","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiLastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiMasterChef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"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":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"userId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b50604051620045a8380380620045a88339810160408190526200003591620000b7565b600080546001600160a01b03191633908117825560405184928492918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606092831b811660805290821b811660a05260c09790975260e095909552505061010091909152901b166101205262000140565b60008060008060008060c08789031215620000d157600080fd5b8651955060208701519450604087015193506060870151620000f38162000127565b6080880151909350620001068162000127565b60a0880151909250620001198162000127565b809150509295509295509295565b6001600160a01b03811681146200013d57600080fd5b50565b60805160601c60a05160601c60c05160e051610100516101205160601c614344620002646000396000818161049f01528181610e490152818161319c015281816132600152818161330301526133a901526000818161036d015281816108d3015281816108fa015261196c0152600081816103b0015261194801526000818161044a01526119ae01526000818161026e015281816136ec0152818161378f015281816137dd015281816139ea0152613b5c01526000818161041001528181610ff4015281816110e1015281816113470152818161151001528181611c4b01528181611db101528181611eb501528181611f81015281816120cf015281816121710152818161223e0152818161287f01528181612b7601526134f001526143446000f3fe608060405234801561001057600080fd5b506004361061023c5760003560e01c8063715018a61161013b578063abc7c069116100b8578063e23ee3b21161007c578063e23ee3b2146105b4578063e692c453146105e7578063f2fde38b146105fa578063f440c1eb1461060d578063f525cb681461062057600080fd5b8063abc7c0691461052b578063b345dc8c1461053e578063bc8feb0e14610585578063c62c610b14610598578063c9bbd04a146105a157600080fd5b80638da5cb5b116100ff5780638da5cb5b146104c957806396769e89146104da578063a234d608146104f2578063a39b10fa14610505578063a41fe49f1461051857600080fd5b8063715018a61461046c5780637a07bf3a146104745780637a618e7214610487578063849e5aff1461049a5780638ae39cac146104c157600080fd5b806348cd4cb1116101c957806358bb45c91161018d57806358bb45c9146103e55780635acf624c146103f85780635fcbd2851461040b57806366d31e1b146104325780636b56781a1461044557600080fd5b806348cd4cb1146103685780634fd3c34a1461038f5780635312ea8e1461039857806354ae7bb0146103ab57806357339be6146103d257600080fd5b806317caf6f11161021057806317caf6f11461030f5780633185c0bd1461032657806338e97f44146103395780633fed8e8d1461034257806340c10f191461035557600080fd5b8062aeef8a14610241578063058048ef146102565780630a087903146102695780631526fe27146102ad575b600080fd5b61025461024f366004614041565b610628565b005b610254610264366004613dbb565b6107c9565b6102907f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6102c06102bb366004613fed565b610b67565b604080516001600160a01b03998a1681529715156020890152959097169486019490945260ff929092166060850152608084015260a083015260c082015260e0810191909152610100016102a4565b610318600a5481565b6040519081526020016102a4565b61031861033436600461401f565b610bcd565b61031860035481565b61025461035036600461406d565b610d23565b610254610363366004613e30565b610dc8565b6103187f000000000000000000000000000000000000000000000000000000000000000081565b61031860045481565b6102546103a6366004613fed565b610eb6565b6103187f000000000000000000000000000000000000000000000000000000000000000081565b6102546103e0366004613fed565b6110b5565b6103186103f3366004613fed565b6111c2565b610254610406366004613fed565b6111fa565b6102907f000000000000000000000000000000000000000000000000000000000000000081565b61025461044036600461406d565b611413565b6103187f000000000000000000000000000000000000000000000000000000000000000081565b610254611470565b610254610482366004613fed565b6114e4565b61025461049536600461406d565b611804565b6102907f000000000000000000000000000000000000000000000000000000000000000081565b6103186118a0565b6000546001600160a01b0316610290565b6005546102909061010090046001600160a01b031681565b61025461050036600461401f565b6119d8565b610254610513366004613e30565b611d69565b610254610526366004614041565b612273565b610254610539366004613e8a565b6123f5565b61057061054c36600461401f565b60076020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016102a4565b61025461059336600461406d565b612577565b61031860025481565b600154610290906001600160a01b031681565b6105d76105c2366004613d9e565b60096020526000908152604090205460ff1681565b60405190151581526020016102a4565b6102546105f5366004614041565b6125d4565b610254610608366004613d9e565b612978565b61025461061b366004613d9e565b612a62565b600654610318565b60006006848154811061063d5761063d6142d2565b6000918252602090912060069091020160018101549091506001600160a01b0316156106b05760405162461bcd60e51b815260206004820152601b60248201527f5468654d61737465723a2055736520737570706f72742066756e63000000000060448201526064015b60405180910390fd5b600084815260076020908152604080832085845290915290208154600160a01b900460ff16156107165781546001600160a01b031633146107035760405162461bcd60e51b81526004016106a7906141a7565b610711858383876000612ae8565b610787565b6001600160a01b03831633146107795760405162461bcd60e51b815260206004820152602260248201527f5468654d61737465723a204465706f73697420746f20796f7572206164647265604482015261737360f01b60648201526084016106a7565b610787858383876001612ae8565b84837f33da4f9b82b3e18a281ca2cabbe2f076925692abb593b7ea3f850009e8ec9770866040516107ba91815260200190565b60405180910390a35050505050565b6000546001600160a01b031633146107f35760405162461bcd60e51b81526004016106a790614172565b6001600160a01b038316156108765760008260ff16118015610819575060508260ff1611155b6108715760405162461bcd60e51b8152602060048201526024808201527f5468654d61737465723a204f757472616e67656420737570706f7274696e67526044820152636174696f60e01b60648201526084016106a7565b6108c7565b60ff8216156108c75760405162461bcd60e51b815260206004820152601f60248201527f5468654d61737465723a204e6f7420737570706f727461626c6520706f6f6c0060448201526064016106a7565b6108cf612c2d565b60007f0000000000000000000000000000000000000000000000000000000000000000431161091e577f0000000000000000000000000000000000000000000000000000000000000000610920565b435b905081600a600082825461093491906141e8565b90915550506006805460408051610100810182526001600160a01b038b811682528a15156020830190815289821693830193845260ff89811660608501908152608085018a815260a086018a8152600060c0880181815260e0890182815260018c018d55918c905297517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9b8b029b8c01805497519189166001600160a81b031998891617600160a01b921515830217905598517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d408c0180549551919098169490961693909317949093169096029290921790925592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d41860155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d42850155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d43840155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d44909201919091558515610aec576001600160a01b0388166000908152600960205260409020805460ff191660011790555b6001600160a01b038881166000818152600960209081526040918290205482519384529389169083015260ff8781168383015260608301879052905192161515918915159184917f85c5f9763b69537638ed9b50435c7c1296747fc78c92080777dd20909d46d0ac9181900360800190a45050505050505050565b60068181548110610b7757600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03808616975060ff600160a01b9687900481169791861696909504909416939088565b60008060068481548110610be357610be36142d2565b60009182526020808320878452600782526040808520888652909252922060046006909202909201908101546005820154600383015492945090914381108015610c2c57508115155b15610c99576000600a548660020154610c436118a0565b610c4d8543614241565b610c579190614222565b610c619190614222565b610c6b9190614200565b905082610c8168056bc75e2d6310000083614222565b610c8b9190614200565b610c9590856141e8565b9350505b6000846001015468056bc75e2d63100000858760000154610cba9190614222565b610cc49190614200565b610cce9190614241565b6001870154909150600160a01b900460ff1680610cf357509550610d1d945050505050565b6064610cff8284614222565b610d099190614200565b610d139083614241565b9750505050505050505b92915050565b60068781548110610d3657610d366142d2565b600091825260209091206006909102015460405163d505accf60e01b81526001600160a01b039091169063d505accf90610d829033903090600019908a908a908a908a906004016140e5565b600060405180830381600087803b158015610d9c57600080fd5b505af1158015610db0573d6000803e3d6000fd5b50505050610dbf878787610628565b50505050505050565b3360009081526009602052604090205460ff16610e325760405162461bcd60e51b815260206004820152602260248201527f5468654d61737465723a2043616c6c65642066726f6d20756e2d6d696e7461626044820152616c6560f01b60648201526084016106a7565b6040516340c10f1960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990610e809085908590600401614126565b600060405180830381600087803b158015610e9a57600080fd5b505af1158015610eae573d6000803e3d6000fd5b505050505050565b600060068281548110610ecb57610ecb6142d2565b6000918252602090912060069091020160018101549091506001600160a01b031615610f395760405162461bcd60e51b815260206004820152601d60248201527f5468654d61737465723a20557365206465737570706f72742066756e6300000060448201526064016106a7565b8054600160a01b900460ff1615610fa15760405162461bcd60e51b815260206004820152602660248201527f5468654d61737465723a20506f6f6c2073686f756c64206265206e6f6e2d64656044820152656c656761746560d01b60648201526084016106a7565b6000828152600760209081526040808320338452909152812080548282556001820183905560058401805492939192839290610fde908490614241565b90915550506002548015801590611022575083547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116145b1561106b57600085815260086020908152604080832033845290915290205461105090829084908190612c74565b60008681526008602090815260408083203384529091529020555b8354611081906001600160a01b03163384612d7e565b604051828152859033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595906020016107ba565b6000600682815481106110ca576110ca6142d2565b6000918252602090912060069091020180549091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116911614801561112357508054600160a01b900460ff16155b6111685760405162461bcd60e51b8152602060048201526016602482015275151a1953585cdd195c8e88125b9d985b1a59081c1a5960521b60448201526064016106a7565b60008281526007602090815260408083203380855290835281842054868552600884528285209185529252909120546111a19190612dd4565b60009283526008602090815260408085203386529091529092209190915550565b60008181526007602090815260408083203380855290835281842054858552600884528285209185529252822054610d1d9190612f7a565b60006006828154811061120f5761120f6142d2565b6000918252602090912060069091020160018101549091506001600160a01b03168061128b5760405162461bcd60e51b815260206004820152602560248201527f5468654d61737465723a2055736520656d657267656e637957697468647261776044820152642066756e6360d81b60648201526084016106a7565b60008381526007602090815260408083203384529091528120805482825560018201839055600585018054929391928392906112c8908490614241565b90915550506001600160a01b03831663ddfeacca336112e68461429f565b6040518363ffffffff1660e01b8152600401611303929190614126565b600060405180830381600087803b15801561131d57600080fd5b505af1158015611331573d6000803e3d6000fd5b50506002549150508015801590611375575084547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116145b156113be5760008681526008602090815260408083203384529091529020546113a390829084908190612c74565b60008781526008602090815260408083203384529091529020555b84546113d4906001600160a01b03163384612d7e565b604051828152869033907f67a463e34014cd44cda35b27bf0daebb9c9e138b4e4b6ef2a23170d79595f8a09060200160405180910390a3505050505050565b60068781548110611426576114266142d2565b600091825260209091206006909102015460405163d505accf60e01b81526001600160a01b039091169063d505accf90610d8290339030908b908a908a908a908a906004016140e5565b6000546001600160a01b0316331461149a5760405162461bcd60e51b81526004016106a790614172565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000600682815481106114f9576114f96142d2565b6000918252602090912060069091020180549091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116911614801561155257508054600160a01b900460ff16155b6115975760405162461bcd60e51b8152602060048201526016602482015275151a1953585cdd195c8e88125b9d985b1a59081c1a5960521b60448201526064016106a7565b600082815260076020908152604080832033845290915290208054806116095760405162461bcd60e51b815260206004820152602160248201527f5468654d61737465723a204e6f7468696e672063616e20626520636c61696d656044820152601960fa1b60648201526084016106a7565b600084815260086020908152604080832033845290915290205461162e908290612dd4565b600085815260086020908152604080832033845290915290205561165183613114565b60018301546001600160a01b0316806116d6576004840154600184015460009068056bc75e2d631000006116858487614222565b61168f9190614200565b6116999190614241565b905080156116ab576116ab3382613248565b68056bc75e2d631000006116bf8386614222565b6116c99190614200565b6001860155506117fd9050565b6004840154600184015460009068056bc75e2d631000006116f78487614222565b6117019190614200565b61170b9190614241565b905080156117d75760018601546040516303273bc760e01b815260048101839052336024820152600160a01b90910460ff16604482015260009081906001600160a01b038616906303273bc7906064016040805180830381600087803b15801561177457600080fd5b505af1158015611788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ac9190613e5c565b909250905080156117c1576117c18282613248565b6117d4336117cf8386614241565b613248565b50505b68056bc75e2d631000006117eb8386614222565b6117f59190614200565b600186015550505b5050505050565b60068781548110611817576118176142d2565b600091825260209091206006909102015460405163d505accf60e01b81526001600160a01b039091169063d505accf906118639033903090600019908a908a908a908a906004016140e5565b600060405180830381600087803b15801561187d57600080fd5b505af1158015611891573d6000803e3d6000fd5b50505050610dbf8787876125d4565b60055460009061010090046001600160a01b03161561194457600560019054906101000a90046001600160a01b03166001600160a01b0316638ae39cac6040518163ffffffff1660e01b815260040160206040518083038186803b15801561190757600080fd5b505afa15801561191b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193f9190614006565b905090565b60007f00000000000000000000000000000000000000000000000000000000000000006119917f000000000000000000000000000000000000000000000000000000000000000043614241565b61199b9190614200565b90506119a88160016141e8565b6119d2907f0000000000000000000000000000000000000000000000000000000000000000614200565b91505090565b6000600683815481106119ed576119ed6142d2565b6000918252602090912060069091020160018101549091506001600160a01b031680611a5b5760405162461bcd60e51b815260206004820152601c60248201527f5468654d61737465723a205573652077697468647261772066756e630000000060448201526064016106a7565b60008481526007602090815260408083203384529091529020805484811015611ac65760405162461bcd60e51b815260206004820152601e60248201527f5468654d61737465723a20496e73756666696369656e7420616d6f756e74000060448201526064016106a7565b611acf84613114565b6004840154600183015460009068056bc75e2d63100000611af08486614222565b611afa9190614200565b611b049190614241565b90508015611bcb5760018601546040516303273bc760e01b815260048101839052336024820152600160a01b90910460ff16604482015260009081906001600160a01b038816906303273bc7906064016040805180830381600087803b158015611b6d57600080fd5b505af1158015611b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba59190613e5c565b90925090508015611bba57611bba8282613248565b611bc8336117cf8386614241565b50505b8615611d04576001600160a01b03851663ddfeacca33611bea8a61429f565b6040518363ffffffff1660e01b8152600401611c07929190614126565b600060405180830381600087803b158015611c2157600080fd5b505af1158015611c35573d6000803e3d6000fd5b50506002549150508015801590611c79575086547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116145b15611cc2576000898152600860209081526040808320338452909152902054611ca79082908a908790612c74565b60008a81526008602090815260408083203384529091529020555b87876005016000828254611cd69190614241565b90915550611ce690508885614241565b8086558754909450611d02906001600160a01b0316338a612d7e565b505b68056bc75e2d63100000611d188385614222565b611d229190614200565b6001850155604051878152889033907fbcb1b254c83676670cc415f8ce8239bb9e972244993586ef7bf282f85ddadfe0906020015b60405180910390a35050505050505050565b6000546001600160a01b03163314611d935760405162461bcd60e51b81526004016106a790614172565b604051631526fe2760e01b8152600481018290526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169190841690631526fe279060240160806040518083038186803b158015611df857600080fd5b505afa158015611e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e309190613f13565b516001600160a01b031614611e875760405162461bcd60e51b815260206004820152601d60248201527f4d6173746572436865664d6f64756c653a20496e76616c69642070696400000060448201526064016106a7565b60055460ff1661200a576005805460ff1916600117905560405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390611eee90859060001990600401614126565b602060405180830381600087803b158015611f0857600080fd5b505af1158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190613ef6565b50600180546001600160a01b0319166001600160a01b038481169190911790915560028290556040516370a0823160e01b81523060048201526120059183917f0000000000000000000000000000000000000000000000000000000000000000909116906370a08231906024015b60206040518083038186803b158015611fc657600080fd5b505afa158015611fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffe9190614006565b60006133e0565b505050565b6001546002546040516393f1a40b60e01b8152600481018290523060248201526001600160a01b039092169161209e90829084906393f1a40b90604401604080518083038186803b15801561205e57600080fd5b505afa158015612072573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120969190613f90565b5160006133f9565b50816001600160a01b0316846001600160a01b0316146121fe5760405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390612107908590600090600401614126565b602060405180830381600087803b15801561212157600080fd5b505af1158015612135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121599190613ef6565b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906121aa90879060001990600401614126565b602060405180830381600087803b1580156121c457600080fd5b505af11580156121d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fc9190613ef6565b505b600180546001600160a01b0319166001600160a01b038681169190911790915560028490556040516370a0823160e01b81523060048201526117fd9185917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401611fae565b5050565b600060068481548110612288576122886142d2565b6000918252602090912060069091020160018101549091506001600160a01b0316156122f65760405162461bcd60e51b815260206004820152601d60248201527f5468654d61737465723a20557365206465737570706f72742066756e6300000060448201526064016106a7565b600084815260076020908152604080832085845290915290208154600160a01b900460ff161561235c5781546001600160a01b031633146123495760405162461bcd60e51b81526004016106a7906141a7565b612357858383876000613408565b6123c2565b6001600160a01b03831633146123b45760405162461bcd60e51b815260206004820152601d60248201527f5468654d61737465723a204e6f742063616c6c6564206279207573657200000060448201526064016106a7565b6123c2858383876001613408565b84837fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b2866040516107ba91815260200190565b6000546001600160a01b0316331461241f5760405162461bcd60e51b81526004016106a790614172565b612427612c2d565b60005b838110156117fd57828282818110612444576124446142d2565b90506020020135600686868481811061245f5761245f6142d2565b9050602002013581548110612476576124766142d2565b906000526020600020906006020160020154600a546124959190614241565b61249f91906141e8565b600a558282828181106124b4576124b46142d2565b9050602002013560068686848181106124cf576124cf6142d2565b90506020020135815481106124e6576124e66142d2565b90600052602060002090600602016002018190555084848281811061250d5761250d6142d2565b905060200201357f545b620a3000f6303b158b321f06b4e95e28a27d70aecac8c6bdac4f48a9f6b3848484818110612547576125476142d2565b9050602002013560405161255d91815260200190565b60405180910390a26125706001826141e8565b905061242a565b6006878154811061258a5761258a6142d2565b600091825260209091206006909102015460405163d505accf60e01b81526001600160a01b039091169063d505accf9061186390339030908b908a908a908a908a906004016140e5565b6000600684815481106125e9576125e96142d2565b6000918252602090912060069091020160018101549091506001600160a01b0316806126575760405162461bcd60e51b815260206004820152601b60248201527f5468654d61737465723a20557365206465706f7369742066756e63000000000060448201526064016106a7565b6000858152600760209081526040808320338452909152902061267983613114565b60048301548154801561277f57600183015460009068056bc75e2d631000006126a28585614222565b6126ac9190614200565b6126b69190614241565b9050801561277d5760018601546040516303273bc760e01b815260048101839052336024820152600160a01b90910460ff16604482015260009081906001600160a01b038816906303273bc7906064016040805180830381600087803b15801561271f57600080fd5b505af1158015612733573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127579190613e5c565b9092509050801561276c5761276c8282613248565b61277a336117cf8386614241565b50505b505b861561292157806127f6576040516359290a2560e11b815233600482015260248101879052604481018890526001600160a01b0385169063b252144a90606401600060405180830381600087803b1580156127d957600080fd5b505af11580156127ed573d6000803e3d6000fd5b50505050612857565b604051636eff566560e11b81526001600160a01b0385169063ddfeacca906128249033908b90600401614126565b600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b505050505b845461286e906001600160a01b031633308a6135b4565b60025480158015906128ad575085547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116145b156128f65760008981526008602090815260408083203384529091529020546128db9082908a9085906135ec565b60008a81526008602090815260408083203384529091529020555b8786600501600082825461290a91906141e8565b9091555061291a905088836141e8565b8085559150505b68056bc75e2d631000006129358383614222565b61293f9190614200565b6001840155604051878152889033907f3391b7506551053a045b28b04ba34acfab377a47e91db9f4a46d8ac01acac14f90602001611d57565b6000546001600160a01b031633146129a25760405162461bcd60e51b81526004016106a790614172565b6001600160a01b038116612a075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612a8c5760405162461bcd60e51b81526004016106a790614172565b60058054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f065fc3b77c68c383644c8d30a3e1f0df39d6f0ddc721adc950902574d599622b9060200160405180910390a150565b612af184613114565b600484015483548015612b4257600185015460009068056bc75e2d63100000612b1a8585614222565b612b249190614200565b612b2e9190614241565b90508015612b4057612b403382613248565b505b8315612c19578215612bef578554612b65906001600160a01b03163330876135b4565b6002548015801590612ba4575086547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116145b15612bed576000888152600860209081526040808320338452909152902054612bd2908290879085906135ec565b60008981526008602090815260408083203384529091529020555b505b83866005016000828254612c0391906141e8565b90915550612c13905084826141e8565b80865590505b68056bc75e2d631000006117eb8383614222565b60065460005b8181101561226f57612c6460068281548110612c5157612c516142d2565b9060005260206000209060060201613114565b612c6d81614284565b9050612c33565b6001546040516393f1a40b60e01b81526004810186905230602482015260009182916001600160a01b03909116906393f1a40b90604401604080518083038186803b158015612cc257600080fd5b505afa158015612cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfa9190613f90565b5190506000612d0a8787846133f9565b9050600084670de0b6b3a7640000612d228489614222565b612d2c9190614200565b612d369190614241565b90508015612d4857612d4833826136d4565b670de0b6b3a764000082612d5c8989614241565b612d669190614222565b612d709190614200565b93505050505b949350505050565b6120058363a9059cbb60e01b8484604051602401612d9d929190614126565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613814565b60025460009080612e275760405162461bcd60e51b815260206004820152601d60248201527f4d6173746572436865664d6f64756c653a20556e636c61696d61626c6500000060448201526064016106a7565b6001546040516393f1a40b60e01b8152600481018390523060248201526000916001600160a01b0316906393f1a40b90604401604080518083038186803b158015612e7157600080fd5b505afa158015612e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea99190613f90565b5190506000612eb98382846133e0565b9050600085670de0b6b3a7640000612ed1848a614222565b612edb9190614200565b612ee59190614241565b905060008111612f485760405162461bcd60e51b815260206004820152602860248201527f4d6173746572436865664d6f64756c653a204e6f7468696e672063616e2062656044820152670818db185a5b595960c21b60648201526084016106a7565b612f5233826136d4565b670de0b6b3a7640000612f658389614222565b612f6f9190614200565b979650505050505050565b60025460009080612f8f576000915050610d1d565b6001546040516393f1a40b60e01b8152600481018390523060248201526000916001600160a01b0316906393f1a40b90604401604080518083038186803b158015612fd957600080fd5b505afa158015612fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130119190613f90565b51600454600354919250904311801561302957508115155b156130e25760015460025460405163065509bb60e21b815260048101919091523060248201526000916001600160a01b03169063195426ec9060440160206040518083038186803b15801561307d57600080fd5b505afa158015613091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b59190614006565b9050826130ca82670de0b6b3a7640000614222565b6130d49190614200565b6130de90836141e8565b9150505b84670de0b6b3a76400006130f68389614222565b6131009190614200565b61310a9190614241565b9695505050505050565b6003810154438110613124575050565b600582015480158061313857506002830154155b1561314857505043600390910155565b6000600a54846002015461315a6118a0565b6131648643614241565b61316e9190614222565b6131789190614222565b6131829190614200565b6040516340c10f1960e01b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906131d39030908590600401614126565b600060405180830381600087803b1580156131ed57600080fd5b505af1158015613201573d6000803e3d6000fd5b505050508168056bc75e2d631000008261321b9190614222565b6132259190614200565b846004015461323491906141e8565b600485015550504360039092019190915550565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156132aa57600080fd5b505afa1580156132be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e29190614006565b9050808211156133925760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061333a9086908590600401614126565b602060405180830381600087803b15801561335457600080fd5b505af1158015613368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338c9190613ef6565b50505050565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061333a9086908690600401614126565b60006133ef60018585856138e6565b90505b9392505050565b60006133ef60008585856138e6565b82548281101561345a5760405162461bcd60e51b815260206004820152601e60248201527f5468654d61737465723a20496e73756666696369656e7420616d6f756e74000060448201526064016106a7565b61346385613114565b6004850154600185015460009068056bc75e2d631000006134848486614222565b61348e9190614200565b6134989190614241565b905080156134aa576134aa3382613248565b841561358457848760050160008282546134c49190614241565b909155506134d490508584614241565b8087559250831561358457600254801580159061351e575087547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116145b1561356c57613551818761353281886141e8565b60008d8152600860209081526040808320338452909152902054612c74565b60008a81526008602090815260408083203384529091529020555b8754613582906001600160a01b03163388612d7e565b505b68056bc75e2d631000006135988385614222565b6135a29190614200565b86600101819055505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261338c9085906323b872dd60e01b90608401612d9d565b6001546040516393f1a40b60e01b81526004810186905230602482015260009182916001600160a01b03909116906393f1a40b90604401604080518083038186803b15801561363a57600080fd5b505afa15801561364e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136729190613f90565b51905060006136828787846133e0565b9050600084670de0b6b3a764000061369a8489614222565b6136a49190614200565b6136ae9190614241565b905080156136c0576136c033826136d4565b670de0b6b3a764000082612d5c89896141e8565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561373657600080fd5b505afa15801561374a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061376e9190614006565b9050808211156137c65760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061333a9086908590600401614126565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061333a9086908690600401614126565b6000613869826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613c419092919063ffffffff16565b80519091501561200557808060200190518101906138879190613ef6565b6120055760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a7565b60008060035443116139d257851561396257600154604051631c57762b60e31b815260048101879052602481018690526001600160a01b039091169063e2bbb15890604401600060405180830381600087803b15801561394557600080fd5b505af1158015613959573d6000803e3d6000fd5b505050506139c8565b600154604051630441a3e760e41b815260048101879052602481018690526001600160a01b039091169063441a3e7090604401600060405180830381600087803b1580156139af57600080fd5b505af11580156139c3573d6000803e3d6000fd5b505050505b5050600454612d76565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015613a3457600080fd5b505afa158015613a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a6c9190614006565b90508615613ade57600154604051631c57762b60e31b815260048101889052602481018790526001600160a01b039091169063e2bbb15890604401600060405180830381600087803b158015613ac157600080fd5b505af1158015613ad5573d6000803e3d6000fd5b50505050613b44565b600154604051630441a3e760e41b815260048101889052602481018790526001600160a01b039091169063441a3e7090604401600060405180830381600087803b158015613b2b57600080fd5b505af1158015613b3f573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015613ba657600080fd5b505afa158015613bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bde9190614006565b9050613bea8282614241565b92505050436003558215801590613c015750600081115b156139c857600083613c1b83670de0b6b3a7640000614222565b613c259190614200565b600454613c3291906141e8565b60048190559250612d76915050565b60606133ef848460008585843b613c9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a7565b600080866001600160a01b03168587604051613cb691906140c9565b60006040518083038185875af1925050503d8060008114613cf3576040519150601f19603f3d011682016040523d82523d6000602084013e613cf8565b606091505b5091509150612f6f82828660608315613d125750816133f2565b825115613d225782518084602001fd5b8160405162461bcd60e51b81526004016106a7919061413f565b60008083601f840112613d4e57600080fd5b50813567ffffffffffffffff811115613d6657600080fd5b6020830191508360208260051b8501011115613d8157600080fd5b9250929050565b803560ff81168114613d9957600080fd5b919050565b600060208284031215613db057600080fd5b81356133f2816142e8565b60008060008060008060c08789031215613dd457600080fd5b8635613ddf816142e8565b95506020870135613def81614300565b94506040870135613dff81614300565b93506060870135613e0f816142e8565b9250613e1d60808801613d88565b915060a087013590509295509295509295565b60008060408385031215613e4357600080fd5b8235613e4e816142e8565b946020939093013593505050565b60008060408385031215613e6f57600080fd5b8251613e7a816142e8565b6020939093015192949293505050565b60008060008060408587031215613ea057600080fd5b843567ffffffffffffffff80821115613eb857600080fd5b613ec488838901613d3c565b90965094506020870135915080821115613edd57600080fd5b50613eea87828801613d3c565b95989497509550505050565b600060208284031215613f0857600080fd5b81516133f281614300565b600060808284031215613f2557600080fd5b6040516080810181811067ffffffffffffffff82111715613f5657634e487b7160e01b600052604160045260246000fd5b6040528251613f64816142e8565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060408284031215613fa257600080fd5b6040516040810181811067ffffffffffffffff82111715613fd357634e487b7160e01b600052604160045260246000fd5b604052825181526020928301519281019290925250919050565b600060208284031215613fff57600080fd5b5035919050565b60006020828403121561401857600080fd5b5051919050565b6000806040838503121561403257600080fd5b50508035926020909101359150565b60008060006060848603121561405657600080fd5b505081359360208301359350604090920135919050565b600080600080600080600060e0888a03121561408857600080fd5b873596506020880135955060408801359450606088013593506140ad60808901613d88565b925060a0880135915060c0880135905092959891949750929550565b600082516140db818460208701614258565b9190910192915050565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b602081526000825180602084015261415e816040850160208701614258565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f5468654d61737465723a204e6f742063616c6c65642062792064656c656761746040820152606560f81b606082015260800190565b600082198211156141fb576141fb6142bc565b500190565b60008261421d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561423c5761423c6142bc565b500290565b600082821015614253576142536142bc565b500390565b60005b8381101561427357818101518382015260200161425b565b8381111561338c5750506000910152565b6000600019821415614298576142986142bc565b5060010190565b6000600160ff1b8214156142b5576142b56142bc565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146142fd57600080fd5b50565b80151581146142fd57600080fdfea26469706673582212203686605138257a5f8bd57401f799f7f57a58d1be8e3ef921ee80b6d7f92a759e64736f6c634300080500330000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000805200000000000000000000000000000000000000000000000000000000000cb2fa00000000000000000000000004af698b479d0098229dc715655c667ceb6cd8433000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023c5760003560e01c8063715018a61161013b578063abc7c069116100b8578063e23ee3b21161007c578063e23ee3b2146105b4578063e692c453146105e7578063f2fde38b146105fa578063f440c1eb1461060d578063f525cb681461062057600080fd5b8063abc7c0691461052b578063b345dc8c1461053e578063bc8feb0e14610585578063c62c610b14610598578063c9bbd04a146105a157600080fd5b80638da5cb5b116100ff5780638da5cb5b146104c957806396769e89146104da578063a234d608146104f2578063a39b10fa14610505578063a41fe49f1461051857600080fd5b8063715018a61461046c5780637a07bf3a146104745780637a618e7214610487578063849e5aff1461049a5780638ae39cac146104c157600080fd5b806348cd4cb1116101c957806358bb45c91161018d57806358bb45c9146103e55780635acf624c146103f85780635fcbd2851461040b57806366d31e1b146104325780636b56781a1461044557600080fd5b806348cd4cb1146103685780634fd3c34a1461038f5780635312ea8e1461039857806354ae7bb0146103ab57806357339be6146103d257600080fd5b806317caf6f11161021057806317caf6f11461030f5780633185c0bd1461032657806338e97f44146103395780633fed8e8d1461034257806340c10f191461035557600080fd5b8062aeef8a14610241578063058048ef146102565780630a087903146102695780631526fe27146102ad575b600080fd5b61025461024f366004614041565b610628565b005b610254610264366004613dbb565b6107c9565b6102907f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe281565b6040516001600160a01b0390911681526020015b60405180910390f35b6102c06102bb366004613fed565b610b67565b604080516001600160a01b03998a1681529715156020890152959097169486019490945260ff929092166060850152608084015260a083015260c082015260e0810191909152610100016102a4565b610318600a5481565b6040519081526020016102a4565b61031861033436600461401f565b610bcd565b61031860035481565b61025461035036600461406d565b610d23565b610254610363366004613e30565b610dc8565b6103187f0000000000000000000000000000000000000000000000000000000000cb2fa081565b61031860045481565b6102546103a6366004613fed565b610eb6565b6103187f000000000000000000000000000000000000000000000000000000000008052081565b6102546103e0366004613fed565b6110b5565b6103186103f3366004613fed565b6111c2565b610254610406366004613fed565b6111fa565b6102907f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f81565b61025461044036600461406d565b611413565b6103187f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b610254611470565b610254610482366004613fed565b6114e4565b61025461049536600461406d565b611804565b6102907f0000000000000000000000004af698b479d0098229dc715655c667ceb6cd843381565b6103186118a0565b6000546001600160a01b0316610290565b6005546102909061010090046001600160a01b031681565b61025461050036600461401f565b6119d8565b610254610513366004613e30565b611d69565b610254610526366004614041565b612273565b610254610539366004613e8a565b6123f5565b61057061054c36600461401f565b60076020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016102a4565b61025461059336600461406d565b612577565b61031860025481565b600154610290906001600160a01b031681565b6105d76105c2366004613d9e565b60096020526000908152604090205460ff1681565b60405190151581526020016102a4565b6102546105f5366004614041565b6125d4565b610254610608366004613d9e565b612978565b61025461061b366004613d9e565b612a62565b600654610318565b60006006848154811061063d5761063d6142d2565b6000918252602090912060069091020160018101549091506001600160a01b0316156106b05760405162461bcd60e51b815260206004820152601b60248201527f5468654d61737465723a2055736520737570706f72742066756e63000000000060448201526064015b60405180910390fd5b600084815260076020908152604080832085845290915290208154600160a01b900460ff16156107165781546001600160a01b031633146107035760405162461bcd60e51b81526004016106a7906141a7565b610711858383876000612ae8565b610787565b6001600160a01b03831633146107795760405162461bcd60e51b815260206004820152602260248201527f5468654d61737465723a204465706f73697420746f20796f7572206164647265604482015261737360f01b60648201526084016106a7565b610787858383876001612ae8565b84837f33da4f9b82b3e18a281ca2cabbe2f076925692abb593b7ea3f850009e8ec9770866040516107ba91815260200190565b60405180910390a35050505050565b6000546001600160a01b031633146107f35760405162461bcd60e51b81526004016106a790614172565b6001600160a01b038316156108765760008260ff16118015610819575060508260ff1611155b6108715760405162461bcd60e51b8152602060048201526024808201527f5468654d61737465723a204f757472616e67656420737570706f7274696e67526044820152636174696f60e01b60648201526084016106a7565b6108c7565b60ff8216156108c75760405162461bcd60e51b815260206004820152601f60248201527f5468654d61737465723a204e6f7420737570706f727461626c6520706f6f6c0060448201526064016106a7565b6108cf612c2d565b60007f0000000000000000000000000000000000000000000000000000000000cb2fa0431161091e577f0000000000000000000000000000000000000000000000000000000000cb2fa0610920565b435b905081600a600082825461093491906141e8565b90915550506006805460408051610100810182526001600160a01b038b811682528a15156020830190815289821693830193845260ff89811660608501908152608085018a815260a086018a8152600060c0880181815260e0890182815260018c018d55918c905297517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9b8b029b8c01805497519189166001600160a81b031998891617600160a01b921515830217905598517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d408c0180549551919098169490961693909317949093169096029290921790925592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d41860155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d42850155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d43840155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d44909201919091558515610aec576001600160a01b0388166000908152600960205260409020805460ff191660011790555b6001600160a01b038881166000818152600960209081526040918290205482519384529389169083015260ff8781168383015260608301879052905192161515918915159184917f85c5f9763b69537638ed9b50435c7c1296747fc78c92080777dd20909d46d0ac9181900360800190a45050505050505050565b60068181548110610b7757600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03808616975060ff600160a01b9687900481169791861696909504909416939088565b60008060068481548110610be357610be36142d2565b60009182526020808320878452600782526040808520888652909252922060046006909202909201908101546005820154600383015492945090914381108015610c2c57508115155b15610c99576000600a548660020154610c436118a0565b610c4d8543614241565b610c579190614222565b610c619190614222565b610c6b9190614200565b905082610c8168056bc75e2d6310000083614222565b610c8b9190614200565b610c9590856141e8565b9350505b6000846001015468056bc75e2d63100000858760000154610cba9190614222565b610cc49190614200565b610cce9190614241565b6001870154909150600160a01b900460ff1680610cf357509550610d1d945050505050565b6064610cff8284614222565b610d099190614200565b610d139083614241565b9750505050505050505b92915050565b60068781548110610d3657610d366142d2565b600091825260209091206006909102015460405163d505accf60e01b81526001600160a01b039091169063d505accf90610d829033903090600019908a908a908a908a906004016140e5565b600060405180830381600087803b158015610d9c57600080fd5b505af1158015610db0573d6000803e3d6000fd5b50505050610dbf878787610628565b50505050505050565b3360009081526009602052604090205460ff16610e325760405162461bcd60e51b815260206004820152602260248201527f5468654d61737465723a2043616c6c65642066726f6d20756e2d6d696e7461626044820152616c6560f01b60648201526084016106a7565b6040516340c10f1960e01b81526001600160a01b037f0000000000000000000000004af698b479d0098229dc715655c667ceb6cd843316906340c10f1990610e809085908590600401614126565b600060405180830381600087803b158015610e9a57600080fd5b505af1158015610eae573d6000803e3d6000fd5b505050505050565b600060068281548110610ecb57610ecb6142d2565b6000918252602090912060069091020160018101549091506001600160a01b031615610f395760405162461bcd60e51b815260206004820152601d60248201527f5468654d61737465723a20557365206465737570706f72742066756e6300000060448201526064016106a7565b8054600160a01b900460ff1615610fa15760405162461bcd60e51b815260206004820152602660248201527f5468654d61737465723a20506f6f6c2073686f756c64206265206e6f6e2d64656044820152656c656761746560d01b60648201526084016106a7565b6000828152600760209081526040808320338452909152812080548282556001820183905560058401805492939192839290610fde908490614241565b90915550506002548015801590611022575083547f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f6001600160a01b039081169116145b1561106b57600085815260086020908152604080832033845290915290205461105090829084908190612c74565b60008681526008602090815260408083203384529091529020555b8354611081906001600160a01b03163384612d7e565b604051828152859033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595906020016107ba565b6000600682815481106110ca576110ca6142d2565b6000918252602090912060069091020180549091507f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f6001600160a01b03908116911614801561112357508054600160a01b900460ff16155b6111685760405162461bcd60e51b8152602060048201526016602482015275151a1953585cdd195c8e88125b9d985b1a59081c1a5960521b60448201526064016106a7565b60008281526007602090815260408083203380855290835281842054868552600884528285209185529252909120546111a19190612dd4565b60009283526008602090815260408085203386529091529092209190915550565b60008181526007602090815260408083203380855290835281842054858552600884528285209185529252822054610d1d9190612f7a565b60006006828154811061120f5761120f6142d2565b6000918252602090912060069091020160018101549091506001600160a01b03168061128b5760405162461bcd60e51b815260206004820152602560248201527f5468654d61737465723a2055736520656d657267656e637957697468647261776044820152642066756e6360d81b60648201526084016106a7565b60008381526007602090815260408083203384529091528120805482825560018201839055600585018054929391928392906112c8908490614241565b90915550506001600160a01b03831663ddfeacca336112e68461429f565b6040518363ffffffff1660e01b8152600401611303929190614126565b600060405180830381600087803b15801561131d57600080fd5b505af1158015611331573d6000803e3d6000fd5b50506002549150508015801590611375575084547f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f6001600160a01b039081169116145b156113be5760008681526008602090815260408083203384529091529020546113a390829084908190612c74565b60008781526008602090815260408083203384529091529020555b84546113d4906001600160a01b03163384612d7e565b604051828152869033907f67a463e34014cd44cda35b27bf0daebb9c9e138b4e4b6ef2a23170d79595f8a09060200160405180910390a3505050505050565b60068781548110611426576114266142d2565b600091825260209091206006909102015460405163d505accf60e01b81526001600160a01b039091169063d505accf90610d8290339030908b908a908a908a908a906004016140e5565b6000546001600160a01b0316331461149a5760405162461bcd60e51b81526004016106a790614172565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000600682815481106114f9576114f96142d2565b6000918252602090912060069091020180549091507f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f6001600160a01b03908116911614801561155257508054600160a01b900460ff16155b6115975760405162461bcd60e51b8152602060048201526016602482015275151a1953585cdd195c8e88125b9d985b1a59081c1a5960521b60448201526064016106a7565b600082815260076020908152604080832033845290915290208054806116095760405162461bcd60e51b815260206004820152602160248201527f5468654d61737465723a204e6f7468696e672063616e20626520636c61696d656044820152601960fa1b60648201526084016106a7565b600084815260086020908152604080832033845290915290205461162e908290612dd4565b600085815260086020908152604080832033845290915290205561165183613114565b60018301546001600160a01b0316806116d6576004840154600184015460009068056bc75e2d631000006116858487614222565b61168f9190614200565b6116999190614241565b905080156116ab576116ab3382613248565b68056bc75e2d631000006116bf8386614222565b6116c99190614200565b6001860155506117fd9050565b6004840154600184015460009068056bc75e2d631000006116f78487614222565b6117019190614200565b61170b9190614241565b905080156117d75760018601546040516303273bc760e01b815260048101839052336024820152600160a01b90910460ff16604482015260009081906001600160a01b038616906303273bc7906064016040805180830381600087803b15801561177457600080fd5b505af1158015611788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ac9190613e5c565b909250905080156117c1576117c18282613248565b6117d4336117cf8386614241565b613248565b50505b68056bc75e2d631000006117eb8386614222565b6117f59190614200565b600186015550505b5050505050565b60068781548110611817576118176142d2565b600091825260209091206006909102015460405163d505accf60e01b81526001600160a01b039091169063d505accf906118639033903090600019908a908a908a908a906004016140e5565b600060405180830381600087803b15801561187d57600080fd5b505af1158015611891573d6000803e3d6000fd5b50505050610dbf8787876125d4565b60055460009061010090046001600160a01b03161561194457600560019054906101000a90046001600160a01b03166001600160a01b0316638ae39cac6040518163ffffffff1660e01b815260040160206040518083038186803b15801561190757600080fd5b505afa15801561191b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193f9190614006565b905090565b60007f00000000000000000000000000000000000000000000000000000000000805206119917f0000000000000000000000000000000000000000000000000000000000cb2fa043614241565b61199b9190614200565b90506119a88160016141e8565b6119d2907f0000000000000000000000000000000000000000000000000de0b6b3a7640000614200565b91505090565b6000600683815481106119ed576119ed6142d2565b6000918252602090912060069091020160018101549091506001600160a01b031680611a5b5760405162461bcd60e51b815260206004820152601c60248201527f5468654d61737465723a205573652077697468647261772066756e630000000060448201526064016106a7565b60008481526007602090815260408083203384529091529020805484811015611ac65760405162461bcd60e51b815260206004820152601e60248201527f5468654d61737465723a20496e73756666696369656e7420616d6f756e74000060448201526064016106a7565b611acf84613114565b6004840154600183015460009068056bc75e2d63100000611af08486614222565b611afa9190614200565b611b049190614241565b90508015611bcb5760018601546040516303273bc760e01b815260048101839052336024820152600160a01b90910460ff16604482015260009081906001600160a01b038816906303273bc7906064016040805180830381600087803b158015611b6d57600080fd5b505af1158015611b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba59190613e5c565b90925090508015611bba57611bba8282613248565b611bc8336117cf8386614241565b50505b8615611d04576001600160a01b03851663ddfeacca33611bea8a61429f565b6040518363ffffffff1660e01b8152600401611c07929190614126565b600060405180830381600087803b158015611c2157600080fd5b505af1158015611c35573d6000803e3d6000fd5b50506002549150508015801590611c79575086547f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f6001600160a01b039081169116145b15611cc2576000898152600860209081526040808320338452909152902054611ca79082908a908790612c74565b60008a81526008602090815260408083203384529091529020555b87876005016000828254611cd69190614241565b90915550611ce690508885614241565b8086558754909450611d02906001600160a01b0316338a612d7e565b505b68056bc75e2d63100000611d188385614222565b611d229190614200565b6001850155604051878152889033907fbcb1b254c83676670cc415f8ce8239bb9e972244993586ef7bf282f85ddadfe0906020015b60405180910390a35050505050505050565b6000546001600160a01b03163314611d935760405162461bcd60e51b81526004016106a790614172565b604051631526fe2760e01b8152600481018290526001600160a01b037f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f81169190841690631526fe279060240160806040518083038186803b158015611df857600080fd5b505afa158015611e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e309190613f13565b516001600160a01b031614611e875760405162461bcd60e51b815260206004820152601d60248201527f4d6173746572436865664d6f64756c653a20496e76616c69642070696400000060448201526064016106a7565b60055460ff1661200a576005805460ff1916600117905560405163095ea7b360e01b81526001600160a01b037f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f169063095ea7b390611eee90859060001990600401614126565b602060405180830381600087803b158015611f0857600080fd5b505af1158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190613ef6565b50600180546001600160a01b0319166001600160a01b038481169190911790915560028290556040516370a0823160e01b81523060048201526120059183917f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f909116906370a08231906024015b60206040518083038186803b158015611fc657600080fd5b505afa158015611fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffe9190614006565b60006133e0565b505050565b6001546002546040516393f1a40b60e01b8152600481018290523060248201526001600160a01b039092169161209e90829084906393f1a40b90604401604080518083038186803b15801561205e57600080fd5b505afa158015612072573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120969190613f90565b5160006133f9565b50816001600160a01b0316846001600160a01b0316146121fe5760405163095ea7b360e01b81526001600160a01b037f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f169063095ea7b390612107908590600090600401614126565b602060405180830381600087803b15801561212157600080fd5b505af1158015612135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121599190613ef6565b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f169063095ea7b3906121aa90879060001990600401614126565b602060405180830381600087803b1580156121c457600080fd5b505af11580156121d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fc9190613ef6565b505b600180546001600160a01b0319166001600160a01b038681169190911790915560028490556040516370a0823160e01b81523060048201526117fd9185917f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f909116906370a0823190602401611fae565b5050565b600060068481548110612288576122886142d2565b6000918252602090912060069091020160018101549091506001600160a01b0316156122f65760405162461bcd60e51b815260206004820152601d60248201527f5468654d61737465723a20557365206465737570706f72742066756e6300000060448201526064016106a7565b600084815260076020908152604080832085845290915290208154600160a01b900460ff161561235c5781546001600160a01b031633146123495760405162461bcd60e51b81526004016106a7906141a7565b612357858383876000613408565b6123c2565b6001600160a01b03831633146123b45760405162461bcd60e51b815260206004820152601d60248201527f5468654d61737465723a204e6f742063616c6c6564206279207573657200000060448201526064016106a7565b6123c2858383876001613408565b84837fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b2866040516107ba91815260200190565b6000546001600160a01b0316331461241f5760405162461bcd60e51b81526004016106a790614172565b612427612c2d565b60005b838110156117fd57828282818110612444576124446142d2565b90506020020135600686868481811061245f5761245f6142d2565b9050602002013581548110612476576124766142d2565b906000526020600020906006020160020154600a546124959190614241565b61249f91906141e8565b600a558282828181106124b4576124b46142d2565b9050602002013560068686848181106124cf576124cf6142d2565b90506020020135815481106124e6576124e66142d2565b90600052602060002090600602016002018190555084848281811061250d5761250d6142d2565b905060200201357f545b620a3000f6303b158b321f06b4e95e28a27d70aecac8c6bdac4f48a9f6b3848484818110612547576125476142d2565b9050602002013560405161255d91815260200190565b60405180910390a26125706001826141e8565b905061242a565b6006878154811061258a5761258a6142d2565b600091825260209091206006909102015460405163d505accf60e01b81526001600160a01b039091169063d505accf9061186390339030908b908a908a908a908a906004016140e5565b6000600684815481106125e9576125e96142d2565b6000918252602090912060069091020160018101549091506001600160a01b0316806126575760405162461bcd60e51b815260206004820152601b60248201527f5468654d61737465723a20557365206465706f7369742066756e63000000000060448201526064016106a7565b6000858152600760209081526040808320338452909152902061267983613114565b60048301548154801561277f57600183015460009068056bc75e2d631000006126a28585614222565b6126ac9190614200565b6126b69190614241565b9050801561277d5760018601546040516303273bc760e01b815260048101839052336024820152600160a01b90910460ff16604482015260009081906001600160a01b038816906303273bc7906064016040805180830381600087803b15801561271f57600080fd5b505af1158015612733573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127579190613e5c565b9092509050801561276c5761276c8282613248565b61277a336117cf8386614241565b50505b505b861561292157806127f6576040516359290a2560e11b815233600482015260248101879052604481018890526001600160a01b0385169063b252144a90606401600060405180830381600087803b1580156127d957600080fd5b505af11580156127ed573d6000803e3d6000fd5b50505050612857565b604051636eff566560e11b81526001600160a01b0385169063ddfeacca906128249033908b90600401614126565b600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b505050505b845461286e906001600160a01b031633308a6135b4565b60025480158015906128ad575085547f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f6001600160a01b039081169116145b156128f65760008981526008602090815260408083203384529091529020546128db9082908a9085906135ec565b60008a81526008602090815260408083203384529091529020555b8786600501600082825461290a91906141e8565b9091555061291a905088836141e8565b8085559150505b68056bc75e2d631000006129358383614222565b61293f9190614200565b6001840155604051878152889033907f3391b7506551053a045b28b04ba34acfab377a47e91db9f4a46d8ac01acac14f90602001611d57565b6000546001600160a01b031633146129a25760405162461bcd60e51b81526004016106a790614172565b6001600160a01b038116612a075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612a8c5760405162461bcd60e51b81526004016106a790614172565b60058054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f065fc3b77c68c383644c8d30a3e1f0df39d6f0ddc721adc950902574d599622b9060200160405180910390a150565b612af184613114565b600484015483548015612b4257600185015460009068056bc75e2d63100000612b1a8585614222565b612b249190614200565b612b2e9190614241565b90508015612b4057612b403382613248565b505b8315612c19578215612bef578554612b65906001600160a01b03163330876135b4565b6002548015801590612ba4575086547f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f6001600160a01b039081169116145b15612bed576000888152600860209081526040808320338452909152902054612bd2908290879085906135ec565b60008981526008602090815260408083203384529091529020555b505b83866005016000828254612c0391906141e8565b90915550612c13905084826141e8565b80865590505b68056bc75e2d631000006117eb8383614222565b60065460005b8181101561226f57612c6460068281548110612c5157612c516142d2565b9060005260206000209060060201613114565b612c6d81614284565b9050612c33565b6001546040516393f1a40b60e01b81526004810186905230602482015260009182916001600160a01b03909116906393f1a40b90604401604080518083038186803b158015612cc257600080fd5b505afa158015612cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfa9190613f90565b5190506000612d0a8787846133f9565b9050600084670de0b6b3a7640000612d228489614222565b612d2c9190614200565b612d369190614241565b90508015612d4857612d4833826136d4565b670de0b6b3a764000082612d5c8989614241565b612d669190614222565b612d709190614200565b93505050505b949350505050565b6120058363a9059cbb60e01b8484604051602401612d9d929190614126565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613814565b60025460009080612e275760405162461bcd60e51b815260206004820152601d60248201527f4d6173746572436865664d6f64756c653a20556e636c61696d61626c6500000060448201526064016106a7565b6001546040516393f1a40b60e01b8152600481018390523060248201526000916001600160a01b0316906393f1a40b90604401604080518083038186803b158015612e7157600080fd5b505afa158015612e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea99190613f90565b5190506000612eb98382846133e0565b9050600085670de0b6b3a7640000612ed1848a614222565b612edb9190614200565b612ee59190614241565b905060008111612f485760405162461bcd60e51b815260206004820152602860248201527f4d6173746572436865664d6f64756c653a204e6f7468696e672063616e2062656044820152670818db185a5b595960c21b60648201526084016106a7565b612f5233826136d4565b670de0b6b3a7640000612f658389614222565b612f6f9190614200565b979650505050505050565b60025460009080612f8f576000915050610d1d565b6001546040516393f1a40b60e01b8152600481018390523060248201526000916001600160a01b0316906393f1a40b90604401604080518083038186803b158015612fd957600080fd5b505afa158015612fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130119190613f90565b51600454600354919250904311801561302957508115155b156130e25760015460025460405163065509bb60e21b815260048101919091523060248201526000916001600160a01b03169063195426ec9060440160206040518083038186803b15801561307d57600080fd5b505afa158015613091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b59190614006565b9050826130ca82670de0b6b3a7640000614222565b6130d49190614200565b6130de90836141e8565b9150505b84670de0b6b3a76400006130f68389614222565b6131009190614200565b61310a9190614241565b9695505050505050565b6003810154438110613124575050565b600582015480158061313857506002830154155b1561314857505043600390910155565b6000600a54846002015461315a6118a0565b6131648643614241565b61316e9190614222565b6131789190614222565b6131829190614200565b6040516340c10f1960e01b81529091506001600160a01b037f0000000000000000000000004af698b479d0098229dc715655c667ceb6cd843316906340c10f19906131d39030908590600401614126565b600060405180830381600087803b1580156131ed57600080fd5b505af1158015613201573d6000803e3d6000fd5b505050508168056bc75e2d631000008261321b9190614222565b6132259190614200565b846004015461323491906141e8565b600485015550504360039092019190915550565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000004af698b479d0098229dc715655c667ceb6cd84336001600160a01b0316906370a082319060240160206040518083038186803b1580156132aa57600080fd5b505afa1580156132be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e29190614006565b9050808211156133925760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000004af698b479d0098229dc715655c667ceb6cd8433169063a9059cbb9061333a9086908590600401614126565b602060405180830381600087803b15801561335457600080fd5b505af1158015613368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338c9190613ef6565b50505050565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000004af698b479d0098229dc715655c667ceb6cd8433169063a9059cbb9061333a9086908690600401614126565b60006133ef60018585856138e6565b90505b9392505050565b60006133ef60008585856138e6565b82548281101561345a5760405162461bcd60e51b815260206004820152601e60248201527f5468654d61737465723a20496e73756666696369656e7420616d6f756e74000060448201526064016106a7565b61346385613114565b6004850154600185015460009068056bc75e2d631000006134848486614222565b61348e9190614200565b6134989190614241565b905080156134aa576134aa3382613248565b841561358457848760050160008282546134c49190614241565b909155506134d490508584614241565b8087559250831561358457600254801580159061351e575087547f000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f6001600160a01b039081169116145b1561356c57613551818761353281886141e8565b60008d8152600860209081526040808320338452909152902054612c74565b60008a81526008602090815260408083203384529091529020555b8754613582906001600160a01b03163388612d7e565b505b68056bc75e2d631000006135988385614222565b6135a29190614200565b86600101819055505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261338c9085906323b872dd60e01b90608401612d9d565b6001546040516393f1a40b60e01b81526004810186905230602482015260009182916001600160a01b03909116906393f1a40b90604401604080518083038186803b15801561363a57600080fd5b505afa15801561364e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136729190613f90565b51905060006136828787846133e0565b9050600084670de0b6b3a764000061369a8489614222565b6136a49190614200565b6136ae9190614241565b905080156136c0576136c033826136d4565b670de0b6b3a764000082612d5c89896141e8565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe26001600160a01b0316906370a082319060240160206040518083038186803b15801561373657600080fd5b505afa15801561374a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061376e9190614006565b9050808211156137c65760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2169063a9059cbb9061333a9086908590600401614126565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2169063a9059cbb9061333a9086908690600401614126565b6000613869826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613c419092919063ffffffff16565b80519091501561200557808060200190518101906138879190613ef6565b6120055760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a7565b60008060035443116139d257851561396257600154604051631c57762b60e31b815260048101879052602481018690526001600160a01b039091169063e2bbb15890604401600060405180830381600087803b15801561394557600080fd5b505af1158015613959573d6000803e3d6000fd5b505050506139c8565b600154604051630441a3e760e41b815260048101879052602481018690526001600160a01b039091169063441a3e7090604401600060405180830381600087803b1580156139af57600080fd5b505af11580156139c3573d6000803e3d6000fd5b505050505b5050600454612d76565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe26001600160a01b0316906370a082319060240160206040518083038186803b158015613a3457600080fd5b505afa158015613a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a6c9190614006565b90508615613ade57600154604051631c57762b60e31b815260048101889052602481018790526001600160a01b039091169063e2bbb15890604401600060405180830381600087803b158015613ac157600080fd5b505af1158015613ad5573d6000803e3d6000fd5b50505050613b44565b600154604051630441a3e760e41b815260048101889052602481018790526001600160a01b039091169063441a3e7090604401600060405180830381600087803b158015613b2b57600080fd5b505af1158015613b3f573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526000907f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe26001600160a01b0316906370a082319060240160206040518083038186803b158015613ba657600080fd5b505afa158015613bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bde9190614006565b9050613bea8282614241565b92505050436003558215801590613c015750600081115b156139c857600083613c1b83670de0b6b3a7640000614222565b613c259190614200565b600454613c3291906141e8565b60048190559250612d76915050565b60606133ef848460008585843b613c9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a7565b600080866001600160a01b03168587604051613cb691906140c9565b60006040518083038185875af1925050503d8060008114613cf3576040519150601f19603f3d011682016040523d82523d6000602084013e613cf8565b606091505b5091509150612f6f82828660608315613d125750816133f2565b825115613d225782518084602001fd5b8160405162461bcd60e51b81526004016106a7919061413f565b60008083601f840112613d4e57600080fd5b50813567ffffffffffffffff811115613d6657600080fd5b6020830191508360208260051b8501011115613d8157600080fd5b9250929050565b803560ff81168114613d9957600080fd5b919050565b600060208284031215613db057600080fd5b81356133f2816142e8565b60008060008060008060c08789031215613dd457600080fd5b8635613ddf816142e8565b95506020870135613def81614300565b94506040870135613dff81614300565b93506060870135613e0f816142e8565b9250613e1d60808801613d88565b915060a087013590509295509295509295565b60008060408385031215613e4357600080fd5b8235613e4e816142e8565b946020939093013593505050565b60008060408385031215613e6f57600080fd5b8251613e7a816142e8565b6020939093015192949293505050565b60008060008060408587031215613ea057600080fd5b843567ffffffffffffffff80821115613eb857600080fd5b613ec488838901613d3c565b90965094506020870135915080821115613edd57600080fd5b50613eea87828801613d3c565b95989497509550505050565b600060208284031215613f0857600080fd5b81516133f281614300565b600060808284031215613f2557600080fd5b6040516080810181811067ffffffffffffffff82111715613f5657634e487b7160e01b600052604160045260246000fd5b6040528251613f64816142e8565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060408284031215613fa257600080fd5b6040516040810181811067ffffffffffffffff82111715613fd357634e487b7160e01b600052604160045260246000fd5b604052825181526020928301519281019290925250919050565b600060208284031215613fff57600080fd5b5035919050565b60006020828403121561401857600080fd5b5051919050565b6000806040838503121561403257600080fd5b50508035926020909101359150565b60008060006060848603121561405657600080fd5b505081359360208301359350604090920135919050565b600080600080600080600060e0888a03121561408857600080fd5b873596506020880135955060408801359450606088013593506140ad60808901613d88565b925060a0880135915060c0880135905092959891949750929550565b600082516140db818460208701614258565b9190910192915050565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b602081526000825180602084015261415e816040850160208701614258565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f5468654d61737465723a204e6f742063616c6c65642062792064656c656761746040820152606560f81b606082015260800190565b600082198211156141fb576141fb6142bc565b500190565b60008261421d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561423c5761423c6142bc565b500290565b600082821015614253576142536142bc565b500390565b60005b8381101561427357818101518382015260200161425b565b8381111561338c5750506000910152565b6000600019821415614298576142986142bc565b5060010190565b6000600160ff1b8214156142b5576142b56142bc565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146142fd57600080fd5b50565b80151581146142fd57600080fdfea26469706673582212203686605138257a5f8bd57401f799f7f57a58d1be8e3ef921ee80b6d7f92a759e64736f6c63430008050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000805200000000000000000000000000000000000000000000000000000000000cb2fa00000000000000000000000004af698b479d0098229dc715655c667ceb6cd8433000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2
-----Decoded View---------------
Arg [0] : _initialRewardPerBlock (uint256): 1000000000000000000
Arg [1] : _decreasingInterval (uint256): 525600
Arg [2] : _startBlock (uint256): 13316000
Arg [3] : _maidCoin (address): 0x4Af698B479D0098229DC715655c667Ceb6cd8433
Arg [4] : _lpToken (address): 0xc7175038323562cB68E4BbdD379E9fE65134937f
Arg [5] : _sushi (address): 0x6B3595068778DD592e39A122f4f5a5cF09C90fE2
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000080520
Arg [2] : 0000000000000000000000000000000000000000000000000000000000cb2fa0
Arg [3] : 0000000000000000000000004af698b479d0098229dc715655c667ceb6cd8433
Arg [4] : 000000000000000000000000c7175038323562cb68e4bbdd379e9fe65134937f
Arg [5] : 0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.