More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,392 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 20593689 | 125 days ago | IN | 0 ETH | 0.00092762 | ||||
Withdraw | 20118318 | 192 days ago | IN | 0 ETH | 0.00382513 | ||||
Withdraw | 20007137 | 207 days ago | IN | 0 ETH | 0.00448839 | ||||
Withdraw | 19989362 | 210 days ago | IN | 0 ETH | 0.00361402 | ||||
Deposit | 19989360 | 210 days ago | IN | 0 ETH | 0.00401255 | ||||
Withdraw | 19983939 | 210 days ago | IN | 0 ETH | 0.00648357 | ||||
Deposit | 19983916 | 210 days ago | IN | 0 ETH | 0.00716237 | ||||
Withdraw | 19838460 | 231 days ago | IN | 0 ETH | 0.00224068 | ||||
Withdraw | 19838449 | 231 days ago | IN | 0 ETH | 0.00235307 | ||||
Withdraw | 19832378 | 232 days ago | IN | 0 ETH | 0.00166338 | ||||
Deposit | 19832378 | 232 days ago | IN | 0 ETH | 0.00145706 | ||||
Withdraw | 19823106 | 233 days ago | IN | 0 ETH | 0.00224398 | ||||
Withdraw | 19776917 | 239 days ago | IN | 0 ETH | 0.00429584 | ||||
Deposit | 19776911 | 239 days ago | IN | 0 ETH | 0.00060091 | ||||
Deposit | 19776819 | 239 days ago | IN | 0 ETH | 0.0043579 | ||||
Withdraw | 19770659 | 240 days ago | IN | 0 ETH | 0.00549929 | ||||
Withdraw | 19734630 | 245 days ago | IN | 0 ETH | 0.00335266 | ||||
Withdraw | 19729349 | 246 days ago | IN | 0 ETH | 0.00441755 | ||||
Withdraw | 19715649 | 248 days ago | IN | 0 ETH | 0.00271612 | ||||
Deposit | 19715613 | 248 days ago | IN | 0 ETH | 0.00245452 | ||||
Withdraw | 19701863 | 250 days ago | IN | 0 ETH | 0.00252354 | ||||
Deposit | 19701675 | 250 days ago | IN | 0 ETH | 0.00252683 | ||||
Withdraw | 19663306 | 255 days ago | IN | 0 ETH | 0.00527755 | ||||
Deposit | 19663299 | 255 days ago | IN | 0 ETH | 0.00575999 | ||||
Withdraw | 19663251 | 255 days ago | IN | 0 ETH | 0.00501444 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SmartChefInitializable
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.0; import "./Interface8/IERC20Metadata.sol"; import "./Lib8/Ownable.sol"; import "./Lib8/SafeERC20.sol"; import "./Lib8/ReentrancyGuard.sol"; contract SmartChefInitializable is Ownable, ReentrancyGuard { using SafeERC20 for IERC20Metadata; // The address of the smart chef factory address public immutable SMART_CHEF_FACTORY; // Whether a limit is set for users bool public userLimit; // Whether it is initialized bool public isInitialized; // Accrued token per share uint256 public accTokenPerShare; // The block number when ZINU mining ends. uint256 public bonusEndBlock; // The block number when ZINU mining starts. uint256 public startBlock; // The block number of the last pool update uint256 public lastRewardBlock; // The pool limit (0 if none) uint256 public poolLimitPerUser; // Block numbers available for user limit (after start block) uint256 public numberBlocksForUserLimit; // ZINU tokens created per block. uint256 public rewardPerBlock; // The precision factor uint256 public PRECISION_FACTOR; // The reward token IERC20Metadata public rewardToken; // The staked token IERC20Metadata public stakedToken; // Info of each user that stakes tokens (stakedToken) mapping(address => UserInfo) public userInfo; // staked amount uint256 public stakedTokenSupply; struct UserInfo { uint256 amount; // How many staked tokens the user has provided uint256 rewardDebt; // Reward debt } event Deposit(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event NewStartAndEndBlocks(uint256 startBlock, uint256 endBlock); event NewRewardPerBlock(uint256 rewardPerBlock); event NewPoolLimit(uint256 poolLimitPerUser); event RewardsStop(uint256 blockNumber); event TokenRecovery(address indexed token, uint256 amount); event Withdraw(address indexed user, uint256 amount); /** * @notice Constructor */ constructor() { SMART_CHEF_FACTORY = msg.sender; } /* * @notice Initialize the contract * @param _stakedToken: staked token address * @param _rewardToken: reward token address * @param _rewardPerBlock: reward per block (in rewardToken) * @param _startBlock: start block * @param _bonusEndBlock: end block * @param _poolLimitPerUser: pool limit per user in stakedToken (if any, else 0) * @param _numberBlocksForUserLimit: block numbers available for user limit (after start block) * @param _admin: admin address with ownership */ function initialize( IERC20Metadata _stakedToken, IERC20Metadata _rewardToken, uint256 _rewardPerBlock, uint256 _startBlock, uint256 _bonusEndBlock, uint256 _poolLimitPerUser, uint256 _numberBlocksForUserLimit, address _admin ) external { require(!isInitialized, "Already initialized"); require(msg.sender == SMART_CHEF_FACTORY, "Not factory"); // Make this contract initialized isInitialized = true; stakedToken = _stakedToken; rewardToken = _rewardToken; rewardPerBlock = _rewardPerBlock; startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; if (_poolLimitPerUser > 0) { userLimit = true; poolLimitPerUser = _poolLimitPerUser; numberBlocksForUserLimit = _numberBlocksForUserLimit; } uint256 decimalsRewardToken = uint256(rewardToken.decimals()); require(decimalsRewardToken < 30, "Must be less than 30"); PRECISION_FACTOR = uint256(10**(uint256(30) - decimalsRewardToken)); // Set the lastRewardBlock as the startBlock lastRewardBlock = startBlock; stakedTokenSupply = 0; // Transfer ownership to the admin address who becomes owner of the contract transferOwnership(_admin); } /* * @notice Deposit staked tokens and collect reward tokens (if any) * @param _amount: amount to withdraw (in rewardToken) */ function deposit(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; userLimit = hasUserLimit(); require(!userLimit || ((_amount + user.amount) <= poolLimitPerUser), "Deposit: Amount above limit"); _updatePool(); if (user.amount > 0) { uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (pending > 0) { rewardToken.safeTransfer(address(msg.sender), pending); } } if (_amount > 0) { uint256 before = stakedToken.balanceOf(address(this)); stakedToken.safeTransferFrom(address(msg.sender), address(this), _amount); _amount = stakedToken.balanceOf(address(this)) - before; user.amount = user.amount + _amount; stakedTokenSupply = stakedTokenSupply + _amount; } user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; emit Deposit(msg.sender, _amount); } /* * @notice Withdraw staked tokens and collect reward tokens * @param _amount: amount to withdraw (in rewardToken) */ function withdraw(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "Amount to withdraw too high"); _updatePool(); uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (_amount > 0) { user.amount = user.amount - _amount; stakedToken.safeTransfer(address(msg.sender), _amount); stakedTokenSupply = stakedTokenSupply - _amount; } if (pending > 0) { rewardToken.safeTransfer(address(msg.sender), pending); } user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; emit Withdraw(msg.sender, _amount); } /* * @notice Withdraw staked tokens without caring about rewards rewards * @dev Needs to be for emergency. */ function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 amountToTransfer = user.amount; user.amount = 0; user.rewardDebt = 0; if (amountToTransfer > 0) { stakedToken.safeTransfer(address(msg.sender), amountToTransfer); stakedTokenSupply = stakedTokenSupply - amountToTransfer; } emit EmergencyWithdraw(msg.sender, user.amount); } /* * @notice Stop rewards * @dev Only callable by owner. Needs to be for emergency. */ function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { rewardToken.safeTransfer(address(msg.sender), _amount); } /** * @notice Allows the owner to recover tokens sent to the contract by mistake * @param _token: token address * @dev Callable by owner */ function recoverToken(address _token) external onlyOwner { require(_token != address(stakedToken), "Operations: Cannot recover staked token"); require(_token != address(rewardToken), "Operations: Cannot recover reward token"); uint256 balance = IERC20Metadata(_token).balanceOf(address(this)); require(balance != 0, "Operations: Cannot recover zero balance"); IERC20Metadata(_token).safeTransfer(address(msg.sender), balance); emit TokenRecovery(_token, balance); } /* * @notice Stop rewards * @dev Only callable by owner */ function stopReward() external onlyOwner { bonusEndBlock = block.number; } /* * @notice Update pool limit per user * @dev Only callable by owner. * @param _userLimit: whether the limit remains forced * @param _poolLimitPerUser: new pool limit per user */ function updatePoolLimitPerUser(bool _userLimit, uint256 _poolLimitPerUser) external onlyOwner { require(userLimit, "Must be set"); if (_userLimit) { require(_poolLimitPerUser > poolLimitPerUser, "New limit must be higher"); poolLimitPerUser = _poolLimitPerUser; } else { userLimit = _userLimit; poolLimitPerUser = 0; } emit NewPoolLimit(poolLimitPerUser); } /* * @notice Update reward per block * @dev Only callable by owner. * @param _rewardPerBlock: the reward per block */ function updateRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { require(block.number < startBlock, "Pool has started"); rewardPerBlock = _rewardPerBlock; emit NewRewardPerBlock(_rewardPerBlock); } /** * @notice It allows the admin to update start and end blocks * @dev This function is only callable by owner. * @param _startBlock: the new start block * @param _bonusEndBlock: the new end block */ function updateStartAndEndBlocks(uint256 _startBlock, uint256 _bonusEndBlock) external onlyOwner { require(block.number < startBlock, "Pool has started"); require(_startBlock < _bonusEndBlock, "New startBlock must be lower than new endBlock"); require(block.number < _startBlock, "New startBlock must be higher than current block"); startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; // Set the lastRewardBlock as the startBlock lastRewardBlock = startBlock; emit NewStartAndEndBlocks(_startBlock, _bonusEndBlock); } /* * @notice View function to see pending reward on frontend. * @param _user: user address * @return Pending reward for a given user */ function pendingReward(address _user) external view returns (uint256) { UserInfo storage user = userInfo[_user]; if (block.number > lastRewardBlock && stakedTokenSupply != 0) { uint256 multiplier = _getMultiplier(lastRewardBlock, block.number); uint256 zinuReward = multiplier * rewardPerBlock; uint256 adjustedTokenPerShare = accTokenPerShare + (zinuReward * PRECISION_FACTOR) / stakedTokenSupply; return (user.amount * adjustedTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; } else { return (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; } } /* * @notice Update reward variables of the given pool to be up-to-date. */ function _updatePool() internal { if (block.number <= lastRewardBlock) { return; } if (stakedTokenSupply == 0) { lastRewardBlock = block.number; return; } uint256 multiplier = _getMultiplier(lastRewardBlock, block.number); uint256 zinuReward = multiplier * rewardPerBlock; accTokenPerShare = accTokenPerShare + (zinuReward * PRECISION_FACTOR) / stakedTokenSupply; lastRewardBlock = block.number; } /* * @notice Return reward multiplier over the given _from to _to block. * @param _from: block to start * @param _to: block to finish */ function _getMultiplier(uint256 _from, uint256 _to) internal view returns (uint256) { if (_to <= bonusEndBlock) { return _to - _from; } else if (_from >= bonusEndBlock) { return 0; } else { return bonusEndBlock - _from; } } /* * @notice Return user limit is set or zero. */ function hasUserLimit() public view returns (bool) { if (!userLimit || (block.number >= (startBlock + numberBlocksForUserLimit))) { return false; } return true; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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"); (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"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 ReentrancyGuard { // 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; constructor() { _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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../Interface8/IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
{ "optimizer": { "enabled": false, "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"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolLimitPerUser","type":"uint256"}],"name":"NewPoolLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"NewRewardPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewStartAndEndBlocks","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":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"RewardsStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SMART_CHEF_FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasUserLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"_stakedToken","type":"address"},{"internalType":"contract IERC20Metadata","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"},{"internalType":"uint256","name":"_numberBlocksForUserLimit","type":"uint256"},{"internalType":"address","name":"_admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberBlocksForUserLimit","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":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedToken","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_userLimit","type":"bool"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"}],"name":"updatePoolLimitPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"name":"updateStartAndEndBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5062000032620000266200007660201b60201c565b6200007e60201b60201c565b600180819055503373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505062000142565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60805160601c6133d262000168600039600081816106b7015261188a01526133d26000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638f66291511610104578063b6b55f25116100a2578063db2e21bc11610071578063db2e21bc146104c6578063f2fde38b146104d0578063f40f0f52146104ec578063f7c618c11461051c576101da565b8063b6b55f2514610450578063bd6171911461046c578063cc7a262e1461048a578063ccd34cd5146104a8576101da565b80639513997f116100de5780639513997f146103de5780639be65a60146103fa578063a0b4090514610416578063a9f8d18114610432576101da565b80638f66291514610384578063921979af146103a257806392e8990e146103c0576101da565b806348cd4cb11161017c57806380dc06721161014b57806380dc0672146103205780638ad1071b1461032a5780638ae39cac146103485780638da5cb5b14610366576101da565b806348cd4cb1146102bc5780634a7c01ec146102da57806366fe9f8a146102f8578063715018a614610316576101da565b80632aa2c381116101b85780632aa2c3811461024a5780632e1a7d4d146102665780633279beab14610282578063392e53cd1461029e576101da565b806301f8a976146101df5780631959a002146101fb5780631aed65531461022c575b600080fd5b6101f960048036038101906101f49190612378565b61053a565b005b61021560048036038101906102109190612238565b61063b565b604051610223929190612ad3565b60405180910390f35b61023461065f565b6040516102419190612ab8565b60405180910390f35b610264600480360381019061025f91906122c6565b610665565b005b610280600480360381019061027b9190612378565b610956565b005b61029c60048036038101906102979190612378565b610bc3565b005b6102a6610c8f565b6040516102b39190612800565b60405180910390f35b6102c4610ca2565b6040516102d19190612ab8565b60405180910390f35b6102e2610ca8565b6040516102ef9190612800565b60405180910390f35b610300610cbb565b60405161030d9190612ab8565b60405180910390f35b61031e610cc1565b005b610328610d49565b005b610332610dce565b60405161033f9190612ab8565b60405180910390f35b610350610dd4565b60405161035d9190612ab8565b60405180910390f35b61036e610dda565b60405161037b9190612785565b60405180910390f35b61038c610e03565b6040516103999190612ab8565b60405180910390f35b6103aa610e09565b6040516103b79190612ab8565b60405180910390f35b6103c8610e0f565b6040516103d59190612800565b60405180910390f35b6103f860048036038101906103f391906123ca565b610e52565b005b610414600480360381019061040f9190612238565b610fea565b005b610430600480360381019061042b919061228a565b6112d6565b005b61043a611457565b6040516104479190612ab8565b60405180910390f35b61046a60048036038101906104659190612378565b61145d565b005b610474611888565b6040516104819190612785565b60405180910390f35b6104926118ac565b60405161049f919061281b565b60405180910390f35b6104b06118d2565b6040516104bd9190612ab8565b60405180910390f35b6104ce6118d8565b005b6104ea60048036038101906104e59190612238565b611a4e565b005b61050660048036038101906105019190612238565b611b46565b6040516105139190612ab8565b60405180910390f35b610524611c5f565b604051610531919061281b565b60405180910390f35b610542611c85565b73ffffffffffffffffffffffffffffffffffffffff16610560610dda565b73ffffffffffffffffffffffffffffffffffffffff16146105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad90612938565b60405180910390fd5b60055443106105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f1906128b8565b60405180910390fd5b806009819055507f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df816040516106309190612ab8565b60405180910390a150565b600d6020528060005260406000206000915090508060000154908060010154905082565b60045481565b600260019054906101000a900460ff16156106b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ac906129f8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073a90612a98565b60405180910390fd5b6001600260016101000a81548160ff02191690831515021790555087600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560098190555084600581905550836004819055506000831115610828576001600260006101000a81548160ff02191690831515021790555082600781905550816008819055505b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561089257600080fd5b505afa1580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190612406565b60ff169050601e8110610912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090990612a38565b60405180910390fd5b80601e61091f9190612d80565b600a61092b9190612c08565b600a819055506005546006819055506000600e8190555061094b82611a4e565b505050505050505050565b6002600154141561099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390612a78565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508181600001541015610a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a25906129b8565b60405180910390fd5b610a36611c8d565b60008160010154600a546003548460000154610a529190612d26565b610a5c9190612b84565b610a669190612d80565b90506000831115610aeb57828260000154610a819190612d80565b8260000181905550610ad63384600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b82600e54610ae49190612d80565b600e819055505b6000811115610b4257610b413382600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b5b600a546003548360000154610b579190612d26565b610b619190612b84565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436484604051610baf9190612ab8565b60405180910390a250506001808190555050565b610bcb611c85565b73ffffffffffffffffffffffffffffffffffffffff16610be9610dda565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612938565b60405180910390fd5b610c8c3382600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b50565b600260019054906101000a900460ff1681565b60055481565b600260009054906101000a900460ff1681565b60075481565b610cc9611c85565b73ffffffffffffffffffffffffffffffffffffffff16610ce7610dda565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3490612938565b60405180910390fd5b610d476000611d94565b565b610d51611c85565b73ffffffffffffffffffffffffffffffffffffffff16610d6f610dda565b73ffffffffffffffffffffffffffffffffffffffff1614610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90612938565b60405180910390fd5b43600481905550565b60085481565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b600e5481565b6000600260009054906101000a900460ff161580610e3c5750600854600554610e389190612b2e565b4310155b15610e4a5760009050610e4f565b600190505b90565b610e5a611c85565b73ffffffffffffffffffffffffffffffffffffffff16610e78610dda565b73ffffffffffffffffffffffffffffffffffffffff1614610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590612938565b60405180910390fd5b6005544310610f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f09906128b8565b60405180910390fd5b808210610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b906128d8565b60405180910390fd5b814310610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90612918565b60405180910390fd5b81600581905550806004819055506005546006819055507f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce068282604051610fde929190612ad3565b60405180910390a15050565b610ff2611c85565b73ffffffffffffffffffffffffffffffffffffffff16611010610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612938565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee90612a18565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90612998565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111c39190612785565b60206040518083038186803b1580156111db57600080fd5b505afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121391906123a1565b90506000811415611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090612858565b60405180910390fd5b61128433828473ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e98826040516112ca9190612ab8565b60405180910390a25050565b6112de611c85565b73ffffffffffffffffffffffffffffffffffffffff166112fc610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990612938565b60405180910390fd5b600260009054906101000a900460ff166113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890612958565b60405180910390fd5b81156113f75760075481116113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e290612978565b60405180910390fd5b8060078190555061141a565b81600260006101000a81548160ff02191690831515021790555060006007819055505b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c60075460405161144b9190612ab8565b60405180910390a15050565b60065481565b600260015414156114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90612a78565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506114f6610e0f565b600260006101000a81548160ff021916908315150217905550600260009054906101000a900460ff16158061153c57506007548160000154836115399190612b2e565b11155b61157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290612878565b60405180910390fd5b611583611c8d565b60008160000154111561161b5760008160010154600a5460035484600001546115ac9190612d26565b6115b69190612b84565b6115c09190612d80565b90506000811115611619576116183382600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b5b505b6000821115611808576000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116819190612785565b60206040518083038186803b15801561169957600080fd5b505afa1580156116ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d191906123a1565b9050611722333085600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e58909392919063ffffffff16565b80600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161177e9190612785565b60206040518083038186803b15801561179657600080fd5b505afa1580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ce91906123a1565b6117d89190612d80565b92508282600001546117ea9190612b2e565b826000018190555082600e546118009190612b2e565b600e81905550505b600a54600354826000015461181d9190612d26565b6118279190612b84565b81600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c836040516118759190612ab8565b60405180910390a2506001808190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6002600154141561191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590612a78565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826001018190555060008111156119f1576119dc3382600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b80600e546119ea9190612d80565b600e819055505b3373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96958360000154604051611a3b9190612ab8565b60405180910390a2505060018081905550565b611a56611c85565b73ffffffffffffffffffffffffffffffffffffffff16611a74610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac190612938565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3190612898565b60405180910390fd5b611b4381611d94565b50565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060065443118015611b9e57506000600e5414155b15611c28576000611bb160065443611ee1565b9050600060095482611bc39190612d26565b90506000600e54600a5483611bd89190612d26565b611be29190612b84565b600354611bef9190612b2e565b90508360010154600a54828660000154611c099190612d26565b611c139190612b84565b611c1d9190612d80565b945050505050611c5a565b8060010154600a546003548360000154611c429190612d26565b611c4c9190612b84565b611c569190612d80565b9150505b919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b6006544311611c9b57611d0c565b6000600e541415611cb25743600681905550611d0c565b6000611cc060065443611ee1565b9050600060095482611cd29190612d26565b9050600e54600a5482611ce59190612d26565b611cef9190612b84565b600354611cfc9190612b2e565b6003819055504360068190555050505b565b611d8f8363a9059cbb60e01b8484604051602401611d2d9291906127d7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f28565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611edb846323b872dd60e01b858585604051602401611e79939291906127a0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f28565b50505050565b60006004548211611eff578282611ef89190612d80565b9050611f22565b6004548310611f115760009050611f22565b82600454611f1f9190612d80565b90505b92915050565b6000611f8a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611fef9092919063ffffffff16565b9050600081511115611fea5780806020019051810190611faa9190612261565b611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090612a58565b60405180910390fd5b5b505050565b6060611ffe8484600085612007565b90509392505050565b60608247101561204c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612043906128f8565b60405180910390fd5b6120558561211b565b612094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208b906129d8565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516120bd919061276e565b60006040518083038185875af1925050503d80600081146120fa576040519150601f19603f3d011682016040523d82523d6000602084013e6120ff565b606091505b509150915061210f82828661213e565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561214e5782905061219e565b6000835111156121615782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121959190612836565b60405180910390fd5b9392505050565b6000813590506121b481613329565b92915050565b6000813590506121c981613340565b92915050565b6000815190506121de81613340565b92915050565b6000813590506121f381613357565b92915050565b6000813590506122088161336e565b92915050565b60008151905061221d8161336e565b92915050565b60008151905061223281613385565b92915050565b60006020828403121561224a57600080fd5b6000612258848285016121a5565b91505092915050565b60006020828403121561227357600080fd5b6000612281848285016121cf565b91505092915050565b6000806040838503121561229d57600080fd5b60006122ab858286016121ba565b92505060206122bc858286016121f9565b9150509250929050565b600080600080600080600080610100898b0312156122e357600080fd5b60006122f18b828c016121e4565b98505060206123028b828c016121e4565b97505060406123138b828c016121f9565b96505060606123248b828c016121f9565b95505060806123358b828c016121f9565b94505060a06123468b828c016121f9565b93505060c06123578b828c016121f9565b92505060e06123688b828c016121a5565b9150509295985092959890939650565b60006020828403121561238a57600080fd5b6000612398848285016121f9565b91505092915050565b6000602082840312156123b357600080fd5b60006123c18482850161220e565b91505092915050565b600080604083850312156123dd57600080fd5b60006123eb858286016121f9565b92505060206123fc858286016121f9565b9150509250929050565b60006020828403121561241857600080fd5b600061242684828501612223565b91505092915050565b61243881612db4565b82525050565b61244781612dc6565b82525050565b600061245882612afc565b6124628185612b12565b9350612472818560208601612e3f565b80840191505092915050565b61248781612e1b565b82525050565b600061249882612b07565b6124a28185612b1d565b93506124b2818560208601612e3f565b6124bb81612ed0565b840191505092915050565b60006124d3602783612b1d565b91506124de82612eee565b604082019050919050565b60006124f6601b83612b1d565b915061250182612f3d565b602082019050919050565b6000612519602683612b1d565b915061252482612f66565b604082019050919050565b600061253c601083612b1d565b915061254782612fb5565b602082019050919050565b600061255f602e83612b1d565b915061256a82612fde565b604082019050919050565b6000612582602683612b1d565b915061258d8261302d565b604082019050919050565b60006125a5603083612b1d565b91506125b08261307c565b604082019050919050565b60006125c8602083612b1d565b91506125d3826130cb565b602082019050919050565b60006125eb600b83612b1d565b91506125f6826130f4565b602082019050919050565b600061260e601883612b1d565b91506126198261311d565b602082019050919050565b6000612631602783612b1d565b915061263c82613146565b604082019050919050565b6000612654601b83612b1d565b915061265f82613195565b602082019050919050565b6000612677601d83612b1d565b9150612682826131be565b602082019050919050565b600061269a601383612b1d565b91506126a5826131e7565b602082019050919050565b60006126bd602783612b1d565b91506126c882613210565b604082019050919050565b60006126e0601483612b1d565b91506126eb8261325f565b602082019050919050565b6000612703602a83612b1d565b915061270e82613288565b604082019050919050565b6000612726601f83612b1d565b9150612731826132d7565b602082019050919050565b6000612749600b83612b1d565b915061275482613300565b602082019050919050565b61276881612e04565b82525050565b600061277a828461244d565b915081905092915050565b600060208201905061279a600083018461242f565b92915050565b60006060820190506127b5600083018661242f565b6127c2602083018561242f565b6127cf604083018461275f565b949350505050565b60006040820190506127ec600083018561242f565b6127f9602083018461275f565b9392505050565b6000602082019050612815600083018461243e565b92915050565b6000602082019050612830600083018461247e565b92915050565b60006020820190508181036000830152612850818461248d565b905092915050565b60006020820190508181036000830152612871816124c6565b9050919050565b60006020820190508181036000830152612891816124e9565b9050919050565b600060208201905081810360008301526128b18161250c565b9050919050565b600060208201905081810360008301526128d18161252f565b9050919050565b600060208201905081810360008301526128f181612552565b9050919050565b6000602082019050818103600083015261291181612575565b9050919050565b6000602082019050818103600083015261293181612598565b9050919050565b60006020820190508181036000830152612951816125bb565b9050919050565b60006020820190508181036000830152612971816125de565b9050919050565b6000602082019050818103600083015261299181612601565b9050919050565b600060208201905081810360008301526129b181612624565b9050919050565b600060208201905081810360008301526129d181612647565b9050919050565b600060208201905081810360008301526129f18161266a565b9050919050565b60006020820190508181036000830152612a118161268d565b9050919050565b60006020820190508181036000830152612a31816126b0565b9050919050565b60006020820190508181036000830152612a51816126d3565b9050919050565b60006020820190508181036000830152612a71816126f6565b9050919050565b60006020820190508181036000830152612a9181612719565b9050919050565b60006020820190508181036000830152612ab18161273c565b9050919050565b6000602082019050612acd600083018461275f565b92915050565b6000604082019050612ae8600083018561275f565b612af5602083018461275f565b9392505050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000612b3982612e04565b9150612b4483612e04565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b7957612b78612e72565b5b828201905092915050565b6000612b8f82612e04565b9150612b9a83612e04565b925082612baa57612ba9612ea1565b5b828204905092915050565b6000808291508390505b6001851115612bff57808604811115612bdb57612bda612e72565b5b6001851615612bea5780820291505b8081029050612bf885612ee1565b9450612bbf565b94509492505050565b6000612c1382612e04565b9150612c1e83612e04565b9250612c4b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612c53565b905092915050565b600082612c635760019050612d1f565b81612c715760009050612d1f565b8160018114612c875760028114612c9157612cc0565b6001915050612d1f565b60ff841115612ca357612ca2612e72565b5b8360020a915084821115612cba57612cb9612e72565b5b50612d1f565b5060208310610133831016604e8410600b8410161715612cf55782820a905083811115612cf057612cef612e72565b5b612d1f565b612d028484846001612bb5565b92509050818404811115612d1957612d18612e72565b5b81810290505b9392505050565b6000612d3182612e04565b9150612d3c83612e04565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d7557612d74612e72565b5b828202905092915050565b6000612d8b82612e04565b9150612d9683612e04565b925082821015612da957612da8612e72565b5b828203905092915050565b6000612dbf82612de4565b9050919050565b60008115159050919050565b6000612ddd82612db4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612e2682612e2d565b9050919050565b6000612e3882612de4565b9050919050565b60005b83811015612e5d578082015181840152602081019050612e42565b83811115612e6c576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b7f4465706f7369743a20416d6f756e742061626f7665206c696d69740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f506f6f6c20686173207374617274656400000000000000000000000000000000600082015250565b7f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160008201527f6e206e657720656e64426c6f636b000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4e6577207374617274426c6f636b206d7573742062652068696768657220746860008201527f616e2063757272656e7420626c6f636b00000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d75737420626520736574000000000000000000000000000000000000000000600082015250565b7f4e6577206c696d6974206d757374206265206869676865720000000000000000600082015250565b7f4f7065726174696f6e733a2043616e6e6f74207265636f76657220726577617260008201527f6420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e7420746f20776974686472617720746f6f20686967680000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b7f4f7065726174696f6e733a2043616e6e6f74207265636f766572207374616b6560008201527f6420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b7f4d757374206265206c657373207468616e203330000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e6f7420666163746f7279000000000000000000000000000000000000000000600082015250565b61333281612db4565b811461333d57600080fd5b50565b61334981612dc6565b811461335457600080fd5b50565b61336081612dd2565b811461336b57600080fd5b50565b61337781612e04565b811461338257600080fd5b50565b61338e81612e0e565b811461339957600080fd5b5056fea264697066735822122015b5bee147f981caf144eb89c3e3a9da00966332cdedf842b5e414210fd8861264736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80638f66291511610104578063b6b55f25116100a2578063db2e21bc11610071578063db2e21bc146104c6578063f2fde38b146104d0578063f40f0f52146104ec578063f7c618c11461051c576101da565b8063b6b55f2514610450578063bd6171911461046c578063cc7a262e1461048a578063ccd34cd5146104a8576101da565b80639513997f116100de5780639513997f146103de5780639be65a60146103fa578063a0b4090514610416578063a9f8d18114610432576101da565b80638f66291514610384578063921979af146103a257806392e8990e146103c0576101da565b806348cd4cb11161017c57806380dc06721161014b57806380dc0672146103205780638ad1071b1461032a5780638ae39cac146103485780638da5cb5b14610366576101da565b806348cd4cb1146102bc5780634a7c01ec146102da57806366fe9f8a146102f8578063715018a614610316576101da565b80632aa2c381116101b85780632aa2c3811461024a5780632e1a7d4d146102665780633279beab14610282578063392e53cd1461029e576101da565b806301f8a976146101df5780631959a002146101fb5780631aed65531461022c575b600080fd5b6101f960048036038101906101f49190612378565b61053a565b005b61021560048036038101906102109190612238565b61063b565b604051610223929190612ad3565b60405180910390f35b61023461065f565b6040516102419190612ab8565b60405180910390f35b610264600480360381019061025f91906122c6565b610665565b005b610280600480360381019061027b9190612378565b610956565b005b61029c60048036038101906102979190612378565b610bc3565b005b6102a6610c8f565b6040516102b39190612800565b60405180910390f35b6102c4610ca2565b6040516102d19190612ab8565b60405180910390f35b6102e2610ca8565b6040516102ef9190612800565b60405180910390f35b610300610cbb565b60405161030d9190612ab8565b60405180910390f35b61031e610cc1565b005b610328610d49565b005b610332610dce565b60405161033f9190612ab8565b60405180910390f35b610350610dd4565b60405161035d9190612ab8565b60405180910390f35b61036e610dda565b60405161037b9190612785565b60405180910390f35b61038c610e03565b6040516103999190612ab8565b60405180910390f35b6103aa610e09565b6040516103b79190612ab8565b60405180910390f35b6103c8610e0f565b6040516103d59190612800565b60405180910390f35b6103f860048036038101906103f391906123ca565b610e52565b005b610414600480360381019061040f9190612238565b610fea565b005b610430600480360381019061042b919061228a565b6112d6565b005b61043a611457565b6040516104479190612ab8565b60405180910390f35b61046a60048036038101906104659190612378565b61145d565b005b610474611888565b6040516104819190612785565b60405180910390f35b6104926118ac565b60405161049f919061281b565b60405180910390f35b6104b06118d2565b6040516104bd9190612ab8565b60405180910390f35b6104ce6118d8565b005b6104ea60048036038101906104e59190612238565b611a4e565b005b61050660048036038101906105019190612238565b611b46565b6040516105139190612ab8565b60405180910390f35b610524611c5f565b604051610531919061281b565b60405180910390f35b610542611c85565b73ffffffffffffffffffffffffffffffffffffffff16610560610dda565b73ffffffffffffffffffffffffffffffffffffffff16146105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad90612938565b60405180910390fd5b60055443106105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f1906128b8565b60405180910390fd5b806009819055507f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df816040516106309190612ab8565b60405180910390a150565b600d6020528060005260406000206000915090508060000154908060010154905082565b60045481565b600260019054906101000a900460ff16156106b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ac906129f8565b60405180910390fd5b7f000000000000000000000000c3d2cdd8b2d859fb31bcfa4cb30002487cebebc373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073a90612a98565b60405180910390fd5b6001600260016101000a81548160ff02191690831515021790555087600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560098190555084600581905550836004819055506000831115610828576001600260006101000a81548160ff02191690831515021790555082600781905550816008819055505b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561089257600080fd5b505afa1580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190612406565b60ff169050601e8110610912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090990612a38565b60405180910390fd5b80601e61091f9190612d80565b600a61092b9190612c08565b600a819055506005546006819055506000600e8190555061094b82611a4e565b505050505050505050565b6002600154141561099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390612a78565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508181600001541015610a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a25906129b8565b60405180910390fd5b610a36611c8d565b60008160010154600a546003548460000154610a529190612d26565b610a5c9190612b84565b610a669190612d80565b90506000831115610aeb57828260000154610a819190612d80565b8260000181905550610ad63384600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b82600e54610ae49190612d80565b600e819055505b6000811115610b4257610b413382600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b5b600a546003548360000154610b579190612d26565b610b619190612b84565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436484604051610baf9190612ab8565b60405180910390a250506001808190555050565b610bcb611c85565b73ffffffffffffffffffffffffffffffffffffffff16610be9610dda565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612938565b60405180910390fd5b610c8c3382600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b50565b600260019054906101000a900460ff1681565b60055481565b600260009054906101000a900460ff1681565b60075481565b610cc9611c85565b73ffffffffffffffffffffffffffffffffffffffff16610ce7610dda565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3490612938565b60405180910390fd5b610d476000611d94565b565b610d51611c85565b73ffffffffffffffffffffffffffffffffffffffff16610d6f610dda565b73ffffffffffffffffffffffffffffffffffffffff1614610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90612938565b60405180910390fd5b43600481905550565b60085481565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b600e5481565b6000600260009054906101000a900460ff161580610e3c5750600854600554610e389190612b2e565b4310155b15610e4a5760009050610e4f565b600190505b90565b610e5a611c85565b73ffffffffffffffffffffffffffffffffffffffff16610e78610dda565b73ffffffffffffffffffffffffffffffffffffffff1614610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590612938565b60405180910390fd5b6005544310610f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f09906128b8565b60405180910390fd5b808210610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b906128d8565b60405180910390fd5b814310610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90612918565b60405180910390fd5b81600581905550806004819055506005546006819055507f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce068282604051610fde929190612ad3565b60405180910390a15050565b610ff2611c85565b73ffffffffffffffffffffffffffffffffffffffff16611010610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612938565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee90612a18565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90612998565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111c39190612785565b60206040518083038186803b1580156111db57600080fd5b505afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121391906123a1565b90506000811415611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090612858565b60405180910390fd5b61128433828473ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e98826040516112ca9190612ab8565b60405180910390a25050565b6112de611c85565b73ffffffffffffffffffffffffffffffffffffffff166112fc610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990612938565b60405180910390fd5b600260009054906101000a900460ff166113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890612958565b60405180910390fd5b81156113f75760075481116113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e290612978565b60405180910390fd5b8060078190555061141a565b81600260006101000a81548160ff02191690831515021790555060006007819055505b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c60075460405161144b9190612ab8565b60405180910390a15050565b60065481565b600260015414156114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90612a78565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506114f6610e0f565b600260006101000a81548160ff021916908315150217905550600260009054906101000a900460ff16158061153c57506007548160000154836115399190612b2e565b11155b61157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290612878565b60405180910390fd5b611583611c8d565b60008160000154111561161b5760008160010154600a5460035484600001546115ac9190612d26565b6115b69190612b84565b6115c09190612d80565b90506000811115611619576116183382600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b5b505b6000821115611808576000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116819190612785565b60206040518083038186803b15801561169957600080fd5b505afa1580156116ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d191906123a1565b9050611722333085600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e58909392919063ffffffff16565b80600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161177e9190612785565b60206040518083038186803b15801561179657600080fd5b505afa1580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ce91906123a1565b6117d89190612d80565b92508282600001546117ea9190612b2e565b826000018190555082600e546118009190612b2e565b600e81905550505b600a54600354826000015461181d9190612d26565b6118279190612b84565b81600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c836040516118759190612ab8565b60405180910390a2506001808190555050565b7f000000000000000000000000c3d2cdd8b2d859fb31bcfa4cb30002487cebebc381565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6002600154141561191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590612a78565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826001018190555060008111156119f1576119dc3382600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d0e9092919063ffffffff16565b80600e546119ea9190612d80565b600e819055505b3373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96958360000154604051611a3b9190612ab8565b60405180910390a2505060018081905550565b611a56611c85565b73ffffffffffffffffffffffffffffffffffffffff16611a74610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac190612938565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3190612898565b60405180910390fd5b611b4381611d94565b50565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060065443118015611b9e57506000600e5414155b15611c28576000611bb160065443611ee1565b9050600060095482611bc39190612d26565b90506000600e54600a5483611bd89190612d26565b611be29190612b84565b600354611bef9190612b2e565b90508360010154600a54828660000154611c099190612d26565b611c139190612b84565b611c1d9190612d80565b945050505050611c5a565b8060010154600a546003548360000154611c429190612d26565b611c4c9190612b84565b611c569190612d80565b9150505b919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b6006544311611c9b57611d0c565b6000600e541415611cb25743600681905550611d0c565b6000611cc060065443611ee1565b9050600060095482611cd29190612d26565b9050600e54600a5482611ce59190612d26565b611cef9190612b84565b600354611cfc9190612b2e565b6003819055504360068190555050505b565b611d8f8363a9059cbb60e01b8484604051602401611d2d9291906127d7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f28565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611edb846323b872dd60e01b858585604051602401611e79939291906127a0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f28565b50505050565b60006004548211611eff578282611ef89190612d80565b9050611f22565b6004548310611f115760009050611f22565b82600454611f1f9190612d80565b90505b92915050565b6000611f8a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611fef9092919063ffffffff16565b9050600081511115611fea5780806020019051810190611faa9190612261565b611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090612a58565b60405180910390fd5b5b505050565b6060611ffe8484600085612007565b90509392505050565b60608247101561204c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612043906128f8565b60405180910390fd5b6120558561211b565b612094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208b906129d8565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516120bd919061276e565b60006040518083038185875af1925050503d80600081146120fa576040519150601f19603f3d011682016040523d82523d6000602084013e6120ff565b606091505b509150915061210f82828661213e565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561214e5782905061219e565b6000835111156121615782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121959190612836565b60405180910390fd5b9392505050565b6000813590506121b481613329565b92915050565b6000813590506121c981613340565b92915050565b6000815190506121de81613340565b92915050565b6000813590506121f381613357565b92915050565b6000813590506122088161336e565b92915050565b60008151905061221d8161336e565b92915050565b60008151905061223281613385565b92915050565b60006020828403121561224a57600080fd5b6000612258848285016121a5565b91505092915050565b60006020828403121561227357600080fd5b6000612281848285016121cf565b91505092915050565b6000806040838503121561229d57600080fd5b60006122ab858286016121ba565b92505060206122bc858286016121f9565b9150509250929050565b600080600080600080600080610100898b0312156122e357600080fd5b60006122f18b828c016121e4565b98505060206123028b828c016121e4565b97505060406123138b828c016121f9565b96505060606123248b828c016121f9565b95505060806123358b828c016121f9565b94505060a06123468b828c016121f9565b93505060c06123578b828c016121f9565b92505060e06123688b828c016121a5565b9150509295985092959890939650565b60006020828403121561238a57600080fd5b6000612398848285016121f9565b91505092915050565b6000602082840312156123b357600080fd5b60006123c18482850161220e565b91505092915050565b600080604083850312156123dd57600080fd5b60006123eb858286016121f9565b92505060206123fc858286016121f9565b9150509250929050565b60006020828403121561241857600080fd5b600061242684828501612223565b91505092915050565b61243881612db4565b82525050565b61244781612dc6565b82525050565b600061245882612afc565b6124628185612b12565b9350612472818560208601612e3f565b80840191505092915050565b61248781612e1b565b82525050565b600061249882612b07565b6124a28185612b1d565b93506124b2818560208601612e3f565b6124bb81612ed0565b840191505092915050565b60006124d3602783612b1d565b91506124de82612eee565b604082019050919050565b60006124f6601b83612b1d565b915061250182612f3d565b602082019050919050565b6000612519602683612b1d565b915061252482612f66565b604082019050919050565b600061253c601083612b1d565b915061254782612fb5565b602082019050919050565b600061255f602e83612b1d565b915061256a82612fde565b604082019050919050565b6000612582602683612b1d565b915061258d8261302d565b604082019050919050565b60006125a5603083612b1d565b91506125b08261307c565b604082019050919050565b60006125c8602083612b1d565b91506125d3826130cb565b602082019050919050565b60006125eb600b83612b1d565b91506125f6826130f4565b602082019050919050565b600061260e601883612b1d565b91506126198261311d565b602082019050919050565b6000612631602783612b1d565b915061263c82613146565b604082019050919050565b6000612654601b83612b1d565b915061265f82613195565b602082019050919050565b6000612677601d83612b1d565b9150612682826131be565b602082019050919050565b600061269a601383612b1d565b91506126a5826131e7565b602082019050919050565b60006126bd602783612b1d565b91506126c882613210565b604082019050919050565b60006126e0601483612b1d565b91506126eb8261325f565b602082019050919050565b6000612703602a83612b1d565b915061270e82613288565b604082019050919050565b6000612726601f83612b1d565b9150612731826132d7565b602082019050919050565b6000612749600b83612b1d565b915061275482613300565b602082019050919050565b61276881612e04565b82525050565b600061277a828461244d565b915081905092915050565b600060208201905061279a600083018461242f565b92915050565b60006060820190506127b5600083018661242f565b6127c2602083018561242f565b6127cf604083018461275f565b949350505050565b60006040820190506127ec600083018561242f565b6127f9602083018461275f565b9392505050565b6000602082019050612815600083018461243e565b92915050565b6000602082019050612830600083018461247e565b92915050565b60006020820190508181036000830152612850818461248d565b905092915050565b60006020820190508181036000830152612871816124c6565b9050919050565b60006020820190508181036000830152612891816124e9565b9050919050565b600060208201905081810360008301526128b18161250c565b9050919050565b600060208201905081810360008301526128d18161252f565b9050919050565b600060208201905081810360008301526128f181612552565b9050919050565b6000602082019050818103600083015261291181612575565b9050919050565b6000602082019050818103600083015261293181612598565b9050919050565b60006020820190508181036000830152612951816125bb565b9050919050565b60006020820190508181036000830152612971816125de565b9050919050565b6000602082019050818103600083015261299181612601565b9050919050565b600060208201905081810360008301526129b181612624565b9050919050565b600060208201905081810360008301526129d181612647565b9050919050565b600060208201905081810360008301526129f18161266a565b9050919050565b60006020820190508181036000830152612a118161268d565b9050919050565b60006020820190508181036000830152612a31816126b0565b9050919050565b60006020820190508181036000830152612a51816126d3565b9050919050565b60006020820190508181036000830152612a71816126f6565b9050919050565b60006020820190508181036000830152612a9181612719565b9050919050565b60006020820190508181036000830152612ab18161273c565b9050919050565b6000602082019050612acd600083018461275f565b92915050565b6000604082019050612ae8600083018561275f565b612af5602083018461275f565b9392505050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000612b3982612e04565b9150612b4483612e04565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b7957612b78612e72565b5b828201905092915050565b6000612b8f82612e04565b9150612b9a83612e04565b925082612baa57612ba9612ea1565b5b828204905092915050565b6000808291508390505b6001851115612bff57808604811115612bdb57612bda612e72565b5b6001851615612bea5780820291505b8081029050612bf885612ee1565b9450612bbf565b94509492505050565b6000612c1382612e04565b9150612c1e83612e04565b9250612c4b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612c53565b905092915050565b600082612c635760019050612d1f565b81612c715760009050612d1f565b8160018114612c875760028114612c9157612cc0565b6001915050612d1f565b60ff841115612ca357612ca2612e72565b5b8360020a915084821115612cba57612cb9612e72565b5b50612d1f565b5060208310610133831016604e8410600b8410161715612cf55782820a905083811115612cf057612cef612e72565b5b612d1f565b612d028484846001612bb5565b92509050818404811115612d1957612d18612e72565b5b81810290505b9392505050565b6000612d3182612e04565b9150612d3c83612e04565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d7557612d74612e72565b5b828202905092915050565b6000612d8b82612e04565b9150612d9683612e04565b925082821015612da957612da8612e72565b5b828203905092915050565b6000612dbf82612de4565b9050919050565b60008115159050919050565b6000612ddd82612db4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612e2682612e2d565b9050919050565b6000612e3882612de4565b9050919050565b60005b83811015612e5d578082015181840152602081019050612e42565b83811115612e6c576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b7f4465706f7369743a20416d6f756e742061626f7665206c696d69740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f506f6f6c20686173207374617274656400000000000000000000000000000000600082015250565b7f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160008201527f6e206e657720656e64426c6f636b000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4e6577207374617274426c6f636b206d7573742062652068696768657220746860008201527f616e2063757272656e7420626c6f636b00000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d75737420626520736574000000000000000000000000000000000000000000600082015250565b7f4e6577206c696d6974206d757374206265206869676865720000000000000000600082015250565b7f4f7065726174696f6e733a2043616e6e6f74207265636f76657220726577617260008201527f6420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e7420746f20776974686472617720746f6f20686967680000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b7f4f7065726174696f6e733a2043616e6e6f74207265636f766572207374616b6560008201527f6420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b7f4d757374206265206c657373207468616e203330000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e6f7420666163746f7279000000000000000000000000000000000000000000600082015250565b61333281612db4565b811461333d57600080fd5b50565b61334981612dc6565b811461335457600080fd5b50565b61336081612dd2565b811461336b57600080fd5b50565b61337781612e04565b811461338257600080fd5b50565b61338e81612e0e565b811461339957600080fd5b5056fea264697066735822122015b5bee147f981caf144eb89c3e3a9da00966332cdedf842b5e414210fd8861264736f6c63430008040033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000137 | 75,893,904.0737 | $10,395.44 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.