More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 202 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 20002686 | 33 days ago | IN | 0 ETH | 0.00037498 | ||||
Emergency Withdr... | 19960263 | 38 days ago | IN | 0 ETH | 0.00056941 | ||||
Emergency Withdr... | 19954669 | 39 days ago | IN | 0 ETH | 0.00038323 | ||||
Emergency Withdr... | 19949873 | 40 days ago | IN | 0 ETH | 0.00015811 | ||||
Emergency Withdr... | 19940184 | 41 days ago | IN | 0 ETH | 0.00050196 | ||||
Emergency Withdr... | 19929321 | 43 days ago | IN | 0 ETH | 0.00033969 | ||||
Emergency Withdr... | 19896719 | 47 days ago | IN | 0 ETH | 0.00016122 | ||||
Emergency Withdr... | 19888258 | 49 days ago | IN | 0 ETH | 0.00035514 | ||||
Emergency Withdr... | 19886978 | 49 days ago | IN | 0 ETH | 0.00017128 | ||||
Emergency Withdr... | 19884421 | 49 days ago | IN | 0 ETH | 0.00026327 | ||||
Emergency Withdr... | 19880678 | 50 days ago | IN | 0 ETH | 0.00026331 | ||||
Emergency Withdr... | 19869255 | 51 days ago | IN | 0 ETH | 0.00043156 | ||||
Emergency Withdr... | 19858765 | 53 days ago | IN | 0 ETH | 0.00030628 | ||||
Emergency Withdr... | 19828857 | 57 days ago | IN | 0 ETH | 0.00019306 | ||||
Emergency Withdr... | 19828612 | 57 days ago | IN | 0 ETH | 0.00026097 | ||||
Emergency Reward... | 19819622 | 58 days ago | IN | 0 ETH | 0.00047812 | ||||
Transfer Ownersh... | 19819361 | 58 days ago | IN | 0 ETH | 0.00020757 | ||||
Withdraw | 19781169 | 64 days ago | IN | 0 ETH | 0.00096678 | ||||
Deposit | 19780472 | 64 days ago | IN | 0 ETH | 0.00053484 | ||||
Deposit | 19776286 | 64 days ago | IN | 0 ETH | 0.0011311 | ||||
Withdraw | 19776233 | 64 days ago | IN | 0 ETH | 0.00111354 | ||||
Deposit | 19763381 | 66 days ago | IN | 0 ETH | 0.00099359 | ||||
Withdraw | 19758727 | 67 days ago | IN | 0 ETH | 0.0007928 | ||||
Deposit | 19738738 | 69 days ago | IN | 0 ETH | 0.00083886 | ||||
Deposit | 19737559 | 70 days ago | IN | 0 ETH | 0.00077195 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
18766113 | 206 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
ERC20RewardApeV1
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /* ______ ______ / \ / \ | ▓▓▓▓▓▓\ ______ ______ | ▓▓▓▓▓▓\__ __ __ ______ ______ | ▓▓__| ▓▓/ \ / \| ▓▓___\▓▓ \ | \ | \| \ / \ | ▓▓ ▓▓ ▓▓▓▓▓▓\ ▓▓▓▓▓▓\\▓▓ \| ▓▓ | ▓▓ | ▓▓ \▓▓▓▓▓▓\ ▓▓▓▓▓▓\ | ▓▓▓▓▓▓▓▓ ▓▓ | ▓▓ ▓▓ ▓▓_\▓▓▓▓▓▓\ ▓▓ | ▓▓ | ▓▓/ ▓▓ ▓▓ | ▓▓ | ▓▓ | ▓▓ ▓▓__/ ▓▓ ▓▓▓▓▓▓▓▓ \__| ▓▓ ▓▓_/ ▓▓_/ ▓▓ ▓▓▓▓▓▓▓ ▓▓__/ ▓▓ | ▓▓ | ▓▓ ▓▓ ▓▓\▓▓ \\▓▓ ▓▓\▓▓ ▓▓ ▓▓\▓▓ ▓▓ ▓▓ ▓▓ \▓▓ \▓▓ ▓▓▓▓▓▓▓ \▓▓▓▓▓▓▓ \▓▓▓▓▓▓ \▓▓▓▓▓\▓▓▓▓ \▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓ | ▓▓ | ▓▓ | ▓▓ | ▓▓ \▓▓ \▓▓ * App: https://ApeSwap.finance * Medium: https://ape-swap.medium.com * Twitter: https://twitter.com/ape_swap * Telegram: https://t.me/ape_swap * Announcements: https://t.me/ape_swap_news * Discord: https://discord.com/ApeSwap * Reddit: https://reddit.com/r/ApeSwap * Instagram: https://instagram.com/ApeSwap.finance * GitHub: https://github.com/ApeSwapFinance */ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; contract ERC20RewardApeV1 is ReentrancyGuard, Ownable, Initializable { using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Rewards to distribute per second. uint256 lastRewardTime; // Last timestamp that Rewards distribution occurs. uint256 accRewardTokenPerShare; // Accumulated Rewards per share, times 1e30. See below. } // The stake token IERC20 public STAKE_TOKEN; // The reward token IERC20 public REWARD_TOKEN; // Is native token reward bool public isNativeTokenReward; // Reward tokens created per second. uint256 public rewardPerSecond; // Keep track of number of tokens staked in case the contract earns reflect fees uint256 public totalStaked = 0; // Keep track of number of reward tokens paid to find remaining reward balance uint256 public totalRewardsPaid = 0; // Keep track of number of reward tokens paid to find remaining reward balance uint256 public totalRewardsAllocated = 0; // Info of each pool. PoolInfo public poolInfo; // Info of each user that stakes LP tokens. mapping(address => UserInfo) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint = 0; // The timestamp number when Reward mining starts. uint256 public startTime; // The timestamp number when mining ends. uint256 public bonusEndTime; event Deposit(address indexed sender, address indexed user, uint256 amount); event DepositRewards(uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event SkimStakeTokenFees(address indexed user, uint256 amount); event LogUpdatePool(uint256 bonusEndTime, uint256 rewardPerSecond); event EmergencyRewardWithdraw(address indexed user, uint256 amount); event EmergencySweepWithdraw( address indexed user, IERC20 indexed token, uint256 amount ); function initialize( IERC20 _stakeToken, IERC20 _rewardToken, uint256 _rewardPerSecond, uint256 _startTime, uint256 _bonusEndTime ) external initializer { if (address(_rewardToken) == address(0)) { isNativeTokenReward = true; } STAKE_TOKEN = _stakeToken; REWARD_TOKEN = _rewardToken; rewardPerSecond = _rewardPerSecond; startTime = _startTime; bonusEndTime = _bonusEndTime; // staking pool poolInfo = PoolInfo({ lpToken: _stakeToken, allocPoint: 1000, lastRewardTime: startTime, accRewardTokenPerShare: 0 }); totalAllocPoint = 1000; } // Return reward multiplier over the given _from to _to timestamp. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { if (_to <= bonusEndTime) { return _to - _from; } else if (_from >= bonusEndTime) { return 0; } else { return bonusEndTime - _from; } } /// @param _bonusEndTime The timestamp when rewards will end function setBonusEndTime(uint256 _bonusEndTime) external onlyOwner { require( _bonusEndTime > block.timestamp, "new bonus end timestamp must be greater than current" ); bonusEndTime = _bonusEndTime; emit LogUpdatePool(bonusEndTime, rewardPerSecond); } // View function to see pending Reward on frontend. function pendingReward(address _user) external view returns (uint256 pending) { UserInfo storage user = userInfo[_user]; uint256 accRewardTokenPerShare = poolInfo.accRewardTokenPerShare; if (block.timestamp > poolInfo.lastRewardTime && totalStaked != 0) { uint256 multiplier = getMultiplier( poolInfo.lastRewardTime, block.timestamp ); uint256 tokenReward = (multiplier * rewardPerSecond * poolInfo.allocPoint) / totalAllocPoint; accRewardTokenPerShare = accRewardTokenPerShare + ((tokenReward * 1e30) / totalStaked); } pending = (user.amount * accRewardTokenPerShare) / 1e30 - user.rewardDebt; } // Update reward variables of the given pool to be up-to-date. function updatePool() public { if (block.timestamp <= poolInfo.lastRewardTime) { return; } if (totalStaked == 0) { poolInfo.lastRewardTime = block.timestamp; return; } uint256 multiplier = getMultiplier( poolInfo.lastRewardTime, block.timestamp ); uint256 tokenReward = (multiplier * rewardPerSecond * poolInfo.allocPoint) / totalAllocPoint; totalRewardsAllocated += tokenReward; poolInfo.accRewardTokenPerShare = poolInfo.accRewardTokenPerShare + ((tokenReward * 1e30) / totalStaked); poolInfo.lastRewardTime = block.timestamp; } /// Deposit staking token into the contract to earn rewards. /// @dev Since this contract needs to be supplied with rewards we are /// sending the balance of the contract if the pending rewards are higher /// @param _amount The amount of staking tokens to deposit function deposit(uint256 _amount) external nonReentrant { _depositTo(_amount, msg.sender); } function depositTo(uint256 _amount, address _user) external nonReentrant { require(_user != address(0), "Can't deposit for null address"); _depositTo(_amount, _user); } function _depositTo(uint256 _amount, address _user) internal { UserInfo storage user = userInfo[_user]; updatePool(); if (user.amount > 0) { uint256 pending = (user.amount * poolInfo.accRewardTokenPerShare) / 1e30 - user.rewardDebt; if (pending > 0) { // If rewardBalance is low then revert to avoid losing the user's rewards require( rewardBalance() >= pending, "insufficient reward balance" ); safeTransferRewardInternal(_user, pending, true); } } uint256 finalDepositAmount = 0; if (_amount > 0) { uint256 preStakeBalance = STAKE_TOKEN.balanceOf(address(this)); poolInfo.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); finalDepositAmount = STAKE_TOKEN.balanceOf(address(this)) - preStakeBalance; user.amount = user.amount + finalDepositAmount; totalStaked = totalStaked + finalDepositAmount; } user.rewardDebt = (user.amount * poolInfo.accRewardTokenPerShare) / 1e30; emit Deposit(msg.sender, _user, finalDepositAmount); } /// Withdraw rewards and/or staked tokens. Pass a 0 amount to withdraw only rewards /// @param _amount The amount of staking tokens to withdraw function withdraw(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(); uint256 pending = (user.amount * poolInfo.accRewardTokenPerShare) / 1e30 - user.rewardDebt; if (pending > 0) { // If rewardBalance is low then revert to avoid losing the user's rewards require(rewardBalance() >= pending, "insufficient reward balance"); safeTransferRewardInternal(address(msg.sender), pending, true); } if (_amount > 0) { user.amount = user.amount - _amount; poolInfo.lpToken.safeTransfer(address(msg.sender), _amount); totalStaked = totalStaked - _amount; } user.rewardDebt = (user.amount * poolInfo.accRewardTokenPerShare) / 1e30; emit Withdraw(msg.sender, _amount); } /// Obtain the reward balance of this contract /// @return wei balance of contract function rewardBalance() public view returns (uint256) { if (isNativeTokenReward) { return address(this).balance; } else { // Return ERC20 balance uint256 balance = REWARD_TOKEN.balanceOf(address(this)); if (STAKE_TOKEN == REWARD_TOKEN) { return balance - totalStaked; } return balance; } } /// Get the balance of rewards that have not been harvested /// @return wei balance of rewards left to be paid function getUnharvestedRewards() public view returns (uint256) { return totalRewardsAllocated - totalRewardsPaid; } // Deposit Rewards into contract function depositRewards(uint256 _amount) external { require(!isNativeTokenReward, "Reward is native token"); require(_amount > 0, "Deposit value must be greater than 0."); REWARD_TOKEN.safeTransferFrom( address(msg.sender), address(this), _amount ); emit DepositRewards(_amount); } /// @param _to address to send reward token to /// @param _amount value of reward token to transfer function safeTransferRewardInternal( address _to, uint256 _amount, bool _sumRewards ) internal { require(_amount <= rewardBalance(), "not enough reward token"); if (_sumRewards) { totalRewardsPaid += _amount; } if (isNativeTokenReward) { // Transfer native token to address (bool success, ) = _to.call{gas: 23000, value: _amount}(""); require(success, "TransferHelper: NATIVE_TRANSFER_FAILED"); } else { // Transfer ERC20 to address REWARD_TOKEN.safeTransfer(_to, _amount); } } /// @dev Obtain the stake balance of this contract function totalStakeTokenBalance() public view returns (uint256) { if (STAKE_TOKEN == REWARD_TOKEN) return totalStaked; return STAKE_TOKEN.balanceOf(address(this)); } /// @dev Obtain the stake token fees (if any) earned by reflect token /// @notice If STAKE_TOKEN == REWARD_TOKEN there are no fees to skim function getStakeTokenFeeBalance() public view returns (uint256) { return totalStakeTokenBalance() - totalStaked; } /* Admin Functions */ /// @param _rewardPerSecond The amount of reward tokens to be given per second function setRewardPerSecond(uint256 _rewardPerSecond) external onlyOwner { rewardPerSecond = _rewardPerSecond; emit LogUpdatePool(bonusEndTime, rewardPerSecond); } /// @dev Remove excess stake tokens earned by reflect fees function skimStakeTokenFees(address _to) external onlyOwner { uint256 stakeTokenFeeBalance = getStakeTokenFeeBalance(); STAKE_TOKEN.safeTransfer(_to, stakeTokenFeeBalance); emit SkimStakeTokenFees(_to, stakeTokenFeeBalance); } /* Emergency Functions */ // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; poolInfo.lpToken.safeTransfer(address(msg.sender), user.amount); totalStaked = totalStaked - user.amount; user.amount = 0; user.rewardDebt = 0; emit EmergencyWithdraw(msg.sender, user.amount); } // Withdraw reward. EMERGENCY ONLY. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { // Withdraw rewards safeTransferRewardInternal(msg.sender, _amount, false); emit EmergencyRewardWithdraw(msg.sender, _amount); } /// @notice A public function to sweep accidental BEP20 transfers to this contract. /// Tokens are sent to owner /// @param token The address of the BEP20 token to sweep function sweepToken(IERC20 token) external onlyOwner { require( address(token) != address(STAKE_TOKEN), "can not sweep stake token" ); require( address(token) != address(REWARD_TOKEN), "can not sweep reward token" ); uint256 balance = token.balanceOf(address(this)); token.safeTransfer(msg.sender, balance); emit EmergencySweepWithdraw(msg.sender, token, balance); } receive() external payable { if (!isNativeTokenReward) { revert("Reward token is not native"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' 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"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (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 pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// 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; } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyRewardWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencySweepWithdraw","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":"bonusEndTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerSecond","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SkimStakeTokenFees","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":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKE_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndTime","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":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"depositTo","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":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakeTokenFeeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnharvestedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stakeToken","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_bonusEndTime","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isNativeTokenReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accRewardTokenPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusEndTime","type":"uint256"}],"name":"setBonusEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"setRewardPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"skimStakeTokenFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"sweepToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalRewardsAllocated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakeTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePool","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":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600555600060065560006007556000600d5534801561002457600080fd5b50600160005561003333610038565b61008a565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e2c806100996000396000f3fe6080604052600436106101e75760003560e01c80638bdf67f211610102578063bbac08f411610095578063e3161ddd11610064578063e3161ddd146105f6578063ee1a62951461060b578063f2fde38b14610621578063f40f0f521461064157600080fd5b8063bbac08f414610581578063d13f90b4146105a1578063db2e21bc146105c1578063db64d8c0146105d657600080fd5b806399248ea7116100d157806399248ea714610517578063a49ceb1914610537578063aa5c3ab41461054c578063b6b55f251461056157600080fd5b80638bdf67f2146104a35780638da5cb5b146104c35780638dbb1e3a146104e15780638f10369a1461050157600080fd5b80635a2f3d091161017a57806374958e351161014957806374958e351461044c57806378e9792514610462578063812bc70814610478578063817b1cd21461048d57600080fd5b80635a2f3d09146103a157806366da5815146103f757806370aff70f14610417578063715018a61461043757600080fd5b80631c39b672116101b65780631c39b672146103135780632e1a7d4d1461034b5780633279beab1461036b57806341744f7b1461038b57600080fd5b8063074bad1d1461025157806309e4e7ab146102875780631959a002146102aa5780631be19560146102f357600080fd5b3661024c57600354600160a01b900460ff1661024a5760405162461bcd60e51b815260206004820152601a60248201527f52657761726420746f6b656e206973206e6f74206e617469766500000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561025d57600080fd5b5060035461027290600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561029357600080fd5b5061029c610661565b60405190815260200161027e565b3480156102b657600080fd5b506102de6102c5366004611b6a565b600c602052600090815260409020805460019091015482565b6040805192835260208301919091520161027e565b3480156102ff57600080fd5b5061024a61030e366004611b6a565b610678565b34801561031f57600080fd5b50600254610333906001600160a01b031681565b6040516001600160a01b03909116815260200161027e565b34801561035757600080fd5b5061024a610366366004611bf6565b610832565b34801561037757600080fd5b5061024a610386366004611bf6565b610a03565b34801561039757600080fd5b5061029c60075481565b3480156103ad57600080fd5b50600854600954600a54600b546103cd936001600160a01b031692919084565b604080516001600160a01b039095168552602085019390935291830152606082015260800161027e565b34801561040357600080fd5b5061024a610412366004611bf6565b610a71565b34801561042357600080fd5b5061024a610432366004611c26565b610ae0565b34801561044357600080fd5b5061024a610b71565b34801561045857600080fd5b5061029c60065481565b34801561046e57600080fd5b5061029c600e5481565b34801561048457600080fd5b5061029c610ba7565b34801561049957600080fd5b5061029c60055481565b3480156104af57600080fd5b5061024a6104be366004611bf6565b610bbe565b3480156104cf57600080fd5b506001546001600160a01b0316610333565b3480156104ed57600080fd5b5061029c6104fc366004611c55565b610cb7565b34801561050d57600080fd5b5061029c60045481565b34801561052357600080fd5b50600354610333906001600160a01b031681565b34801561054357600080fd5b5061029c610cf8565b34801561055857600080fd5b5061029c610d96565b34801561056d57600080fd5b5061024a61057c366004611bf6565b610e60565b34801561058d57600080fd5b5061024a61059c366004611b6a565b610e9a565b3480156105ad57600080fd5b5061024a6105bc366004611ba6565b610f2f565b3480156105cd57600080fd5b5061024a6110a2565b3480156105e257600080fd5b5061024a6105f1366004611bf6565b61114f565b34801561060257600080fd5b5061024a611224565b34801561061757600080fd5b5061029c600f5481565b34801561062d57600080fd5b5061024a61063c366004611b6a565b6112ce565b34801561064d57600080fd5b5061029c61065c366004611b6a565b611369565b60006006546007546106739190611d88565b905090565b6001546001600160a01b031633146106a25760405162461bcd60e51b815260040161024190611cc5565b6002546001600160a01b03828116911614156107005760405162461bcd60e51b815260206004820152601960248201527f63616e206e6f74207377656570207374616b6520746f6b656e000000000000006044820152606401610241565b6003546001600160a01b038281169116141561075e5760405162461bcd60e51b815260206004820152601a60248201527f63616e206e6f742073776565702072657761726420746f6b656e0000000000006044820152606401610241565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b1580156107a057600080fd5b505afa1580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d89190611c0e565b90506107ee6001600160a01b038316338361144a565b6040518181526001600160a01b0383169033907f9186304ffe50c568e430e57234122976c83522da68345954bb5485cbab3957139060200160405180910390a35050565b600260005414156108555760405162461bcd60e51b815260040161024190611cfa565b60026000908155338152600c6020526040902080548211156108ae5760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b6044820152606401610241565b6108b6611224565b6001810154600b5482546000929168327cb2734119d3b7a9601e1b916108dc9190611d69565b6108e69190611d49565b6108f09190611d88565b9050801561095b5780610901610d96565b101561094f5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207265776172642062616c616e636500000000006044820152606401610241565b61095b338260016114b2565b821561099957815461096e908490611d88565b8255600854610987906001600160a01b0316338561144a565b826005546109959190611d88565b6005555b600b54825468327cb2734119d3b7a9601e1b916109b591611d69565b6109bf9190611d49565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050600160005550565b6001546001600160a01b03163314610a2d5760405162461bcd60e51b815260040161024190611cc5565b610a39338260006114b2565b60405181815233907f2d4434bb59801e733e9ce3df40b0c5518861a5fcdeec1906e83e03c755872b429060200160405180910390a250565b6001546001600160a01b03163314610a9b5760405162461bcd60e51b815260040161024190611cc5565b6004819055600f5460408051918252602082018390527f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a457291015b60405180910390a150565b60026000541415610b035760405162461bcd60e51b815260040161024190611cfa565b60026000556001600160a01b038116610b5e5760405162461bcd60e51b815260206004820152601e60248201527f43616e2774206465706f73697420666f72206e756c6c206164647265737300006044820152606401610241565b610b68828261160c565b50506001600055565b6001546001600160a01b03163314610b9b5760405162461bcd60e51b815260040161024190611cc5565b610ba56000611894565b565b6000600554610bb4610cf8565b6106739190611d88565b600354600160a01b900460ff1615610c115760405162461bcd60e51b81526020600482015260166024820152752932bbb0b9321034b9903730ba34bb32903a37b5b2b760511b6044820152606401610241565b60008111610c6f5760405162461bcd60e51b815260206004820152602560248201527f4465706f7369742076616c7565206d757374206265206772656174657220746860448201526430b710181760d91b6064820152608401610241565b600354610c87906001600160a01b03163330846118e6565b6040518181527f754fe3a3c69256b66ca56365fda4bbf3299d7c94038c105ffd43fb4b37f56db690602001610ad5565b6000600f548211610cd357610ccc8383611d88565b9050610cf2565b600f548310610ce457506000610cf2565b82600f54610ccc9190611d88565b92915050565b6003546002546000916001600160a01b0391821691161415610d1b575060055490565b6002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610d5e57600080fd5b505afa158015610d72573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190611c0e565b600354600090600160a01b900460ff1615610db057504790565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610df457600080fd5b505afa158015610e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2c9190611c0e565b6003546002549192506001600160a01b0391821691161415610e5b57600554610e559082611d88565b91505090565b919050565b60026000541415610e835760405162461bcd60e51b815260040161024190611cfa565b6002600055610e92813361160c565b506001600055565b6001546001600160a01b03163314610ec45760405162461bcd60e51b815260040161024190611cc5565b6000610ece610ba7565b600254909150610ee8906001600160a01b0316838361144a565b816001600160a01b03167feb4e6a6a8d3c8edbd6ef48316a3670cfa0e6374eebe3f555e620399f866d2f3282604051610f2391815260200190565b60405180910390a25050565b600154600160a81b900460ff1680610f515750600154600160a01b900460ff16155b610fb45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610241565b600154600160a81b900460ff16158015610fde576001805461ffff60a01b191661010160a01b1790555b6001600160a01b038516611000576003805460ff60a01b1916600160a01b1790555b600280546001600160a01b038089166001600160a01b03199283168117909355600380549189169183169190911790556004869055600e859055600f849055604080516080810182528381526103e86020820181905291810187905260006060909101819052600880549093169093179091556009819055600a859055600b91909155600d55801561109a576001805460ff60a81b191690555b505050505050565b600260005414156110c55760405162461bcd60e51b815260040161024190611cfa565b6002600090815533808252600c6020526040909120805460085491926110f4926001600160a01b03169161144a565b80546005546111039190611d88565b60055560008082556001820181905560405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2506001600055565b6001546001600160a01b031633146111795760405162461bcd60e51b815260040161024190611cc5565b4281116111e55760405162461bcd60e51b815260206004820152603460248201527f6e657720626f6e757320656e642074696d657374616d70206d7573742062652060448201527319dc99585d195c881d1a185b8818dd5c9c995b9d60621b6064820152608401610241565b600f8190556004546040805183815260208101929092527f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a45729101610ad5565b600a54421161122f57565b60055461123c5742600a55565b600061124d60086002015442610cb7565b600d546009546004549293506000926112669085611d69565b6112709190611d69565b61127a9190611d49565b9050806007600082825461128e9190611d31565b90915550506005546112ac8268327cb2734119d3b7a9601e1b611d69565b6112b69190611d49565b600b546112c39190611d31565b600b55505042600a55565b6001546001600160a01b031633146112f85760405162461bcd60e51b815260040161024190611cc5565b6001600160a01b03811661135d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610241565b61136681611894565b50565b6001600160a01b0381166000908152600c60205260408120600b54600a5442118015611396575060055415155b1561140e5760006113ac60086002015442610cb7565b600d546009546004549293506000926113c59085611d69565b6113cf9190611d69565b6113d99190611d49565b6005549091506113f58268327cb2734119d3b7a9601e1b611d69565b6113ff9190611d49565b6114099084611d31565b925050505b6001820154825468327cb2734119d3b7a9601e1b9061142e908490611d69565b6114389190611d49565b6114429190611d88565b949350505050565b6040516001600160a01b0383166024820152604481018290526114ad90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261191e565b505050565b6114ba610d96565b8211156115095760405162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682072657761726420746f6b656e0000000000000000006044820152606401610241565b80156115275781600660008282546115219190611d31565b90915550505b600354600160a01b900460ff16156115f5576000836001600160a01b03166159d884604051600060405180830381858888f193505050503d806000811461158a576040519150601f19603f3d011682016040523d82523d6000602084013e61158f565b606091505b50509050806115ef5760405162461bcd60e51b815260206004820152602660248201527f5472616e7366657248656c7065723a204e41544956455f5452414e534645525f60448201526511905253115160d21b6064820152608401610241565b50505050565b6003546114ad906001600160a01b0316848461144a565b6001600160a01b0381166000908152600c6020526040902061162c611224565b8054156116da576001810154600b5482546000929168327cb2734119d3b7a9601e1b916116599190611d69565b6116639190611d49565b61166d9190611d88565b905080156116d8578061167e610d96565b10156116cc5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207265776172642062616c616e636500000000006044820152606401610241565b6116d8838260016114b2565b505b60008315611823576002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561172657600080fd5b505afa15801561173a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175e9190611c0e565b600854909150611779906001600160a01b03163330886118e6565b6002546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156117bc57600080fd5b505afa1580156117d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f49190611c0e565b6117fe9190611d88565b835490925061180e908390611d31565b835560055461181e908390611d31565b600555505b600b54825468327cb2734119d3b7a9601e1b9161183f91611d69565b6118499190611d49565b60018301556040518181526001600160a01b0384169033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526115ef9085906323b872dd60e01b90608401611476565b6000611973826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119f09092919063ffffffff16565b8051909150156114ad57808060200190518101906119919190611b86565b6114ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610241565b60606119ff8484600085611a09565b90505b9392505050565b606082471015611a6a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610241565b843b611ab85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610241565b600080866001600160a01b03168587604051611ad49190611c76565b60006040518083038185875af1925050503d8060008114611b11576040519150601f19603f3d011682016040523d82523d6000602084013e611b16565b606091505b5091509150611b26828286611b31565b979650505050505050565b60608315611b40575081611a02565b825115611b505782518084602001fd5b8160405162461bcd60e51b81526004016102419190611c92565b600060208284031215611b7b578081fd5b8135611a0281611de1565b600060208284031215611b97578081fd5b81518015158114611a02578182fd5b600080600080600060a08688031215611bbd578081fd5b8535611bc881611de1565b94506020860135611bd881611de1565b94979496505050506040830135926060810135926080909101359150565b600060208284031215611c07578081fd5b5035919050565b600060208284031215611c1f578081fd5b5051919050565b60008060408385031215611c38578182fd5b823591506020830135611c4a81611de1565b809150509250929050565b60008060408385031215611c67578182fd5b50508035926020909101359150565b60008251611c88818460208701611d9f565b9190910192915050565b6020815260008251806020840152611cb1816040850160208701611d9f565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115611d4457611d44611dcb565b500190565b600082611d6457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611d8357611d83611dcb565b500290565b600082821015611d9a57611d9a611dcb565b500390565b60005b83811015611dba578181015183820152602001611da2565b838111156115ef5750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461136657600080fdfea2646970667358221220e31cb3d85b2acd3d7e216fbc915425f62fd7b30315cb937ee867d5ea81e0c6fa64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101e75760003560e01c80638bdf67f211610102578063bbac08f411610095578063e3161ddd11610064578063e3161ddd146105f6578063ee1a62951461060b578063f2fde38b14610621578063f40f0f521461064157600080fd5b8063bbac08f414610581578063d13f90b4146105a1578063db2e21bc146105c1578063db64d8c0146105d657600080fd5b806399248ea7116100d157806399248ea714610517578063a49ceb1914610537578063aa5c3ab41461054c578063b6b55f251461056157600080fd5b80638bdf67f2146104a35780638da5cb5b146104c35780638dbb1e3a146104e15780638f10369a1461050157600080fd5b80635a2f3d091161017a57806374958e351161014957806374958e351461044c57806378e9792514610462578063812bc70814610478578063817b1cd21461048d57600080fd5b80635a2f3d09146103a157806366da5815146103f757806370aff70f14610417578063715018a61461043757600080fd5b80631c39b672116101b65780631c39b672146103135780632e1a7d4d1461034b5780633279beab1461036b57806341744f7b1461038b57600080fd5b8063074bad1d1461025157806309e4e7ab146102875780631959a002146102aa5780631be19560146102f357600080fd5b3661024c57600354600160a01b900460ff1661024a5760405162461bcd60e51b815260206004820152601a60248201527f52657761726420746f6b656e206973206e6f74206e617469766500000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561025d57600080fd5b5060035461027290600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561029357600080fd5b5061029c610661565b60405190815260200161027e565b3480156102b657600080fd5b506102de6102c5366004611b6a565b600c602052600090815260409020805460019091015482565b6040805192835260208301919091520161027e565b3480156102ff57600080fd5b5061024a61030e366004611b6a565b610678565b34801561031f57600080fd5b50600254610333906001600160a01b031681565b6040516001600160a01b03909116815260200161027e565b34801561035757600080fd5b5061024a610366366004611bf6565b610832565b34801561037757600080fd5b5061024a610386366004611bf6565b610a03565b34801561039757600080fd5b5061029c60075481565b3480156103ad57600080fd5b50600854600954600a54600b546103cd936001600160a01b031692919084565b604080516001600160a01b039095168552602085019390935291830152606082015260800161027e565b34801561040357600080fd5b5061024a610412366004611bf6565b610a71565b34801561042357600080fd5b5061024a610432366004611c26565b610ae0565b34801561044357600080fd5b5061024a610b71565b34801561045857600080fd5b5061029c60065481565b34801561046e57600080fd5b5061029c600e5481565b34801561048457600080fd5b5061029c610ba7565b34801561049957600080fd5b5061029c60055481565b3480156104af57600080fd5b5061024a6104be366004611bf6565b610bbe565b3480156104cf57600080fd5b506001546001600160a01b0316610333565b3480156104ed57600080fd5b5061029c6104fc366004611c55565b610cb7565b34801561050d57600080fd5b5061029c60045481565b34801561052357600080fd5b50600354610333906001600160a01b031681565b34801561054357600080fd5b5061029c610cf8565b34801561055857600080fd5b5061029c610d96565b34801561056d57600080fd5b5061024a61057c366004611bf6565b610e60565b34801561058d57600080fd5b5061024a61059c366004611b6a565b610e9a565b3480156105ad57600080fd5b5061024a6105bc366004611ba6565b610f2f565b3480156105cd57600080fd5b5061024a6110a2565b3480156105e257600080fd5b5061024a6105f1366004611bf6565b61114f565b34801561060257600080fd5b5061024a611224565b34801561061757600080fd5b5061029c600f5481565b34801561062d57600080fd5b5061024a61063c366004611b6a565b6112ce565b34801561064d57600080fd5b5061029c61065c366004611b6a565b611369565b60006006546007546106739190611d88565b905090565b6001546001600160a01b031633146106a25760405162461bcd60e51b815260040161024190611cc5565b6002546001600160a01b03828116911614156107005760405162461bcd60e51b815260206004820152601960248201527f63616e206e6f74207377656570207374616b6520746f6b656e000000000000006044820152606401610241565b6003546001600160a01b038281169116141561075e5760405162461bcd60e51b815260206004820152601a60248201527f63616e206e6f742073776565702072657761726420746f6b656e0000000000006044820152606401610241565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b1580156107a057600080fd5b505afa1580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d89190611c0e565b90506107ee6001600160a01b038316338361144a565b6040518181526001600160a01b0383169033907f9186304ffe50c568e430e57234122976c83522da68345954bb5485cbab3957139060200160405180910390a35050565b600260005414156108555760405162461bcd60e51b815260040161024190611cfa565b60026000908155338152600c6020526040902080548211156108ae5760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b6044820152606401610241565b6108b6611224565b6001810154600b5482546000929168327cb2734119d3b7a9601e1b916108dc9190611d69565b6108e69190611d49565b6108f09190611d88565b9050801561095b5780610901610d96565b101561094f5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207265776172642062616c616e636500000000006044820152606401610241565b61095b338260016114b2565b821561099957815461096e908490611d88565b8255600854610987906001600160a01b0316338561144a565b826005546109959190611d88565b6005555b600b54825468327cb2734119d3b7a9601e1b916109b591611d69565b6109bf9190611d49565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050600160005550565b6001546001600160a01b03163314610a2d5760405162461bcd60e51b815260040161024190611cc5565b610a39338260006114b2565b60405181815233907f2d4434bb59801e733e9ce3df40b0c5518861a5fcdeec1906e83e03c755872b429060200160405180910390a250565b6001546001600160a01b03163314610a9b5760405162461bcd60e51b815260040161024190611cc5565b6004819055600f5460408051918252602082018390527f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a457291015b60405180910390a150565b60026000541415610b035760405162461bcd60e51b815260040161024190611cfa565b60026000556001600160a01b038116610b5e5760405162461bcd60e51b815260206004820152601e60248201527f43616e2774206465706f73697420666f72206e756c6c206164647265737300006044820152606401610241565b610b68828261160c565b50506001600055565b6001546001600160a01b03163314610b9b5760405162461bcd60e51b815260040161024190611cc5565b610ba56000611894565b565b6000600554610bb4610cf8565b6106739190611d88565b600354600160a01b900460ff1615610c115760405162461bcd60e51b81526020600482015260166024820152752932bbb0b9321034b9903730ba34bb32903a37b5b2b760511b6044820152606401610241565b60008111610c6f5760405162461bcd60e51b815260206004820152602560248201527f4465706f7369742076616c7565206d757374206265206772656174657220746860448201526430b710181760d91b6064820152608401610241565b600354610c87906001600160a01b03163330846118e6565b6040518181527f754fe3a3c69256b66ca56365fda4bbf3299d7c94038c105ffd43fb4b37f56db690602001610ad5565b6000600f548211610cd357610ccc8383611d88565b9050610cf2565b600f548310610ce457506000610cf2565b82600f54610ccc9190611d88565b92915050565b6003546002546000916001600160a01b0391821691161415610d1b575060055490565b6002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610d5e57600080fd5b505afa158015610d72573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190611c0e565b600354600090600160a01b900460ff1615610db057504790565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610df457600080fd5b505afa158015610e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2c9190611c0e565b6003546002549192506001600160a01b0391821691161415610e5b57600554610e559082611d88565b91505090565b919050565b60026000541415610e835760405162461bcd60e51b815260040161024190611cfa565b6002600055610e92813361160c565b506001600055565b6001546001600160a01b03163314610ec45760405162461bcd60e51b815260040161024190611cc5565b6000610ece610ba7565b600254909150610ee8906001600160a01b0316838361144a565b816001600160a01b03167feb4e6a6a8d3c8edbd6ef48316a3670cfa0e6374eebe3f555e620399f866d2f3282604051610f2391815260200190565b60405180910390a25050565b600154600160a81b900460ff1680610f515750600154600160a01b900460ff16155b610fb45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610241565b600154600160a81b900460ff16158015610fde576001805461ffff60a01b191661010160a01b1790555b6001600160a01b038516611000576003805460ff60a01b1916600160a01b1790555b600280546001600160a01b038089166001600160a01b03199283168117909355600380549189169183169190911790556004869055600e859055600f849055604080516080810182528381526103e86020820181905291810187905260006060909101819052600880549093169093179091556009819055600a859055600b91909155600d55801561109a576001805460ff60a81b191690555b505050505050565b600260005414156110c55760405162461bcd60e51b815260040161024190611cfa565b6002600090815533808252600c6020526040909120805460085491926110f4926001600160a01b03169161144a565b80546005546111039190611d88565b60055560008082556001820181905560405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2506001600055565b6001546001600160a01b031633146111795760405162461bcd60e51b815260040161024190611cc5565b4281116111e55760405162461bcd60e51b815260206004820152603460248201527f6e657720626f6e757320656e642074696d657374616d70206d7573742062652060448201527319dc99585d195c881d1a185b8818dd5c9c995b9d60621b6064820152608401610241565b600f8190556004546040805183815260208101929092527f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a45729101610ad5565b600a54421161122f57565b60055461123c5742600a55565b600061124d60086002015442610cb7565b600d546009546004549293506000926112669085611d69565b6112709190611d69565b61127a9190611d49565b9050806007600082825461128e9190611d31565b90915550506005546112ac8268327cb2734119d3b7a9601e1b611d69565b6112b69190611d49565b600b546112c39190611d31565b600b55505042600a55565b6001546001600160a01b031633146112f85760405162461bcd60e51b815260040161024190611cc5565b6001600160a01b03811661135d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610241565b61136681611894565b50565b6001600160a01b0381166000908152600c60205260408120600b54600a5442118015611396575060055415155b1561140e5760006113ac60086002015442610cb7565b600d546009546004549293506000926113c59085611d69565b6113cf9190611d69565b6113d99190611d49565b6005549091506113f58268327cb2734119d3b7a9601e1b611d69565b6113ff9190611d49565b6114099084611d31565b925050505b6001820154825468327cb2734119d3b7a9601e1b9061142e908490611d69565b6114389190611d49565b6114429190611d88565b949350505050565b6040516001600160a01b0383166024820152604481018290526114ad90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261191e565b505050565b6114ba610d96565b8211156115095760405162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682072657761726420746f6b656e0000000000000000006044820152606401610241565b80156115275781600660008282546115219190611d31565b90915550505b600354600160a01b900460ff16156115f5576000836001600160a01b03166159d884604051600060405180830381858888f193505050503d806000811461158a576040519150601f19603f3d011682016040523d82523d6000602084013e61158f565b606091505b50509050806115ef5760405162461bcd60e51b815260206004820152602660248201527f5472616e7366657248656c7065723a204e41544956455f5452414e534645525f60448201526511905253115160d21b6064820152608401610241565b50505050565b6003546114ad906001600160a01b0316848461144a565b6001600160a01b0381166000908152600c6020526040902061162c611224565b8054156116da576001810154600b5482546000929168327cb2734119d3b7a9601e1b916116599190611d69565b6116639190611d49565b61166d9190611d88565b905080156116d8578061167e610d96565b10156116cc5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207265776172642062616c616e636500000000006044820152606401610241565b6116d8838260016114b2565b505b60008315611823576002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561172657600080fd5b505afa15801561173a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175e9190611c0e565b600854909150611779906001600160a01b03163330886118e6565b6002546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156117bc57600080fd5b505afa1580156117d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f49190611c0e565b6117fe9190611d88565b835490925061180e908390611d31565b835560055461181e908390611d31565b600555505b600b54825468327cb2734119d3b7a9601e1b9161183f91611d69565b6118499190611d49565b60018301556040518181526001600160a01b0384169033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526115ef9085906323b872dd60e01b90608401611476565b6000611973826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119f09092919063ffffffff16565b8051909150156114ad57808060200190518101906119919190611b86565b6114ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610241565b60606119ff8484600085611a09565b90505b9392505050565b606082471015611a6a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610241565b843b611ab85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610241565b600080866001600160a01b03168587604051611ad49190611c76565b60006040518083038185875af1925050503d8060008114611b11576040519150601f19603f3d011682016040523d82523d6000602084013e611b16565b606091505b5091509150611b26828286611b31565b979650505050505050565b60608315611b40575081611a02565b825115611b505782518084602001fd5b8160405162461bcd60e51b81526004016102419190611c92565b600060208284031215611b7b578081fd5b8135611a0281611de1565b600060208284031215611b97578081fd5b81518015158114611a02578182fd5b600080600080600060a08688031215611bbd578081fd5b8535611bc881611de1565b94506020860135611bd881611de1565b94979496505050506040830135926060810135926080909101359150565b600060208284031215611c07578081fd5b5035919050565b600060208284031215611c1f578081fd5b5051919050565b60008060408385031215611c38578182fd5b823591506020830135611c4a81611de1565b809150509250929050565b60008060408385031215611c67578182fd5b50508035926020909101359150565b60008251611c88818460208701611d9f565b9190910192915050565b6020815260008251806020840152611cb1816040850160208701611d9f565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115611d4457611d44611dcb565b500190565b600082611d6457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611d8357611d83611dcb565b500290565b600082821015611d9a57611d9a611dcb565b500390565b60005b83811015611dba578181015183820152602001611da2565b838111156115ef5750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461136657600080fdfea2646970667358221220e31cb3d85b2acd3d7e216fbc915425f62fd7b30315cb937ee867d5ea81e0c6fa64736f6c63430008040033
Deployed Bytecode Sourcemap
2064:13248:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15222:19;;-1:-1:-1;;;15222:19:0;;;;15217:87;;15257:36;;-1:-1:-1;;;15257:36:0;;7979:2:8;15257:36:0;;;7961:21:8;8018:2;7998:18;;;7991:30;8057:28;8037:18;;;8030:56;8103:18;;15257:36:0;;;;;;;;15217:87;2064:13248;;;;;2912:31;;;;;;;;;;-1:-1:-1;2912:31:0;;;;-1:-1:-1;;;2912:31:0;;;;;;;;;4002:14:8;;3995:22;3977:41;;3965:2;3950:18;2912:31:0;;;;;;;;11370:127;;;;;;;;;;;;;:::i;:::-;;;12005:25:8;;;11993:2;11978:18;11370:127:0;11960:76:8;3507:44:0;;;;;;;;;;-1:-1:-1;3507:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;12215:25:8;;;12271:2;12256:18;;12249:34;;;;12188:18;3507:44:0;12170:119:8;14700:474:0;;;;;;;;;;-1:-1:-1;14700:474:0;;;;;:::i;:::-;;:::i;2794:25::-;;;;;;;;;;-1:-1:-1;2794:25:0;;;;-1:-1:-1;;;;;2794:25:0;;;;;;-1:-1:-1;;;;;3134:32:8;;;3116:51;;3104:2;3089:18;2794:25:0;3071:102:8;9775:967:0;;;;;;;;;;-1:-1:-1;9775:967:0;;;;;:::i;:::-;;:::i;14283:227::-;;;;;;;;;;-1:-1:-1;14283:227:0;;;;;:::i;:::-;;:::i;3356:40::-;;;;;;;;;;;;;;;;3429:24;;;;;;;;;;-1:-1:-1;3429:24:0;;;;;;;;;;-1:-1:-1;;;;;3429:24:0;;;;;;;;;;-1:-1:-1;;;;;4516:32:8;;;4498:51;;4580:2;4565:18;;4558:34;;;;4608:18;;;4601:34;4666:2;4651:18;;4644:34;4485:3;4470:19;3429:24:0;4452:232:8;13287:183:0;;;;;;;;;;-1:-1:-1;13287:183:0;;;;;:::i;:::-;;:::i;8047:188::-;;;;;;;;;;-1:-1:-1;8047:188:0;;;;;:::i;:::-;;:::i;1605:92:1:-;;;;;;;;;;;;;:::i;3232:35:0:-;;;;;;;;;;;;;;;;3740:24;;;;;;;;;;;;;;;;13044:127;;;;;;;;;;;;;:::i;3113:30::-;;;;;;;;;;;;;;;;11540:361;;;;;;;;;;-1:-1:-1;11540:361:0;;;;;:::i;:::-;;:::i;973:85:1:-;;;;;;;;;;-1:-1:-1;1045:6:1;;-1:-1:-1;;;;;1045:6:1;973:85;;5245:317:0;;;;;;;;;;-1:-1:-1;5245:317:0;;;;;:::i;:::-;;:::i;2991:30::-;;;;;;;;;;;;;;;;2849:26;;;;;;;;;;-1:-1:-1;2849:26:0;;;;-1:-1:-1;;;;;2849:26:0;;;12706:185;;;;;;;;;;;;;:::i;10839:406::-;;;;;;;;;;;;;:::i;7937:104::-;;;;;;;;;;-1:-1:-1;7937:104:0;;;;;:::i;:::-;;:::i;13539:254::-;;;;;;;;;;-1:-1:-1;13539:254:0;;;;;:::i;:::-;;:::i;4436:732::-;;;;;;;;;;-1:-1:-1;4436:732:0;;;;;:::i;:::-;;:::i;13892:345::-;;;;;;;;;;;;;:::i;5634:311::-;;;;;;;;;;-1:-1:-1;5634:311:0;;;;;:::i;:::-;;:::i;6928:722::-;;;;;;;;;;;;;:::i;3816:27::-;;;;;;;;;;;;;;;;1846:189:1;;;;;;;;;;-1:-1:-1;1846:189:1;;;;;:::i;:::-;;:::i;6007:848:0:-;;;;;;;;;;-1:-1:-1;6007:848:0;;;;;:::i;:::-;;:::i;11370:127::-;11424:7;11474:16;;11450:21;;:40;;;;:::i;:::-;11443:47;;11370:127;:::o;14700:474::-;1045:6:1;;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;14810:11:0::1;::::0;-1:-1:-1;;;;;14784:38:0;;::::1;14810:11:::0;::::1;14784:38;;14763:110;;;::::0;-1:-1:-1;;;14763:110:0;;7625:2:8;14763:110:0::1;::::0;::::1;7607:21:8::0;7664:2;7644:18;;;7637:30;7703:27;7683:18;;;7676:55;7748:18;;14763:110:0::1;7597:175:8::0;14763:110:0::1;14930:12;::::0;-1:-1:-1;;;;;14904:39:0;;::::1;14930:12:::0;::::1;14904:39;;14883:112;;;::::0;-1:-1:-1;;;14883:112:0;;10588:2:8;14883:112:0::1;::::0;::::1;10570:21:8::0;10627:2;10607:18;;;10600:30;10666:28;10646:18;;;10639:56;10712:18;;14883:112:0::1;10560:176:8::0;14883:112:0::1;15023:30;::::0;-1:-1:-1;;;15023:30:0;;15047:4:::1;15023:30;::::0;::::1;3116:51:8::0;15005:15:0::1;::::0;-1:-1:-1;;;;;15023:15:0;::::1;::::0;::::1;::::0;3089:18:8;;15023:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15005:48:::0;-1:-1:-1;15063:39:0::1;-1:-1:-1::0;;;;;15063:18:0;::::1;15082:10;15005:48:::0;15063:18:::1;:39::i;:::-;15117:50;::::0;12005:25:8;;;-1:-1:-1;;;;;15117:50:0;::::1;::::0;15140:10:::1;::::0;15117:50:::1;::::0;11993:2:8;11978:18;15117:50:0::1;;;;;;;1255:1:1;14700:474:0::0;:::o;9775:967::-;1680:1:3;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:3;;;;;;;:::i;:::-;1680:1;2389:7;:18;;;9875:10:0::1;9866:20:::0;;:8:::1;:20;::::0;;;;9904:11;;:22;-1:-1:-1;9904:22:0::1;9896:53;;;::::0;-1:-1:-1;;;9896:53:0;;10943:2:8;9896:53:0::1;::::0;::::1;10925:21:8::0;10982:2;10962:18;;;10955:30;-1:-1:-1;;;11001:18:8;;;10994:48;11059:18;;9896:53:0::1;10915:168:8::0;9896:53:0::1;9959:12;:10;:12::i;:::-;10080:15;::::0;::::1;::::0;10014:31;;10000:11;;9981:15:::1;::::0;10080;-1:-1:-1;;;10061:4:0;10000:45:::1;::::0;10014:31;10000:45:::1;:::i;:::-;9999:66;;;;:::i;:::-;:96;;;;:::i;:::-;9981:114:::0;-1:-1:-1;10109:11:0;;10105:270:::1;;10249:7;10230:15;:13;:15::i;:::-;:26;;10222:66;;;::::0;-1:-1:-1;;;10222:66:0;;9116:2:8;10222:66:0::1;::::0;::::1;9098:21:8::0;9155:2;9135:18;;;9128:30;9194:29;9174:18;;;9167:57;9241:18;;10222:66:0::1;9088:177:8::0;10222:66:0::1;10302:62;10337:10;10350:7;10359:4;10302:26;:62::i;:::-;10389:11:::0;;10385:199:::1;;10430:11:::0;;:21:::1;::::0;10444:7;;10430:21:::1;:::i;:::-;10416:35:::0;;10465:8:::1;:16:::0;:59:::1;::::0;-1:-1:-1;;;;;10465:16:0::1;10503:10;10516:7:::0;10465:29:::1;:59::i;:::-;10566:7;10552:11;;:21;;;;:::i;:::-;10538:11;:35:::0;10385:199:::1;10639:31:::0;;10625:11;;-1:-1:-1;;;10686:4:0;10625:45:::1;::::0;::::1;:::i;:::-;10624:66;;;;:::i;:::-;10594:15;::::0;::::1;:96:::0;10706:29:::1;::::0;12005:25:8;;;10715:10:0::1;::::0;10706:29:::1;::::0;11993:2:8;11978:18;10706:29:0::1;;;;;;;-1:-1:-1::0;;1637:1:3;2562:7;:22;-1:-1:-1;9775:967:0:o;14283:227::-;1045:6:1;;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;14390:54:0::1;14417:10;14429:7;14438:5;14390:26;:54::i;:::-;14459:44;::::0;12005:25:8;;;14483:10:0::1;::::0;14459:44:::1;::::0;11993:2:8;11978:18;14459:44:0::1;;;;;;;14283:227:::0;:::o;13287:183::-;1045:6:1;;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;13370:15:0::1;:34:::0;;;13433:12:::1;::::0;13419:44:::1;::::0;;12215:25:8;;;12271:2;12256:18;;12249:34;;;13419:44:0::1;::::0;12188:18:8;13419:44:0::1;;;;;;;;13287:183:::0;:::o;8047:188::-;1680:1:3;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:3;;;;;;;:::i;:::-;1680:1;2389:7;:18;-1:-1:-1;;;;;8138:19:0;::::1;8130:62;;;::::0;-1:-1:-1;;;8130:62:0;;5279:2:8;8130:62:0::1;::::0;::::1;5261:21:8::0;5318:2;5298:18;;;5291:30;5357:32;5337:18;;;5330:60;5407:18;;8130:62:0::1;5251:180:8::0;8130:62:0::1;8202:26;8213:7;8222:5;8202:10;:26::i;:::-;-1:-1:-1::0;;1637:1:3;2562:7;:22;8047:188:0:o;1605:92:1:-;1045:6;;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;13044:127:0:-;13100:7;13153:11;;13126:24;:22;:24::i;:::-;:38;;;;:::i;11540:361::-;11609:19;;-1:-1:-1;;;11609:19:0;;;;11608:20;11600:55;;;;-1:-1:-1;;;11600:55:0;;5638:2:8;11600:55:0;;;5620:21:8;5677:2;5657:18;;;5650:30;-1:-1:-1;;;5696:18:8;;;5689:52;5758:18;;11600:55:0;5610:172:8;11600:55:0;11683:1;11673:7;:11;11665:61;;;;-1:-1:-1;;;11665:61:0;;9824:2:8;11665:61:0;;;9806:21:8;9863:2;9843:18;;;9836:30;9902:34;9882:18;;;9875:62;-1:-1:-1;;;9953:18:8;;;9946:35;9998:19;;11665:61:0;9796:227:8;11665:61:0;11736:12;;:120;;-1:-1:-1;;;;;11736:12:0;11787:10;11820:4;11839:7;11736:29;:120::i;:::-;11871:23;;12005:25:8;;;11871:23:0;;11993:2:8;11978:18;11871:23:0;11960:76:8;5245:317:0;5341:7;5375:12;;5368:3;:19;5364:192;;5410:11;5416:5;5410:3;:11;:::i;:::-;5403:18;;;;5364:192;5451:12;;5442:5;:21;5438:118;;-1:-1:-1;5486:1:0;5479:8;;5438:118;5540:5;5525:12;;:20;;;;:::i;5438:118::-;5245:317;;;;:::o;12706:185::-;12799:12;;12784:11;;12761:7;;-1:-1:-1;;;;;12784:11:0;;;12799:12;;12784:27;12780:51;;;-1:-1:-1;12820:11:0;;;12706:185::o;12780:51::-;12848:11;;:36;;-1:-1:-1;;;12848:36:0;;12878:4;12848:36;;;3116:51:8;-1:-1:-1;;;;;12848:11:0;;;;:21;;3089:18:8;;12848:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10839:406::-;10908:19;;10885:7;;-1:-1:-1;;;10908:19:0;;;;10904:335;;;-1:-1:-1;10950:21:0;;10839:406::o;10904:335::-;11056:12;;:37;;-1:-1:-1;;;11056:37:0;;11087:4;11056:37;;;3116:51:8;11038:15:0;;-1:-1:-1;;;;;11056:12:0;;:22;;3089:18:8;;11056:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11126:12;;11111:11;;11038:55;;-1:-1:-1;;;;;;11111:11:0;;;11126:12;;11111:27;11107:94;;;11175:11;;11165:21;;:7;:21;:::i;:::-;11158:28;;;10839:406;:::o;11107:94::-;11221:7;10839:406;-1:-1:-1;10839:406:0:o;7937:104::-;1680:1:3;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:3;;;;;;;:::i;:::-;1680:1;2389:7;:18;8003:31:0::1;8014:7:::0;8023:10:::1;8003;:31::i;:::-;-1:-1:-1::0;1637:1:3;2562:7;:22;7937:104:0:o;13539:254::-;1045:6:1;;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;13609:28:0::1;13640:25;:23;:25::i;:::-;13675:11;::::0;13609:56;;-1:-1:-1;13675:51:0::1;::::0;-1:-1:-1;;;;;13675:11:0::1;13700:3:::0;13609:56;13675:24:::1;:51::i;:::-;13760:3;-1:-1:-1::0;;;;;13741:45:0::1;;13765:20;13741:45;;;;12005:25:8::0;;11993:2;11978:18;;11960:76;13741:45:0::1;;;;;;;;1255:1:1;13539:254:0::0;:::o;4436:732::-;1409:13:2;;-1:-1:-1;;;1409:13:2;;;;;:30;;-1:-1:-1;1427:12:2;;-1:-1:-1;;;1427:12:2;;;;1426:13;1409:30;1401:89;;;;-1:-1:-1;;;1401:89:2;;7210:2:8;1401:89:2;;;7192:21:8;7249:2;7229:18;;;7222:30;7288:34;7268:18;;;7261:62;-1:-1:-1;;;7339:18:8;;;7332:44;7393:19;;1401:89:2;7182:236:8;1401:89:2;1524:13;;-1:-1:-1;;;1524:13:2;;;;1523:14;1547:98;;;;1597:4;1581:20;;-1:-1:-1;;;;1615:19:2;-1:-1:-1;;;1615:19:2;;;1547:98;-1:-1:-1;;;;;4647:35:0;::::1;4643:92;;4698:19;:26:::0;;-1:-1:-1;;;;4698:26:0::1;-1:-1:-1::0;;;4698:26:0::1;::::0;;4643:92:::1;4744:11;:25:::0;;-1:-1:-1;;;;;4744:25:0;;::::1;-1:-1:-1::0;;;;;;4744:25:0;;::::1;::::0;::::1;::::0;;;4779:12:::1;:27:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;4816:15:::1;:34:::0;;;4860:9:::1;:22:::0;;;4892:12:::1;:28:::0;;;4966:162:::1;::::0;;::::1;::::0;::::1;::::0;;;;;5035:4:::1;4966:162;::::0;::::1;::::0;;;;;;;;;4744:11:::1;4966:162:::0;;;;;;;4955:8:::1;:173:::0;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;5139:15:::1;:22:::0;1667:66:2;;;;1701:13;:21;;-1:-1:-1;;;;1701:21:2;;;1667:66;4436:732:0;;;;;;:::o;13892:345::-;1680:1:3;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:3;;;;;;;:::i;:::-;1680:1;2389:7;:18;;;13986:10:0::1;13977:20:::0;;;:8:::1;:20;::::0;;;;;14058:11;;14007:8:::1;:16:::0;13977:20;;14007:63:::1;::::0;-1:-1:-1;;;;;14007:16:0::1;::::0;:29:::1;:63::i;:::-;14108:11:::0;;14094::::1;::::0;:25:::1;::::0;14108:11;14094:25:::1;:::i;:::-;14080:11;:39:::0;14143:1:::1;14129:15:::0;;;14154::::1;::::0;::::1;:19:::0;;;14188:42:::1;::::0;12005:25:8;;;14206:10:0::1;::::0;14188:42:::1;::::0;11993:2:8;11978:18;14188:42:0::1;;;;;;;-1:-1:-1::0;1637:1:3;2562:7;:22;13892:345:0:o;5634:311::-;1045:6:1;;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;5748:15:0::1;5732:13;:31;5711:130;;;::::0;-1:-1:-1;;;5711:130:0;;8334:2:8;5711:130:0::1;::::0;::::1;8316:21:8::0;8373:2;8353:18;;;8346:30;8412:34;8392:18;;;8385:62;-1:-1:-1;;;8463:18:8;;;8456:50;8523:19;;5711:130:0::1;8306:242:8::0;5711:130:0::1;5851:12;:28:::0;;;5922:15:::1;::::0;5894:44:::1;::::0;;12215:25:8;;;12271:2;12256:18;;12249:34;;;;5894:44:0::1;::::0;12188:18:8;5894:44:0::1;12170:119:8::0;6928:722:0;6990:23;;6971:15;:42;6967:79;;6928:722::o;6967:79::-;7059:11;;7055:108;;7117:15;7091:23;:41;6928:722::o;7055:108::-;7172:18;7193:89;7220:8;:23;;;7257:15;7193:13;:89::i;:::-;7393:15;;7370:19;;7340:15;;7172:110;;-1:-1:-1;7292:19:0;;7315:40;;7172:110;7315:40;:::i;:::-;:74;;;;:::i;:::-;7314:94;;;;:::i;:::-;7292:116;;7443:11;7418:21;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;7580:11:0;;7558:18;:11;-1:-1:-1;;;7558:18:0;:::i;:::-;7557:34;;;;:::i;:::-;7510:31;;:82;;;;:::i;:::-;7464:31;:128;-1:-1:-1;;7628:15:0;7602:23;:41;6928:722::o;1846:189:1:-;1045:6;;-1:-1:-1;;;;;1045:6:1;666:10:7;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;1934:22:1;::::1;1926:73;;;::::0;-1:-1:-1;;;1926:73:1;;5989:2:8;1926:73:1::1;::::0;::::1;5971:21:8::0;6028:2;6008:18;;;6001:30;6067:34;6047:18;;;6040:62;-1:-1:-1;;;6118:18:8;;;6111:36;6164:19;;1926:73:1::1;5961:228:8::0;1926:73:1::1;2009:19;2019:8;2009:9;:19::i;:::-;1846:189:::0;:::o;6007:848:0:-;-1:-1:-1;;;;;6147:15:0;;6092;6147;;;:8;:15;;;;;6205:31;;6268:23;;6250:15;:41;:61;;;;-1:-1:-1;6295:11:0;;:16;;6250:61;6246:484;;;6327:18;6348:101;6379:8;:23;;;6420:15;6348:13;:101::i;:::-;6572:15;;6549:19;;6515:15;;6327:122;;-1:-1:-1;6463:19:0;;6486:44;;6327:122;6486:44;:::i;:::-;:82;;;;:::i;:::-;6485:102;;;;:::i;:::-;6707:11;;6463:124;;-1:-1:-1;6685:18:0;6463:124;-1:-1:-1;;;6685:18:0;:::i;:::-;6684:34;;;;:::i;:::-;6642:77;;:22;:77;:::i;:::-;6601:118;;6246:484;;;6833:15;;;;6762:11;;-1:-1:-1;;;6814:4:0;6762:36;;6776:22;;6762:36;:::i;:::-;6761:57;;;;:::i;:::-;:87;;;;:::i;:::-;6739:109;6007:848;-1:-1:-1;;;;6007:848:0:o;634:205:5:-;773:58;;-1:-1:-1;;;;;3750:32:8;;773:58:5;;;3732:51:8;3799:18;;;3792:34;;;746:86:5;;766:5;;-1:-1:-1;;;796:23:5;3705:18:8;;773:58:5;;;;-1:-1:-1;;773:58:5;;;;;;;;;;;;;;-1:-1:-1;;;;;773:58:5;-1:-1:-1;;;;;;773:58:5;;;;;;;;;;746:19;:86::i;:::-;634:205;;;:::o;12015:630:0:-;12167:15;:13;:15::i;:::-;12156:7;:26;;12148:62;;;;-1:-1:-1;;;12148:62:0;;9472:2:8;12148:62:0;;;9454:21:8;9511:2;9491:18;;;9484:30;9550:25;9530:18;;;9523:53;9593:18;;12148:62:0;9444:173:8;12148:62:0;12224:11;12220:69;;;12271:7;12251:16;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;12220:69:0;12303:19;;-1:-1:-1;;;12303:19:0;;;;12299:340;;;12387:12;12405:3;-1:-1:-1;;;;;12405:8:0;12419:5;12433:7;12405:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12386:59;;;12467:7;12459:58;;;;-1:-1:-1;;;12459:58:0;;6396:2:8;12459:58:0;;;6378:21:8;6435:2;6415:18;;;6408:30;6474:34;6454:18;;;6447:62;-1:-1:-1;;;6525:18:8;;;6518:36;6571:19;;12459:58:0;6368:228:8;12459:58:0;12299:340;634:205:5;;;:::o;12299:340:0:-;12589:12;;:39;;-1:-1:-1;;;;;12589:12:0;12615:3;12620:7;12589:25;:39::i;8241:1376::-;-1:-1:-1;;;;;8336:15:0;;8312:21;8336:15;;;:8;:15;;;;;8361:12;:10;:12::i;:::-;8387:11;;:15;8383:511;;8525:15;;;;8451:31;;8437:11;;8418:15;;8525;-1:-1:-1;;;8502:4:0;8437:45;;8451:31;8437:45;:::i;:::-;8436:70;;;;:::i;:::-;:104;;;;:::i;:::-;8418:122;-1:-1:-1;8558:11:0;;8554:330;;8727:7;8708:15;:13;:15::i;:::-;:26;;8679:124;;;;-1:-1:-1;;;8679:124:0;;9116:2:8;8679:124:0;;;9098:21:8;9155:2;9135:18;;;9128:30;9194:29;9174:18;;;9167:57;9241:18;;8679:124:0;9088:177:8;8679:124:0;8821:48;8848:5;8855:7;8864:4;8821:26;:48::i;:::-;8383:511;;8904:26;8948:11;;8944:499;;9001:11;;:36;;-1:-1:-1;;;9001:36:0;;9031:4;9001:36;;;3116:51:8;8975:23:0;;-1:-1:-1;;;;;9001:11:0;;:21;;3089:18:8;;9001:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9051:8;:16;8975:62;;-1:-1:-1;9051:140:0;;-1:-1:-1;;;;;9051:16:0;9110:10;9147:4;9170:7;9051:33;:140::i;:::-;9242:11;;:36;;-1:-1:-1;;;9242:36:0;;9272:4;9242:36;;;3116:51:8;9297:15:0;;-1:-1:-1;;;;;9242:11:0;;:21;;3089:18:8;;9242:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;;;:::i;:::-;9340:11;;9205:107;;-1:-1:-1;9340:32:0;;9205:107;;9340:32;:::i;:::-;9326:46;;9400:11;;:32;;9414:18;;9400:32;:::i;:::-;9386:11;:46;-1:-1:-1;8944:499:0;9497:31;;9483:11;;-1:-1:-1;;;9544:4:0;9483:45;;;:::i;:::-;9482:66;;;;:::i;:::-;9452:15;;;:96;9564:46;;12005:25:8;;;-1:-1:-1;;;;;9564:46:0;;;9572:10;;9564:46;;11993:2:8;11978:18;9564:46:0;;;;;;;8241:1376;;;;:::o;2041:169:1:-;2115:6;;;-1:-1:-1;;;;;2131:17:1;;;-1:-1:-1;;;;;;2131:17:1;;;;;;;2163:40;;2115:6;;;2131:17;2115:6;;2163:40;;2096:16;;2163:40;2041:169;;:::o;845:241:5:-;1010:68;;-1:-1:-1;;;;;3436:15:8;;;1010:68:5;;;3418:34:8;3488:15;;3468:18;;;3461:43;3520:18;;;3513:34;;;983:96:5;;1003:5;;-1:-1:-1;;;1033:27:5;3353:18:8;;1010:68:5;3335:218:8;3140:706:5;3559:23;3585:69;3613:4;3585:69;;;;;;;;;;;;;;;;;3593:5;-1:-1:-1;;;;;3585:27:5;;;:69;;;;;:::i;:::-;3668:17;;3559:95;;-1:-1:-1;3668:21:5;3664:176;;3763:10;3752:30;;;;;;;;;;;;:::i;:::-;3744:85;;;;-1:-1:-1;;;3744:85:5;;11290:2:8;3744:85:5;;;11272:21:8;11329:2;11309:18;;;11302:30;11368:34;11348:18;;;11341:62;-1:-1:-1;;;11419:18:8;;;11412:40;11469:19;;3744:85:5;11262:232:8;3461:223:6;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;;3461:223;;;;;;:::o;4548:499::-;4713:12;4770:5;4745:21;:30;;4737:81;;;;-1:-1:-1;;;4737:81:6;;6803:2:8;4737:81:6;;;6785:21:8;6842:2;6822:18;;;6815:30;6881:34;6861:18;;;6854:62;-1:-1:-1;;;6932:18:8;;;6925:36;6978:19;;4737:81:6;6775:228:8;4737:81:6;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:6;;10230:2:8;4828:60:6;;;10212:21:8;10269:2;10249:18;;;10242:30;10308:31;10288:18;;;10281:59;10357:18;;4828:60:6;10202:179:8;4828:60:6;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:6;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:51;5006:7;5015:10;5027:12;4989:16;:51::i;:::-;4982:58;4548:499;-1:-1:-1;;;;;;;4548:499:6:o;7161:692::-;7307:12;7335:7;7331:516;;;-1:-1:-1;7365:10:6;7358:17;;7331:516;7476:17;;:21;7472:365;;7670:10;7664:17;7730:15;7717:10;7713:2;7709:19;7702:44;7619:145;7809:12;7802:20;;-1:-1:-1;;;7802:20:6;;;;;;;;:::i;14:257:8:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:297::-;343:6;396:2;384:9;375:7;371:23;367:32;364:2;;;417:6;409;402:22;364:2;454:9;448:16;507:5;500:13;493:21;486:5;483:32;473:2;;534:6;526;519:22;855:634;980:6;988;996;1004;1012;1065:3;1053:9;1044:7;1040:23;1036:33;1033:2;;;1087:6;1079;1072:22;1033:2;1131:9;1118:23;1150:31;1175:5;1150:31;:::i;:::-;1200:5;-1:-1:-1;1257:2:8;1242:18;;1229:32;1270:33;1229:32;1270:33;:::i;:::-;1023:466;;1322:7;;-1:-1:-1;;;;1376:2:8;1361:18;;1348:32;;1427:2;1412:18;;1399:32;;1478:3;1463:19;;;1450:33;;-1:-1:-1;1023:466:8:o;1494:190::-;1553:6;1606:2;1594:9;1585:7;1581:23;1577:32;1574:2;;;1627:6;1619;1612:22;1574:2;-1:-1:-1;1655:23:8;;1564:120;-1:-1:-1;1564:120:8:o;1689:194::-;1759:6;1812:2;1800:9;1791:7;1787:23;1783:32;1780:2;;;1833:6;1825;1818:22;1780:2;-1:-1:-1;1861:16:8;;1770:113;-1:-1:-1;1770:113:8:o;1888:325::-;1956:6;1964;2017:2;2005:9;1996:7;1992:23;1988:32;1985:2;;;2038:6;2030;2023:22;1985:2;2079:9;2066:23;2056:33;;2139:2;2128:9;2124:18;2111:32;2152:31;2177:5;2152:31;:::i;:::-;2202:5;2192:15;;;1975:238;;;;;:::o;2218:258::-;2286:6;2294;2347:2;2335:9;2326:7;2322:23;2318:32;2315:2;;;2368:6;2360;2353:22;2315:2;-1:-1:-1;;2396:23:8;;;2466:2;2451:18;;;2438:32;;-1:-1:-1;2305:171:8:o;2481:274::-;2610:3;2648:6;2642:13;2664:53;2710:6;2705:3;2698:4;2690:6;2686:17;2664:53;:::i;:::-;2733:16;;;;;2618:137;-1:-1:-1;;2618:137:8:o;4689:383::-;4838:2;4827:9;4820:21;4801:4;4870:6;4864:13;4913:6;4908:2;4897:9;4893:18;4886:34;4929:66;4988:6;4983:2;4972:9;4968:18;4963:2;4955:6;4951:15;4929:66;:::i;:::-;5056:2;5035:15;-1:-1:-1;;5031:29:8;5016:45;;;;5063:2;5012:54;;4810:262;-1:-1:-1;;4810:262:8:o;8553:356::-;8755:2;8737:21;;;8774:18;;;8767:30;8833:34;8828:2;8813:18;;8806:62;8900:2;8885:18;;8727:182::o;11499:355::-;11701:2;11683:21;;;11740:2;11720:18;;;11713:30;11779:33;11774:2;11759:18;;11752:61;11845:2;11830:18;;11673:181::o;12294:128::-;12334:3;12365:1;12361:6;12358:1;12355:13;12352:2;;;12371:18;;:::i;:::-;-1:-1:-1;12407:9:8;;12342:80::o;12427:217::-;12467:1;12493;12483:2;;-1:-1:-1;;;12518:31:8;;12572:4;12569:1;12562:15;12600:4;12525:1;12590:15;12483:2;-1:-1:-1;12629:9:8;;12473:171::o;12649:168::-;12689:7;12755:1;12751;12747:6;12743:14;12740:1;12737:21;12732:1;12725:9;12718:17;12714:45;12711:2;;;12762:18;;:::i;:::-;-1:-1:-1;12802:9:8;;12701:116::o;12822:125::-;12862:4;12890:1;12887;12884:8;12881:2;;;12895:18;;:::i;:::-;-1:-1:-1;12932:9:8;;12871:76::o;12952:258::-;13024:1;13034:113;13048:6;13045:1;13042:13;13034:113;;;13124:11;;;13118:18;13105:11;;;13098:39;13070:2;13063:10;13034:113;;;13165:6;13162:1;13159:13;13156:2;;;-1:-1:-1;;13200:1:8;13182:16;;13175:27;13005:205::o;13215:127::-;13276:10;13271:3;13267:20;13264:1;13257:31;13307:4;13304:1;13297:15;13331:4;13328:1;13321:15;13347:131;-1:-1:-1;;;;;13422:31:8;;13412:42;;13402:2;;13468:1;13465;13458:12
Swarm Source
ipfs://e31cb3d85b2acd3d7e216fbc915425f62fd7b30315cb937ee867d5ea81e0c6fa
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.008497 | 194,450.8996 | $1,652.32 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.