More Info
Private Name Tags
Latest 25 from a total of 473 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 21493672 | 10 days ago | IN | 0 ETH | 0.00082853 | ||||
Get Reward | 21493667 | 10 days ago | IN | 0 ETH | 0.00113812 | ||||
Withdraw | 21195965 | 51 days ago | IN | 0 ETH | 0.00311365 | ||||
Stake | 21172465 | 54 days ago | IN | 0 ETH | 0.00407809 | ||||
Withdraw | 21171751 | 55 days ago | IN | 0 ETH | 0.0046118 | ||||
Withdraw | 21162504 | 56 days ago | IN | 0 ETH | 0.00428674 | ||||
Get Reward | 20614152 | 132 days ago | IN | 0 ETH | 0.00044504 | ||||
Withdraw | 20614151 | 132 days ago | IN | 0 ETH | 0.000474 | ||||
Withdraw | 20524990 | 145 days ago | IN | 0 ETH | 0.00052262 | ||||
Withdraw | 20501752 | 148 days ago | IN | 0 ETH | 0.00018651 | ||||
Withdraw | 20501744 | 148 days ago | IN | 0 ETH | 0.00019075 | ||||
Withdraw | 20496490 | 149 days ago | IN | 0 ETH | 0.00028895 | ||||
Withdraw | 20496486 | 149 days ago | IN | 0 ETH | 0.00030532 | ||||
Withdraw | 20480335 | 151 days ago | IN | 0 ETH | 0.00043706 | ||||
Withdraw | 20208411 | 189 days ago | IN | 0 ETH | 0.00059536 | ||||
Get Reward | 20208410 | 189 days ago | IN | 0 ETH | 0.00088619 | ||||
Get Reward | 20182940 | 193 days ago | IN | 0 ETH | 0.00116758 | ||||
Get Reward | 20170871 | 194 days ago | IN | 0 ETH | 0.00176365 | ||||
Stake | 20164029 | 195 days ago | IN | 0 ETH | 0.001621 | ||||
Stake | 20160911 | 196 days ago | IN | 0 ETH | 0.00108227 | ||||
Withdraw | 20157365 | 196 days ago | IN | 0 ETH | 0.00054266 | ||||
Withdraw | 20150312 | 197 days ago | IN | 0 ETH | 0.00030348 | ||||
Get Reward | 20149973 | 197 days ago | IN | 0 ETH | 0.00039085 | ||||
Withdraw | 20149967 | 197 days ago | IN | 0 ETH | 0.00046927 | ||||
Withdraw | 20136289 | 199 days ago | IN | 0 ETH | 0.0000639 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Pool
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-25 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.4; /* /$$$$$$ /$$$$$$$$ /$$$$$$ /$$__ $$| $$_____/ /$$__ $$ | $$ \__/| $$ | $$ \__/ | $$ /$$$$| $$$$$ | $$ | $$|_ $$| $$__/ | $$ | $$ \ $$| $$ | $$ $$ | $$$$$$/| $$$$$$$$| $$$$$$/ \______/ |________/ \______/ Website: https://gectoken.com Twitter: https://twitter.com/geometricenergy Telegram: https://t.me/GECERC Geometric Energy Corporation (GEC) is a state-of-the-art technology company committed to facilitating positive social change of humanity by commercializing next-generation technologies within the sustainable energy, space, and computing industries. */ /** * @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; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @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); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory returnedData) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory returnedData) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } /** * @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; } } interface IERC20Metadata is IERC20 { function decimals() external view returns (uint8); } contract Pool is Ownable, ReentrancyGuard { using SafeERC20 for IERC20Metadata; IERC20Metadata public immutable stakingToken; uint256 public immutable stakingTokenMultiplier; uint256 public immutable devFee; // 100 = 1% uint256 public immutable tokenFee; // 100 = 1% uint256 public totalSupply; // Total staked tokens on the contract address public treasury; struct PoolInfo { IERC20Metadata rewardToken; uint256 rewardPoolID; uint256 duration; uint256 periodFinish; uint256 startTime; uint256 lastUpdateTime; uint256 rewardRate; uint256 rewardPerTokenStored; } struct UserRewardInfo { uint256 rewards; uint256 userRewardPerTokenPaid; } PoolInfo[] public poolInfo; mapping(address => uint256) internal _balances; mapping(address => bool) public addedRewardTokens; mapping(uint256 => mapping(address => UserRewardInfo)) public rewardsInPool; event Withdrawn(address indexed user, uint256 amount); event Staked(address indexed user, uint256 amount); event RewardPaid( address indexed user, address rewardToken, uint256 rewardAmount ); event RewardPoolAdded( uint256 rewardPoolID, address rewardTokenAddress ); event RewardPoolStarted( uint256 rewardPoolID, address rewardTokenAddress, uint256 rewardAmount, uint256 rewardDuration, uint256 rewardPeriodFinish ); event RewardPoolExtended( uint256 rewardPoolID, address rewardTokenAddress, uint256 oldRewardAmount, uint256 newRewardAmount, uint256 totalRewardAmount, uint256 rewardDuration, uint256 rewardPeriodFinish ); constructor( address _stakingToken, address _treasury, uint256 _devFee, uint256 _tokenFee ) { require( _stakingToken != address(0) && _treasury != address(0), "!constructor" ); devFee = _devFee; stakingToken = IERC20Metadata(_stakingToken); treasury = _treasury; tokenFee = _tokenFee; stakingTokenMultiplier = 10**uint256(IERC20Metadata(_stakingToken).decimals()); } function updateReward(address account) internal { // loop through all reward pools for user for (uint256 i = 0; i < poolInfo.length; i++) { PoolInfo storage pool = poolInfo[i]; if (address(pool.rewardToken) == address(0)) { continue; } else { updateRewardPerTokenStored(i); rewardsInPool[i][account].rewards = earned(account, i); rewardsInPool[i][account].userRewardPerTokenPaid = pool.rewardPerTokenStored; } } } function updateRewardPerTokenStored(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; pool.rewardPerTokenStored = rewardPerToken(_pid); pool.lastUpdateTime = lastTimeRewardsActive(_pid); } function lastTimeRewardsActive(uint256 _pid) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; return Math.min(block.timestamp, pool.periodFinish); } function endTime(uint256 _pid) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; return pool.periodFinish; } function poolLength() public view returns (uint256) { return poolInfo.length; } function rewardPerToken(uint256 _pid) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; // Do not distribute rewards before startTime. if (block.timestamp < pool.startTime) { return 0; } if (totalSupply == 0) { return pool.rewardPerTokenStored; } // The returrn value is time-based on last time the contract had rewards active // multiplied by the reward-rate and it's evened out with a division of bonus effective supply. return pool.rewardPerTokenStored + (pool.rewardRate * (lastTimeRewardsActive(_pid) - pool.lastUpdateTime) * stakingTokenMultiplier) / totalSupply; } function earned(address account, uint256 _pid) public view returns (uint256) { uint256 reward = rewardsInPool[_pid][account].rewards; uint256 rewardPerTokenPaid = rewardsInPool[_pid][account].userRewardPerTokenPaid; return ((_balances[account] * (rewardPerToken(_pid) - rewardPerTokenPaid)) / stakingTokenMultiplier) + reward; } function stake(uint256 amount) public nonReentrant { require(amount > 0, "Cannot stake 0"); updateReward(msg.sender); // Transfer staking token from caller to contract stakingToken.safeTransferFrom(msg.sender, address(this), amount); // Increment sender's balances and total supply if (tokenFee > 0) { uint256 tokenFeeBalance = amount * tokenFee / 10000; uint256 stakedBalance = amount - tokenFeeBalance; _balances[msg.sender] += stakedBalance; totalSupply += stakedBalance; } else { _balances[msg.sender] += amount; totalSupply += amount; } emit Staked(msg.sender, amount); } function withdraw(uint256 amount) public nonReentrant { require(amount > 0, "Cannot withdraw 0"); updateReward(msg.sender); // Reduce sender's balances and total supply totalSupply -= amount; _balances[msg.sender] -= amount; // Calculate the withdraw tax uint256 tax = amount * devFee / 10000; // Transfer the tokens to user stakingToken.safeTransfer(msg.sender, amount - tax); // Tax to treasury stakingToken.safeTransfer(treasury, tax); emit Withdrawn(msg.sender, amount); } function exit() external nonReentrant { withdraw(balanceOf(msg.sender)); } function getReward() public nonReentrant { updateReward(msg.sender); uint256 arraysize = poolInfo.length; // loop through all the reward pools for a user for (uint256 i = 0; i < arraysize; i++) { PoolInfo storage pool = poolInfo[i]; uint256 reward = rewardsInPool[i][msg.sender].rewards; if (address(pool.rewardToken) == address(0) || reward == 0) { continue; } else { rewardsInPool[i][msg.sender].rewards = 0; pool.rewardToken.safeTransfer(msg.sender, reward); emit RewardPaid( msg.sender, address(pool.rewardToken), reward ); } } } function getRewardCompound() public { updateReward(msg.sender); // loop through all the reward pools for a user for (uint256 i = 0; i < poolInfo.length; i++) { PoolInfo storage pool = poolInfo[i]; uint256 reward = rewardsInPool[i][msg.sender].rewards; if (address(pool.rewardToken) == address(0) || reward == 0) { continue; } else { rewardsInPool[i][msg.sender].rewards = 0; if (address(pool.rewardToken) == address(stakingToken)) { stake(reward); } else { pool.rewardToken.safeTransfer(msg.sender, reward); emit RewardPaid( msg.sender, address(pool.rewardToken), reward ); } } } } function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function addRewardPool(IERC20Metadata _rewardToken) public onlyOwner { require(address(_rewardToken) != address(0), "Cannot add burn address"); require( !addedRewardTokens[address(_rewardToken)], "Token already added" ); // calculate info relevant for storing in the pool array uint256 totalPools = poolInfo.length; uint256 _rewardTokenID = totalPools++; poolInfo.push( PoolInfo({ rewardToken: _rewardToken, rewardPoolID: _rewardTokenID, duration: 0, periodFinish: 0, startTime: 0, lastUpdateTime: 0, rewardRate: 0, rewardPerTokenStored: 0 }) ); addedRewardTokens[address(_rewardToken)] = true; emit RewardPoolAdded(_rewardTokenID, address(_rewardToken)); } function extendRewardPool(uint256 _pid, uint256 _reward, uint256 _duration) external onlyOwner { require(_reward > 0, "Can not add zero balance"); require(_duration > 0, "Must define valid duration length"); PoolInfo storage pool = poolInfo[_pid]; uint256 timeNow = block.timestamp; uint256 rewardsRemaining; uint256 totalRewards; // Transfer reward token from caller to contract pool.rewardToken.safeTransferFrom( msg.sender, address(this), _reward ); // Update reward per token stored value + last updated value updateRewardPerTokenStored(_pid); // Update duration of pool pool.duration = _duration; // Update reward rate // if pool has already finished if (timeNow > pool.periodFinish) { pool.rewardRate = _reward / _duration; totalRewards = _reward; } else { // if pool has not finished yet // Remaining time for the pool uint256 remainingTime = pool.periodFinish - timeNow; // And the rewards rewardsRemaining = remainingTime * pool.rewardRate; // Find new amount of rewards in pool totalRewards = rewardsRemaining + _reward; // Set the current rate pool.rewardRate = totalRewards / pool.duration; } // Set the last updated time pool.lastUpdateTime = timeNow; // Add the period to be equal to duration set pool.periodFinish = timeNow + pool.duration; emit RewardPoolExtended( _pid, address(pool.rewardToken), rewardsRemaining, _reward, totalRewards, pool.duration, pool.periodFinish ); } function startRewardPool(uint256 _pid, uint256 _reward, uint256 _duration) external onlyOwner { require(_reward > 0, "Can not add zero balance"); require(_duration > 0, "Must define valid duration length"); PoolInfo storage pool = poolInfo[_pid]; uint256 timeNow = block.timestamp; // Transfer reward token from caller to contract pool.rewardToken.safeTransferFrom( msg.sender, address(this), _reward ); // Set reward values updateRewardPerTokenStored(_pid); // Set duration of pool pool.duration = _duration; // Set the current rate pool.rewardRate = _reward / pool.duration; // Set the last updated time pool.lastUpdateTime = timeNow; // Set the initial start time pool.startTime = timeNow; // Add the period to be equal to duration set pool.periodFinish = timeNow + pool.duration; emit RewardPoolStarted( _pid, address(pool.rewardToken), _reward, pool.duration, pool.periodFinish ); } function eject(uint256 _pid) public onlyOwner { PoolInfo storage pool = poolInfo[_pid]; require(block.timestamp >= pool.periodFinish + 7 days, "Can only eject 7 days after pool has finished" ); uint256 currBalance = pool.rewardToken.balanceOf(address(this)); // If Staking Token = Reward Token of Pool, do not withdraw the users staked tokens if (address(stakingToken) == address(pool.rewardToken)) { currBalance = currBalance - totalSupply; } pool.rewardToken.safeTransfer(msg.sender, currBalance); } function ejectAll() public onlyOwner { // loop through all reward pools to eject all for (uint256 i = 0; i < poolInfo.length; i++) { PoolInfo storage pool = poolInfo[i]; if (address(pool.rewardToken) == address(0)) { continue; } else { eject(i); } } } function setNewTreasury(address _treasury) external onlyOwner { treasury = _treasury; } function kill(uint256 _pid) external onlyOwner { PoolInfo storage pool = poolInfo[_pid]; pool.periodFinish = block.timestamp; } function emergencyWithdraw(address tokenAddress, uint256 tokenAmount) external onlyOwner { IERC20Metadata(tokenAddress).safeTransfer(msg.sender, tokenAmount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_tokenFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPoolID","type":"uint256"},{"indexed":false,"internalType":"address","name":"rewardTokenAddress","type":"address"}],"name":"RewardPoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPoolID","type":"uint256"},{"indexed":false,"internalType":"address","name":"rewardTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldRewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalRewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPeriodFinish","type":"uint256"}],"name":"RewardPoolExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPoolID","type":"uint256"},{"indexed":false,"internalType":"address","name":"rewardTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPeriodFinish","type":"uint256"}],"name":"RewardPoolStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"_rewardToken","type":"address"}],"name":"addRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addedRewardTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"eject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ejectAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_reward","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"extendRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"lastTimeRewardsActive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20Metadata","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"rewardPoolID","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"rewardsInPool","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"userRewardPerTokenPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setNewTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingTokenMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_reward","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"startRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b50604051620023c5380380620023c58339810160408190526200003591620001c8565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556001600160a01b038416158015906200009b57506001600160a01b03831615155b620000db5760405162461bcd60e51b815260206004820152600c60248201526b10b1b7b739ba393ab1ba37b960a11b604482015260640160405180910390fd5b60c0829052606084901b6001600160601b031916608052600380546001600160a01b0319166001600160a01b038581169190911790915560e08290526040805163313ce56760e01b815290519186169163313ce56791600480820192602092909190829003018186803b1580156200015257600080fd5b505afa15801562000167573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018d91906200020f565b6200019d9060ff16600a62000282565b60a052506200035692505050565b80516001600160a01b0381168114620001c357600080fd5b919050565b60008060008060808587031215620001de578384fd5b620001e985620001ab565b9350620001f960208601620001ab565b6040860151606090960151949790965092505050565b60006020828403121562000221578081fd5b815160ff8116811462000232578182fd5b9392505050565b600181815b808511156200027a5781600019048211156200025e576200025e62000340565b808516156200026c57918102915b93841c93908002906200023e565b509250929050565b60006200023283836000826200029b575060016200033a565b81620002aa575060006200033a565b8160018114620002c35760028114620002ce57620002ee565b60019150506200033a565b60ff841115620002e257620002e262000340565b50506001821b6200033a565b5060208310610133831016604e8410600b841016171562000313575081810a6200033a565b6200031f838362000239565b806000190482111562000336576200033662000340565b0290505b92915050565b634e487b7160e01b600052601160045260246000fd5b60805160601c60a05160c05160e051611fec620003d9600039600081816102f1015281816111ca01526111f8015260008181610356015261063201526000818161048b0152818161088c0152610dd70152600081816103ae0152818161067b015281816106b301528181611025015281816111a001526116830152611fec6000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806375c379971161010f5780639eade652116100a2578063c373417d11610071578063c373417d146104db578063d29a0025146104e3578063e9fad8ee146104f6578063f2fde38b146104fe57600080fd5b80639eade65214610486578063a655c983146104ad578063a694fc3a146104b5578063a6c3b8e8146104c857600080fd5b80638da5cb5b116100de5780638da5cb5b1461043c5780638f9a372d1461044d57806395ccea67146104605780639796fdfc1461047357600080fd5b806375c37997146103d05780637cd84175146103e3578063860545ad14610416578063874c120b1461042957600080fd5b806344c816fa116101875780636827e764116101565780636827e7641461035157806370a0823114610378578063715018a6146103a157806372f702f3146103a957600080fd5b806344c816fa146102d957806345599136146102ec5780634e601c751461031357806361d027b31461032657600080fd5b80632e1a7d4d116101c35780632e1a7d4d14610262578063392966d1146102775780633d18b912146102be5780633e491d47146102c657600080fd5b8063081e3eda146101ea5780631526fe271461020157806318160ddd14610259575b600080fd5b6004545b6040519081526020015b60405180910390f35b61021461020f366004611d50565b610511565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101f8565b6101ee60025481565b610275610270366004611d50565b610571565b005b6102a9610285366004611d80565b60076020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101f8565b610275610719565b6101ee6102d4366004611d05565b61085f565b6101ee6102e7366004611d50565b6108ff565b6101ee7f000000000000000000000000000000000000000000000000000000000000000081565b610275610321366004611daf565b61093e565b600354610339906001600160a01b031681565b6040516001600160a01b0390911681526020016101f8565b6101ee7f000000000000000000000000000000000000000000000000000000000000000081565b6101ee610386366004611ce9565b6001600160a01b031660009081526005602052604090205490565b610275610b30565b6103397f000000000000000000000000000000000000000000000000000000000000000081565b6102756103de366004611daf565b610ba4565b6104066103f1366004611ce9565b60066020526000908152604090205460ff1681565b60405190151581526020016101f8565b6101ee610424366004611d50565b610d2f565b6101ee610437366004611d50565b610d78565b6000546001600160a01b0316610339565b61027561045b366004611ce9565b610e40565b61027561046e366004611d05565b610e8c565b610275610481366004611d50565b610ece565b6101ee7f000000000000000000000000000000000000000000000000000000000000000081565b610275611082565b6102756104c3366004611d50565b611124565b6102756104d6366004611ce9565b6112f9565b6102756115e1565b6102756104f1366004611d50565b611736565b6102756117a0565b61027561050c366004611ce9565b6117e7565b6004818154811061052157600080fd5b6000918252602090912060089091020180546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b0390961697509395929491939092909188565b6002600154141561059d5760405162461bcd60e51b815260040161059490611e9f565b60405180910390fd5b6002600155806105e35760405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b6044820152606401610594565b6105ec336118d1565b80600260008282546105fe9190611f2d565b90915550503360009081526005602052604081208054839290610622908490611f2d565b90915550600090506127106106577f000000000000000000000000000000000000000000000000000000000000000084611f0e565b6106619190611eee565b90506106a2336106718385611f2d565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611980565b6003546106dc906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683611980565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a2505060018055565b6002600154141561073c5760405162461bcd60e51b815260040161059490611e9f565b600260015561074a336118d1565b60045460005b818110156108575760006004828154811061077b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320858452600782526040808520338652909252922054600890910290910180549092506001600160a01b031615806107ba575080155b156107c6575050610845565b600083815260076020908152604080832033808552925282209190915582546107fb916001600160a01b039091169083611980565b8154604080516001600160a01b0390921682526020820183905233917f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e910160405180910390a250505b8061084f81611f70565b915050610750565b505060018055565b60008181526007602090815260408083206001600160a01b038616845290915281208054600190910154817f0000000000000000000000000000000000000000000000000000000000000000826108b587610d78565b6108bf9190611f2d565b6001600160a01b0388166000908152600560205260409020546108e29190611f0e565b6108ec9190611eee565b6108f69190611ed6565b95945050505050565b6000806004838154811061092357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360089092020101549392505050565b6000546001600160a01b031633146109685760405162461bcd60e51b815260040161059490611e6a565b600082116109b35760405162461bcd60e51b815260206004820152601860248201527743616e206e6f7420616464207a65726f2062616c616e636560401b6044820152606401610594565b600081116109d35760405162461bcd60e51b815260040161059490611e29565b6000600484815481106109f657634e487b7160e01b600052603260045260246000fd5b60009182526020822060089091020180549092504291908190610a24906001600160a01b03163330896119e3565b610a2d87611a21565b600284018590556003840154831115610a5657610a4a8587611eee565b60068501555084610a9f565b6000838560030154610a689190611f2d565b9050846006015481610a7a9190611f0e565b9250610a868784611ed6565b9150846002015482610a989190611eee565b6006860155505b600584018390556002840154610ab59084611ed6565b6003850181905584546002860154604080518b81526001600160a01b0390931660208401528201859052606082018990526080820184905260a082015260c08101919091527fc49c60b873b49c445468a5faf6b57454be129e6c33068d1bd214b1a9171545ae9060e00160405180910390a150505050505050565b6000546001600160a01b03163314610b5a5760405162461bcd60e51b815260040161059490611e6a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610bce5760405162461bcd60e51b815260040161059490611e6a565b60008211610c195760405162461bcd60e51b815260206004820152601860248201527743616e206e6f7420616464207a65726f2062616c616e636560401b6044820152606401610594565b60008111610c395760405162461bcd60e51b815260040161059490611e29565b600060048481548110610c5c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912060089091020180549091504290610c88906001600160a01b03163330876119e3565b610c9185611a21565b60028201839055610ca28385611eee565b600683015560058201819055600482018190556002820154610cc49082611ed6565b6003830181905582546002840154604080518981526001600160a01b0390931660208401528201879052606082015260808101919091527f56b29ba67dc4d82c6fe031578818821698a089d836b01b90a3fc8925510c9a089060a00160405180910390a15050505050565b60008060048381548110610d5357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802019050610d71428260030154611a74565b9392505050565b60008060048381548110610d9c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020190508060040154421015610dc15750600092915050565b600254610dd2576007015492915050565b6002547f00000000000000000000000000000000000000000000000000000000000000008260050154610e0486610d2f565b610e0e9190611f2d565b8360060154610e1d9190611f0e565b610e279190611f0e565b610e319190611eee565b8160070154610d719190611ed6565b6000546001600160a01b03163314610e6a5760405162461bcd60e51b815260040161059490611e6a565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610eb65760405162461bcd60e51b815260040161059490611e6a565b610eca6001600160a01b0383163383611980565b5050565b6000546001600160a01b03163314610ef85760405162461bcd60e51b815260040161059490611e6a565b600060048281548110610f1b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802019050806003015462093a80610f3e9190611ed6565b421015610fa35760405162461bcd60e51b815260206004820152602d60248201527f43616e206f6e6c7920656a6563742037206461797320616674657220706f6f6c60448201526c081a185cc8199a5b9a5cda1959609a1b6064820152608401610594565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610fe657600080fd5b505afa158015610ffa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101e9190611d68565b82549091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161415611067576002546110649082611f2d565b90505b815461107d906001600160a01b03163383611980565b505050565b6000546001600160a01b031633146110ac5760405162461bcd60e51b815260040161059490611e6a565b60005b600454811015611121576000600482815481106110dc57634e487b7160e01b600052603260045260246000fd5b6000918252602090912060089091020180549091506001600160a01b0316611104575061110f565b61110d82610ece565b505b8061111981611f70565b9150506110af565b50565b600260015414156111475760405162461bcd60e51b815260040161059490611e9f565b60026001558061118a5760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606401610594565b611193336118d1565b6111c86001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846119e3565b7f00000000000000000000000000000000000000000000000000000000000000001561127f57600061271061121d7f000000000000000000000000000000000000000000000000000000000000000084611f0e565b6112279190611eee565b905060006112358284611f2d565b33600090815260056020526040812080549293508392909190611259908490611ed6565b9250508190555080600260008282546112729190611ed6565b909155506112bd92505050565b336000908152600560205260408120805483929061129e908490611ed6565b9250508190555080600260008282546112b79190611ed6565b90915550505b60405181815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a25060018055565b6000546001600160a01b031633146113235760405162461bcd60e51b815260040161059490611e6a565b6001600160a01b0381166113795760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420616464206275726e20616464726573730000000000000000006044820152606401610594565b6001600160a01b03811660009081526006602052604090205460ff16156113d85760405162461bcd60e51b8152602060048201526013602482015272151bdad95b88185b1c9958591e481859191959606a1b6044820152606401610594565b6004546000816113e781611f70565b60408051610100810182526001600160a01b0387811680835260208084018781526000858701818152606087018281526080880183815260a0890184815260c08a0185815260e08b0186815260048054600180820183559189529c517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b6008909e029d8e0180546001600160a01b03191691909d1617909b5596517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c8c015593517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d8b015591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e8a0155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f890155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a0880155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a187015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a2909501949094558184526006815292849020805460ff19169092179091558251858152918201529194509192507ff1b7350f6f1384cccc8d5e3b392828df8a218cde20a7d3dd78c3a17840e8d613910160405180910390a1505050565b6115ea336118d1565b60005b6004548110156111215760006004828154811061161a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320858452600782526040808520338652909252922054600890910290910180549092506001600160a01b03161580611659575080155b15611665575050611724565b600083815260076020908152604080832033845290915281205581547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116911614156116c3576116be81611124565b611721565b81546116d9906001600160a01b03163383611980565b8154604080516001600160a01b0390921682526020820183905233917f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e910160405180910390a25b50505b8061172e81611f70565b9150506115ed565b6000546001600160a01b031633146117605760405162461bcd60e51b815260040161059490611e6a565b60006004828154811061178357634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020190504281600301819055505050565b600260015414156117c35760405162461bcd60e51b815260040161059490611e9f565b6002600155336000908152600560205260409020546117e190610571565b60018055565b6000546001600160a01b031633146118115760405162461bcd60e51b815260040161059490611e6a565b6001600160a01b0381166118765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610594565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60005b600454811015610eca5760006004828154811061190157634e487b7160e01b600052603260045260246000fd5b6000918252602090912060089091020180549091506001600160a01b0316611929575061196e565b61193282611a21565b61193c838361085f565b60008381526007602081815260408084206001600160a01b038916855290915290912091825591909101546001909101555b8061197881611f70565b9150506118d4565b6040516001600160a01b03831660248201526044810182905261107d90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a8a565b6040516001600160a01b0380851660248301528316604482015260648101829052611a1b9085906323b872dd60e01b906084016119ac565b50505050565b600060048281548110611a4457634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802019050611a5d82610d78565b6007820155611a6b82610d2f565b60059091015550565b6000818310611a835781610d71565b5090919050565b6000611adf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611b5c9092919063ffffffff16565b80519091501561107d5780806020019051810190611afd9190611d30565b61107d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610594565b6060611b6b8484600085611b73565b949350505050565b606082471015611bd45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610594565b600080866001600160a01b03168587604051611bf09190611dda565b60006040518083038185875af1925050503d8060008114611c2d576040519150601f19603f3d011682016040523d82523d6000602084013e611c32565b606091505b5091509150611c4387838387611c4e565b979650505050505050565b60608315611cba578251611cb3576001600160a01b0385163b611cb35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610594565b5081611b6b565b611b6b8383815115611ccf5781518083602001fd5b8060405162461bcd60e51b81526004016105949190611df6565b600060208284031215611cfa578081fd5b8135610d7181611fa1565b60008060408385031215611d17578081fd5b8235611d2281611fa1565b946020939093013593505050565b600060208284031215611d41578081fd5b81518015158114610d71578182fd5b600060208284031215611d61578081fd5b5035919050565b600060208284031215611d79578081fd5b5051919050565b60008060408385031215611d92578182fd5b823591506020830135611da481611fa1565b809150509250929050565b600080600060608486031215611dc3578081fd5b505081359360208301359350604090920135919050565b60008251611dec818460208701611f44565b9190910192915050565b6020815260008251806020840152611e15816040850160208701611f44565b601f01601f19169190910160400192915050565b60208082526021908201527f4d75737420646566696e652076616c6964206475726174696f6e206c656e67746040820152600d60fb1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115611ee957611ee9611f8b565b500190565b600082611f0957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611f2857611f28611f8b565b500290565b600082821015611f3f57611f3f611f8b565b500390565b60005b83811015611f5f578181015183820152602001611f47565b83811115611a1b5750506000910152565b6000600019821415611f8457611f84611f8b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461112157600080fdfea26469706673582212200e61ff9c1f05d81a19b39fbc9d81b64d3be6a02adf7468bdef1e9227487d1eca64736f6c634300080400330000000000000000000000003001f57f8308b189eb412a64322aad5ef99512900000000000000000000000003001f57f8308b189eb412a64322aad5ef995129000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806375c379971161010f5780639eade652116100a2578063c373417d11610071578063c373417d146104db578063d29a0025146104e3578063e9fad8ee146104f6578063f2fde38b146104fe57600080fd5b80639eade65214610486578063a655c983146104ad578063a694fc3a146104b5578063a6c3b8e8146104c857600080fd5b80638da5cb5b116100de5780638da5cb5b1461043c5780638f9a372d1461044d57806395ccea67146104605780639796fdfc1461047357600080fd5b806375c37997146103d05780637cd84175146103e3578063860545ad14610416578063874c120b1461042957600080fd5b806344c816fa116101875780636827e764116101565780636827e7641461035157806370a0823114610378578063715018a6146103a157806372f702f3146103a957600080fd5b806344c816fa146102d957806345599136146102ec5780634e601c751461031357806361d027b31461032657600080fd5b80632e1a7d4d116101c35780632e1a7d4d14610262578063392966d1146102775780633d18b912146102be5780633e491d47146102c657600080fd5b8063081e3eda146101ea5780631526fe271461020157806318160ddd14610259575b600080fd5b6004545b6040519081526020015b60405180910390f35b61021461020f366004611d50565b610511565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101f8565b6101ee60025481565b610275610270366004611d50565b610571565b005b6102a9610285366004611d80565b60076020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101f8565b610275610719565b6101ee6102d4366004611d05565b61085f565b6101ee6102e7366004611d50565b6108ff565b6101ee7f000000000000000000000000000000000000000000000000000000000000000081565b610275610321366004611daf565b61093e565b600354610339906001600160a01b031681565b6040516001600160a01b0390911681526020016101f8565b6101ee7f000000000000000000000000000000000000000000000000000000000000006481565b6101ee610386366004611ce9565b6001600160a01b031660009081526005602052604090205490565b610275610b30565b6103397f0000000000000000000000003001f57f8308b189eb412a64322aad5ef995129081565b6102756103de366004611daf565b610ba4565b6104066103f1366004611ce9565b60066020526000908152604090205460ff1681565b60405190151581526020016101f8565b6101ee610424366004611d50565b610d2f565b6101ee610437366004611d50565b610d78565b6000546001600160a01b0316610339565b61027561045b366004611ce9565b610e40565b61027561046e366004611d05565b610e8c565b610275610481366004611d50565b610ece565b6101ee7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b610275611082565b6102756104c3366004611d50565b611124565b6102756104d6366004611ce9565b6112f9565b6102756115e1565b6102756104f1366004611d50565b611736565b6102756117a0565b61027561050c366004611ce9565b6117e7565b6004818154811061052157600080fd5b6000918252602090912060089091020180546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b0390961697509395929491939092909188565b6002600154141561059d5760405162461bcd60e51b815260040161059490611e9f565b60405180910390fd5b6002600155806105e35760405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b6044820152606401610594565b6105ec336118d1565b80600260008282546105fe9190611f2d565b90915550503360009081526005602052604081208054839290610622908490611f2d565b90915550600090506127106106577f000000000000000000000000000000000000000000000000000000000000006484611f0e565b6106619190611eee565b90506106a2336106718385611f2d565b6001600160a01b037f0000000000000000000000003001f57f8308b189eb412a64322aad5ef9951290169190611980565b6003546106dc906001600160a01b037f0000000000000000000000003001f57f8308b189eb412a64322aad5ef99512908116911683611980565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a2505060018055565b6002600154141561073c5760405162461bcd60e51b815260040161059490611e9f565b600260015561074a336118d1565b60045460005b818110156108575760006004828154811061077b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320858452600782526040808520338652909252922054600890910290910180549092506001600160a01b031615806107ba575080155b156107c6575050610845565b600083815260076020908152604080832033808552925282209190915582546107fb916001600160a01b039091169083611980565b8154604080516001600160a01b0390921682526020820183905233917f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e910160405180910390a250505b8061084f81611f70565b915050610750565b505060018055565b60008181526007602090815260408083206001600160a01b038616845290915281208054600190910154817f0000000000000000000000000000000000000000000000000de0b6b3a7640000826108b587610d78565b6108bf9190611f2d565b6001600160a01b0388166000908152600560205260409020546108e29190611f0e565b6108ec9190611eee565b6108f69190611ed6565b95945050505050565b6000806004838154811061092357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600360089092020101549392505050565b6000546001600160a01b031633146109685760405162461bcd60e51b815260040161059490611e6a565b600082116109b35760405162461bcd60e51b815260206004820152601860248201527743616e206e6f7420616464207a65726f2062616c616e636560401b6044820152606401610594565b600081116109d35760405162461bcd60e51b815260040161059490611e29565b6000600484815481106109f657634e487b7160e01b600052603260045260246000fd5b60009182526020822060089091020180549092504291908190610a24906001600160a01b03163330896119e3565b610a2d87611a21565b600284018590556003840154831115610a5657610a4a8587611eee565b60068501555084610a9f565b6000838560030154610a689190611f2d565b9050846006015481610a7a9190611f0e565b9250610a868784611ed6565b9150846002015482610a989190611eee565b6006860155505b600584018390556002840154610ab59084611ed6565b6003850181905584546002860154604080518b81526001600160a01b0390931660208401528201859052606082018990526080820184905260a082015260c08101919091527fc49c60b873b49c445468a5faf6b57454be129e6c33068d1bd214b1a9171545ae9060e00160405180910390a150505050505050565b6000546001600160a01b03163314610b5a5760405162461bcd60e51b815260040161059490611e6a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610bce5760405162461bcd60e51b815260040161059490611e6a565b60008211610c195760405162461bcd60e51b815260206004820152601860248201527743616e206e6f7420616464207a65726f2062616c616e636560401b6044820152606401610594565b60008111610c395760405162461bcd60e51b815260040161059490611e29565b600060048481548110610c5c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912060089091020180549091504290610c88906001600160a01b03163330876119e3565b610c9185611a21565b60028201839055610ca28385611eee565b600683015560058201819055600482018190556002820154610cc49082611ed6565b6003830181905582546002840154604080518981526001600160a01b0390931660208401528201879052606082015260808101919091527f56b29ba67dc4d82c6fe031578818821698a089d836b01b90a3fc8925510c9a089060a00160405180910390a15050505050565b60008060048381548110610d5357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802019050610d71428260030154611a74565b9392505050565b60008060048381548110610d9c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020190508060040154421015610dc15750600092915050565b600254610dd2576007015492915050565b6002547f0000000000000000000000000000000000000000000000000de0b6b3a76400008260050154610e0486610d2f565b610e0e9190611f2d565b8360060154610e1d9190611f0e565b610e279190611f0e565b610e319190611eee565b8160070154610d719190611ed6565b6000546001600160a01b03163314610e6a5760405162461bcd60e51b815260040161059490611e6a565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610eb65760405162461bcd60e51b815260040161059490611e6a565b610eca6001600160a01b0383163383611980565b5050565b6000546001600160a01b03163314610ef85760405162461bcd60e51b815260040161059490611e6a565b600060048281548110610f1b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802019050806003015462093a80610f3e9190611ed6565b421015610fa35760405162461bcd60e51b815260206004820152602d60248201527f43616e206f6e6c7920656a6563742037206461797320616674657220706f6f6c60448201526c081a185cc8199a5b9a5cda1959609a1b6064820152608401610594565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610fe657600080fd5b505afa158015610ffa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101e9190611d68565b82549091507f0000000000000000000000003001f57f8308b189eb412a64322aad5ef99512906001600160a01b0390811691161415611067576002546110649082611f2d565b90505b815461107d906001600160a01b03163383611980565b505050565b6000546001600160a01b031633146110ac5760405162461bcd60e51b815260040161059490611e6a565b60005b600454811015611121576000600482815481106110dc57634e487b7160e01b600052603260045260246000fd5b6000918252602090912060089091020180549091506001600160a01b0316611104575061110f565b61110d82610ece565b505b8061111981611f70565b9150506110af565b50565b600260015414156111475760405162461bcd60e51b815260040161059490611e9f565b60026001558061118a5760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606401610594565b611193336118d1565b6111c86001600160a01b037f0000000000000000000000003001f57f8308b189eb412a64322aad5ef9951290163330846119e3565b7f00000000000000000000000000000000000000000000000000000000000000001561127f57600061271061121d7f000000000000000000000000000000000000000000000000000000000000000084611f0e565b6112279190611eee565b905060006112358284611f2d565b33600090815260056020526040812080549293508392909190611259908490611ed6565b9250508190555080600260008282546112729190611ed6565b909155506112bd92505050565b336000908152600560205260408120805483929061129e908490611ed6565b9250508190555080600260008282546112b79190611ed6565b90915550505b60405181815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a25060018055565b6000546001600160a01b031633146113235760405162461bcd60e51b815260040161059490611e6a565b6001600160a01b0381166113795760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420616464206275726e20616464726573730000000000000000006044820152606401610594565b6001600160a01b03811660009081526006602052604090205460ff16156113d85760405162461bcd60e51b8152602060048201526013602482015272151bdad95b88185b1c9958591e481859191959606a1b6044820152606401610594565b6004546000816113e781611f70565b60408051610100810182526001600160a01b0387811680835260208084018781526000858701818152606087018281526080880183815260a0890184815260c08a0185815260e08b0186815260048054600180820183559189529c517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b6008909e029d8e0180546001600160a01b03191691909d1617909b5596517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c8c015593517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d8b015591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e8a0155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f890155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a0880155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a187015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a2909501949094558184526006815292849020805460ff19169092179091558251858152918201529194509192507ff1b7350f6f1384cccc8d5e3b392828df8a218cde20a7d3dd78c3a17840e8d613910160405180910390a1505050565b6115ea336118d1565b60005b6004548110156111215760006004828154811061161a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320858452600782526040808520338652909252922054600890910290910180549092506001600160a01b03161580611659575080155b15611665575050611724565b600083815260076020908152604080832033845290915281205581547f0000000000000000000000003001f57f8308b189eb412a64322aad5ef99512906001600160a01b03908116911614156116c3576116be81611124565b611721565b81546116d9906001600160a01b03163383611980565b8154604080516001600160a01b0390921682526020820183905233917f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e910160405180910390a25b50505b8061172e81611f70565b9150506115ed565b6000546001600160a01b031633146117605760405162461bcd60e51b815260040161059490611e6a565b60006004828154811061178357634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020190504281600301819055505050565b600260015414156117c35760405162461bcd60e51b815260040161059490611e9f565b6002600155336000908152600560205260409020546117e190610571565b60018055565b6000546001600160a01b031633146118115760405162461bcd60e51b815260040161059490611e6a565b6001600160a01b0381166118765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610594565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60005b600454811015610eca5760006004828154811061190157634e487b7160e01b600052603260045260246000fd5b6000918252602090912060089091020180549091506001600160a01b0316611929575061196e565b61193282611a21565b61193c838361085f565b60008381526007602081815260408084206001600160a01b038916855290915290912091825591909101546001909101555b8061197881611f70565b9150506118d4565b6040516001600160a01b03831660248201526044810182905261107d90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a8a565b6040516001600160a01b0380851660248301528316604482015260648101829052611a1b9085906323b872dd60e01b906084016119ac565b50505050565b600060048281548110611a4457634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802019050611a5d82610d78565b6007820155611a6b82610d2f565b60059091015550565b6000818310611a835781610d71565b5090919050565b6000611adf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611b5c9092919063ffffffff16565b80519091501561107d5780806020019051810190611afd9190611d30565b61107d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610594565b6060611b6b8484600085611b73565b949350505050565b606082471015611bd45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610594565b600080866001600160a01b03168587604051611bf09190611dda565b60006040518083038185875af1925050503d8060008114611c2d576040519150601f19603f3d011682016040523d82523d6000602084013e611c32565b606091505b5091509150611c4387838387611c4e565b979650505050505050565b60608315611cba578251611cb3576001600160a01b0385163b611cb35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610594565b5081611b6b565b611b6b8383815115611ccf5781518083602001fd5b8060405162461bcd60e51b81526004016105949190611df6565b600060208284031215611cfa578081fd5b8135610d7181611fa1565b60008060408385031215611d17578081fd5b8235611d2281611fa1565b946020939093013593505050565b600060208284031215611d41578081fd5b81518015158114610d71578182fd5b600060208284031215611d61578081fd5b5035919050565b600060208284031215611d79578081fd5b5051919050565b60008060408385031215611d92578182fd5b823591506020830135611da481611fa1565b809150509250929050565b600080600060608486031215611dc3578081fd5b505081359360208301359350604090920135919050565b60008251611dec818460208701611f44565b9190910192915050565b6020815260008251806020840152611e15816040850160208701611f44565b601f01601f19169190910160400192915050565b60208082526021908201527f4d75737420646566696e652076616c6964206475726174696f6e206c656e67746040820152600d60fb1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115611ee957611ee9611f8b565b500190565b600082611f0957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611f2857611f28611f8b565b500290565b600082821015611f3f57611f3f611f8b565b500390565b60005b83811015611f5f578181015183820152602001611f47565b83811115611a1b5750506000910152565b6000600019821415611f8457611f84611f8b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461112157600080fdfea26469706673582212200e61ff9c1f05d81a19b39fbc9d81b64d3be6a02adf7468bdef1e9227487d1eca64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003001f57f8308b189eb412a64322aad5ef99512900000000000000000000000003001f57f8308b189eb412a64322aad5ef995129000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x3001f57F8308b189EB412a64322Aad5eF9951290
Arg [1] : _treasury (address): 0x3001f57F8308b189EB412a64322Aad5eF9951290
Arg [2] : _devFee (uint256): 100
Arg [3] : _tokenFee (uint256): 0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000003001f57f8308b189eb412a64322aad5ef9951290
Arg [1] : 0000000000000000000000003001f57f8308b189eb412a64322aad5ef9951290
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
22756:13855:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26352:93;26422:8;:15;26352:93;;;9943:25:1;;;9931:2;9916:18;26352:93:0;;;;;;;;23565:26;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4198:32:1;;;4180:51;;4262:2;4247:18;;4240:34;;;;4290:18;;;4283:34;;;;4348:2;4333:18;;4326:34;;;;4391:3;4376:19;;4369:35;4218:3;4420:19;;4413:35;4479:3;4464:19;;4457:35;4523:3;4508:19;;4501:35;4167:3;4152:19;23565:26:0;4134:408:1;23059:26:0;;;;;;28470:597;;;;;;:::i;:::-;;:::i;:::-;;23709:75;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11564:25:1;;;11620:2;11605:18;;11598:34;;;;11537:18;23709:75:0;11519:119:1;29171:836:0;;;:::i;27254:446::-;;;;;;:::i;:::-;;:::i;26189:155::-;;;;;;:::i;:::-;;:::i;23006:33::-;;;;;32042:1902;;;;;;:::i;:::-;;:::i;23141:23::-;;;;;-1:-1:-1;;;;;23141:23:0;;;;;;-1:-1:-1;;;;;2690:32:1;;;2672:51;;2660:2;2645:18;23141:23:0;2627:102:1;22953:31:0;;;;;30970:110;;;;;;:::i;:::-;-1:-1:-1;;;;;31054:18:0;31027:7;31054:18;;;:9;:18;;;;;;;30970:110;3163:148;;;:::i;22848:44::-;;;;;33952:1201;;;;;;:::i;:::-;;:::i;23653:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3558:14:1;;3551:22;3533:41;;3521:2;3506:18;23653:49:0;3488:92:1;25987:194:0;;;;;;:::i;:::-;;:::i;26453:793::-;;;;;;:::i;:::-;;:::i;2512:87::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;2512:87;;36158:101;;;;;;:::i;:::-;;:::i;36427:179::-;;;;;;:::i;:::-;;:::i;35161:610::-;;;;;;:::i;:::-;;:::i;22899:47::-;;;;;35779:371;;;:::i;27708:754::-;;;;;;:::i;:::-;;:::i;31088:946::-;;;;;;:::i;:::-;;:::i;30015:947::-;;;:::i;36267:152::-;;;;;;:::i;:::-;;:::i;29075:88::-;;;:::i;3466:244::-;;;;;;:::i;:::-;;:::i;23565:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23565:26:0;;;;-1:-1:-1;23565:26:0;;;;;;;;;;;:::o;28470:597::-;21709:1;22306:7;;:19;;22298:63;;;;-1:-1:-1;;;22298:63:0;;;;;;;:::i;:::-;;;;;;;;;21709:1;22439:7;:18;28543:10;28535:40:::1;;;::::0;-1:-1:-1;;;28535:40:0;;6646:2:1;28535:40:0::1;::::0;::::1;6628:21:1::0;6685:2;6665:18;;;6658:30;-1:-1:-1;;;6704:18:1;;;6697:47;6761:18;;28535:40:0::1;6618:167:1::0;28535:40:0::1;28586:24;28599:10;28586:12;:24::i;:::-;28692:6;28677:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;28719:10:0::1;28709:21;::::0;;;:9:::1;:21;::::0;;;;:31;;28734:6;;28709:21;:31:::1;::::0;28734:6;;28709:31:::1;:::i;:::-;::::0;;;-1:-1:-1;28792:11:0::1;::::0;-1:-1:-1;28824:5:0::1;28806:15;28815:6;28806::::0;:15:::1;:::i;:::-;:23;;;;:::i;:::-;28792:37:::0;-1:-1:-1;28882:51:0::1;28908:10;28920:12;28792:37:::0;28920:6;:12:::1;:::i;:::-;-1:-1:-1::0;;;;;28882:12:0::1;:25;::::0;:51;:25:::1;:51::i;:::-;28998:8;::::0;28972:40:::1;::::0;-1:-1:-1;;;;;28972:12:0::1;:25:::0;::::1;::::0;28998:8:::1;29008:3:::0;28972:25:::1;:40::i;:::-;29030:29;::::0;9943:25:1;;;29040:10:0::1;::::0;29030:29:::1;::::0;9931:2:1;9916:18;29030:29:0::1;;;;;;;-1:-1:-1::0;;21665:1:0;22618:22;;28470:597::o;29171:836::-;21709:1;22306:7;;:19;;22298:63;;;;-1:-1:-1;;;22298:63:0;;;;;;;:::i;:::-;21709:1;22439:7;:18;29223:24:::1;29236:10;29223:12;:24::i;:::-;29278:8;:15:::0;29258:17:::1;29363:627;29387:9;29383:1;:13;29363:627;;;29418:21;29442:8;29451:1;29442:11;;;;;;-1:-1:-1::0;;;29442:11:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;29485:16;;;:13:::1;:16:::0;;;;;;29502:10:::1;29485:28:::0;;;;;;;:36;29442:11:::1;::::0;;::::1;::::0;;::::1;29562:16:::0;;29442:11;;-1:-1:-1;;;;;;29562:16:0::1;29554:39:::0;;:54:::1;;-1:-1:-1::0;29597:11:0;;29554:54:::1;29550:415;;;29629:8;;;;29550:415;29717:1;29678:16:::0;;;:13:::1;:16;::::0;;;;;;;29695:10:::1;29678:28:::0;;;;;;;:40;;;;29737:16;;:49:::1;::::0;-1:-1:-1;;;;;29737:16:0;;::::1;::::0;29779:6;29737:29:::1;:49::i;:::-;29884:16:::0;;29810:139:::1;::::0;;-1:-1:-1;;;;;29884:16:0;;::::1;3288:51:1::0;;3370:2;3355:18;;3348:34;;;29843:10:0::1;::::0;29810:139:::1;::::0;3261:18:1;29810:139:0::1;;;;;;;29363:627;;;29398:3:::0;::::1;::::0;::::1;:::i;:::-;;;;29363:627;;;-1:-1:-1::0;;21665:1:0;22618:22;;29171:836::o;27254:446::-;27349:7;27391:19;;;:13;:19;;;;;;;;-1:-1:-1;;;;;27391:28:0;;;;;;;;;:36;;27467:51;;;;;27391:36;27647:22;27467:51;27588:20;27391:19;27588:14;:20::i;:::-;:41;;;;:::i;:::-;-1:-1:-1;;;;;27553:18:0;;;;;;:9;:18;;;;;;:77;;;;:::i;:::-;27552:117;;;;:::i;:::-;27551:141;;;;:::i;:::-;27531:161;27254:446;-1:-1:-1;;;;;27254:446:0:o;26189:155::-;26241:7;26261:21;26285:8;26294:4;26285:14;;;;;;-1:-1:-1;;;26285:14:0;;;;;;;;;;;;;;;;;26319:17;26285:14;;;;;26319:17;;;26189:155;-1:-1:-1;;;26189:155:0:o;32042:1902::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;32166:1:::1;32156:7;:11;32148:48;;;::::0;-1:-1:-1;;;32148:48:0;;9286:2:1;32148:48:0::1;::::0;::::1;9268:21:1::0;9325:2;9305:18;;;9298:30;-1:-1:-1;;;9344:18:1;;;9337:54;9408:18;;32148:48:0::1;9258:174:1::0;32148:48:0::1;32227:1;32215:9;:13;32207:59;;;;-1:-1:-1::0;;;32207:59:0::1;;;;;;;:::i;:::-;32279:21;32303:8;32312:4;32303:14;;;;;;-1:-1:-1::0;;;32303:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;32498:16:::0;;32303:14;;-1:-1:-1;32346:15:0::1;::::0;32303:14;;;32498:119:::1;::::0;-1:-1:-1;;;;;32498:16:0::1;32546:10;32579:4;32599:7:::0;32498:33:::1;:119::i;:::-;32700:32;32727:4;32700:26;:32::i;:::-;32781:13;::::0;::::1;:25:::0;;;32905:17:::1;::::0;::::1;::::0;32895:27;::::1;32891:609;;;32957:19;32967:9:::0;32957:7;:19:::1;:::i;:::-;32939:15;::::0;::::1;:37:::0;-1:-1:-1;33006:7:0;32891:609:::1;;;33135:21;33179:7;33159:4;:17;;;:27;;;;:::i;:::-;33135:51;;33268:4;:15;;;33252:13;:31;;;;:::i;:::-;33233:50:::0;-1:-1:-1;33364:26:0::1;33383:7:::0;33233:50;33364:26:::1;:::i;:::-;33349:41;;33475:4;:13;;;33460:12;:28;;;;:::i;:::-;33442:15;::::0;::::1;:46:::0;-1:-1:-1;32891:609:0::1;33550:19;::::0;::::1;:29:::0;;;33677:13:::1;::::0;::::1;::::0;33667:23:::1;::::0;33572:7;33667:23:::1;:::i;:::-;33647:17;::::0;::::1;:43:::0;;;33768:16;;33880:13:::1;::::0;::::1;::::0;33708:228:::1;::::0;;11067:25:1;;;-1:-1:-1;;;;;33768:16:0;;::::1;11123:2:1::0;11108:18;;11101:60;11177:18;;11170:34;;;11235:2;11220:18;;11213:34;;;11278:3;11263:19;;11256:35;;;11148:3;11307:19;;11300:35;11366:3;11351:19;;11344:35;;;;33708:228:0::1;::::0;11054:3:1;11039:19;33708:228:0::1;;;;;;;2803:1;;;;32042:1902:::0;;;:::o;3163:148::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;3270:1:::1;3254:6:::0;;3233:40:::1;::::0;-1:-1:-1;;;;;3254:6:0;;::::1;::::0;3233:40:::1;::::0;3270:1;;3233:40:::1;3301:1;3284:19:::0;;-1:-1:-1;;;;;;3284:19:0::1;::::0;;3163:148::o;33952:1201::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;34075:1:::1;34065:7;:11;34057:48;;;::::0;-1:-1:-1;;;34057:48:0;;9286:2:1;34057:48:0::1;::::0;::::1;9268:21:1::0;9325:2;9305:18;;;9298:30;-1:-1:-1;;;9344:18:1;;;9337:54;9408:18;;34057:48:0::1;9258:174:1::0;34057:48:0::1;34136:1;34124:9;:13;34116:59;;;;-1:-1:-1::0;;;34116:59:0::1;;;;;;;:::i;:::-;34188:21;34212:8;34221:4;34212:14;;;;;;-1:-1:-1::0;;;34212:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;34341:16:::0;;34212:14;;-1:-1:-1;34255:15:0::1;::::0;34341:119:::1;::::0;-1:-1:-1;;;;;34341:16:0::1;34389:10;34422:4;34442:7:::0;34341:33:::1;:119::i;:::-;34503:32;34530:4;34503:26;:32::i;:::-;34581:13;::::0;::::1;:25:::0;;;34670:23:::1;34597:9:::0;34670:7;:23:::1;:::i;:::-;34652:15;::::0;::::1;:41:::0;34744:19:::1;::::0;::::1;:29:::0;;;34825:14:::1;::::0;::::1;:24:::0;;;-1:-1:-1;34947:13:0;::::1;::::0;34937:23:::1;::::0;34766:7;34937:23:::1;:::i;:::-;34917:17;::::0;::::1;:43:::0;;;35035:16;;35089:13:::1;::::0;::::1;::::0;34976:169:::1;::::0;;10517:25:1;;;-1:-1:-1;;;;;35035:16:0;;::::1;10573:2:1::0;10558:18;;10551:60;10627:18;;10620:34;;;10685:2;10670:18;;10663:34;10728:3;10713:19;;10706:35;;;;34976:169:0::1;::::0;10504:3:1;10489:19;34976:169:0::1;;;;;;;2803:1;;33952:1201:::0;;;:::o;25987:194::-;26053:7;26073:21;26097:8;26106:4;26097:14;;;;;;-1:-1:-1;;;26097:14:0;;;;;;;;;;;;;;;;;;;26073:38;;26129:44;26138:15;26155:4;:17;;;26129:8;:44::i;:::-;26122:51;25987:194;-1:-1:-1;;;25987:194:0:o;26453:793::-;26512:7;26532:21;26556:8;26565:4;26556:14;;;;;;-1:-1:-1;;;26556:14:0;;;;;;;;;;;;;;;;;;;26532:38;;26661:4;:14;;;26643:15;:32;26639:73;;;-1:-1:-1;26699:1:0;;26453:793;-1:-1:-1;;26453:793:0:o;26639:73::-;26728:11;;26724:81;;26768:25;;;;26453:793;-1:-1:-1;;26453:793:0:o;26724:81::-;27227:11;;27184:22;27144:4;:19;;;27114:27;27136:4;27114:21;:27::i;:::-;:49;;;;:::i;:::-;27077:4;:15;;;:87;;;;:::i;:::-;:129;;;;:::i;:::-;27076:162;;;;:::i;:::-;27031:4;:25;;;:207;;;;:::i;36158:101::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;36231:8:::1;:20:::0;;-1:-1:-1;;;;;;36231:20:0::1;-1:-1:-1::0;;;;;36231:20:0;;;::::1;::::0;;;::::1;::::0;;36158:101::o;36427:179::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;36532:66:::1;-1:-1:-1::0;;;;;36532:41:0;::::1;36574:10;36586:11:::0;36532:41:::1;:66::i;:::-;36427:179:::0;;:::o;35161:610::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;35218:21:::1;35242:8;35251:4;35242:14;;;;;;-1:-1:-1::0;;;35242:14:0::1;;;;;;;;;;;;;;;;;;;35218:38;;35296:4;:17;;;35316:6;35296:26;;;;:::i;:::-;35277:15;:45;;35269:126;;;::::0;-1:-1:-1;;;35269:126:0;;7755:2:1;35269:126:0::1;::::0;::::1;7737:21:1::0;7794:2;7774:18;;;7767:30;7833:34;7813:18;;;7806:62;-1:-1:-1;;;7884:18:1;;;7877:43;7937:19;;35269:126:0::1;7727:235:1::0;35269:126:0::1;35428:16:::0;;:41:::1;::::0;-1:-1:-1;;;35428:41:0;;35463:4:::1;35428:41;::::0;::::1;2672:51:1::0;35406:19:0::1;::::0;-1:-1:-1;;;;;35428:16:0::1;::::0;:26:::1;::::0;2645:18:1;;35428:41:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35612:16:::0;;35406:63;;-1:-1:-1;35587:12:0::1;-1:-1:-1::0;;;;;35579:50:0;;::::1;35612:16:::0;::::1;35579:50;35575:122;;;35674:11;::::0;35660:25:::1;::::0;:11;:25:::1;:::i;:::-;35646:39;;35575:122;35709:16:::0;;:54:::1;::::0;-1:-1:-1;;;;;35709:16:0::1;35739:10;35751:11:::0;35709:29:::1;:54::i;:::-;2803:1;;35161:610:::0;:::o;35779:371::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;35887:9:::1;35882:261;35906:8;:15:::0;35902:19;::::1;35882:261;;;35943:21;35967:8;35976:1;35967:11;;;;;;-1:-1:-1::0;;;35967:11:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;36007:16:::0;;35967:11;;-1:-1:-1;;;;;;36007:16:0::1;35995:137;;36059:8;;;35995:137;36108:8;36114:1;36108:5;:8::i;:::-;35882:261;;35923:3:::0;::::1;::::0;::::1;:::i;:::-;;;;35882:261;;;;35779:371::o:0;27708:754::-;21709:1;22306:7;;:19;;22298:63;;;;-1:-1:-1;;;22298:63:0;;;;;;;:::i;:::-;21709:1;22439:7;:18;27778:10;27770:37:::1;;;::::0;-1:-1:-1;;;27770:37:0;;5544:2:1;27770:37:0::1;::::0;::::1;5526:21:1::0;5583:2;5563:18;;;5556:30;-1:-1:-1;;;5602:18:1;;;5595:44;5656:18;;27770:37:0::1;5516:164:1::0;27770:37:0::1;27818:24;27831:10;27818:12;:24::i;:::-;27922:64;-1:-1:-1::0;;;;;27922:12:0::1;:29;27952:10;27972:4;27979:6:::0;27922:29:::1;:64::i;:::-;28060:8;:12:::0;28056:355:::1;;28089:23;28135:5;28115:17;28124:8;28115:6:::0;:17:::1;:::i;:::-;:25;;;;:::i;:::-;28089:51:::0;-1:-1:-1;28155:21:0::1;28179:24;28089:51:::0;28179:6;:24:::1;:::i;:::-;28228:10;28218:21;::::0;;;:9:::1;:21;::::0;;;;:38;;28155:48;;-1:-1:-1;28155:48:0;;28218:21;;;:38:::1;::::0;28155:48;;28218:38:::1;:::i;:::-;;;;;;;;28286:13;28271:11;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;28056:355:0::1;::::0;-1:-1:-1;;;28056:355:0::1;;28342:10;28332:21;::::0;;;:9:::1;:21;::::0;;;;:31;;28357:6;;28332:21;:31:::1;::::0;28357:6;;28332:31:::1;:::i;:::-;;;;;;;;28393:6;28378:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;28056:355:0::1;28428:26;::::0;9943:25:1;;;28435:10:0::1;::::0;28428:26:::1;::::0;9931:2:1;9916:18;28428:26:0::1;;;;;;;-1:-1:-1::0;21665:1:0;22618:22;;27708:754::o;31088:946::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31176:35:0;::::1;31168:71;;;::::0;-1:-1:-1;;;31168:71:0;;6294:2:1;31168:71:0::1;::::0;::::1;6276:21:1::0;6333:2;6313:18;;;6306:30;6372:25;6352:18;;;6345:53;6415:18;;31168:71:0::1;6266:173:1::0;31168:71:0::1;-1:-1:-1::0;;;;;31273:40:0;::::1;;::::0;;;:17:::1;:40;::::0;;;;;::::1;;31272:41;31250:110;;;::::0;-1:-1:-1;;;31250:110:0;;8169:2:1;31250:110:0::1;::::0;::::1;8151:21:1::0;8208:2;8188:18;;;8181:30;-1:-1:-1;;;8227:18:1;;;8220:49;8286:18;;31250:110:0::1;8141:169:1::0;31250:110:0::1;31458:8;:15:::0;31437:18:::1;31458:15:::0;31509:12:::1;31458:15:::0;31509:12:::1;:::i;:::-;31562:321;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;31562:321:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;31562:321:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31534:8:::1;:360:::0;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;31534:360:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31907:40;;;31534:360:::1;31907:40:::0;;;;;;:47;;-1:-1:-1;;31907:47:0::1;::::0;;::::1;::::0;;;31972:54;;10153:25:1;;;10194:18;;;10187:60;31509:12:0;;-1:-1:-1;31562:321:0;;-1:-1:-1;31972:54:0::1;::::0;10126:18:1;31972:54:0::1;;;;;;;2803:1;;31088:946:::0;:::o;30015:947::-;30062:24;30075:10;30062:12;:24::i;:::-;30161:9;30156:789;30180:8;:15;30176:19;;30156:789;;;30217:21;30241:8;30250:1;30241:11;;;;;;-1:-1:-1;;;30241:11:0;;;;;;;;;;;;;;;;;30284:16;;;:13;:16;;;;;;30301:10;30284:28;;;;;;;:36;30241:11;;;;;;;30349:16;;30241:11;;-1:-1:-1;;;;;;30349:16:0;30341:39;;:54;;-1:-1:-1;30384:11:0;;30341:54;30337:597;;;30416:8;;;;30337:597;30504:1;30465:16;;;:13;:16;;;;;;;;30482:10;30465:28;;;;;;;:40;30538:16;;30567:12;-1:-1:-1;;;;;30530:50:0;;;30538:16;;30530:50;30526:393;;;30605:13;30611:6;30605:5;:13::i;:::-;30526:393;;;30667:16;;:49;;-1:-1:-1;;;;;30667:16:0;30697:10;30709:6;30667:29;:49::i;:::-;30826:16;;30744:155;;;-1:-1:-1;;;;;30826:16:0;;;3288:51:1;;3370:2;3355:18;;3348:34;;;30781:10:0;;30744:155;;3261:18:1;30744:155:0;;;;;;;30526:393;30156:789;;;30197:3;;;;:::i;:::-;;;;30156:789;;36267:152;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;36325:21:::1;36349:8;36358:4;36349:14;;;;;;-1:-1:-1::0;;;36349:14:0::1;;;;;;;;;;;;;;;;;;;36325:38;;36396:15;36376:4;:17;;:35;;;;2803:1;36267:152:::0;:::o;29075:88::-;21709:1;22306:7;;:19;;22298:63;;;;-1:-1:-1;;;22298:63:0;;;;;;;:::i;:::-;21709:1;22439:7;:18;29143:10:::1;31027:7:::0;31054:18;;;:9;:18;;;;;;29124:31:::1;::::0;28470:597;:::i;29124:31::-:1;21665:1:::0;22618:22;;29075:88::o;3466:244::-;2558:7;2585:6;-1:-1:-1;;;;;2585:6:0;1370:10;2732:23;2724:68;;;;-1:-1:-1;;;2724:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3555:22:0;::::1;3547:73;;;::::0;-1:-1:-1;;;3547:73:0;;5137:2:1;3547:73:0::1;::::0;::::1;5119:21:1::0;5176:2;5156:18;;;5149:30;5215:34;5195:18;;;5188:62;-1:-1:-1;;;5266:18:1;;;5259:36;5312:19;;3547:73:0::1;5109:228:1::0;3547:73:0::1;3657:6;::::0;;3636:38:::1;::::0;-1:-1:-1;;;;;3636:38:0;;::::1;::::0;3657:6;::::1;::::0;3636:38:::1;::::0;::::1;3685:6;:17:::0;;-1:-1:-1;;;;;;3685:17:0::1;-1:-1:-1::0;;;;;3685:17:0;;;::::1;::::0;;;::::1;::::0;;3466:244::o;25167:567::-;25282:9;25277:450;25301:8;:15;25297:19;;25277:450;;;25338:21;25362:8;25371:1;25362:11;;;;;;-1:-1:-1;;;25362:11:0;;;;;;;;;;;;;;;;;;;;;;25402:16;;25362:11;;-1:-1:-1;;;;;;25402:16:0;25390:326;;25454:8;;;25390:326;25503:29;25530:1;25503:26;:29::i;:::-;25587:18;25594:7;25603:1;25587:6;:18::i;:::-;25551:16;;;;:13;:16;;;;;;;;-1:-1:-1;;;;;25551:25:0;;;;;;;;;;:54;;;25675:25;;;;;25624:48;;;;:76;25277:450;25318:3;;;;:::i;:::-;;;;25277:450;;16260:177;16370:58;;-1:-1:-1;;;;;3306:32:1;;16370:58:0;;;3288:51:1;3355:18;;;3348:34;;;16343:86:0;;16363:5;;-1:-1:-1;;;16393:23:0;3261:18:1;;16370:58:0;;;;-1:-1:-1;;16370:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;16370:58:0;-1:-1:-1;;;;;;16370:58:0;;;;;;;;;;16343:19;:86::i;16445:205::-;16573:68;;-1:-1:-1;;;;;2992:15:1;;;16573:68:0;;;2974:34:1;3044:15;;3024:18;;;3017:43;3076:18;;;3069:34;;;16546:96:0;;16566:5;;-1:-1:-1;;;16596:27:0;2909:18:1;;16573:68:0;2891:218:1;16546:96:0;16445:205;;;;:::o;25742:237::-;25812:21;25836:8;25845:4;25836:14;;;;;;-1:-1:-1;;;25836:14:0;;;;;;;;;;;;;;;;;;;25812:38;;25891:20;25906:4;25891:14;:20::i;:::-;25863:25;;;:48;25944:27;25966:4;25944:21;:27::i;:::-;25922:19;;;;:49;-1:-1:-1;25742:237:0:o;19631:106::-;19689:7;19720:1;19716;:5;:13;;19728:1;19716:13;;;-1:-1:-1;19724:1:0;;19709:20;-1:-1:-1;19631:106:0:o;18514:761::-;18938:23;18964:69;18992:4;18964:69;;;;;;;;;;;;;;;;;18972:5;-1:-1:-1;;;;;18964:27:0;;;:69;;;;;:::i;:::-;19048:17;;18938:95;;-1:-1:-1;19048:21:0;19044:224;;19190:10;19179:30;;;;;;;;;;;;:::i;:::-;19171:85;;;;-1:-1:-1;;;19171:85:0;;8875:2:1;19171:85:0;;;8857:21:1;8914:2;8894:18;;;8887:30;8953:34;8933:18;;;8926:62;-1:-1:-1;;;9004:18:1;;;8997:40;9054:19;;19171:85:0;8847:232:1;10268:229:0;10405:12;10437:52;10459:6;10467:4;10473:1;10476:12;10437:21;:52::i;:::-;10430:59;10268:229;-1:-1:-1;;;;10268:229:0:o;11388:455::-;11558:12;11616:5;11591:21;:30;;11583:81;;;;-1:-1:-1;;;11583:81:0;;5887:2:1;11583:81:0;;;5869:21:1;5926:2;5906:18;;;5899:30;5965:34;5945:18;;;5938:62;-1:-1:-1;;;6016:18:1;;;6009:36;6062:19;;11583:81:0;5859:228:1;11583:81:0;11676:12;11690:23;11717:6;-1:-1:-1;;;;;11717:11:0;11736:5;11743:4;11717:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11675:73;;;;11766:69;11793:6;11801:7;11810:10;11822:12;11766:26;:69::i;:::-;11759:76;11388:455;-1:-1:-1;;;;;;;11388:455:0:o;13961:657::-;14146:25;14188:7;14184:427;;;14216:17;;14212:290;;-1:-1:-1;;;;;7806:19:0;;;14426:60;;;;-1:-1:-1;;;14426:60:0;;8517:2:1;14426:60:0;;;8499:21:1;8556:2;8536:18;;;8529:30;8595:31;8575:18;;;8568:59;8644:18;;14426:60:0;8489:179:1;14426:60:0;-1:-1:-1;14523:10:0;14516:17;;14184:427;14566:33;14574:10;14586:12;15334:17;;:21;15330:388;;15566:10;15560:17;15623:15;15610:10;15606:2;15602:19;15595:44;15518:136;15693:12;15686:20;;-1:-1:-1;;;15686:20:0;;;;;;;;:::i;14:257:1:-;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:325::-;344:6;352;405:2;393:9;384:7;380:23;376:32;373:2;;;426:6;418;411:22;373:2;470:9;457:23;489:31;514:5;489:31;:::i;:::-;539:5;591:2;576:18;;;;563:32;;-1:-1:-1;;;363:238:1:o;606:297::-;673:6;726:2;714:9;705:7;701:23;697:32;694:2;;;747:6;739;732:22;694:2;784:9;778:16;837:5;830:13;823:21;816:5;813:32;803:2;;864:6;856;849:22;1192:190;1251:6;1304:2;1292:9;1283:7;1279:23;1275:32;1272:2;;;1325:6;1317;1310:22;1272:2;-1:-1:-1;1353:23:1;;1262:120;-1:-1:-1;1262:120:1:o;1387:194::-;1457:6;1510:2;1498:9;1489:7;1485:23;1481:32;1478:2;;;1531:6;1523;1516:22;1478:2;-1:-1:-1;1559:16:1;;1468:113;-1:-1:-1;1468:113:1:o;1586:325::-;1654:6;1662;1715:2;1703:9;1694:7;1690:23;1686:32;1683:2;;;1736:6;1728;1721:22;1683:2;1777:9;1764:23;1754:33;;1837:2;1826:9;1822:18;1809:32;1850:31;1875:5;1850:31;:::i;:::-;1900:5;1890:15;;;1673:238;;;;;:::o;1916:326::-;1993:6;2001;2009;2062:2;2050:9;2041:7;2037:23;2033:32;2030:2;;;2083:6;2075;2068:22;2030:2;-1:-1:-1;;2111:23:1;;;2181:2;2166:18;;2153:32;;-1:-1:-1;2232:2:1;2217:18;;;2204:32;;2020:222;-1:-1:-1;2020:222:1:o;2247:274::-;2376:3;2414:6;2408:13;2430:53;2476:6;2471:3;2464:4;2456:6;2452:17;2430:53;:::i;:::-;2499:16;;;;;2384:137;-1:-1:-1;;2384:137:1:o;4547:383::-;4696:2;4685:9;4678:21;4659:4;4728:6;4722:13;4771:6;4766:2;4755:9;4751:18;4744:34;4787:66;4846:6;4841:2;4830:9;4826:18;4821:2;4813:6;4809:15;4787:66;:::i;:::-;4914:2;4893:15;-1:-1:-1;;4889:29:1;4874:45;;;;4921:2;4870:54;;4668:262;-1:-1:-1;;4668:262:1:o;6790:397::-;6992:2;6974:21;;;7031:2;7011:18;;;7004:30;7070:34;7065:2;7050:18;;7043:62;-1:-1:-1;;;7136:2:1;7121:18;;7114:31;7177:3;7162:19;;6964:223::o;7192:356::-;7394:2;7376:21;;;7413:18;;;7406:30;7472:34;7467:2;7452:18;;7445:62;7539:2;7524:18;;7366:182::o;9437:355::-;9639:2;9621:21;;;9678:2;9658:18;;;9651:30;9717:33;9712:2;9697:18;;9690:61;9783:2;9768:18;;9611:181::o;11643:128::-;11683:3;11714:1;11710:6;11707:1;11704:13;11701:2;;;11720:18;;:::i;:::-;-1:-1:-1;11756:9:1;;11691:80::o;11776:217::-;11816:1;11842;11832:2;;-1:-1:-1;;;11867:31:1;;11921:4;11918:1;11911:15;11949:4;11874:1;11939:15;11832:2;-1:-1:-1;11978:9:1;;11822:171::o;11998:168::-;12038:7;12104:1;12100;12096:6;12092:14;12089:1;12086:21;12081:1;12074:9;12067:17;12063:45;12060:2;;;12111:18;;:::i;:::-;-1:-1:-1;12151:9:1;;12050:116::o;12171:125::-;12211:4;12239:1;12236;12233:8;12230:2;;;12244:18;;:::i;:::-;-1:-1:-1;12281:9:1;;12220:76::o;12301:258::-;12373:1;12383:113;12397:6;12394:1;12391:13;12383:113;;;12473:11;;;12467:18;12454:11;;;12447:39;12419:2;12412:10;12383:113;;;12514:6;12511:1;12508:13;12505:2;;;-1:-1:-1;;12549:1:1;12531:16;;12524:27;12354:205::o;12564:135::-;12603:3;-1:-1:-1;;12624:17:1;;12621:2;;;12644:18;;:::i;:::-;-1:-1:-1;12691:1:1;12680:13;;12611:88::o;12704:127::-;12765:10;12760:3;12756:20;12753:1;12746:31;12796:4;12793:1;12786:15;12820:4;12817:1;12810:15;12836:131;-1:-1:-1;;;;;12911:31:1;;12901:42;;12891:2;;12957:1;12954;12947:12
Swarm Source
ipfs://0e61ff9c1f05d81a19b39fbc9d81b64d3be6a02adf7468bdef1e9227487d1eca
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.