Overview
FTM Balance
0 FTM
FTM Value
$0.00More Info
Private Name Tags
ContractCreator:
Sponsored
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 47806759 | 549 days ago | IN | Create: ShadowChef | 0 FTM | 0.2516817 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
47806759 | 549 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
ShadowChef
Compiler Version
v0.6.12+commit.27d51765
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.6.12; pragma experimental ABIEncoderV2; import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol"; import "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol"; import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import "./libraries/SignedSafeMath.sol"; import "./interfaces/IMasterChef.sol"; import "./interfaces/IShadowStrategy.sol"; import "./interfaces/ISmartWalletWhitelist.sol"; import "./interfaces/ISecondRewarder.sol"; contract ShadowChef is OwnableUpgradeable, ReentrancyGuardUpgradeable { using SafeMath for uint256; using BoringMath128 for uint128; using BoringERC20 for IERC20; using SignedSafeMath for int256; struct UserInfo { uint256 amount; int256 rewardDebt; } uint256 public accRewardPerShare; uint256 public lastRewardTime; /// @notice Address of rewardToken contract. IERC20 public rewardToken; /// @notice Address of the LP token for each MCV2 pool. IERC20 public lpToken; /// @notice Info of each user that stakes LP tokens. mapping(address => UserInfo) public userInfo; uint256 public rewardPerSecond; uint256 private ACC_REWARD_PRECISION; address public strategy; uint256 public distributionPeriod; uint256 public lastDistributedTime; uint256 public overDistributed; address public smartWalletChecker; ISecondRewarder public rewarder; uint256 public rewarderPid; event Deposit(address indexed user, uint256 amount, address indexed to); event Withdraw(address indexed user, uint256 amount, address indexed to); event EmergencyWithdraw(address indexed user, uint256 amount, address indexed to); event Harvest(address indexed user, uint256 amount); event LogUpdatePool(uint256 lastRewardTime, uint256 lpSupply, uint256 accRewardPerShare); event LogRewardPerSecond(uint256 rewardPerSecond); constructor() public {} function initialize( IERC20 _rewardToken, IERC20 _lpToken, address _strategy, uint256 _distributionPeriod, address _smartWalletChecker ) public initializer { __Ownable_init(); __ReentrancyGuard_init(); rewardToken = _rewardToken; distributionPeriod = _distributionPeriod; ACC_REWARD_PRECISION = 1e12; lpToken = _lpToken; lastRewardTime = block.timestamp; strategy = _strategy; smartWalletChecker = _smartWalletChecker; } modifier onlyWhitelisted() { if (tx.origin != msg.sender) { require(address(smartWalletChecker) != address(0), "Not whitelisted"); require(ISmartWalletWhitelist(smartWalletChecker).check(msg.sender), "Not whitelisted"); } _; } function setDistributionPeriod(uint256 _distributionPeriod) public onlyOwner { distributionPeriod = _distributionPeriod; } function setSmartWalletChecker(address _checker) public onlyOwner { smartWalletChecker = _checker; } function setStrategy(address _strategy) public onlyOwner { if (strategy != address(0)) { IShadowStrategy(strategy).withdrawAll(); } if (_strategy != address(0)) { uint256 _lpBalance = lpToken.balanceOf(address(this)); lpToken.safeTransfer(_strategy, _lpBalance); IShadowStrategy(_strategy).deposit(); strategy = _strategy; } strategy = _strategy; } function setSecondRewarder(ISecondRewarder _rewarder, uint256 _pid) public onlyOwner { rewarder = _rewarder; rewarderPid = _pid; } /// @notice Sets the reward per second to be distributed. Can only be called by the owner. /// @param _rewardPerSecond The amount of Reward to be distributed per second. function setRewardPerSecond(uint256 _rewardPerSecond) public onlyOwner { rewardPerSecond = _rewardPerSecond; emit LogRewardPerSecond(_rewardPerSecond); } function _setDistributionRate(uint256 amount) internal { updatePool(); uint256 _notDistributed; if (lastDistributedTime > 0 && block.timestamp < lastDistributedTime) { uint256 timeLeft = lastDistributedTime.sub(block.timestamp); _notDistributed = rewardPerSecond.mul(timeLeft); } amount = amount.add(_notDistributed); uint256 _moreDistributed = overDistributed; overDistributed = 0; if (lastDistributedTime > 0 && block.timestamp > lastDistributedTime) { uint256 timeOver = block.timestamp.sub(lastDistributedTime); _moreDistributed = _moreDistributed.add(rewardPerSecond.mul(timeOver)); } if (amount < _moreDistributed) { overDistributed = _moreDistributed.sub(amount); rewardPerSecond = 0; lastDistributedTime = block.timestamp.add(distributionPeriod); updatePool(); emit LogRewardPerSecond(rewardPerSecond); } else { amount = amount.sub(_moreDistributed); rewardPerSecond = amount.div(distributionPeriod); lastDistributedTime = block.timestamp.add(distributionPeriod); updatePool(); emit LogRewardPerSecond(rewardPerSecond); } } function setOverDistributed(uint256 _overDistributed) public onlyOwner { overDistributed = _overDistributed; } function harvestRewardsFromStrategy() public { // require(strategy != address(0), "Strategy is not set"); uint256 _rewardAmount = IShadowStrategy(strategy).harvest(msg.sender); if (_rewardAmount > 0) { _setDistributionRate(_rewardAmount); } } function pendingReward(address _user) external view returns (uint256 pending) { // if (strategy != address(0)) { UserInfo storage user = userInfo[_user]; uint256 lpSupply = lpToken.balanceOf(address(this)); lpSupply = lpSupply.add(IShadowStrategy(strategy).balanceOf()); uint256 _accRewardPerShare = accRewardPerShare; if (block.timestamp > lastRewardTime && lpSupply != 0) { uint256 time = block.timestamp.sub(lastRewardTime); uint256 rewardAmount = time.mul(rewardPerSecond); _accRewardPerShare = _accRewardPerShare.add(rewardAmount.mul(ACC_REWARD_PRECISION) / lpSupply); } pending = int256(user.amount.mul(_accRewardPerShare) / ACC_REWARD_PRECISION).sub(user.rewardDebt).toUInt256(); // } } function updatePool() public returns (uint256) { if (block.timestamp > lastRewardTime) { uint256 lpSupply = lpToken.balanceOf(address(this)); if (strategy != address(0)) { lpSupply = lpSupply.add(IShadowStrategy(strategy).balanceOf()); } if (lpSupply > 0) { uint256 time = block.timestamp.sub(lastRewardTime); uint256 rewardAmount = time.mul(rewardPerSecond); accRewardPerShare = accRewardPerShare.add(rewardAmount.mul(ACC_REWARD_PRECISION).div(lpSupply)); } lastRewardTime = block.timestamp; emit LogUpdatePool(lastRewardTime, lpSupply, accRewardPerShare); return accRewardPerShare; } } function deposit(uint256 amount, address to) public onlyWhitelisted nonReentrant { updatePool(); UserInfo storage user = userInfo[to]; // Effects user.amount = user.amount.add(amount); user.rewardDebt = user.rewardDebt.add(int256(amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION)); if (address(rewarder) != address(0)) { rewarder.onReward(rewarderPid, to, to, 0, user.amount); } lpToken.safeTransferFrom(msg.sender, address(this), amount); if (strategy != address(0)) { uint256 _lpBalance = lpToken.balanceOf(address(this)); lpToken.safeTransfer(strategy, _lpBalance); IShadowStrategy(strategy).deposit(); } emit Deposit(msg.sender, amount, to); } function withdraw(uint256 amount, address to) public onlyWhitelisted nonReentrant { updatePool(); UserInfo storage user = userInfo[msg.sender]; // Effects user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION)); user.amount = user.amount.sub(amount); if (address(rewarder) != address(0)) { rewarder.onReward(rewarderPid, to, to, 0, user.amount); } uint256 _lpBalance = lpToken.balanceOf(address(this)); if (_lpBalance < amount && strategy != address(0)) { uint256 _missing = amount.sub(_lpBalance); IShadowStrategy(strategy).withdraw(_missing); } lpToken.safeTransfer(to, amount); emit Withdraw(msg.sender, amount, to); } function harvest(address to) public { // if (strategy == address(0)) { // return; // } updatePool(); UserInfo storage user = userInfo[msg.sender]; int256 accumulatedReward = int256(user.amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION); uint256 _pendingReward = accumulatedReward.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedReward; // Interactions if (_pendingReward != 0 && strategy != address(0)) { IShadowStrategy(strategy).claim(_pendingReward); rewardToken.safeTransfer(to, _pendingReward); } if (address(rewarder) != address(0)) { rewarder.onReward(rewarderPid, msg.sender, to, _pendingReward, user.amount); } emit Harvest(msg.sender, _pendingReward); } function withdrawAndHarvest(uint256 amount, address to) public onlyWhitelisted nonReentrant { updatePool(); UserInfo storage user = userInfo[msg.sender]; require(amount <= user.amount, "Withdraw amount exceeds the deposited amount."); int256 accumulatedReward = int256(user.amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION); uint256 _pendingReward = accumulatedReward.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedReward.sub(int256(amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION)); user.amount = user.amount.sub(amount); // Interactions if (strategy != address(0)) { IShadowStrategy(strategy).claim(_pendingReward); rewardToken.safeTransfer(to, _pendingReward); } uint256 _lpBalance = lpToken.balanceOf(address(this)); if (_lpBalance < amount && strategy != address(0)) { uint256 _missing = amount.sub(_lpBalance); IShadowStrategy(strategy).withdraw(_missing); } if (address(rewarder) != address(0)) { rewarder.onReward(rewarderPid, msg.sender, to, _pendingReward, user.amount); } lpToken.safeTransfer(to, amount); emit Withdraw(msg.sender, amount, to); emit Harvest(msg.sender, _pendingReward); } function emergencyWithdraw(address to) public onlyWhitelisted nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; uint256 _lpBalance = lpToken.balanceOf(address(this)); if (_lpBalance < amount && strategy != address(0)) { uint256 _missing = amount.sub(_lpBalance); IShadowStrategy(strategy).withdraw(_missing); } if (address(rewarder) != address(0)) { rewarder.onReward(rewarderPid, msg.sender, to, 0, 0); } // Note: transfer can fail or succeed if `amount` is zero. lpToken.safeTransfer(to, amount); emit EmergencyWithdraw(msg.sender, amount, to); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; // a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math) library BoringMath { function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");} function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "BoringMath: Mul Overflow");} function to128(uint256 a) internal pure returns (uint128 c) { require(a <= uint128(-1), "BoringMath: uint128 Overflow"); c = uint128(a); } function to64(uint256 a) internal pure returns (uint64 c) { require(a <= uint64(-1), "BoringMath: uint64 Overflow"); c = uint64(a); } function to32(uint256 a) internal pure returns (uint32 c) { require(a <= uint32(-1), "BoringMath: uint32 Overflow"); c = uint32(a); } } library BoringMath128 { function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath64 { function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath32 { function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, "BoringMath: Underflow");} }
// SPDX-License-Identifier: UNLICENSED // Audit on 5-Jan-2021 by Keno and BoringCrypto // P1 - P3: OK pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // solhint-disable avoid-low-level-calls import "./libraries/BoringERC20.sol"; // T1 - T4: OK contract BaseBoringBatchable { function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_returnData.length < 68) return "Transaction reverted silently"; assembly { // Slice the sighash. _returnData := add(_returnData, 0x04) } return abi.decode(_returnData, (string)); // All that remains is the revert string } // F3 - F9: OK // F1: External is ok here because this is the batch function, adding it to a batch makes no sense // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value // C1 - C21: OK // C3: The length of the loop is fully under user control, so can't be exploited // C7: Delegatecall is only used on the same contract, so it's safe function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) { // Interactions successes = new bool[](calls.length); results = new bytes[](calls.length); for (uint256 i = 0; i < calls.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(calls[i]); require(success || !revertOnFail, _getRevertMsg(result)); successes[i] = success; results[i] = result; } } } // T1 - T4: OK contract BoringBatchable is BaseBoringBatchable { // F1 - F9: OK // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert) // if part of a batch this could be used to grief once as the second call would not need the permit // C1 - C21: OK function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { // Interactions // X1 - X5 token.permit(from, to, amount, deadline, v, r, s); } }
// SPDX-License-Identifier: MIT // Audit on 5-Jan-2021 by Keno and BoringCrypto // P1 - P3: OK pragma solidity 0.6.12; // Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol // Edited by BoringCrypto // T1 - T4: OK contract BoringOwnableData { // V1 - V5: OK address public owner; // V1 - V5: OK address public pendingOwner; } // T1 - T4: OK contract BoringOwnable is BoringOwnableData { // E1: OK event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () public { owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } // F1 - F9: OK // C1 - C21: OK function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner { if (direct) { // Checks require(newOwner != address(0) || renounce, "Ownable: zero address"); // Effects emit OwnershipTransferred(owner, newOwner); owner = newOwner; pendingOwner = address(0); } else { // Effects pendingOwner = newOwner; } } // F1 - F9: OK // C1 - C21: OK function claimOwnership() public { address _pendingOwner = pendingOwner; // Checks require(msg.sender == _pendingOwner, "Ownable: caller != pending owner"); // Effects emit OwnershipTransferred(owner, _pendingOwner); owner = _pendingOwner; pendingOwner = address(0); } // M1 - M5: OK // C1 - C21: OK modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { 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; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../proxy/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; library SignedSafeMath { int256 constant private _INT256_MIN = -2**255; /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two signed integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } function toUInt256(int256 a) internal pure returns (uint256) { require(a >= 0, "Integer < 0"); return uint256(a); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IMasterChef { function BONUS_MULTIPLIER() external view returns (uint256); function add( uint256 _allocPoint, address _lpToken, bool _withUpdate ) external; function bonusEndBlock() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; function dev(address _devaddr) external; function devFundDivRate() external view returns (uint256); function devaddr() external view returns (address); function emergencyWithdraw(uint256 _pid) external; function getMultiplier(uint256 _from, uint256 _to) external view returns (uint256); function massUpdatePools() external; function owner() external view returns (address); function pendingPickle(uint256 _pid, address _user) external view returns (uint256); function pendingReward(uint256 _pid, address _user) external view returns (uint256); function pending(uint256 _pid, address _user) external view returns (uint256); function pickle() external view returns (address); function picklePerBlock() external view returns (uint256); function poolInfo(uint256) external view returns ( address lpToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accPicklePerShare ); function poolLength() external view returns (uint256); function renounceOwnership() external; function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) external; function setBonusEndBlock(uint256 _bonusEndBlock) external; function setDevFundDivRate(uint256 _devFundDivRate) external; function setPicklePerBlock(uint256 _picklePerBlock) external; function startBlock() external view returns (uint256); function totalAllocPoint() external view returns (uint256); function transferOwnership(address newOwner) external; function updatePool(uint256 _pid) external; function userInfo(uint256, address) external view returns (uint256 amount, uint256 rewardDebt); function withdraw(uint256 _pid, uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface IShadowStrategy { function withdrawAll() external returns (uint256); function withdraw(uint256 _amount) external returns (uint256); function deposit() external; function harvest(address) external returns (uint256); function claim(uint256 pendingLinSpirit) external; function balanceOf() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface ISmartWalletWhitelist { function check(address) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol"; interface ISecondRewarder { using BoringERC20 for IERC20; function onReward( uint256 pid, address user, address recipient, uint256 amount, uint256 newLpAmount ) external; function pendingTokens( uint256 pid, address user, uint256 amount ) external view returns (IERC20[] memory, uint256[] memory); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.12; import "../interfaces/IERC20.sol"; library BoringERC20 { function safeSymbol(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeName(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeDecimals(IERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567)); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } function safeTransfer(IERC20 token, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed"); } function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed"); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); // EIP 2612 function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../proxy/Initializable.sol"; /* * @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 GSN 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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // solhint-disable-next-line compiler-version pragma solidity >=0.4.24 <0.8.0; import "../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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); } 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); } } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerSecond","type":"uint256"}],"name":"LogRewardPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accRewardPerShare","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"accRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestRewardsFromStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_distributionPeriod","type":"uint256"},{"internalType":"address","name":"_smartWalletChecker","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastDistributedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewarder","outputs":[{"internalType":"contract ISecondRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewarderPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_distributionPeriod","type":"uint256"}],"name":"setDistributionPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_overDistributed","type":"uint256"}],"name":"setOverDistributed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"setRewardPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISecondRewarder","name":"_rewarder","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"setSecondRewarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_checker","type":"address"}],"name":"setSmartWalletChecker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"setStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"smartWalletChecker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"int256","name":"rewardDebt","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawAndHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612c90806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c80638da5cb5b1161010f578063c1f3d963116100a2578063e3161ddd11610071578063e3161ddd14610383578063f2fde38b1461038b578063f40f0f521461039e578063f7c618c1146103b1576101e4565b8063c1f3d9631461034d578063ca2f2c0714610360578063d1e82a2114610368578063dcc3e06e1461037b576101e4565b8063939d6237116100de578063939d6237146103225780639b5017231461032a578063a8c62e7614610332578063b6bc6a8c1461033a576101e4565b80638da5cb5b146103025780638f10369a1461030a5780638f67b013146103125780639231cf741461031a576101e4565b80635ac01ca2116101875780636ff1c9bc116101565780636ff1c9bc146102cc578063715018a6146102df5780637710c6d8146102e75780637df14854146102fa576101e4565b80635ac01ca2146102895780635fcbd2851461029157806366da5815146102a65780636e553f65146102b9576101e4565b80631959a002116101c35780631959a0021461022457806333a100ca1461024e5780634def1c8214610261578063530b97a414610276576101e4565b8062f714ce146101e957806303015053146101fe5780630e5c011e14610211575b600080fd5b6101fc6101f73660046127be565b6103b9565b005b6101fc61020c3660046126c0565b61072b565b6101fc61021f3660046126c0565b61078c565b6102376102323660046126c0565b61094b565b604051610245929190612c21565b60405180910390f35b6101fc61025c3660046126c0565b610964565b610269610b7a565b6040516102459190612be9565b6101fc6102843660046126fc565b610b80565b610269610c74565b610299610c7a565b6040516102459190612826565b6101fc6102b436600461278e565b610c89565b6101fc6102c73660046127be565b610d08565b6101fc6102da3660046126c0565b611063565b6101fc611381565b6101fc6102f536600461278e565b61140a565b61029961144e565b61029961145d565b61026961146d565b610269611473565b610269611479565b61026961147f565b610269611485565b61029961148b565b6101fc61034836600461278e565b61149a565b6101fc61035b3660046127be565b6114de565b6101fc611974565b6101fc610376366004612763565b611a0b565b610299611a70565b610269611a7f565b6101fc6103993660046126c0565b611c5f565b6102696103ac3660046126c0565b611d20565b610299611ec2565b32331461048d5760a2546001600160a01b03166103f15760405162461bcd60e51b81526004016103e890612a4c565b60405180910390fd5b60a254604051631846d2f560e31b81526001600160a01b039091169063c23697a890610421903390600401612826565b60206040518083038186803b15801561043957600080fd5b505afa15801561044d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047191906126dc565b61048d5760405162461bcd60e51b81526004016103e890612a4c565b600260655414156104b05760405162461bcd60e51b81526004016103e890612bb2565b60026065556104bd611a7f565b50336000908152609b60205260409020609d546097546104f791906104e3908690611ed1565b816104ea57fe5b6001840154919004611f14565b600182015580546105089084611f5a565b815560a3546001600160a01b03161561058b5760a35460a45482546040516344af0fa760e01b81526001600160a01b03909316926344af0fa7926105589290918791829160009190600401612bf2565b600060405180830381600087803b15801561057257600080fd5b505af1158015610586573d6000803e3d6000fd5b505050505b609a546040516370a0823160e01b81526000916001600160a01b0316906370a08231906105bc903090600401612826565b60206040518083038186803b1580156105d457600080fd5b505afa1580156105e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060c91906127a6565b905083811080156106275750609e546001600160a01b031615155b156106be5760006106388583611f5a565b609e54604051632e1a7d4d60e01b81529192506001600160a01b031690632e1a7d4d90610669908490600401612be9565b602060405180830381600087803b15801561068357600080fd5b505af1158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb91906127a6565b50505b609a546106d5906001600160a01b03168486611f82565b826001600160a01b0316336001600160a01b03167f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b2866040516107189190612be9565b60405180910390a3505060016065555050565b610733612070565b6001600160a01b031661074461145d565b6001600160a01b03161461076a5760405162461bcd60e51b81526004016103e890612b04565b60a280546001600160a01b0319166001600160a01b0392909216919091179055565b610794611a7f565b50336000908152609b60205260408120609d5460975482549293926107b891611ed1565b816107bf57fe5b04905060006107e36107de846001015484611f1490919063ffffffff16565b612074565b60018401839055905080158015906108055750609e546001600160a01b031615155b1561088457609e5460405163379607f560e01b81526001600160a01b039091169063379607f59061083a908490600401612be9565b600060405180830381600087803b15801561085457600080fd5b505af1158015610868573d6000803e3d6000fd5b505060995461088492506001600160a01b031690508583611f82565b60a3546001600160a01b0316156109045760a35460a45484546040516344af0fa760e01b81526001600160a01b03909316926344af0fa7926108d192909133918a91889190600401612bf2565b600060405180830381600087803b1580156108eb57600080fd5b505af11580156108ff573d6000803e3d6000fd5b505050505b336001600160a01b03167fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba8260405161093d9190612be9565b60405180910390a250505050565b609b602052600090815260409020805460019091015482565b61096c612070565b6001600160a01b031661097d61145d565b6001600160a01b0316146109a35760405162461bcd60e51b81526004016103e890612b04565b609e546001600160a01b031615610a3e57609e60009054906101000a90046001600160a01b03166001600160a01b031663853828b66040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610a0457600080fd5b505af1158015610a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3c91906127a6565b505b6001600160a01b03811615610b5857609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a7e903090600401612826565b60206040518083038186803b158015610a9657600080fd5b505afa158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace91906127a6565b609a54909150610ae8906001600160a01b03168383611f82565b816001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b2357600080fd5b505af1158015610b37573d6000803e3d6000fd5b5050609e80546001600160a01b0319166001600160a01b0386161790555050505b609e80546001600160a01b0319166001600160a01b0392909216919091179055565b60a05481565b600054610100900460ff1680610b995750610b9961209a565b80610ba7575060005460ff16155b610bc35760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff16158015610bee576000805460ff1961ff0019909116610100171660011790555b610bf66120ab565b610bfe61213d565b609980546001600160a01b038089166001600160a01b031992831617909255609f85905564e8d4a51000609d55609a805488841690831617905542609855609e805487841690831617905560a28054928516929091169190911790558015610c6c576000805461ff00191690555b505050505050565b60a15481565b609a546001600160a01b031681565b610c91612070565b6001600160a01b0316610ca261145d565b6001600160a01b031614610cc85760405162461bcd60e51b81526004016103e890612b04565b609c8190556040517fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a27890610cfd908390612be9565b60405180910390a150565b323314610dd35760a2546001600160a01b0316610d375760405162461bcd60e51b81526004016103e890612a4c565b60a254604051631846d2f560e31b81526001600160a01b039091169063c23697a890610d67903390600401612826565b60206040518083038186803b158015610d7f57600080fd5b505afa158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db791906126dc565b610dd35760405162461bcd60e51b81526004016103e890612a4c565b60026065541415610df65760405162461bcd60e51b81526004016103e890612bb2565b6002606555610e03611a7f565b506001600160a01b0381166000908152609b602052604090208054610e2890846121b3565b8155609d54609754610e549190610e40908690611ed1565b81610e4757fe5b60018401549190046121d8565b600182015560a3546001600160a01b031615610eda5760a35460a45482546040516344af0fa760e01b81526001600160a01b03909316926344af0fa792610ea79290918791829160009190600401612bf2565b600060405180830381600087803b158015610ec157600080fd5b505af1158015610ed5573d6000803e3d6000fd5b505050505b609a54610ef2906001600160a01b031633308661221e565b609e546001600160a01b03161561100e57609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610f34903090600401612826565b60206040518083038186803b158015610f4c57600080fd5b505afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8491906127a6565b609e54609a54919250610fa4916001600160a01b03908116911683611f82565b609e60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ff457600080fd5b505af1158015611008573d6000803e3d6000fd5b50505050505b816001600160a01b0316336001600160a01b03167fe31c7b8d08ee7db0afa68782e1028ef92305caeea8626633ad44d413e30f6b2f856040516110519190612be9565b60405180910390a35050600160655550565b32331461112e5760a2546001600160a01b03166110925760405162461bcd60e51b81526004016103e890612a4c565b60a254604051631846d2f560e31b81526001600160a01b039091169063c23697a8906110c2903390600401612826565b60206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111291906126dc565b61112e5760405162461bcd60e51b81526004016103e890612a4c565b600260655414156111515760405162461bcd60e51b81526004016103e890612bb2565b6002606555336000908152609b6020526040808220805483825560018201849055609a5492516370a0823160e01b81529193909290916001600160a01b03909116906370a08231906111a7903090600401612826565b60206040518083038186803b1580156111bf57600080fd5b505afa1580156111d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f791906127a6565b905081811080156112125750609e546001600160a01b031615155b156112a95760006112238383611f5a565b609e54604051632e1a7d4d60e01b81529192506001600160a01b031690632e1a7d4d90611254908490600401612be9565b602060405180830381600087803b15801561126e57600080fd5b505af1158015611282573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a691906127a6565b50505b60a3546001600160a01b0316156113275760a35460a4546040516344af0fa760e01b81526001600160a01b03909216916344af0fa7916112f491339089906000908190600401612bf2565b600060405180830381600087803b15801561130e57600080fd5b505af1158015611322573d6000803e3d6000fd5b505050505b609a5461133e906001600160a01b03168584611f82565b836001600160a01b0316336001600160a01b03167faaeda929aa102e867049528ec7cd2499e3a2f8846e736ae7935f234dfbf500d9846040516107189190612be9565b611389612070565b6001600160a01b031661139a61145d565b6001600160a01b0316146113c05760405162461bcd60e51b81526004016103e890612b04565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b611412612070565b6001600160a01b031661142361145d565b6001600160a01b0316146114495760405162461bcd60e51b81526004016103e890612b04565b609f55565b60a2546001600160a01b031681565b6033546001600160a01b03165b90565b609c5481565b60a45481565b60985481565b60975481565b609f5481565b609e546001600160a01b031681565b6114a2612070565b6001600160a01b03166114b361145d565b6001600160a01b0316146114d95760405162461bcd60e51b81526004016103e890612b04565b60a155565b3233146115a95760a2546001600160a01b031661150d5760405162461bcd60e51b81526004016103e890612a4c565b60a254604051631846d2f560e31b81526001600160a01b039091169063c23697a89061153d903390600401612826565b60206040518083038186803b15801561155557600080fd5b505afa158015611569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158d91906126dc565b6115a95760405162461bcd60e51b81526004016103e890612a4c565b600260655414156115cc5760405162461bcd60e51b81526004016103e890612bb2565b60026065556115d9611a7f565b50336000908152609b60205260409020805483111561160a5760405162461bcd60e51b81526004016103e89061289c565b609d546097548254600092916116209190611ed1565b8161162757fe5b04905060006116466107de846001015484611f1490919063ffffffff16565b9050611673609d5461166360975488611ed190919063ffffffff16565b8161166a57fe5b84919004611f14565b600184015582546116849086611f5a565b8355609e546001600160a01b03161561171157609e5460405163379607f560e01b81526001600160a01b039091169063379607f5906116c7908490600401612be9565b600060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b505060995461171192506001600160a01b031690508583611f82565b609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611742903090600401612826565b60206040518083038186803b15801561175a57600080fd5b505afa15801561176e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179291906127a6565b905085811080156117ad5750609e546001600160a01b031615155b156118445760006117be8783611f5a565b609e54604051632e1a7d4d60e01b81529192506001600160a01b031690632e1a7d4d906117ef908490600401612be9565b602060405180830381600087803b15801561180957600080fd5b505af115801561181d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184191906127a6565b50505b60a3546001600160a01b0316156118c45760a35460a45485546040516344af0fa760e01b81526001600160a01b03909316926344af0fa79261189192909133918b91899190600401612bf2565b600060405180830381600087803b1580156118ab57600080fd5b505af11580156118bf573d6000803e3d6000fd5b505050505b609a546118db906001600160a01b03168688611f82565b846001600160a01b0316336001600160a01b03167f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b28860405161191e9190612be9565b60405180910390a3336001600160a01b03167fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba8360405161195f9190612be9565b60405180910390a25050600160655550505050565b609e5460405163072e008f60e11b81526000916001600160a01b031690630e5c011e906119a5903390600401612826565b602060405180830381600087803b1580156119bf57600080fd5b505af11580156119d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f791906127a6565b90508015611a0857611a0881612307565b50565b611a13612070565b6001600160a01b0316611a2461145d565b6001600160a01b031614611a4a5760405162461bcd60e51b81526004016103e890612b04565b60a380546001600160a01b0319166001600160a01b03939093169290921790915560a455565b60a3546001600160a01b031681565b600060985442111561146a57609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611abc903090600401612826565b60206040518083038186803b158015611ad457600080fd5b505afa158015611ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0c91906127a6565b609e549091506001600160a01b031615611ba857609e546040805163722713f760e01b81529051611ba5926001600160a01b03169163722713f7916004808301926020929190829003018186803b158015611b6657600080fd5b505afa158015611b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9e91906127a6565b82906121b3565b90505b8015611c11576000611bc560985442611f5a90919063ffffffff16565b90506000611bde609c5483611ed190919063ffffffff16565b9050611c0b611c0284611bfc609d5485611ed190919063ffffffff16565b906124a6565b609754906121b3565b60975550505b4260988190556097546040517f1f2d1a9fde053af46b5db3dc92a8aa8696e56a677998fdd1311b45be341f785392611c4d929091859190612c2f565b60405180910390a1505060975461146a565b611c67612070565b6001600160a01b0316611c7861145d565b6001600160a01b031614611c9e5760405162461bcd60e51b81526004016103e890612b04565b6001600160a01b038116611cc45760405162461bcd60e51b81526004016103e890612920565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038082166000908152609b6020526040808220609a5491516370a0823160e01b8152929390928492909116906370a0823190611d67903090600401612826565b60206040518083038186803b158015611d7f57600080fd5b505afa158015611d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db791906127a6565b9050611e0a609e60009054906101000a90046001600160a01b03166001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b158015611b6657600080fd5b6097546098549192509042118015611e2157508115155b15611e86576000611e3d60985442611f5a90919063ffffffff16565b90506000611e56609c5483611ed190919063ffffffff16565b9050611e8184611e71609d5484611ed190919063ffffffff16565b81611e7857fe5b859190046121b3565b925050505b611eb96107de8460010154609d54611eab858860000154611ed190919063ffffffff16565b81611eb257fe5b0490611f14565b95945050505050565b6099546001600160a01b031681565b600082611ee057506000611f0e565b82820282848281611eed57fe5b0414611f0b5760405162461bcd60e51b81526004016103e890612ac3565b90505b92915050565b6000818303818312801590611f295750838113155b80611f3e5750600083128015611f3e57508381135b611f0b5760405162461bcd60e51b81526004016103e890612b39565b600082821115611f7c5760405162461bcd60e51b81526004016103e8906129de565b50900390565b60006060846001600160a01b031663a9059cbb8585604051602401611fa892919061285e565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611fe191906127ed565b6000604051808303816000865af19150503d806000811461201e576040519150601f19603f3d011682016040523d82523d6000602084013e612023565b606091505b509150915081801561204d57508051158061204d57508080602001905181019061204d91906126dc565b6120695760405162461bcd60e51b81526004016103e8906128e9565b5050505050565b3390565b6000808212156120965760405162461bcd60e51b81526004016103e890612877565b5090565b60006120a5306124d8565b15905090565b600054610100900460ff16806120c457506120c461209a565b806120d2575060005460ff16155b6120ee5760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff16158015612119576000805460ff1961ff0019909116610100171660011790555b6121216124de565b61212961255f565b8015611a08576000805461ff001916905550565b600054610100900460ff1680612156575061215661209a565b80612164575060005460ff16155b6121805760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff161580156121ab576000805460ff1961ff0019909116610100171660011790555b612129612639565b600082820183811015611f0b5760405162461bcd60e51b81526004016103e890612966565b60008282018183128015906121ed5750838112155b80612202575060008312801561220257508381125b611f0b5760405162461bcd60e51b81526004016103e89061299d565b60006060856001600160a01b03166323b872dd8686866040516024016122469392919061283a565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161227f91906127ed565b6000604051808303816000865af19150503d80600081146122bc576040519150601f19603f3d011682016040523d82523d6000602084013e6122c1565b606091505b50915091508180156122eb5750805115806122eb5750808060200190518101906122eb91906126dc565b610c6c5760405162461bcd60e51b81526004016103e890612b7d565b61230f611a7f565b5060008060a054118015612324575060a05442105b1561234d5760a0546000906123399042611f5a565b609c549091506123499082611ed1565b9150505b61235782826121b3565b60a18054600090915560a0549193509015801590612376575060a05442115b156123b757600061239260a05442611f5a90919063ffffffff16565b90506123b36123ac82609c54611ed190919063ffffffff16565b83906121b3565b9150505b80831015612429576123c98184611f5a565b60a1556000609c55609f546123df9042906121b3565b60a0556123ea611a7f565b507fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a278609c5460405161241c9190612be9565b60405180910390a16124a1565b6124338382611f5a565b925061244a609f54846124a690919063ffffffff16565b609c55609f5461245b9042906121b3565b60a055612466611a7f565b507fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a278609c546040516124989190612be9565b60405180910390a15b505050565b60008082116124c75760405162461bcd60e51b81526004016103e890612a15565b8183816124d057fe5b049392505050565b3b151590565b600054610100900460ff16806124f757506124f761209a565b80612505575060005460ff16155b6125215760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff16158015612129576000805460ff1961ff0019909116610100171660011790558015611a08576000805461ff001916905550565b600054610100900460ff1680612578575061257861209a565b80612586575060005460ff16155b6125a25760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff161580156125cd576000805460ff1961ff0019909116610100171660011790555b60006125d7612070565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611a08576000805461ff001916905550565b600054610100900460ff1680612652575061265261209a565b80612660575060005460ff16155b61267c5760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff161580156126a7576000805460ff1961ff0019909116610100171660011790555b60016065558015611a08576000805461ff001916905550565b6000602082840312156126d1578081fd5b8135611f0b81612c45565b6000602082840312156126ed578081fd5b81518015158114611f0b578182fd5b600080600080600060a08688031215612713578081fd5b853561271e81612c45565b9450602086013561272e81612c45565b9350604086013561273e81612c45565b925060608601359150608086013561275581612c45565b809150509295509295909350565b60008060408385031215612775578182fd5b823561278081612c45565b946020939093013593505050565b60006020828403121561279f578081fd5b5035919050565b6000602082840312156127b7578081fd5b5051919050565b600080604083850312156127d0578182fd5b8235915060208301356127e281612c45565b809150509250929050565b60008251815b8181101561280d57602081860181015185830152016127f3565b8181111561281b5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b6020808252602d908201527f576974686472617720616d6f756e74206578636565647320746865206465706f60408201526c39b4ba32b21030b6b7bab73a1760991b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252600f908201526e139bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160a01b0381168114611a0857600080fdfea2646970667358221220ceb2dbf12f8b8836ba21ce4dce438e4fed1dc36effbb63dfdfe6abb92f98b74164736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e45760003560e01c80638da5cb5b1161010f578063c1f3d963116100a2578063e3161ddd11610071578063e3161ddd14610383578063f2fde38b1461038b578063f40f0f521461039e578063f7c618c1146103b1576101e4565b8063c1f3d9631461034d578063ca2f2c0714610360578063d1e82a2114610368578063dcc3e06e1461037b576101e4565b8063939d6237116100de578063939d6237146103225780639b5017231461032a578063a8c62e7614610332578063b6bc6a8c1461033a576101e4565b80638da5cb5b146103025780638f10369a1461030a5780638f67b013146103125780639231cf741461031a576101e4565b80635ac01ca2116101875780636ff1c9bc116101565780636ff1c9bc146102cc578063715018a6146102df5780637710c6d8146102e75780637df14854146102fa576101e4565b80635ac01ca2146102895780635fcbd2851461029157806366da5815146102a65780636e553f65146102b9576101e4565b80631959a002116101c35780631959a0021461022457806333a100ca1461024e5780634def1c8214610261578063530b97a414610276576101e4565b8062f714ce146101e957806303015053146101fe5780630e5c011e14610211575b600080fd5b6101fc6101f73660046127be565b6103b9565b005b6101fc61020c3660046126c0565b61072b565b6101fc61021f3660046126c0565b61078c565b6102376102323660046126c0565b61094b565b604051610245929190612c21565b60405180910390f35b6101fc61025c3660046126c0565b610964565b610269610b7a565b6040516102459190612be9565b6101fc6102843660046126fc565b610b80565b610269610c74565b610299610c7a565b6040516102459190612826565b6101fc6102b436600461278e565b610c89565b6101fc6102c73660046127be565b610d08565b6101fc6102da3660046126c0565b611063565b6101fc611381565b6101fc6102f536600461278e565b61140a565b61029961144e565b61029961145d565b61026961146d565b610269611473565b610269611479565b61026961147f565b610269611485565b61029961148b565b6101fc61034836600461278e565b61149a565b6101fc61035b3660046127be565b6114de565b6101fc611974565b6101fc610376366004612763565b611a0b565b610299611a70565b610269611a7f565b6101fc6103993660046126c0565b611c5f565b6102696103ac3660046126c0565b611d20565b610299611ec2565b32331461048d5760a2546001600160a01b03166103f15760405162461bcd60e51b81526004016103e890612a4c565b60405180910390fd5b60a254604051631846d2f560e31b81526001600160a01b039091169063c23697a890610421903390600401612826565b60206040518083038186803b15801561043957600080fd5b505afa15801561044d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047191906126dc565b61048d5760405162461bcd60e51b81526004016103e890612a4c565b600260655414156104b05760405162461bcd60e51b81526004016103e890612bb2565b60026065556104bd611a7f565b50336000908152609b60205260409020609d546097546104f791906104e3908690611ed1565b816104ea57fe5b6001840154919004611f14565b600182015580546105089084611f5a565b815560a3546001600160a01b03161561058b5760a35460a45482546040516344af0fa760e01b81526001600160a01b03909316926344af0fa7926105589290918791829160009190600401612bf2565b600060405180830381600087803b15801561057257600080fd5b505af1158015610586573d6000803e3d6000fd5b505050505b609a546040516370a0823160e01b81526000916001600160a01b0316906370a08231906105bc903090600401612826565b60206040518083038186803b1580156105d457600080fd5b505afa1580156105e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060c91906127a6565b905083811080156106275750609e546001600160a01b031615155b156106be5760006106388583611f5a565b609e54604051632e1a7d4d60e01b81529192506001600160a01b031690632e1a7d4d90610669908490600401612be9565b602060405180830381600087803b15801561068357600080fd5b505af1158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb91906127a6565b50505b609a546106d5906001600160a01b03168486611f82565b826001600160a01b0316336001600160a01b03167f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b2866040516107189190612be9565b60405180910390a3505060016065555050565b610733612070565b6001600160a01b031661074461145d565b6001600160a01b03161461076a5760405162461bcd60e51b81526004016103e890612b04565b60a280546001600160a01b0319166001600160a01b0392909216919091179055565b610794611a7f565b50336000908152609b60205260408120609d5460975482549293926107b891611ed1565b816107bf57fe5b04905060006107e36107de846001015484611f1490919063ffffffff16565b612074565b60018401839055905080158015906108055750609e546001600160a01b031615155b1561088457609e5460405163379607f560e01b81526001600160a01b039091169063379607f59061083a908490600401612be9565b600060405180830381600087803b15801561085457600080fd5b505af1158015610868573d6000803e3d6000fd5b505060995461088492506001600160a01b031690508583611f82565b60a3546001600160a01b0316156109045760a35460a45484546040516344af0fa760e01b81526001600160a01b03909316926344af0fa7926108d192909133918a91889190600401612bf2565b600060405180830381600087803b1580156108eb57600080fd5b505af11580156108ff573d6000803e3d6000fd5b505050505b336001600160a01b03167fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba8260405161093d9190612be9565b60405180910390a250505050565b609b602052600090815260409020805460019091015482565b61096c612070565b6001600160a01b031661097d61145d565b6001600160a01b0316146109a35760405162461bcd60e51b81526004016103e890612b04565b609e546001600160a01b031615610a3e57609e60009054906101000a90046001600160a01b03166001600160a01b031663853828b66040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610a0457600080fd5b505af1158015610a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3c91906127a6565b505b6001600160a01b03811615610b5857609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a7e903090600401612826565b60206040518083038186803b158015610a9657600080fd5b505afa158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace91906127a6565b609a54909150610ae8906001600160a01b03168383611f82565b816001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b2357600080fd5b505af1158015610b37573d6000803e3d6000fd5b5050609e80546001600160a01b0319166001600160a01b0386161790555050505b609e80546001600160a01b0319166001600160a01b0392909216919091179055565b60a05481565b600054610100900460ff1680610b995750610b9961209a565b80610ba7575060005460ff16155b610bc35760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff16158015610bee576000805460ff1961ff0019909116610100171660011790555b610bf66120ab565b610bfe61213d565b609980546001600160a01b038089166001600160a01b031992831617909255609f85905564e8d4a51000609d55609a805488841690831617905542609855609e805487841690831617905560a28054928516929091169190911790558015610c6c576000805461ff00191690555b505050505050565b60a15481565b609a546001600160a01b031681565b610c91612070565b6001600160a01b0316610ca261145d565b6001600160a01b031614610cc85760405162461bcd60e51b81526004016103e890612b04565b609c8190556040517fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a27890610cfd908390612be9565b60405180910390a150565b323314610dd35760a2546001600160a01b0316610d375760405162461bcd60e51b81526004016103e890612a4c565b60a254604051631846d2f560e31b81526001600160a01b039091169063c23697a890610d67903390600401612826565b60206040518083038186803b158015610d7f57600080fd5b505afa158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db791906126dc565b610dd35760405162461bcd60e51b81526004016103e890612a4c565b60026065541415610df65760405162461bcd60e51b81526004016103e890612bb2565b6002606555610e03611a7f565b506001600160a01b0381166000908152609b602052604090208054610e2890846121b3565b8155609d54609754610e549190610e40908690611ed1565b81610e4757fe5b60018401549190046121d8565b600182015560a3546001600160a01b031615610eda5760a35460a45482546040516344af0fa760e01b81526001600160a01b03909316926344af0fa792610ea79290918791829160009190600401612bf2565b600060405180830381600087803b158015610ec157600080fd5b505af1158015610ed5573d6000803e3d6000fd5b505050505b609a54610ef2906001600160a01b031633308661221e565b609e546001600160a01b03161561100e57609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610f34903090600401612826565b60206040518083038186803b158015610f4c57600080fd5b505afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8491906127a6565b609e54609a54919250610fa4916001600160a01b03908116911683611f82565b609e60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ff457600080fd5b505af1158015611008573d6000803e3d6000fd5b50505050505b816001600160a01b0316336001600160a01b03167fe31c7b8d08ee7db0afa68782e1028ef92305caeea8626633ad44d413e30f6b2f856040516110519190612be9565b60405180910390a35050600160655550565b32331461112e5760a2546001600160a01b03166110925760405162461bcd60e51b81526004016103e890612a4c565b60a254604051631846d2f560e31b81526001600160a01b039091169063c23697a8906110c2903390600401612826565b60206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111291906126dc565b61112e5760405162461bcd60e51b81526004016103e890612a4c565b600260655414156111515760405162461bcd60e51b81526004016103e890612bb2565b6002606555336000908152609b6020526040808220805483825560018201849055609a5492516370a0823160e01b81529193909290916001600160a01b03909116906370a08231906111a7903090600401612826565b60206040518083038186803b1580156111bf57600080fd5b505afa1580156111d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f791906127a6565b905081811080156112125750609e546001600160a01b031615155b156112a95760006112238383611f5a565b609e54604051632e1a7d4d60e01b81529192506001600160a01b031690632e1a7d4d90611254908490600401612be9565b602060405180830381600087803b15801561126e57600080fd5b505af1158015611282573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a691906127a6565b50505b60a3546001600160a01b0316156113275760a35460a4546040516344af0fa760e01b81526001600160a01b03909216916344af0fa7916112f491339089906000908190600401612bf2565b600060405180830381600087803b15801561130e57600080fd5b505af1158015611322573d6000803e3d6000fd5b505050505b609a5461133e906001600160a01b03168584611f82565b836001600160a01b0316336001600160a01b03167faaeda929aa102e867049528ec7cd2499e3a2f8846e736ae7935f234dfbf500d9846040516107189190612be9565b611389612070565b6001600160a01b031661139a61145d565b6001600160a01b0316146113c05760405162461bcd60e51b81526004016103e890612b04565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b611412612070565b6001600160a01b031661142361145d565b6001600160a01b0316146114495760405162461bcd60e51b81526004016103e890612b04565b609f55565b60a2546001600160a01b031681565b6033546001600160a01b03165b90565b609c5481565b60a45481565b60985481565b60975481565b609f5481565b609e546001600160a01b031681565b6114a2612070565b6001600160a01b03166114b361145d565b6001600160a01b0316146114d95760405162461bcd60e51b81526004016103e890612b04565b60a155565b3233146115a95760a2546001600160a01b031661150d5760405162461bcd60e51b81526004016103e890612a4c565b60a254604051631846d2f560e31b81526001600160a01b039091169063c23697a89061153d903390600401612826565b60206040518083038186803b15801561155557600080fd5b505afa158015611569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158d91906126dc565b6115a95760405162461bcd60e51b81526004016103e890612a4c565b600260655414156115cc5760405162461bcd60e51b81526004016103e890612bb2565b60026065556115d9611a7f565b50336000908152609b60205260409020805483111561160a5760405162461bcd60e51b81526004016103e89061289c565b609d546097548254600092916116209190611ed1565b8161162757fe5b04905060006116466107de846001015484611f1490919063ffffffff16565b9050611673609d5461166360975488611ed190919063ffffffff16565b8161166a57fe5b84919004611f14565b600184015582546116849086611f5a565b8355609e546001600160a01b03161561171157609e5460405163379607f560e01b81526001600160a01b039091169063379607f5906116c7908490600401612be9565b600060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b505060995461171192506001600160a01b031690508583611f82565b609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611742903090600401612826565b60206040518083038186803b15801561175a57600080fd5b505afa15801561176e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179291906127a6565b905085811080156117ad5750609e546001600160a01b031615155b156118445760006117be8783611f5a565b609e54604051632e1a7d4d60e01b81529192506001600160a01b031690632e1a7d4d906117ef908490600401612be9565b602060405180830381600087803b15801561180957600080fd5b505af115801561181d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184191906127a6565b50505b60a3546001600160a01b0316156118c45760a35460a45485546040516344af0fa760e01b81526001600160a01b03909316926344af0fa79261189192909133918b91899190600401612bf2565b600060405180830381600087803b1580156118ab57600080fd5b505af11580156118bf573d6000803e3d6000fd5b505050505b609a546118db906001600160a01b03168688611f82565b846001600160a01b0316336001600160a01b03167f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b28860405161191e9190612be9565b60405180910390a3336001600160a01b03167fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba8360405161195f9190612be9565b60405180910390a25050600160655550505050565b609e5460405163072e008f60e11b81526000916001600160a01b031690630e5c011e906119a5903390600401612826565b602060405180830381600087803b1580156119bf57600080fd5b505af11580156119d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f791906127a6565b90508015611a0857611a0881612307565b50565b611a13612070565b6001600160a01b0316611a2461145d565b6001600160a01b031614611a4a5760405162461bcd60e51b81526004016103e890612b04565b60a380546001600160a01b0319166001600160a01b03939093169290921790915560a455565b60a3546001600160a01b031681565b600060985442111561146a57609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611abc903090600401612826565b60206040518083038186803b158015611ad457600080fd5b505afa158015611ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0c91906127a6565b609e549091506001600160a01b031615611ba857609e546040805163722713f760e01b81529051611ba5926001600160a01b03169163722713f7916004808301926020929190829003018186803b158015611b6657600080fd5b505afa158015611b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9e91906127a6565b82906121b3565b90505b8015611c11576000611bc560985442611f5a90919063ffffffff16565b90506000611bde609c5483611ed190919063ffffffff16565b9050611c0b611c0284611bfc609d5485611ed190919063ffffffff16565b906124a6565b609754906121b3565b60975550505b4260988190556097546040517f1f2d1a9fde053af46b5db3dc92a8aa8696e56a677998fdd1311b45be341f785392611c4d929091859190612c2f565b60405180910390a1505060975461146a565b611c67612070565b6001600160a01b0316611c7861145d565b6001600160a01b031614611c9e5760405162461bcd60e51b81526004016103e890612b04565b6001600160a01b038116611cc45760405162461bcd60e51b81526004016103e890612920565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038082166000908152609b6020526040808220609a5491516370a0823160e01b8152929390928492909116906370a0823190611d67903090600401612826565b60206040518083038186803b158015611d7f57600080fd5b505afa158015611d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db791906127a6565b9050611e0a609e60009054906101000a90046001600160a01b03166001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b158015611b6657600080fd5b6097546098549192509042118015611e2157508115155b15611e86576000611e3d60985442611f5a90919063ffffffff16565b90506000611e56609c5483611ed190919063ffffffff16565b9050611e8184611e71609d5484611ed190919063ffffffff16565b81611e7857fe5b859190046121b3565b925050505b611eb96107de8460010154609d54611eab858860000154611ed190919063ffffffff16565b81611eb257fe5b0490611f14565b95945050505050565b6099546001600160a01b031681565b600082611ee057506000611f0e565b82820282848281611eed57fe5b0414611f0b5760405162461bcd60e51b81526004016103e890612ac3565b90505b92915050565b6000818303818312801590611f295750838113155b80611f3e5750600083128015611f3e57508381135b611f0b5760405162461bcd60e51b81526004016103e890612b39565b600082821115611f7c5760405162461bcd60e51b81526004016103e8906129de565b50900390565b60006060846001600160a01b031663a9059cbb8585604051602401611fa892919061285e565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611fe191906127ed565b6000604051808303816000865af19150503d806000811461201e576040519150601f19603f3d011682016040523d82523d6000602084013e612023565b606091505b509150915081801561204d57508051158061204d57508080602001905181019061204d91906126dc565b6120695760405162461bcd60e51b81526004016103e8906128e9565b5050505050565b3390565b6000808212156120965760405162461bcd60e51b81526004016103e890612877565b5090565b60006120a5306124d8565b15905090565b600054610100900460ff16806120c457506120c461209a565b806120d2575060005460ff16155b6120ee5760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff16158015612119576000805460ff1961ff0019909116610100171660011790555b6121216124de565b61212961255f565b8015611a08576000805461ff001916905550565b600054610100900460ff1680612156575061215661209a565b80612164575060005460ff16155b6121805760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff161580156121ab576000805460ff1961ff0019909116610100171660011790555b612129612639565b600082820183811015611f0b5760405162461bcd60e51b81526004016103e890612966565b60008282018183128015906121ed5750838112155b80612202575060008312801561220257508381125b611f0b5760405162461bcd60e51b81526004016103e89061299d565b60006060856001600160a01b03166323b872dd8686866040516024016122469392919061283a565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161227f91906127ed565b6000604051808303816000865af19150503d80600081146122bc576040519150601f19603f3d011682016040523d82523d6000602084013e6122c1565b606091505b50915091508180156122eb5750805115806122eb5750808060200190518101906122eb91906126dc565b610c6c5760405162461bcd60e51b81526004016103e890612b7d565b61230f611a7f565b5060008060a054118015612324575060a05442105b1561234d5760a0546000906123399042611f5a565b609c549091506123499082611ed1565b9150505b61235782826121b3565b60a18054600090915560a0549193509015801590612376575060a05442115b156123b757600061239260a05442611f5a90919063ffffffff16565b90506123b36123ac82609c54611ed190919063ffffffff16565b83906121b3565b9150505b80831015612429576123c98184611f5a565b60a1556000609c55609f546123df9042906121b3565b60a0556123ea611a7f565b507fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a278609c5460405161241c9190612be9565b60405180910390a16124a1565b6124338382611f5a565b925061244a609f54846124a690919063ffffffff16565b609c55609f5461245b9042906121b3565b60a055612466611a7f565b507fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a278609c546040516124989190612be9565b60405180910390a15b505050565b60008082116124c75760405162461bcd60e51b81526004016103e890612a15565b8183816124d057fe5b049392505050565b3b151590565b600054610100900460ff16806124f757506124f761209a565b80612505575060005460ff16155b6125215760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff16158015612129576000805460ff1961ff0019909116610100171660011790558015611a08576000805461ff001916905550565b600054610100900460ff1680612578575061257861209a565b80612586575060005460ff16155b6125a25760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff161580156125cd576000805460ff1961ff0019909116610100171660011790555b60006125d7612070565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611a08576000805461ff001916905550565b600054610100900460ff1680612652575061265261209a565b80612660575060005460ff16155b61267c5760405162461bcd60e51b81526004016103e890612a75565b600054610100900460ff161580156126a7576000805460ff1961ff0019909116610100171660011790555b60016065558015611a08576000805461ff001916905550565b6000602082840312156126d1578081fd5b8135611f0b81612c45565b6000602082840312156126ed578081fd5b81518015158114611f0b578182fd5b600080600080600060a08688031215612713578081fd5b853561271e81612c45565b9450602086013561272e81612c45565b9350604086013561273e81612c45565b925060608601359150608086013561275581612c45565b809150509295509295909350565b60008060408385031215612775578182fd5b823561278081612c45565b946020939093013593505050565b60006020828403121561279f578081fd5b5035919050565b6000602082840312156127b7578081fd5b5051919050565b600080604083850312156127d0578182fd5b8235915060208301356127e281612c45565b809150509250929050565b60008251815b8181101561280d57602081860181015185830152016127f3565b8181111561281b5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b6020808252602d908201527f576974686472617720616d6f756e74206578636565647320746865206465706f60408201526c39b4ba32b21030b6b7bab73a1760991b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252600f908201526e139bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160a01b0381168114611a0857600080fdfea2646970667358221220ceb2dbf12f8b8836ba21ce4dce438e4fed1dc36effbb63dfdfe6abb92f98b74164736f6c634300060c0033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.