More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 9,978 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Locked | 66981566 | 44 hrs ago | IN | 0 POL | 0.02282542 | ||||
Get Reward | 66899580 | 3 days ago | IN | 0 POL | 0.01383343 | ||||
Withdraw Locked | 66697361 | 8 days ago | IN | 0 POL | 0.00650474 | ||||
Get Reward | 66656032 | 10 days ago | IN | 0 POL | 0.01791399 | ||||
Get Reward | 66568898 | 12 days ago | IN | 0 POL | 0.02146257 | ||||
Get Reward | 66238977 | 20 days ago | IN | 0 POL | 0.00487746 | ||||
Withdraw Locked | 66159051 | 22 days ago | IN | 0 POL | 0.00549795 | ||||
Get Reward | 66159042 | 22 days ago | IN | 0 POL | 0.00380331 | ||||
Get Reward | 66159027 | 22 days ago | IN | 0 POL | 0.00380331 | ||||
Withdraw Locked | 66142209 | 23 days ago | IN | 0 POL | 0.01256194 | ||||
Withdraw Locked | 66032504 | 25 days ago | IN | 0 POL | 0.00994909 | ||||
Get Reward | 66032479 | 25 days ago | IN | 0 POL | 0.00656318 | ||||
Withdraw Locked | 65961195 | 27 days ago | IN | 0 POL | 0.00585376 | ||||
Get Reward | 65961183 | 27 days ago | IN | 0 POL | 0.00441594 | ||||
Withdraw Locked | 65840306 | 30 days ago | IN | 0 POL | 0.01977163 | ||||
Get Reward | 65840290 | 30 days ago | IN | 0 POL | 0.01746206 | ||||
Get Reward | 65575950 | 37 days ago | IN | 0 POL | 0.00525657 | ||||
Withdraw Locked | 65510318 | 39 days ago | IN | 0 POL | 0.01029765 | ||||
Get Reward | 65510307 | 39 days ago | IN | 0 POL | 0.00886956 | ||||
Withdraw Locked | 65429838 | 41 days ago | IN | 0 POL | 0.00658465 | ||||
Get Reward | 65429818 | 41 days ago | IN | 0 POL | 0.00534751 | ||||
Get Reward | 65240068 | 46 days ago | IN | 0 POL | 0.00416154 | ||||
Withdraw Locked | 65235339 | 46 days ago | IN | 0 POL | 0.00572028 | ||||
Withdraw Locked | 65197762 | 47 days ago | IN | 0 POL | 0.00691922 | ||||
Get Reward | 65197745 | 47 days ago | IN | 0 POL | 0.00566013 |
Loading...
Loading
Contract Name:
StakingRewardsDualV5_nonLP_wsKLIMA
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-05-02 */ // File: contracts/Staking/Owned.sol pragma solidity >=0.6.11; // https://docs.synthetix.io/contracts/Owned contract Owned { address public owner; address public nominatedOwner; constructor (address _owner) public { require(_owner != address(0), "Owner address cannot be 0"); owner = _owner; emit OwnerChanged(address(0), _owner); } function nominateNewOwner(address _owner) external onlyOwner { nominatedOwner = _owner; emit OwnerNominated(_owner); } function acceptOwnership() external { require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } modifier onlyOwner { require(msg.sender == owner, "Only the contract owner may perform this action"); _; } event OwnerNominated(address newOwner); event OwnerChanged(address oldOwner, address newOwner); } // File: contracts/Utils/ReentrancyGuard.sol pragma solidity >=0.6.11; /** * @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 () internal { _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; } } // File: contracts/Uniswap/Interfaces/IUniswapV2Pair.sol pragma solidity >=0.6.11; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts/Uniswap/TransferHelper.sol pragma solidity >=0.6.11; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // File: contracts/Utils/Address.sol pragma solidity >=0.6.11 <0.9.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/Common/Context.sol pragma solidity >=0.6.11; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: contracts/Curve/IveC3.sol pragma solidity >=0.6.11; pragma abicoder v2; interface IveC3 { struct LockedBalance { int128 amount; uint256 end; } function commit_transfer_ownership(address addr) external; function apply_transfer_ownership() external; function commit_smart_wallet_checker(address addr) external; function apply_smart_wallet_checker() external; function toggleEmergencyUnlock() external; function recoverERC20(address token_addr, uint256 amount) external; function get_last_user_slope(address addr) external view returns (int128); function user_point_history__ts(address _addr, uint256 _idx) external view returns (uint256); function locked__end(address _addr) external view returns (uint256); function checkpoint() external; function deposit_for(address _addr, uint256 _value) external; function create_lock(uint256 _value, uint256 _unlock_time) external; function increase_amount(uint256 _value) external; function increase_unlock_time(uint256 _unlock_time) external; function withdraw() external; function balanceOf(address addr) external view returns (uint256); function balanceOf(address addr, uint256 _t) external view returns (uint256); function balanceOfAt(address addr, uint256 _block) external view returns (uint256); function totalSupply() external view returns (uint256); function totalSupply(uint256 t) external view returns (uint256); function totalSupplyAt(uint256 _block) external view returns (uint256); function totalC3Supply() external view returns (uint256); function totalC3SupplyAt(uint256 _block) external view returns (uint256); function changeController(address _newController) external; function token() external view returns (address); function supply() external view returns (uint256); function locked(address addr) external view returns (LockedBalance memory); function epoch() external view returns (uint256); function point_history(uint256 arg0) external view returns (int128 bias, int128 slope, uint256 ts, uint256 blk, uint256 fxs_amt); function user_point_history(address arg0, uint256 arg1) external view returns (int128 bias, int128 slope, uint256 ts, uint256 blk, uint256 fxs_amt); function user_point_epoch(address arg0) external view returns (uint256); function slope_changes(uint256 arg0) external view returns (int128); function controller() external view returns (address); function transfersEnabled() external view returns (bool); function emergencyUnlockActive() external view returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function version() external view returns (string memory); function decimals() external view returns (uint256); function future_smart_wallet_checker() external view returns (address); function smart_wallet_checker() external view returns (address); function admin() external view returns (address); function future_admin() external view returns (address); } // File: contracts/Math/SafeMath.sol pragma solidity >=0.6.11; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/ERC20/IERC20.sol pragma solidity >=0.6.11; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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); } // File: contracts/ERC20/SafeERC20.sol pragma solidity >=0.6.11; /** * @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 SafeMath for uint256; 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).add(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).sub(value, "SafeERC20: decreased allowance below zero"); _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"); } } } // File: contracts/ERC20/ERC20.sol pragma solidity >=0.6.11; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory __name, string memory __symbol) public { _name = __name; _symbol = __symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address.approve(address spender, uint256 amount) */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for `accounts`'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), decreasedAllowance); _burn(account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal virtual { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of `from`'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of `from`'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:using-hooks.adoc[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: contracts/Math/Math.sol pragma solidity >=0.6.11; /** * @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); } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } // File: contracts/Staking/C3/C3_StakingRewardsDualV5_nonLP.sol pragma solidity >=0.6.11; pragma experimental ABIEncoderV2; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ======================= StakingRewardsDualV5 ======================= // ==================================================================== // Includes veFXS boost logic // Unlocked deposits are removed to free up space // Frax Finance: https://github.com/FraxFinance // Primary Author(s) // Travis Moore: https://github.com/FortisFortuna // Reviewer(s) / Contributor(s) // Jason Huan: https://github.com/jasonhuan // Sam Kazemian: https://github.com/samkazemian // Sam Sun: https://github.com/samczsun // Originally inspired by Synthetix.io, but heavily modified by the Frax team // https://raw.githubusercontent.com/Synthetixio/synthetix/develop/contracts/StakingRewards.sol //import "../../Frax/Frax.sol"; // Inheritance contract C3StakingRewardsDualV5_nonLP is Owned, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for ERC20; /* ========== STATE VARIABLES ========== */ // Instances IveC3 private veC3; ERC20 private rewardsToken0; ERC20 private rewardsToken1; ERC20 private stakingToken; // Constant for various precisions uint256 private constant MULTIPLIER_PRECISION = 1e18; // Admin addresses address public timelock_address; // Governance timelock address address public controller_address; // Gauge controller // Time tracking uint256 public periodFinish; uint256 public lastUpdateTime; // Lock time and multiplier settings uint256 public lock_max_multiplier = uint256(3e18); // E18. 1x = e18 uint256 public lock_time_for_max_multiplier = 3 * 365 * 86400; // 3 years uint256 public lock_time_min = 86400; // 1 * 86400 (1 day) // veC3 related uint256 public vec3_per_c3_for_max_boost = uint256(4e18); // E18. 4e18 means 4 veC3 must be held by the staker per 1 FRAX uint256 public vec3_max_multiplier = uint256(2e18); // E18. 1x = 1e18 mapping(address => uint256) private _vec3MultiplierStored; // Max reward per second uint256 public rewardRate0; uint256 public rewardRate1; // Reward period uint256 public rewardsDuration = 604800; // 7 * 86400 (7 days) // Reward tracking uint256 private rewardPerTokenStored0; uint256 private rewardPerTokenStored1 = 0; mapping(address => uint256) public userRewardPerTokenPaid0; mapping(address => uint256) public userRewardPerTokenPaid1; mapping(address => uint256) public rewards0; mapping(address => uint256) public rewards1; // Balance tracking uint256 private _total_liquidity_locked; uint256 private _total_combined_weight; mapping(address => uint256) private _locked_liquidity; mapping(address => uint256) private _combined_weights; // Uniswap related //bool c3_is_token0; // Stake tracking mapping(address => LockedStake[]) private lockedStakes; // List of valid migrators (set by governance) mapping(address => bool) public valid_migrators; // Stakers set which migrator(s) they want to use mapping(address => mapping(address => bool)) public staker_allowed_migrators; // Greylisting of bad addresses mapping(address => bool) public greylist; // Administrative booleans bool public token1_rewards_on = true; bool public migrationsOn; // Used for migrations. Prevents new stakes, but allows LP and reward withdrawals bool public stakesUnlocked; // Release locked stakes in case of system migration or emergency bool public withdrawalsPaused; // For emergencies bool public rewardsCollectionPaused; // For emergencies bool public stakingPaused; // For emergencies /* ========== STRUCTS ========== */ struct LockedStake { bytes32 kek_id; uint256 start_timestamp; uint256 liquidity; uint256 ending_timestamp; uint256 lock_multiplier; // 6 decimals of precision. 1x = 1000000 } /* ========== MODIFIERS ========== */ modifier onlyByOwnGov() { require(msg.sender == owner || msg.sender == timelock_address, "Not owner or timelock"); _; } modifier onlyByOwnGovCtrlr() { require(msg.sender == owner || msg.sender == timelock_address || msg.sender == controller_address, "Not own, tlk, or ctrlr"); _; } modifier isMigrating() { require(migrationsOn == true, "Not in migration"); _; } modifier notStakingPaused() { require(stakingPaused == false, "Staking paused"); _; } modifier updateRewardAndBalance(address account, bool sync_too) { _updateRewardAndBalance(account, sync_too); _; } /* ========== CONSTRUCTOR ========== */ constructor ( address _owner, address _rewardsToken0, address _rewardsToken1, address _stakingToken, address _c3_address, address _timelock_address, address _veC3_address ) Owned(_owner){ rewardsToken0 = ERC20(_rewardsToken0); rewardsToken1 = ERC20(_rewardsToken1); stakingToken = ERC20(_stakingToken); veC3 = IveC3(_veC3_address); timelock_address = _timelock_address; // 10 C3 a day rewardRate0 = 0; // (uint256(3650e18)).div(365 * 86400); // 1 token1 a day rewardRate1 = 0; // (uint256(365e18)).div(365 * 86400); // Uniswap related. Need to know which token c3 is (0 or 1) // address token0 = stakingToken.token0(); // if (token0 == _c3_address) c3_is_token0 = true; // else c3_is_token0 = false; // Other booleans migrationsOn = false; stakesUnlocked = false; // Initialization lastUpdateTime = block.timestamp; periodFinish = block.timestamp.add(rewardsDuration); } /* ========== VIEWS ========== */ // Total locked liquidity tokens function totalLiquidityLocked() external view returns (uint256) { return _total_liquidity_locked; } // Locked liquidity for a given account function lockedLiquidityOf(address account) external view returns (uint256) { return _locked_liquidity[account]; } // Total 'balance' used for calculating the percent of the pool the account owns // Takes into account the locked stake time multiplier and veC3 multiplier function totalCombinedWeight() external view returns (uint256) { return _total_combined_weight; } // Combined weight for a specific account function combinedWeightOf(address account) external view returns (uint256) { return _combined_weights[account]; } // All the locked stakes for a given account function lockedStakesOf(address account) external view returns (LockedStake[] memory) { return lockedStakes[account]; } function lockMultiplier(uint256 secs) public view returns (uint256) { uint256 lock_multiplier = uint256(MULTIPLIER_PRECISION).add( secs .mul(lock_max_multiplier.sub(MULTIPLIER_PRECISION)) .div(lock_time_for_max_multiplier) ); if (lock_multiplier > lock_max_multiplier) lock_multiplier = lock_max_multiplier; return lock_multiplier; } function lastTimeRewardApplicable() internal view returns (uint256) { return Math.min(block.timestamp, periodFinish); } function userStakedToken(address account) public view returns (uint256) { return _locked_liquidity[account]; } function minVeC3ForMaxBoost(address account) public view returns (uint256) { return (userStakedToken(account)).mul(vec3_per_c3_for_max_boost).div(MULTIPLIER_PRECISION); } function veC3Multiplier(address account) public view returns (uint256) { // The claimer gets a boost depending on amount of veC3 they have relative to the amount of FRAX 'inside' // of their locked LP tokens uint256 veC3_needed_for_max_boost = minVeC3ForMaxBoost(account); if (veC3_needed_for_max_boost > 0){ uint256 user_vec3_fraction = (veC3.balanceOf(account)).mul(MULTIPLIER_PRECISION).div(veC3_needed_for_max_boost); uint256 vec3_multiplier = ((user_vec3_fraction).mul(vec3_max_multiplier)).div(MULTIPLIER_PRECISION); // Cap the boost to the vec3_max_multiplier if (vec3_multiplier > vec3_max_multiplier) vec3_multiplier = vec3_max_multiplier; return vec3_multiplier; } else return 0; // This will happen with the first stake, when user_staked_c3 is 0 } function calcCurCombinedWeight(address account) public view returns ( uint256 old_combined_weight, uint256 new_vec3_multiplier, uint256 new_combined_weight ) { // Get the old combined weight old_combined_weight = _combined_weights[account]; // Get the veC3 multipliers // For the calculations, use the midpoint (analogous to midpoint Riemann sum) new_vec3_multiplier = veC3Multiplier(account); uint256 midpoint_vec3_multiplier; if (_locked_liquidity[account] == 0 && _combined_weights[account] == 0) { // This is only called for the first stake to make sure the veC3 multiplier is not cut in half midpoint_vec3_multiplier = new_vec3_multiplier; } else { midpoint_vec3_multiplier = ((new_vec3_multiplier).add(_vec3MultiplierStored[account])).div(2); } // Loop through the locked stakes, first by getting the liquidity * lock_multiplier portion new_combined_weight = 0; for (uint256 i = 0; i < lockedStakes[account].length; i++) { LockedStake memory thisStake = lockedStakes[account][i]; uint256 lock_multiplier = thisStake.lock_multiplier; // If the lock period is over, drop the lock multiplier down to 1x for the weight calculations if (thisStake.ending_timestamp <= block.timestamp){ lock_multiplier = MULTIPLIER_PRECISION; } uint256 liquidity = thisStake.liquidity; uint256 combined_boosted_amount = liquidity.mul(lock_multiplier.add(midpoint_vec3_multiplier)).div(MULTIPLIER_PRECISION); new_combined_weight = new_combined_weight.add(combined_boosted_amount); } } function rewardPerToken() public view returns (uint256, uint256) { if (_total_liquidity_locked == 0 || _total_combined_weight == 0) { return (rewardPerTokenStored0, rewardPerTokenStored1); } else { return ( rewardPerTokenStored0.add( lastTimeRewardApplicable().sub(lastUpdateTime).mul(rewardRate0).mul(1e18).div(_total_combined_weight) ), rewardPerTokenStored1.add( lastTimeRewardApplicable().sub(lastUpdateTime).mul(rewardRate1).mul(1e18).div(_total_combined_weight) ) ); } } function earned(address account) public view returns (uint256, uint256) { (uint256 rew_per_token0, uint256 rew_per_token1) = rewardPerToken(); if (_combined_weights[account] == 0){ return (0, 0); } return ( (_combined_weights[account].mul(rew_per_token0.sub(userRewardPerTokenPaid0[account]))).div(1e18).add(rewards0[account]), (_combined_weights[account].mul(rew_per_token1.sub(userRewardPerTokenPaid1[account]))).div(1e18).add(rewards1[account]) ); } function getRewardForDuration() external view returns (uint256, uint256) { return ( rewardRate0.mul(rewardsDuration), rewardRate1.mul(rewardsDuration) ); } /* ========== MUTATIVE FUNCTIONS ========== */ function _updateRewardAndBalance(address account, bool sync_too) internal { // Need to retro-adjust some things if the period hasn't been renewed, then start a new one if (sync_too){ sync(); } if (account != address(0)) { // To keep the math correct, the user's combined weight must be recomputed to account for their // ever-changing veC3 balance. ( uint256 old_combined_weight, uint256 new_vec3_multiplier, uint256 new_combined_weight ) = calcCurCombinedWeight(account); // Calculate the earnings first _syncEarned(account); // Update the user's stored veC3 multipliers _vec3MultiplierStored[account] = new_vec3_multiplier; // Update the user's and the global combined weights if (new_combined_weight >= old_combined_weight) { uint256 weight_diff = new_combined_weight.sub(old_combined_weight); _total_combined_weight = _total_combined_weight.add(weight_diff); _combined_weights[account] = old_combined_weight.add(weight_diff); } else { uint256 weight_diff = old_combined_weight.sub(new_combined_weight); _total_combined_weight = _total_combined_weight.sub(weight_diff); _combined_weights[account] = old_combined_weight.sub(weight_diff); } } } function _syncEarned(address account) internal { if (account != address(0)) { // Calculate the earnings (uint256 earned0, uint256 earned1) = earned(account); rewards0[account] = earned0; rewards1[account] = earned1; userRewardPerTokenPaid0[account] = rewardPerTokenStored0; userRewardPerTokenPaid1[account] = rewardPerTokenStored1; } } // Staker can allow a migrator function stakerAllowMigrator(address migrator_address) external { require(valid_migrators[migrator_address], "Invalid migrator address"); staker_allowed_migrators[msg.sender][migrator_address] = true; } // Staker can disallow a previously-allowed migrator function stakerDisallowMigrator(address migrator_address) external { // Delete from the mapping delete staker_allowed_migrators[msg.sender][migrator_address]; } // Two different stake functions are needed because of delegateCall and msg.sender issues (important for migration) function stakeLocked(uint256 liquidity, uint256 secs) nonReentrant public { _stakeLocked(msg.sender, msg.sender, liquidity, secs, block.timestamp); } // If this were not internal, and source_address had an infinite approve, this could be exploitable // (pull funds from source_address and stake for an arbitrary staker_address) function _stakeLocked( address staker_address, address source_address, uint256 liquidity, uint256 secs, uint256 start_timestamp ) internal updateRewardAndBalance(staker_address, true) { require(!stakingPaused || valid_migrators[msg.sender] == true, "Staking paused or in migration"); require(liquidity > 0, "Must stake more than zero"); require(greylist[staker_address] == false, "Address has been greylisted"); require(secs >= lock_time_min, "Minimum stake time not met"); require(secs <= lock_time_for_max_multiplier,"Trying to lock for too long"); uint256 lock_multiplier = lockMultiplier(secs); bytes32 kek_id = keccak256(abi.encodePacked(staker_address, start_timestamp, liquidity, _locked_liquidity[staker_address])); lockedStakes[staker_address].push(LockedStake( kek_id, start_timestamp, liquidity, start_timestamp.add(secs), lock_multiplier )); // Pull the tokens from the source_address TransferHelper.safeTransferFrom(address(stakingToken), source_address, address(this), liquidity); // Update liquidities _total_liquidity_locked = _total_liquidity_locked.add(liquidity); _locked_liquidity[staker_address] = _locked_liquidity[staker_address].add(liquidity); // Need to call to update the combined weights _updateRewardAndBalance(staker_address, false); emit StakeLocked(staker_address, liquidity, secs, kek_id, source_address); } // Two different withdrawLocked functions are needed because of delegateCall and msg.sender issues (important for migration) function withdrawLocked(bytes32 kek_id) nonReentrant public { require(withdrawalsPaused == false, "Withdrawals paused"); _withdrawLocked(msg.sender, msg.sender, kek_id); } // No withdrawer == msg.sender check needed since this is only internally callable and the checks are done in the wrapper // functions like withdraw(), migrator_withdraw_unlocked() and migrator_withdraw_locked() function _withdrawLocked(address staker_address, address destination_address, bytes32 kek_id) internal { // Collect rewards first and then update the balances _getReward(staker_address, destination_address); LockedStake memory thisStake; thisStake.liquidity = 0; uint theArrayIndex; for (uint i = 0; i < lockedStakes[staker_address].length; i++){ if (kek_id == lockedStakes[staker_address][i].kek_id){ thisStake = lockedStakes[staker_address][i]; theArrayIndex = i; break; } } require(thisStake.kek_id == kek_id, "Stake not found"); require(block.timestamp >= thisStake.ending_timestamp || stakesUnlocked == true || valid_migrators[msg.sender] == true, "Stake is still locked!"); uint256 liquidity = thisStake.liquidity; if (liquidity > 0) { // Update liquidities _total_liquidity_locked = _total_liquidity_locked.sub(liquidity); _locked_liquidity[staker_address] = _locked_liquidity[staker_address].sub(liquidity); // Remove the stake from the array delete lockedStakes[staker_address][theArrayIndex]; // Need to call to update the combined weights _updateRewardAndBalance(staker_address, false); // Give the tokens to the destination_address // Should throw if insufficient balance stakingToken.transfer(destination_address, liquidity); emit WithdrawLocked(staker_address, liquidity, kek_id, destination_address); } } // Two different getReward functions are needed because of delegateCall and msg.sender issues (important for migration) function getReward() external nonReentrant returns (uint256, uint256) { require(rewardsCollectionPaused == false,"Rewards collection paused"); return _getReward(msg.sender, msg.sender); } // No withdrawer == msg.sender check needed since this is only internally callable // This distinction is important for the migrator function _getReward(address rewardee, address destination_address) internal updateRewardAndBalance(rewardee, true) returns (uint256 reward0, uint256 reward1) { reward0 = rewards0[rewardee]; reward1 = rewards1[rewardee]; if (reward0 > 0) { rewards0[rewardee] = 0; rewardsToken0.transfer(destination_address, reward0); emit RewardPaid(rewardee, reward0, address(rewardsToken0), destination_address); } // if (token1_rewards_on){ if (reward1 > 0) { rewards1[rewardee] = 0; rewardsToken1.transfer(destination_address, reward1); emit RewardPaid(rewardee, reward1, address(rewardsToken1), destination_address); } // } } // If the period expired, renew it function retroCatchUp() internal { // Failsafe check require(block.timestamp > periodFinish, "Period has not expired yet!"); // Ensure the provided reward amount is not more than the balance in the contract. // This keeps the reward rate in the right range, preventing overflows due to // very high values of rewardRate in the earned and rewardsPerToken functions; // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow. uint256 num_periods_elapsed = uint256(block.timestamp.sub(periodFinish)) / rewardsDuration; // Floor division to the nearest period uint balance0 = rewardsToken0.balanceOf(address(this)); uint balance1 = rewardsToken1.balanceOf(address(this)); require(rewardRate0.mul(rewardsDuration).mul(num_periods_elapsed + 1) <= balance0, "Not enough C3 available"); if (token1_rewards_on){ require(rewardRate1.mul(rewardsDuration).mul(num_periods_elapsed + 1) <= balance1, "Not enough token1 available for rewards!"); } // uint256 old_lastUpdateTime = lastUpdateTime; // uint256 new_lastUpdateTime = block.timestamp; // lastUpdateTime = periodFinish; periodFinish = periodFinish.add((num_periods_elapsed.add(1)).mul(rewardsDuration)); (uint256 reward0, uint256 reward1) = rewardPerToken(); rewardPerTokenStored0 = reward0; rewardPerTokenStored1 = reward1; lastUpdateTime = lastTimeRewardApplicable(); emit RewardsPeriodRenewed(address(stakingToken)); } function sync() public { if (block.timestamp > periodFinish) { retroCatchUp(); } else { (uint256 reward0, uint256 reward1) = rewardPerToken(); rewardPerTokenStored0 = reward0; rewardPerTokenStored1 = reward1; lastUpdateTime = lastTimeRewardApplicable(); } } /* ========== RESTRICTED FUNCTIONS ========== */ // Migrator can stake for someone else (they won't be able to withdraw it back though, only staker_address can). function migrator_stakeLocked_for(address staker_address, uint256 amount, uint256 secs, uint256 start_timestamp) external isMigrating { require(staker_allowed_migrators[staker_address][msg.sender] && valid_migrators[msg.sender], "Mig. invalid or unapproved"); _stakeLocked(staker_address, msg.sender, amount, secs, start_timestamp); } // Used for migrations function migrator_withdraw_locked(address staker_address, bytes32 kek_id) external isMigrating { require(staker_allowed_migrators[staker_address][msg.sender] && valid_migrators[msg.sender], "Mig. invalid or unapproved"); _withdrawLocked(staker_address, msg.sender, kek_id); } // Adds supported migrator address function addMigrator(address migrator_address) external onlyByOwnGov { valid_migrators[migrator_address] = true; } // Remove a migrator address function removeMigrator(address migrator_address) external onlyByOwnGov { require(valid_migrators[migrator_address] == true, "Address nonexistant"); // Delete from the mapping delete valid_migrators[migrator_address]; } // Added to support recovering LP Rewards and other mistaken tokens from other systems to be distributed to holders function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyByOwnGov { // Admin cannot withdraw the staking token from the contract unless currently migrating if(!migrationsOn){ require(tokenAddress != address(stakingToken), "Not in migration"); // Only Governance / Timelock can trigger a migration } // Only the owner address can ever receive the recovery withdrawal ERC20(tokenAddress).transfer(owner, tokenAmount); emit Recovered(tokenAddress, tokenAmount); } function setRewardsDuration(uint256 _rewardsDuration) external onlyByOwnGovCtrlr { require( periodFinish == 0 || block.timestamp > periodFinish, "Reward period incomplete" ); rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(rewardsDuration); } function setMultipliers(uint256 _lock_max_multiplier, uint256 _vec3_max_multiplier, uint256 _vec3_per_c3_for_max_boost) external onlyByOwnGov { require(_lock_max_multiplier >= MULTIPLIER_PRECISION, "Mult must be >= MULTIPLIER_PRECISION"); require(_vec3_max_multiplier >= 0, "veC3 mul must be >= 0"); require(_vec3_per_c3_for_max_boost > 0, "veC3 pct max must be >= 0"); lock_max_multiplier = _lock_max_multiplier; vec3_max_multiplier = _vec3_max_multiplier; vec3_per_c3_for_max_boost = _vec3_per_c3_for_max_boost; emit MaxVeC3Multiplier(vec3_max_multiplier); emit LockedStakeMaxMultiplierUpdated(lock_max_multiplier); emit veC3PerC3ForMaxBoostUpdated(vec3_per_c3_for_max_boost); } function setLockedStakeTimeForMinAndMaxMultiplier(uint256 _lock_time_for_max_multiplier, uint256 _lock_time_min) external onlyByOwnGov { require(_lock_time_for_max_multiplier >= 1, "Mul max time must be >= 1"); require(_lock_time_min >= 1, "Mul min time must be >= 1"); lock_time_for_max_multiplier = _lock_time_for_max_multiplier; lock_time_min = _lock_time_min; emit LockedStakeTimeForMaxMultiplier(lock_time_for_max_multiplier); emit LockedStakeMinTime(_lock_time_min); } function greylistAddress(address _address) external onlyByOwnGov { greylist[_address] = !(greylist[_address]); } function unlockStakes() external onlyByOwnGov { stakesUnlocked = !stakesUnlocked; } function toggleMigrations() external onlyByOwnGov { migrationsOn = !migrationsOn; } function toggleStaking() external onlyByOwnGov { stakingPaused = !stakingPaused; } function toggleWithdrawals() external onlyByOwnGov { withdrawalsPaused = !withdrawalsPaused; } function toggleRewardsCollection() external onlyByOwnGov { rewardsCollectionPaused = !rewardsCollectionPaused; } function setRewardRates(uint256 _new_rate0, uint256 _new_rate1, bool sync_too) external onlyByOwnGovCtrlr { rewardRate0 = _new_rate0; rewardRate1 = _new_rate1; if (sync_too){ sync(); } } function toggleToken1Rewards() external onlyByOwnGov { if (token1_rewards_on) { rewardRate1 = 0; } token1_rewards_on = !token1_rewards_on; } function setTimelock(address _new_timelock) external onlyByOwnGov { timelock_address = _new_timelock; } function setController(address _controller_address) external onlyByOwnGov { controller_address = _controller_address; } /* ========== EVENTS ========== */ event StakeLocked(address indexed user, uint256 amount, uint256 secs, bytes32 kek_id, address source_address); event WithdrawLocked(address indexed user, uint256 amount, bytes32 kek_id, address destination_address); event RewardPaid(address indexed user, uint256 reward, address token_address, address destination_address); event RewardsDurationUpdated(uint256 newDuration); event Recovered(address token, uint256 amount); event RewardsPeriodRenewed(address token); event LockedStakeMaxMultiplierUpdated(uint256 multiplier); event LockedStakeTimeForMaxMultiplier(uint256 secs); event LockedStakeMinTime(uint256 secs); event MaxVeC3Multiplier(uint256 multiplier); event veC3PerC3ForMaxBoostUpdated(uint256 scale_factor); } // File: contracts/Staking/C3_Variants/C3_StakingRewardsDualV5_nonLP_wsKLIMA.sol pragma solidity >=0.6.11; contract StakingRewardsDualV5_nonLP_wsKLIMA is C3StakingRewardsDualV5_nonLP { constructor ( address _owner, address _rewardsToken0, address _rewardsToken1, // KLIMA is E9 address _stakingToken, address _c3_address, address _timelock_address, address _veC3_address ) C3StakingRewardsDualV5_nonLP(_owner, _rewardsToken0, _rewardsToken1, _stakingToken, _c3_address, _timelock_address, _veC3_address ) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_rewardsToken0","type":"address"},{"internalType":"address","name":"_rewardsToken1","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_c3_address","type":"address"},{"internalType":"address","name":"_timelock_address","type":"address"},{"internalType":"address","name":"_veC3_address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"LockedStakeMaxMultiplierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"secs","type":"uint256"}],"name":"LockedStakeMinTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"secs","type":"uint256"}],"name":"LockedStakeTimeForMaxMultiplier","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"MaxVeC3Multiplier","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"},{"indexed":false,"internalType":"address","name":"destination_address","type":"address"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"RewardsPeriodRenewed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secs","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"kek_id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"source_address","type":"address"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"kek_id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"destination_address","type":"address"}],"name":"WithdrawLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"scale_factor","type":"uint256"}],"name":"veC3PerC3ForMaxBoostUpdated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"migrator_address","type":"address"}],"name":"addMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"calcCurCombinedWeight","outputs":[{"internalType":"uint256","name":"old_combined_weight","type":"uint256"},{"internalType":"uint256","name":"new_vec3_multiplier","type":"uint256"},{"internalType":"uint256","name":"new_combined_weight","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"combinedWeightOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"greylist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"greylistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"secs","type":"uint256"}],"name":"lockMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock_max_multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock_time_for_max_multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock_time_min","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lockedLiquidityOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lockedStakesOf","outputs":[{"components":[{"internalType":"bytes32","name":"kek_id","type":"bytes32"},{"internalType":"uint256","name":"start_timestamp","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"ending_timestamp","type":"uint256"},{"internalType":"uint256","name":"lock_multiplier","type":"uint256"}],"internalType":"struct C3StakingRewardsDualV5_nonLP.LockedStake[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrationsOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker_address","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"secs","type":"uint256"},{"internalType":"uint256","name":"start_timestamp","type":"uint256"}],"name":"migrator_stakeLocked_for","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker_address","type":"address"},{"internalType":"bytes32","name":"kek_id","type":"bytes32"}],"name":"migrator_withdraw_locked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"minVeC3ForMaxBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"migrator_address","type":"address"}],"name":"removeMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsCollectionPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_controller_address","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lock_time_for_max_multiplier","type":"uint256"},{"internalType":"uint256","name":"_lock_time_min","type":"uint256"}],"name":"setLockedStakeTimeForMinAndMaxMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lock_max_multiplier","type":"uint256"},{"internalType":"uint256","name":"_vec3_max_multiplier","type":"uint256"},{"internalType":"uint256","name":"_vec3_per_c3_for_max_boost","type":"uint256"}],"name":"setMultipliers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_rate0","type":"uint256"},{"internalType":"uint256","name":"_new_rate1","type":"uint256"},{"internalType":"bool","name":"sync_too","type":"bool"}],"name":"setRewardRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"secs","type":"uint256"}],"name":"stakeLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"migrator_address","type":"address"}],"name":"stakerAllowMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"migrator_address","type":"address"}],"name":"stakerDisallowMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"staker_allowed_migrators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakesUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timelock_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMigrations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleRewardsCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleToken1Rewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token1_rewards_on","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCombinedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLiquidityLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"userStakedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"valid_migrators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"veC3Multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vec3_max_multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vec3_per_c3_for_max_boost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"kek_id","type":"bytes32"}],"name":"withdrawLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526729a2241af62c0000600b556305a39a80600c5562015180600d55673782dace9d900000600e55671bc16d674ec80000600f5562093a8060135560006015556022805460ff191660011790553480156200005d57600080fd5b50604051620036873803806200368783398101604081905262000080916200026d565b86868686868686866001600160a01b038116620000e45760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f7420626520300000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1506001600255600480546001600160a01b03199081166001600160a01b038981169190911790925560058054821688841617905560068054821687841617905560038054821684841617905560078054909116918416919091179055600060118190556012556022805462ffff001916905542600a819055601354620001ce9190620001e6602090811b62001e9d17901c565b60095550620003299c50505050505050505050505050565b600080620001f5838562000302565b905083811015620002495760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620000db565b9392505050565b80516001600160a01b03811681146200026857600080fd5b919050565b600080600080600080600060e0888a0312156200028957600080fd5b620002948862000250565b9650620002a46020890162000250565b9550620002b46040890162000250565b9450620002c46060890162000250565b9350620002d46080890162000250565b9250620002e460a0890162000250565b9150620002f460c0890162000250565b905092959891949750929550565b600082198211156200032457634e487b7160e01b600052601160045260246000fd5b500190565b61334e80620003396000396000f3fe608060405234801561001057600080fd5b50600436106103e55760003560e01c806392eefe9b1161020a578063d239f00311610125578063ebe2b12b116100b8578063f9706f4411610087578063f9706f44146108ad578063fce6fd13146108c0578063fe271f5f146108d2578063ff0063fc146108f2578063fff6cae9146108fb57600080fd5b8063ebe2b12b14610866578063ed48f6f71461086f578063ee89e02f14610877578063f12f14471461089a57600080fd5b8063e01f62bf116100f4578063e01f62bf1461082f578063e1ba95d214610837578063e9f2838e1461083f578063eb3c209e1461085357600080fd5b8063d239f00314610801578063d9f96e8d14610574578063dc6663c714610809578063de9853ad1461081c57600080fd5b8063b94c4dcb1161019d578063c8f33c911161016c578063c8f33c91146107d4578063cc1a378f146107dd578063cd3daf9d146107f0578063cdc82e80146107f857600080fd5b8063b94c4dcb14610782578063bbb781cc1461078b578063bdacb303146107a1578063c126d1aa146107b457600080fd5b80639c5303eb116101d95780639c5303eb1461074b578063a1ec508a1461075e578063a2217bc514610767578063af00f4e21461076f57600080fd5b806392eefe9b146106e6578063941d9f65146106f95780639637927f1461070c5780639b8c15a81461071f57600080fd5b80633d18b9121161030557806367feda3e1161029857806379ba50971161026757806379ba5097146106825780637b31c19a1461068a5780638980f11f146106925780638bad86a7146106a55780638da5cb5b146106d357600080fd5b806367feda3e146106335780636a231b03146106465780636ce46bc3146106665780636e27cef91461067957600080fd5b806352732bc8116102d457806352732bc8146105b957806353a47bb7146105f3578063643504671461061e57806364f2c0601461062b57600080fd5b80633d18b9121461056c5780634703dace1461057457806351654f7f1461059d57806351e3fc17146105a657600080fd5b80631e090f011161037d578063323331ca1161034c578063323331ca1461051d57806336f89af214610532578063386a95251461055b5780633b8105b31461056457600080fd5b80631e090f01146104ae57806328ef934e146104ce5780632ca1a895146104e157806331ca208c146104ea57600080fd5b8063170feb76116103b9578063170feb761461046d57806317b18c89146104805780631b3e870a146104935780631c1f78eb146104a657600080fd5b80628cc262146103ea5780630d7bac4f14610417578063144e8034146104385780631627540c14610458575b600080fd5b6103fd6103f8366004612f53565b610903565b604080519283526020830191909152015b60405180910390f35b61042a610425366004612f6e565b610a23565b60405190815260200161040e565b61042a610446366004612f53565b60166020526000908152604090205481565b61046b610466366004612f53565b610a7c565b005b61042a61047b366004612f53565b610b48565b61046b61048e366004612f87565b610c2d565b61046b6104a1366004612f53565b610c69565b6103fd610d2c565b6104c16104bc366004612f53565b610d5d565b60405161040e9190612fa9565b61046b6104dc366004613017565b610e04565b61042a60115481565b61050d6104f8366004612f53565b60216020526000908152604090205460ff1681565b604051901515815260200161040e565b60225461050d90640100000000900460ff1681565b61042a610540366004612f53565b6001600160a01b03166000908152601d602052604090205490565b61042a60135481565b61046b610ed0565b6103fd610f34565b61042a610582366004612f53565b6001600160a01b03166000908152601c602052604090205490565b61042a600f5481565b61046b6105b4366004612f6e565b610fcf565b61046b6105c7366004612f53565b336000908152602080805260408083206001600160a01b0394909416835292905220805460ff19169055565b600154610606906001600160a01b031681565b6040516001600160a01b03909116815260200161040e565b60225461050d9060ff1681565b601b5461042a565b600854610606906001600160a01b031681565b61042a610654366004612f53565b60196020526000908152604090205481565b61046b610674366004613050565b611057565b61042a600d5481565b61046b611207565b61046b6112f1565b61046b6106a036600461307c565b611353565b6106b86106b3366004612f53565b61148e565b6040805193845260208401929092529082015260600161040e565b600054610606906001600160a01b031681565b61046b6106f4366004612f53565b61163e565b61046b610707366004612f53565b61169f565b60225461050d9062010000900460ff1681565b61050d61072d3660046130a6565b60208080526000928352604080842090915290825290205460ff1681565b61046b610759366004612f53565b611707565b61042a60125481565b61046b61176a565b61046b61077d366004612f87565b6117c6565b61042a600c5481565b60225461050d9065010000000000900460ff1681565b61046b6107af366004612f53565b611914565b61042a6107c2366004612f53565b60186020526000908152604090205481565b61042a600a5481565b61046b6107eb366004612f6e565b611975565b6103fd611a83565b61042a600b5481565b61046b611b12565b600754610606906001600160a01b031681565b61046b61082a3660046130e7565b611b72565b601a5461042a565b61046b611c0c565b60225461050d906301000000900460ff1681565b61046b61086136600461307c565b611c6a565b61042a60095481565b61046b611d32565b61050d610885366004612f53565b601f6020526000908152604090205460ff1681565b61046b6108a8366004612f53565b611d96565b61042a6108bb366004612f53565b611e2d565b60225461050d90610100900460ff1681565b61042a6108e0366004612f53565b60176020526000908152604090205481565b61042a600e5481565b61046b611e60565b600080600080610911611a83565b6001600160a01b0387166000908152601d60205260409020549193509150610940575060009485945092505050565b6001600160a01b0385166000908152601860209081526040808320546016909252909120546109b291906109ac90670de0b6b3a7640000906109a690610987908890611f03565b6001600160a01b038b166000908152601d602052604090205490611f45565b90611fc4565b90611e9d565b6001600160a01b038616600090815260196020908152604080832054601790925290912054610a1891906109ac90670de0b6b3a7640000906109a6906109f9908890611f03565b6001600160a01b038c166000908152601d602052604090205490611f45565b935093505050915091565b600080610a65610a56600c546109a6610a4f670de0b6b3a7640000600b54611f0390919063ffffffff16565b8790611f45565b670de0b6b3a764000090611e9d565b9050600b54811115610a765750600b545b92915050565b6000546001600160a01b03163314610af35760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b60648201526084015b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22906020015b60405180910390a150565b600080610b5483611e2d565b90508015610c24576003546040516370a0823160e01b81526001600160a01b038581166004830152600092610be69285926109a692670de0b6b3a7640000929116906370a0823190602401602060405180830381865afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be09190613120565b90611f45565b90506000610c0b670de0b6b3a76400006109a6600f5485611f4590919063ffffffff16565b9050600f54811115610c1c5750600f545b949350505050565b50600092915050565b600280541415610c4f5760405162461bcd60e51b8152600401610aea90613139565b60028055610c603380848442612006565b50506001600255565b6000546001600160a01b0316331480610c8c57506007546001600160a01b031633145b610ca85760405162461bcd60e51b8152600401610aea90613170565b6001600160a01b0381166000908152601f602052604090205460ff161515600114610d0b5760405162461bcd60e51b81526020600482015260136024820152721059191c995cdcc81b9bdb995e1a5cdd185b9d606a1b6044820152606401610aea565b6001600160a01b03166000908152601f60205260409020805460ff19169055565b600080610d46601354601154611f4590919063ffffffff16565b601354601254610d5591611f45565b915091509091565b6001600160a01b0381166000908152601e60209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610df957838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020019060010190610d95565b505050509050919050565b60225460ff610100909104161515600114610e315760405162461bcd60e51b8152600401610aea9061319f565b6001600160a01b03841660009081526020808052604080832033845290915290205460ff168015610e715750336000908152601f602052604090205460ff165b610ebd5760405162461bcd60e51b815260206004820152601a60248201527f4d69672e20696e76616c6964206f7220756e617070726f7665640000000000006044820152606401610aea565b610eca8433858585612006565b50505050565b6000546001600160a01b0316331480610ef357506007546001600160a01b031633145b610f0f5760405162461bcd60e51b8152600401610aea90613170565b6022805465ff0000000000198116650100000000009182900460ff1615909102179055565b600080600280541415610f595760405162461bcd60e51b8152600401610aea90613139565b60028055602254640100000000900460ff1615610fb85760405162461bcd60e51b815260206004820152601960248201527f5265776172647320636f6c6c656374696f6e20706175736564000000000000006044820152606401610aea565b610fc233336123bf565b9150915060016002559091565b600280541415610ff15760405162461bcd60e51b8152600401610aea90613139565b600280556022546301000000900460ff16156110445760405162461bcd60e51b815260206004820152601260248201527115da5d1a191c985dd85b1cc81c185d5cd95960721b6044820152606401610aea565b61104f3333836125cd565b506001600255565b6000546001600160a01b031633148061107a57506007546001600160a01b031633145b6110965760405162461bcd60e51b8152600401610aea90613170565b670de0b6b3a76400008310156110fa5760405162461bcd60e51b8152602060048201526024808201527f4d756c74206d757374206265203e3d204d554c5449504c4945525f505245434960448201526329a4a7a760e11b6064820152608401610aea565b6000811161114a5760405162461bcd60e51b815260206004820152601960248201527f7665433320706374206d6178206d757374206265203e3d2030000000000000006044820152606401610aea565b600b839055600f829055600e8190556040518281527f6b04d7611e06fe226eebfd39936d0c17ed4750a86ec9bd223924335d955288689060200160405180910390a17fa1676084a9eea08c6f205b60799323b364a1bd8e10aba89f0fbd94cfbf68b5dd600b546040516111bf91815260200190565b60405180910390a17f5341dc8814a88b3b792bc9de97825af6a74034e43f5263d2ebc8407936723fe6600e546040516111fa91815260200190565b60405180910390a1505050565b6001546001600160a01b0316331461127f5760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610aea565b600054600154604080516001600160a01b0393841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031633148061131457506007546001600160a01b031633145b6113305760405162461bcd60e51b8152600401610aea90613170565b6022805464ff000000001981166401000000009182900460ff1615909102179055565b6000546001600160a01b031633148061137657506007546001600160a01b031633145b6113925760405162461bcd60e51b8152600401610aea90613170565b602254610100900460ff166113cf576006546001600160a01b03838116911614156113cf5760405162461bcd60e51b8152600401610aea9061319f565b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af1158015611422573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144691906131c9565b50604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2891015b60405180910390a15050565b6001600160a01b0381166000908152601d602052604081205490806114b284610b48565b6001600160a01b0385166000908152601c6020526040812054919350901580156114f257506001600160a01b0385166000908152601d6020526040902054155b156114fe57508161152c565b6001600160a01b038516600090815260106020526040902054611529906002906109a6908690611e9d565b90505b6000915060005b6001600160a01b0386166000908152601e6020526040902054811015611635576001600160a01b0386166000908152601e6020526040812080548390811061157d5761157d6131e6565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600081608001519050428260600151116115e95750670de0b6b3a76400005b60408201516000611610670de0b6b3a76400006109a6611609868a611e9d565b8590611f45565b905061161c8782611e9d565b965050505050808061162d90613212565b915050611533565b50509193909250565b6000546001600160a01b031633148061166157506007546001600160a01b031633145b61167d5760405162461bcd60e51b8152600401610aea90613170565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806116c257506007546001600160a01b031633145b6116de5760405162461bcd60e51b8152600401610aea90613170565b6001600160a01b03166000908152602160205260409020805460ff19811660ff90911615179055565b6000546001600160a01b031633148061172a57506007546001600160a01b031633145b6117465760405162461bcd60e51b8152600401610aea90613170565b6001600160a01b03166000908152601f60205260409020805460ff19166001179055565b6000546001600160a01b031633148061178d57506007546001600160a01b031633145b6117a95760405162461bcd60e51b8152600401610aea90613170565b6022805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b03163314806117e957506007546001600160a01b031633145b6118055760405162461bcd60e51b8152600401610aea90613170565b60018210156118565760405162461bcd60e51b815260206004820152601960248201527f4d756c206d61782074696d65206d757374206265203e3d2031000000000000006044820152606401610aea565b60018110156118a75760405162461bcd60e51b815260206004820152601960248201527f4d756c206d696e2074696d65206d757374206265203e3d2031000000000000006044820152606401610aea565b600c829055600d8190556040518281527f0e3e3fae480c6f92291358a02bc83f04ee1971d5488596bffda7929d57ab470f9060200160405180910390a16040518181527f0534d208d75dfdbfacc1204745dd9b3c4c37e8cfc05eb5e8e3ae538aedb0a9fa90602001611482565b6000546001600160a01b031633148061193757506007546001600160a01b031633145b6119535760405162461bcd60e51b8152600401610aea90613170565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061199857506007546001600160a01b031633145b806119ad57506008546001600160a01b031633145b6119f25760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb716103a3635961037b91031ba39363960511b6044820152606401610aea565b6009541580611a02575060095442115b611a4e5760405162461bcd60e51b815260206004820152601860248201527f52657761726420706572696f6420696e636f6d706c65746500000000000000006044820152606401610aea565b60138190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d390602001610b3d565b600080601a5460001480611a975750601b54155b15611aa85750506014546015549091565b611ae0611ad7601b546109a6670de0b6b3a7640000610be0601154610be0600a54611ad161294e565b90611f03565b60145490611e9d565b610d55611b09601b546109a6670de0b6b3a7640000610be0601254610be0600a54611ad161294e565b60155490611e9d565b6000546001600160a01b0316331480611b3557506007546001600160a01b031633145b611b515760405162461bcd60e51b8152600401610aea90613170565b6022805463ff00000019811663010000009182900460ff1615909102179055565b6000546001600160a01b0316331480611b9557506007546001600160a01b031633145b80611baa57506008546001600160a01b031633145b611bef5760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb716103a3635961037b91031ba39363960511b6044820152606401610aea565b601183905560128290558015611c0757611c07611e60565b505050565b6000546001600160a01b0316331480611c2f57506007546001600160a01b031633145b611c4b5760405162461bcd60e51b8152600401610aea90613170565b6022805462ff0000198116620100009182900460ff1615909102179055565b60225460ff610100909104161515600114611c975760405162461bcd60e51b8152600401610aea9061319f565b6001600160a01b03821660009081526020808052604080832033845290915290205460ff168015611cd75750336000908152601f602052604090205460ff165b611d235760405162461bcd60e51b815260206004820152601a60248201527f4d69672e20696e76616c6964206f7220756e617070726f7665640000000000006044820152606401610aea565b611d2e8233836125cd565b5050565b6000546001600160a01b0316331480611d5557506007546001600160a01b031633145b611d715760405162461bcd60e51b8152600401610aea90613170565b60225460ff1615611d825760006012555b6022805460ff19811660ff90911615179055565b6001600160a01b0381166000908152601f602052604090205460ff16611dfe5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d69677261746f72206164647265737300000000000000006044820152606401610aea565b336000908152602080805260408083206001600160a01b0394909416835292905220805460ff19166001179055565b6000610a76670de0b6b3a76400006109a6600e54610be0866001600160a01b03166000908152601c602052604090205490565b600954421115611e7457611e72612961565b565b600080611e7f611a83565b601482905560158190559092509050611e9661294e565b600a555050565b600080611eaa838561322d565b905083811015611efc5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610aea565b9392505050565b6000611efc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c3f565b600082611f5457506000610a76565b6000611f608385613245565b905082611f6d8583613264565b14611efc5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610aea565b6000611efc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612c79565b8460016120138282612ca7565b60225465010000000000900460ff1615806120425750336000908152601f602052604090205460ff1615156001145b61208e5760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720706175736564206f7220696e206d6967726174696f6e00006044820152606401610aea565b600085116120de5760405162461bcd60e51b815260206004820152601960248201527f4d757374207374616b65206d6f7265207468616e207a65726f000000000000006044820152606401610aea565b6001600160a01b03871660009081526021602052604090205460ff16156121475760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320686173206265656e20677265796c697374656400000000006044820152606401610aea565b600d548410156121995760405162461bcd60e51b815260206004820152601a60248201527f4d696e696d756d207374616b652074696d65206e6f74206d65740000000000006044820152606401610aea565b600c548411156121eb5760405162461bcd60e51b815260206004820152601b60248201527f547279696e6720746f206c6f636b20666f7220746f6f206c6f6e6700000000006044820152606401610aea565b60006121f685610a23565b6001600160a01b0389166000908152601c602090815260408083205490516bffffffffffffffffffffffff1960608e901b169281019290925260348201889052605482018a905260748201529192509060940160408051601f1981840301815282825280516020918201206001600160a01b038d166000908152601e835283902060a0850184528185529184018990529183018a9052909250906060810161229e888a611e9d565b8152602090810185905282546001818101855560009485529382902083516005909202019081559082015192810192909255604081015160028301556060810151600383015560800151600490910155600654612306906001600160a01b031689308a612d96565b601a546123139088611e9d565b601a556001600160a01b0389166000908152601c60205260409020546123399088611e9d565b6001600160a01b038a166000908152601c6020526040812091909155612360908a90612ca7565b60408051888152602081018890529081018290526001600160a01b0389811660608301528a16907ff400e72e69ef4402819dfc57eeddc66f5eb69bf405e0e8098b1946ec1ac14a229060800160405180910390a2505050505050505050565b6000808360016123cf8282612ca7565b6001600160a01b038616600090815260186020908152604080832054601990925290912054909450925083156124e0576001600160a01b038681166000908152601860205260408082209190915560048054915163a9059cbb60e01b8152888416918101919091526024810187905291169063a9059cbb906044016020604051808303816000875af1158015612469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248d91906131c9565b50600454604080518681526001600160a01b039283166020820152878316818301529051918816917f1d2f2ca53af5d2f333bd32fdd45f9c52ad8ebe31414f7792912077fcb3876dff9181900360600190a25b82156125c4576001600160a01b0386811660009081526019602052604080822091909155600554905163a9059cbb60e01b815287831660048201526024810186905291169063a9059cbb906044016020604051808303816000875af115801561254d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257191906131c9565b50600554604080518581526001600160a01b039283166020820152878316818301529051918816917f1d2f2ca53af5d2f333bd32fdd45f9c52ad8ebe31414f7792912077fcb3876dff9181900360600190a25b50509250929050565b6125d783836123bf565b505061260e6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001600081525090565b600060408201819052805b6001600160a01b0386166000908152601e602052604090205481101561270d576001600160a01b0386166000908152601e60205260409020805482908110612663576126636131e6565b9060005260206000209060050201600001548414156126fb576001600160a01b0386166000908152601e602052604090208054829081106126a6576126a66131e6565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050925080915061270d565b8061270581613212565b915050612619565b50815183146127505760405162461bcd60e51b815260206004820152600f60248201526e14dd185ad9481b9bdd08199bdd5b99608a1b6044820152606401610aea565b816060015142101580612770575060225462010000900460ff1615156001145b8061278f5750336000908152601f602052604090205460ff1615156001145b6127d45760405162461bcd60e51b81526020600482015260166024820152755374616b65206973207374696c6c206c6f636b65642160501b6044820152606401610aea565b6040820151801561294657601a546127ec9082611f03565b601a556001600160a01b0386166000908152601c60205260409020546128129082611f03565b6001600160a01b0387166000908152601c6020908152604080832093909355601e905220805483908110612848576128486131e6565b600091825260208220600590910201818155600181018290556002810182905560038101829055600401819055612880908790612ca7565b60065460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156128d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f791906131c9565b5060408051828152602081018690526001600160a01b03878116828401529151918816917f1d9308f6b22a2754a1c622bb30889e8f8f956c83e524d039e9d65d5f052eb9089181900360600190a25b505050505050565b600061295c42600954612ebe565b905090565b60095442116129b25760405162461bcd60e51b815260206004820152601b60248201527f506572696f6420686173206e6f742065787069726564207965742100000000006044820152606401610aea565b60006013546129cc60095442611f0390919063ffffffff16565b6129d69190613264565b600480546040516370a0823160e01b815230928101929092529192506000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a499190613120565b6005546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abb9190613120565b905081612adb612acc85600161322d565b601354601154610be091611f45565b1115612b295760405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f75676820433320617661696c61626c650000000000000000006044820152606401610aea565b60225460ff1615612bb15780612b52612b4385600161322d565b601354601254610be091611f45565b1115612bb15760405162461bcd60e51b815260206004820152602860248201527f4e6f7420656e6f75676820746f6b656e3120617661696c61626c6520666f7220604482015267726577617264732160c01b6064820152608401610aea565b601354612bd090612bc790610be0866001611e9d565b60095490611e9d565b600955600080612bde611a83565b601482905560158190559092509050612bf561294e565b600a556006546040516001600160a01b0390911681527f6f2b3b3aaf1881d69a5d40565500f93ea73df36e7b6a29bf48b21479a9237fe99060200160405180910390a15050505050565b60008184841115612c635760405162461bcd60e51b8152600401610aea91906132b2565b506000612c7084866132e5565b95945050505050565b60008183612c9a5760405162461bcd60e51b8152600401610aea91906132b2565b506000612c708486613264565b8015612cb557612cb5611e60565b6001600160a01b03821615611d2e576000806000612cd28561148e565b925092509250612ce185612ed4565b6001600160a01b0385166000908152601060205260409020829055828110612d4b576000612d0f8285611f03565b601b54909150612d1f9082611e9d565b601b55612d2c8482611e9d565b6001600160a01b0387166000908152601d602052604090205550612d8f565b6000612d578483611f03565b601b54909150612d679082611f03565b601b55612d748482611f03565b6001600160a01b0387166000908152601d6020526040902055505b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612dfa91906132fc565b6000604051808303816000865af19150503d8060008114612e37576040519150601f19603f3d011682016040523d82523d6000602084013e612e3c565b606091505b5091509150818015612e66575080511580612e66575080806020019051810190612e6691906131c9565b6129465760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610aea565b6000818310612ecd5781611efc565b5090919050565b6001600160a01b03811615612f3457600080612eef83610903565b6001600160a01b038516600090815260186020908152604080832094909455601981528382209290925560145460168352838220556015546017909252919091205550505b50565b80356001600160a01b0381168114612f4e57600080fd5b919050565b600060208284031215612f6557600080fd5b611efc82612f37565b600060208284031215612f8057600080fd5b5035919050565b60008060408385031215612f9a57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b8281101561300a5781518051855286810151878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101612fc6565b5091979650505050505050565b6000806000806080858703121561302d57600080fd5b61303685612f37565b966020860135965060408601359560600135945092505050565b60008060006060848603121561306557600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561308f57600080fd5b61309883612f37565b946020939093013593505050565b600080604083850312156130b957600080fd5b6130c283612f37565b91506130d060208401612f37565b90509250929050565b8015158114612f3457600080fd5b6000806000606084860312156130fc57600080fd5b83359250602084013591506040840135613115816130d9565b809150509250925092565b60006020828403121561313257600080fd5b5051919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601590820152744e6f74206f776e6572206f722074696d656c6f636b60581b604082015260600190565b60208082526010908201526f2737ba1034b71036b4b3b930ba34b7b760811b604082015260600190565b6000602082840312156131db57600080fd5b8151611efc816130d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613226576132266131fc565b5060010190565b60008219821115613240576132406131fc565b500190565b600081600019048311821515161561325f5761325f6131fc565b500290565b60008261328157634e487b7160e01b600052601260045260246000fd5b500490565b60005b838110156132a1578181015183820152602001613289565b83811115610eca5750506000910152565b60208152600082518060208401526132d1816040850160208701613286565b601f01601f19169190910160400192915050565b6000828210156132f7576132f76131fc565b500390565b6000825161330e818460208701613286565b919091019291505056fea26469706673582212202d11967dd0fb1e13d8811c4da956c0f4949eb84d59cba471870b4840a8b1e95f64736f6c634300080b00330000000000000000000000008c250a8128c76b25103174d0cf9dee4800ebfecd000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c60000000000000000000000004e78011ce80ee02d2c3e649fb657e458982578150000000000000000000000006f370dba99e32a3cad959b341120db3c9e280ba6000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c60000000000000000000000009dca574b1b6bd51cbd02a3d98716597bd84c45eb0000000000000000000000006a88a0abb9be9f9050ff87753b84613f4e28361b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103e55760003560e01c806392eefe9b1161020a578063d239f00311610125578063ebe2b12b116100b8578063f9706f4411610087578063f9706f44146108ad578063fce6fd13146108c0578063fe271f5f146108d2578063ff0063fc146108f2578063fff6cae9146108fb57600080fd5b8063ebe2b12b14610866578063ed48f6f71461086f578063ee89e02f14610877578063f12f14471461089a57600080fd5b8063e01f62bf116100f4578063e01f62bf1461082f578063e1ba95d214610837578063e9f2838e1461083f578063eb3c209e1461085357600080fd5b8063d239f00314610801578063d9f96e8d14610574578063dc6663c714610809578063de9853ad1461081c57600080fd5b8063b94c4dcb1161019d578063c8f33c911161016c578063c8f33c91146107d4578063cc1a378f146107dd578063cd3daf9d146107f0578063cdc82e80146107f857600080fd5b8063b94c4dcb14610782578063bbb781cc1461078b578063bdacb303146107a1578063c126d1aa146107b457600080fd5b80639c5303eb116101d95780639c5303eb1461074b578063a1ec508a1461075e578063a2217bc514610767578063af00f4e21461076f57600080fd5b806392eefe9b146106e6578063941d9f65146106f95780639637927f1461070c5780639b8c15a81461071f57600080fd5b80633d18b9121161030557806367feda3e1161029857806379ba50971161026757806379ba5097146106825780637b31c19a1461068a5780638980f11f146106925780638bad86a7146106a55780638da5cb5b146106d357600080fd5b806367feda3e146106335780636a231b03146106465780636ce46bc3146106665780636e27cef91461067957600080fd5b806352732bc8116102d457806352732bc8146105b957806353a47bb7146105f3578063643504671461061e57806364f2c0601461062b57600080fd5b80633d18b9121461056c5780634703dace1461057457806351654f7f1461059d57806351e3fc17146105a657600080fd5b80631e090f011161037d578063323331ca1161034c578063323331ca1461051d57806336f89af214610532578063386a95251461055b5780633b8105b31461056457600080fd5b80631e090f01146104ae57806328ef934e146104ce5780632ca1a895146104e157806331ca208c146104ea57600080fd5b8063170feb76116103b9578063170feb761461046d57806317b18c89146104805780631b3e870a146104935780631c1f78eb146104a657600080fd5b80628cc262146103ea5780630d7bac4f14610417578063144e8034146104385780631627540c14610458575b600080fd5b6103fd6103f8366004612f53565b610903565b604080519283526020830191909152015b60405180910390f35b61042a610425366004612f6e565b610a23565b60405190815260200161040e565b61042a610446366004612f53565b60166020526000908152604090205481565b61046b610466366004612f53565b610a7c565b005b61042a61047b366004612f53565b610b48565b61046b61048e366004612f87565b610c2d565b61046b6104a1366004612f53565b610c69565b6103fd610d2c565b6104c16104bc366004612f53565b610d5d565b60405161040e9190612fa9565b61046b6104dc366004613017565b610e04565b61042a60115481565b61050d6104f8366004612f53565b60216020526000908152604090205460ff1681565b604051901515815260200161040e565b60225461050d90640100000000900460ff1681565b61042a610540366004612f53565b6001600160a01b03166000908152601d602052604090205490565b61042a60135481565b61046b610ed0565b6103fd610f34565b61042a610582366004612f53565b6001600160a01b03166000908152601c602052604090205490565b61042a600f5481565b61046b6105b4366004612f6e565b610fcf565b61046b6105c7366004612f53565b336000908152602080805260408083206001600160a01b0394909416835292905220805460ff19169055565b600154610606906001600160a01b031681565b6040516001600160a01b03909116815260200161040e565b60225461050d9060ff1681565b601b5461042a565b600854610606906001600160a01b031681565b61042a610654366004612f53565b60196020526000908152604090205481565b61046b610674366004613050565b611057565b61042a600d5481565b61046b611207565b61046b6112f1565b61046b6106a036600461307c565b611353565b6106b86106b3366004612f53565b61148e565b6040805193845260208401929092529082015260600161040e565b600054610606906001600160a01b031681565b61046b6106f4366004612f53565b61163e565b61046b610707366004612f53565b61169f565b60225461050d9062010000900460ff1681565b61050d61072d3660046130a6565b60208080526000928352604080842090915290825290205460ff1681565b61046b610759366004612f53565b611707565b61042a60125481565b61046b61176a565b61046b61077d366004612f87565b6117c6565b61042a600c5481565b60225461050d9065010000000000900460ff1681565b61046b6107af366004612f53565b611914565b61042a6107c2366004612f53565b60186020526000908152604090205481565b61042a600a5481565b61046b6107eb366004612f6e565b611975565b6103fd611a83565b61042a600b5481565b61046b611b12565b600754610606906001600160a01b031681565b61046b61082a3660046130e7565b611b72565b601a5461042a565b61046b611c0c565b60225461050d906301000000900460ff1681565b61046b61086136600461307c565b611c6a565b61042a60095481565b61046b611d32565b61050d610885366004612f53565b601f6020526000908152604090205460ff1681565b61046b6108a8366004612f53565b611d96565b61042a6108bb366004612f53565b611e2d565b60225461050d90610100900460ff1681565b61042a6108e0366004612f53565b60176020526000908152604090205481565b61042a600e5481565b61046b611e60565b600080600080610911611a83565b6001600160a01b0387166000908152601d60205260409020549193509150610940575060009485945092505050565b6001600160a01b0385166000908152601860209081526040808320546016909252909120546109b291906109ac90670de0b6b3a7640000906109a690610987908890611f03565b6001600160a01b038b166000908152601d602052604090205490611f45565b90611fc4565b90611e9d565b6001600160a01b038616600090815260196020908152604080832054601790925290912054610a1891906109ac90670de0b6b3a7640000906109a6906109f9908890611f03565b6001600160a01b038c166000908152601d602052604090205490611f45565b935093505050915091565b600080610a65610a56600c546109a6610a4f670de0b6b3a7640000600b54611f0390919063ffffffff16565b8790611f45565b670de0b6b3a764000090611e9d565b9050600b54811115610a765750600b545b92915050565b6000546001600160a01b03163314610af35760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b60648201526084015b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22906020015b60405180910390a150565b600080610b5483611e2d565b90508015610c24576003546040516370a0823160e01b81526001600160a01b038581166004830152600092610be69285926109a692670de0b6b3a7640000929116906370a0823190602401602060405180830381865afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be09190613120565b90611f45565b90506000610c0b670de0b6b3a76400006109a6600f5485611f4590919063ffffffff16565b9050600f54811115610c1c5750600f545b949350505050565b50600092915050565b600280541415610c4f5760405162461bcd60e51b8152600401610aea90613139565b60028055610c603380848442612006565b50506001600255565b6000546001600160a01b0316331480610c8c57506007546001600160a01b031633145b610ca85760405162461bcd60e51b8152600401610aea90613170565b6001600160a01b0381166000908152601f602052604090205460ff161515600114610d0b5760405162461bcd60e51b81526020600482015260136024820152721059191c995cdcc81b9bdb995e1a5cdd185b9d606a1b6044820152606401610aea565b6001600160a01b03166000908152601f60205260409020805460ff19169055565b600080610d46601354601154611f4590919063ffffffff16565b601354601254610d5591611f45565b915091509091565b6001600160a01b0381166000908152601e60209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610df957838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020019060010190610d95565b505050509050919050565b60225460ff610100909104161515600114610e315760405162461bcd60e51b8152600401610aea9061319f565b6001600160a01b03841660009081526020808052604080832033845290915290205460ff168015610e715750336000908152601f602052604090205460ff165b610ebd5760405162461bcd60e51b815260206004820152601a60248201527f4d69672e20696e76616c6964206f7220756e617070726f7665640000000000006044820152606401610aea565b610eca8433858585612006565b50505050565b6000546001600160a01b0316331480610ef357506007546001600160a01b031633145b610f0f5760405162461bcd60e51b8152600401610aea90613170565b6022805465ff0000000000198116650100000000009182900460ff1615909102179055565b600080600280541415610f595760405162461bcd60e51b8152600401610aea90613139565b60028055602254640100000000900460ff1615610fb85760405162461bcd60e51b815260206004820152601960248201527f5265776172647320636f6c6c656374696f6e20706175736564000000000000006044820152606401610aea565b610fc233336123bf565b9150915060016002559091565b600280541415610ff15760405162461bcd60e51b8152600401610aea90613139565b600280556022546301000000900460ff16156110445760405162461bcd60e51b815260206004820152601260248201527115da5d1a191c985dd85b1cc81c185d5cd95960721b6044820152606401610aea565b61104f3333836125cd565b506001600255565b6000546001600160a01b031633148061107a57506007546001600160a01b031633145b6110965760405162461bcd60e51b8152600401610aea90613170565b670de0b6b3a76400008310156110fa5760405162461bcd60e51b8152602060048201526024808201527f4d756c74206d757374206265203e3d204d554c5449504c4945525f505245434960448201526329a4a7a760e11b6064820152608401610aea565b6000811161114a5760405162461bcd60e51b815260206004820152601960248201527f7665433320706374206d6178206d757374206265203e3d2030000000000000006044820152606401610aea565b600b839055600f829055600e8190556040518281527f6b04d7611e06fe226eebfd39936d0c17ed4750a86ec9bd223924335d955288689060200160405180910390a17fa1676084a9eea08c6f205b60799323b364a1bd8e10aba89f0fbd94cfbf68b5dd600b546040516111bf91815260200190565b60405180910390a17f5341dc8814a88b3b792bc9de97825af6a74034e43f5263d2ebc8407936723fe6600e546040516111fa91815260200190565b60405180910390a1505050565b6001546001600160a01b0316331461127f5760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610aea565b600054600154604080516001600160a01b0393841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031633148061131457506007546001600160a01b031633145b6113305760405162461bcd60e51b8152600401610aea90613170565b6022805464ff000000001981166401000000009182900460ff1615909102179055565b6000546001600160a01b031633148061137657506007546001600160a01b031633145b6113925760405162461bcd60e51b8152600401610aea90613170565b602254610100900460ff166113cf576006546001600160a01b03838116911614156113cf5760405162461bcd60e51b8152600401610aea9061319f565b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af1158015611422573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144691906131c9565b50604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2891015b60405180910390a15050565b6001600160a01b0381166000908152601d602052604081205490806114b284610b48565b6001600160a01b0385166000908152601c6020526040812054919350901580156114f257506001600160a01b0385166000908152601d6020526040902054155b156114fe57508161152c565b6001600160a01b038516600090815260106020526040902054611529906002906109a6908690611e9d565b90505b6000915060005b6001600160a01b0386166000908152601e6020526040902054811015611635576001600160a01b0386166000908152601e6020526040812080548390811061157d5761157d6131e6565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600081608001519050428260600151116115e95750670de0b6b3a76400005b60408201516000611610670de0b6b3a76400006109a6611609868a611e9d565b8590611f45565b905061161c8782611e9d565b965050505050808061162d90613212565b915050611533565b50509193909250565b6000546001600160a01b031633148061166157506007546001600160a01b031633145b61167d5760405162461bcd60e51b8152600401610aea90613170565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806116c257506007546001600160a01b031633145b6116de5760405162461bcd60e51b8152600401610aea90613170565b6001600160a01b03166000908152602160205260409020805460ff19811660ff90911615179055565b6000546001600160a01b031633148061172a57506007546001600160a01b031633145b6117465760405162461bcd60e51b8152600401610aea90613170565b6001600160a01b03166000908152601f60205260409020805460ff19166001179055565b6000546001600160a01b031633148061178d57506007546001600160a01b031633145b6117a95760405162461bcd60e51b8152600401610aea90613170565b6022805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b03163314806117e957506007546001600160a01b031633145b6118055760405162461bcd60e51b8152600401610aea90613170565b60018210156118565760405162461bcd60e51b815260206004820152601960248201527f4d756c206d61782074696d65206d757374206265203e3d2031000000000000006044820152606401610aea565b60018110156118a75760405162461bcd60e51b815260206004820152601960248201527f4d756c206d696e2074696d65206d757374206265203e3d2031000000000000006044820152606401610aea565b600c829055600d8190556040518281527f0e3e3fae480c6f92291358a02bc83f04ee1971d5488596bffda7929d57ab470f9060200160405180910390a16040518181527f0534d208d75dfdbfacc1204745dd9b3c4c37e8cfc05eb5e8e3ae538aedb0a9fa90602001611482565b6000546001600160a01b031633148061193757506007546001600160a01b031633145b6119535760405162461bcd60e51b8152600401610aea90613170565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061199857506007546001600160a01b031633145b806119ad57506008546001600160a01b031633145b6119f25760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb716103a3635961037b91031ba39363960511b6044820152606401610aea565b6009541580611a02575060095442115b611a4e5760405162461bcd60e51b815260206004820152601860248201527f52657761726420706572696f6420696e636f6d706c65746500000000000000006044820152606401610aea565b60138190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d390602001610b3d565b600080601a5460001480611a975750601b54155b15611aa85750506014546015549091565b611ae0611ad7601b546109a6670de0b6b3a7640000610be0601154610be0600a54611ad161294e565b90611f03565b60145490611e9d565b610d55611b09601b546109a6670de0b6b3a7640000610be0601254610be0600a54611ad161294e565b60155490611e9d565b6000546001600160a01b0316331480611b3557506007546001600160a01b031633145b611b515760405162461bcd60e51b8152600401610aea90613170565b6022805463ff00000019811663010000009182900460ff1615909102179055565b6000546001600160a01b0316331480611b9557506007546001600160a01b031633145b80611baa57506008546001600160a01b031633145b611bef5760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb716103a3635961037b91031ba39363960511b6044820152606401610aea565b601183905560128290558015611c0757611c07611e60565b505050565b6000546001600160a01b0316331480611c2f57506007546001600160a01b031633145b611c4b5760405162461bcd60e51b8152600401610aea90613170565b6022805462ff0000198116620100009182900460ff1615909102179055565b60225460ff610100909104161515600114611c975760405162461bcd60e51b8152600401610aea9061319f565b6001600160a01b03821660009081526020808052604080832033845290915290205460ff168015611cd75750336000908152601f602052604090205460ff165b611d235760405162461bcd60e51b815260206004820152601a60248201527f4d69672e20696e76616c6964206f7220756e617070726f7665640000000000006044820152606401610aea565b611d2e8233836125cd565b5050565b6000546001600160a01b0316331480611d5557506007546001600160a01b031633145b611d715760405162461bcd60e51b8152600401610aea90613170565b60225460ff1615611d825760006012555b6022805460ff19811660ff90911615179055565b6001600160a01b0381166000908152601f602052604090205460ff16611dfe5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d69677261746f72206164647265737300000000000000006044820152606401610aea565b336000908152602080805260408083206001600160a01b0394909416835292905220805460ff19166001179055565b6000610a76670de0b6b3a76400006109a6600e54610be0866001600160a01b03166000908152601c602052604090205490565b600954421115611e7457611e72612961565b565b600080611e7f611a83565b601482905560158190559092509050611e9661294e565b600a555050565b600080611eaa838561322d565b905083811015611efc5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610aea565b9392505050565b6000611efc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c3f565b600082611f5457506000610a76565b6000611f608385613245565b905082611f6d8583613264565b14611efc5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610aea565b6000611efc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612c79565b8460016120138282612ca7565b60225465010000000000900460ff1615806120425750336000908152601f602052604090205460ff1615156001145b61208e5760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720706175736564206f7220696e206d6967726174696f6e00006044820152606401610aea565b600085116120de5760405162461bcd60e51b815260206004820152601960248201527f4d757374207374616b65206d6f7265207468616e207a65726f000000000000006044820152606401610aea565b6001600160a01b03871660009081526021602052604090205460ff16156121475760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320686173206265656e20677265796c697374656400000000006044820152606401610aea565b600d548410156121995760405162461bcd60e51b815260206004820152601a60248201527f4d696e696d756d207374616b652074696d65206e6f74206d65740000000000006044820152606401610aea565b600c548411156121eb5760405162461bcd60e51b815260206004820152601b60248201527f547279696e6720746f206c6f636b20666f7220746f6f206c6f6e6700000000006044820152606401610aea565b60006121f685610a23565b6001600160a01b0389166000908152601c602090815260408083205490516bffffffffffffffffffffffff1960608e901b169281019290925260348201889052605482018a905260748201529192509060940160408051601f1981840301815282825280516020918201206001600160a01b038d166000908152601e835283902060a0850184528185529184018990529183018a9052909250906060810161229e888a611e9d565b8152602090810185905282546001818101855560009485529382902083516005909202019081559082015192810192909255604081015160028301556060810151600383015560800151600490910155600654612306906001600160a01b031689308a612d96565b601a546123139088611e9d565b601a556001600160a01b0389166000908152601c60205260409020546123399088611e9d565b6001600160a01b038a166000908152601c6020526040812091909155612360908a90612ca7565b60408051888152602081018890529081018290526001600160a01b0389811660608301528a16907ff400e72e69ef4402819dfc57eeddc66f5eb69bf405e0e8098b1946ec1ac14a229060800160405180910390a2505050505050505050565b6000808360016123cf8282612ca7565b6001600160a01b038616600090815260186020908152604080832054601990925290912054909450925083156124e0576001600160a01b038681166000908152601860205260408082209190915560048054915163a9059cbb60e01b8152888416918101919091526024810187905291169063a9059cbb906044016020604051808303816000875af1158015612469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248d91906131c9565b50600454604080518681526001600160a01b039283166020820152878316818301529051918816917f1d2f2ca53af5d2f333bd32fdd45f9c52ad8ebe31414f7792912077fcb3876dff9181900360600190a25b82156125c4576001600160a01b0386811660009081526019602052604080822091909155600554905163a9059cbb60e01b815287831660048201526024810186905291169063a9059cbb906044016020604051808303816000875af115801561254d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257191906131c9565b50600554604080518581526001600160a01b039283166020820152878316818301529051918816917f1d2f2ca53af5d2f333bd32fdd45f9c52ad8ebe31414f7792912077fcb3876dff9181900360600190a25b50509250929050565b6125d783836123bf565b505061260e6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001600081525090565b600060408201819052805b6001600160a01b0386166000908152601e602052604090205481101561270d576001600160a01b0386166000908152601e60205260409020805482908110612663576126636131e6565b9060005260206000209060050201600001548414156126fb576001600160a01b0386166000908152601e602052604090208054829081106126a6576126a66131e6565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050925080915061270d565b8061270581613212565b915050612619565b50815183146127505760405162461bcd60e51b815260206004820152600f60248201526e14dd185ad9481b9bdd08199bdd5b99608a1b6044820152606401610aea565b816060015142101580612770575060225462010000900460ff1615156001145b8061278f5750336000908152601f602052604090205460ff1615156001145b6127d45760405162461bcd60e51b81526020600482015260166024820152755374616b65206973207374696c6c206c6f636b65642160501b6044820152606401610aea565b6040820151801561294657601a546127ec9082611f03565b601a556001600160a01b0386166000908152601c60205260409020546128129082611f03565b6001600160a01b0387166000908152601c6020908152604080832093909355601e905220805483908110612848576128486131e6565b600091825260208220600590910201818155600181018290556002810182905560038101829055600401819055612880908790612ca7565b60065460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156128d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f791906131c9565b5060408051828152602081018690526001600160a01b03878116828401529151918816917f1d9308f6b22a2754a1c622bb30889e8f8f956c83e524d039e9d65d5f052eb9089181900360600190a25b505050505050565b600061295c42600954612ebe565b905090565b60095442116129b25760405162461bcd60e51b815260206004820152601b60248201527f506572696f6420686173206e6f742065787069726564207965742100000000006044820152606401610aea565b60006013546129cc60095442611f0390919063ffffffff16565b6129d69190613264565b600480546040516370a0823160e01b815230928101929092529192506000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a499190613120565b6005546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abb9190613120565b905081612adb612acc85600161322d565b601354601154610be091611f45565b1115612b295760405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f75676820433320617661696c61626c650000000000000000006044820152606401610aea565b60225460ff1615612bb15780612b52612b4385600161322d565b601354601254610be091611f45565b1115612bb15760405162461bcd60e51b815260206004820152602860248201527f4e6f7420656e6f75676820746f6b656e3120617661696c61626c6520666f7220604482015267726577617264732160c01b6064820152608401610aea565b601354612bd090612bc790610be0866001611e9d565b60095490611e9d565b600955600080612bde611a83565b601482905560158190559092509050612bf561294e565b600a556006546040516001600160a01b0390911681527f6f2b3b3aaf1881d69a5d40565500f93ea73df36e7b6a29bf48b21479a9237fe99060200160405180910390a15050505050565b60008184841115612c635760405162461bcd60e51b8152600401610aea91906132b2565b506000612c7084866132e5565b95945050505050565b60008183612c9a5760405162461bcd60e51b8152600401610aea91906132b2565b506000612c708486613264565b8015612cb557612cb5611e60565b6001600160a01b03821615611d2e576000806000612cd28561148e565b925092509250612ce185612ed4565b6001600160a01b0385166000908152601060205260409020829055828110612d4b576000612d0f8285611f03565b601b54909150612d1f9082611e9d565b601b55612d2c8482611e9d565b6001600160a01b0387166000908152601d602052604090205550612d8f565b6000612d578483611f03565b601b54909150612d679082611f03565b601b55612d748482611f03565b6001600160a01b0387166000908152601d6020526040902055505b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612dfa91906132fc565b6000604051808303816000865af19150503d8060008114612e37576040519150601f19603f3d011682016040523d82523d6000602084013e612e3c565b606091505b5091509150818015612e66575080511580612e66575080806020019051810190612e6691906131c9565b6129465760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610aea565b6000818310612ecd5781611efc565b5090919050565b6001600160a01b03811615612f3457600080612eef83610903565b6001600160a01b038516600090815260186020908152604080832094909455601981528382209290925560145460168352838220556015546017909252919091205550505b50565b80356001600160a01b0381168114612f4e57600080fd5b919050565b600060208284031215612f6557600080fd5b611efc82612f37565b600060208284031215612f8057600080fd5b5035919050565b60008060408385031215612f9a57600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b8281101561300a5781518051855286810151878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101612fc6565b5091979650505050505050565b6000806000806080858703121561302d57600080fd5b61303685612f37565b966020860135965060408601359560600135945092505050565b60008060006060848603121561306557600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561308f57600080fd5b61309883612f37565b946020939093013593505050565b600080604083850312156130b957600080fd5b6130c283612f37565b91506130d060208401612f37565b90509250929050565b8015158114612f3457600080fd5b6000806000606084860312156130fc57600080fd5b83359250602084013591506040840135613115816130d9565b809150509250925092565b60006020828403121561313257600080fd5b5051919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601590820152744e6f74206f776e6572206f722074696d656c6f636b60581b604082015260600190565b60208082526010908201526f2737ba1034b71036b4b3b930ba34b7b760811b604082015260600190565b6000602082840312156131db57600080fd5b8151611efc816130d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613226576132266131fc565b5060010190565b60008219821115613240576132406131fc565b500190565b600081600019048311821515161561325f5761325f6131fc565b500290565b60008261328157634e487b7160e01b600052601260045260246000fd5b500490565b60005b838110156132a1578181015183820152602001613289565b83811115610eca5750506000910152565b60208152600082518060208401526132d1816040850160208701613286565b601f01601f19169190910160400192915050565b6000828210156132f7576132f76131fc565b500390565b6000825161330e818460208701613286565b919091019291505056fea26469706673582212202d11967dd0fb1e13d8811c4da956c0f4949eb84d59cba471870b4840a8b1e95f64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008c250a8128c76b25103174d0cf9dee4800ebfecd000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c60000000000000000000000004e78011ce80ee02d2c3e649fb657e458982578150000000000000000000000006f370dba99e32a3cad959b341120db3c9e280ba6000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c60000000000000000000000009dca574b1b6bd51cbd02a3d98716597bd84c45eb0000000000000000000000006a88a0abb9be9f9050ff87753b84613f4e28361b
-----Decoded View---------------
Arg [0] : _owner (address): 0x8C250a8128c76B25103174d0Cf9dee4800EBfECd
Arg [1] : _rewardsToken0 (address): 0xad01DFfe604CDc172D8237566eE3a3ab6524d4C6
Arg [2] : _rewardsToken1 (address): 0x4e78011Ce80ee02d2c3e649Fb657E45898257815
Arg [3] : _stakingToken (address): 0x6f370dba99E32A3cAD959b341120DB3C9E280bA6
Arg [4] : _c3_address (address): 0xad01DFfe604CDc172D8237566eE3a3ab6524d4C6
Arg [5] : _timelock_address (address): 0x9dcA574B1B6BD51CbD02A3d98716597Bd84C45Eb
Arg [6] : _veC3_address (address): 0x6A88A0abb9bE9f9050Ff87753b84613F4E28361B
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000008c250a8128c76b25103174d0cf9dee4800ebfecd
Arg [1] : 000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c6
Arg [2] : 0000000000000000000000004e78011ce80ee02d2c3e649fb657e45898257815
Arg [3] : 0000000000000000000000006f370dba99e32a3cad959b341120db3c9e280ba6
Arg [4] : 000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c6
Arg [5] : 0000000000000000000000009dca574b1b6bd51cbd02a3d98716597bd84c45eb
Arg [6] : 0000000000000000000000006a88a0abb9be9f9050ff87753b84613f4e28361b
Deployed Bytecode Sourcemap
74292:488:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57259:541;;;;;;:::i;:::-;;:::i;:::-;;;;557:25:1;;;613:2;598:18;;591:34;;;;530:18;57259:541:0;;;;;;;;52907:450;;;;;;:::i;:::-;;:::i;:::-;;;967:25:1;;;955:2;940:18;52907:450:0;821:177:1;48239:58:0;;;;;;:::i;:::-;;;;;;;;;;;;;;398:141;;;;;;:::i;:::-;;:::i;:::-;;53832:900;;;;;;:::i;:::-;;:::i;60711:163::-;;;;;;:::i;:::-;;:::i;69341:261::-;;;;;;:::i;:::-;;:::i;57808:204::-;;;:::i;52766:133::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;68431:357::-;;;;;;:::i;:::-;;:::i;47962:26::-;;;;;;49132:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2833:14:1;;2826:22;2808:41;;2796:2;2781:18;49132:40:0;2668:187:1;49523:35:0;;;;;;;;;;;;52581:127;;;;;;:::i;:::-;-1:-1:-1;;;;;52674:26:0;52647:7;52674:26;;;:17;:26;;;;;;;52581:127;48052:39;;;;;;72292:96;;;:::i;65065:210::-;;;:::i;53508:124::-;;;;;;:::i;:::-;-1:-1:-1;;;;;53598:26:0;53571:7;53598:26;;;:17;:26;;;;;;;53508:124;47791:50;;;;;;62834:194;;;;;;:::i;:::-;;:::i;60395:183::-;;;;;;:::i;:::-;60541:10;60516:36;;;;:24;:36;;;;;;;-1:-1:-1;;;;;60516:54:0;;;;;;;;;;60509:61;;-1:-1:-1;;60509:61:0;;;60395:183;166:29;;;;;-1:-1:-1;;;;;166:29:0;;;;;;-1:-1:-1;;;;;3209:32:1;;;3191:51;;3179:2;3164:18;166:29:0;3045:203:1;49213:36:0;;;;;;;;;52415:111;52496:22;;52415:111;;47225:33;;;;;-1:-1:-1;;;;;47225:33:0;;;48419:43;;;;;;:::i;:::-;;;;;;;;;;;;;;70625:770;;;;;;:::i;:::-;;:::i;47576:36::-;;;;;;547:271;;;:::i;72512:126::-;;;:::i;69731:553::-;;;;;;:::i;:::-;;:::i;54740:1837::-;;;;;;:::i;:::-;;:::i;:::-;;;;4035:25:1;;;4091:2;4076:18;;4069:34;;;;4119:18;;;4112:34;4023:2;4008:18;54740:1837:0;3833:319:1;139:20:0;;;;;-1:-1:-1;;;;;139:20:0;;;73214:133;;;;;;:::i;:::-;;:::i;71948:126::-;;;;;;:::i;:::-;;:::i;49369:26::-;;;;;;;;;;;;49010:76;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;69171:128;;;;;;:::i;:::-;;:::i;47995:26::-;;;;;;72187:97;;;:::i;71403:537::-;;;;;;:::i;:::-;;:::i;47497:61::-;;;;;;49584:25;;;;;;;;;;;;73089:117;;;;;;:::i;:::-;;:::i;48369:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;47343:29;;;;;;70292:325;;;;;;:::i;:::-;;:::i;56585:666::-;;;:::i;47423:50::-;;;;;;72396:108;;;:::i;47156:31::-;;;;;-1:-1:-1;;;;;47156:31:0;;;72646:242;;;;;;:::i;:::-;;:::i;51947:113::-;52029:23;;51947:113;;72082:97;;;:::i;49468:29::-;;;;;;;;;;;;68824:298;;;;;;:::i;:::-;;:::i;47309:27::-;;;;;;72896:185;;;:::i;48899:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;60101:226;;;;;;:::i;:::-;;:::i;53640:184::-;;;;;;:::i;:::-;;:::i;49256:24::-;;;;;;;;;;;;48304:58;;;;;;:::i;:::-;;;;;;;;;;;;;;47664:56;;;;;;67885:363;;;:::i;57259:541::-;57313:7;57322;57343:22;57367;57393:16;:14;:16::i;:::-;-1:-1:-1;;;;;57424:26:0;;;;;;:17;:26;;;;;;57342:67;;-1:-1:-1;57342:67:0;-1:-1:-1;57420:76:0;;-1:-1:-1;57479:1:0;;;;-1:-1:-1;57259:541:0;-1:-1:-1;;;57259:541:0:o;57420:76::-;-1:-1:-1;;;;;57629:17:0;;;;;;:8;:17;;;;;;;;;57579:23;:32;;;;;;;57528:119;;57629:17;57528:96;;57619:4;;57529:84;;57560:52;;:14;;:18;:52::i;:::-;-1:-1:-1;;;;;57529:26:0;;;;;;:17;:26;;;;;;;:30;:84::i;:::-;57528:90;;:96::i;:::-;:100;;:119::i;:::-;-1:-1:-1;;;;;57763:17:0;;;;;;:8;:17;;;;;;;;;57713:23;:32;;;;;;;57662:119;;57763:17;57662:96;;57753:4;;57663:84;;57694:52;;:14;;:18;:52::i;:::-;-1:-1:-1;;;;;57663:26:0;;;;;;:17;:26;;;;;;;:30;:84::i;57662:119::-;57506:286;;;;;;57259:541;;;:::o;52907:450::-;52966:7;52986:23;53025:200;53077:133;53181:28;;53077:77;53108:45;47119:4;53108:19;;:23;;:45;;;;:::i;:::-;53077:4;;:30;:77::i;:133::-;47119:4;;53025:33;:200::i;:::-;52986:239;;53258:19;;53240:15;:37;53236:80;;;-1:-1:-1;53297:19:0;;53236:80;53334:15;52907:450;-1:-1:-1;;52907:450:0:o;398:141::-;878:5;;-1:-1:-1;;;;;878:5:0;864:10;:19;856:79;;;;-1:-1:-1;;;856:79:0;;5388:2:1;856:79:0;;;5370:21:1;5427:2;5407:18;;;5400:30;5466:34;5446:18;;;5439:62;-1:-1:-1;;;5517:18:1;;;5510:45;5572:19;;856:79:0;;;;;;;;;470:14:::1;:23:::0;;-1:-1:-1;;;;;;470:23:0::1;-1:-1:-1::0;;;;;470:23:0;::::1;::::0;;::::1;::::0;;;509:22:::1;::::0;3191:51:1;;;509:22:0::1;::::0;3179:2:1;3164:18;509:22:0::1;;;;;;;;398:141:::0;:::o;53832:900::-;53894:7;54067:33;54103:27;54122:7;54103:18;:27::i;:::-;54067:63;-1:-1:-1;54145:29:0;;54141:516;;54220:4;;:23;;-1:-1:-1;;;54220:23:0;;-1:-1:-1;;;;;3209:32:1;;;54220:23:0;;;3191:51:1;54190:26:0;;54219:82;;54275:25;;54219:51;;47119:4;;54220;;;:14;;3164:18:1;;54220:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54219:29;;:51::i;:82::-;54190:111;;54330:23;54356:73;47119:4;54357:45;54382:19;;54358:18;54357:24;;:45;;;;:::i;54356:73::-;54330:99;;54525:19;;54507:15;:37;54503:80;;;-1:-1:-1;54564:19:0;;54503:80;54607:15;53832:900;-1:-1:-1;;;;53832:900:0:o;54141:516::-;-1:-1:-1;54656:1:0;;53832:900;-1:-1:-1;;53832:900:0:o;60711:163::-;2798:1;3404:7;;:19;;3396:63;;;;-1:-1:-1;;;3396:63:0;;;;;;;:::i;:::-;2798:1;3537:18;;60796:70:::1;60809:10;::::0;60833:9;60844:4;60850:15:::1;60796:12;:70::i;:::-;-1:-1:-1::0;;2754:1:0;3716:7;:22;60711:163::o;69341:261::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69432:33:0;::::1;;::::0;;;:15:::1;:33;::::0;;;;;::::1;;:41;;:33:::0;:41:::1;69424:73;;;::::0;-1:-1:-1;;;69424:73:0;;6703:2:1;69424:73:0::1;::::0;::::1;6685:21:1::0;6742:2;6722:18;;;6715:30;-1:-1:-1;;;6761:18:1;;;6754:49;6820:18;;69424:73:0::1;6501:343:1::0;69424:73:0::1;-1:-1:-1::0;;;;;69561:33:0::1;;::::0;;;:15:::1;:33;::::0;;;;69554:40;;-1:-1:-1;;69554:40:0::1;::::0;;69341:261::o;57808:204::-;57863:7;57872;57914:32;57930:15;;57914:11;;:15;;:32;;;;:::i;:::-;57977:15;;57961:11;;:32;;:15;:32::i;:::-;57892:112;;;;57808:204;;:::o;52766:133::-;-1:-1:-1;;;;;52870:21:0;;;;;;:12;:21;;;;;;;;52863:28;;;;;;;;;;;;;;;;;52830:20;;52863:28;;52870:21;;52863:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52766:133;;;:::o;68431:357::-;50345:12;;;;;;;;:20;;:12;:20;50337:49;;;;-1:-1:-1;;;50337:49:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68584:40:0;::::1;;::::0;;;:24:::1;:40:::0;;;;;;;68625:10:::1;68584:52:::0;;;;;;;;::::1;;:83:::0;::::1;;;-1:-1:-1::0;68656:10:0::1;68640:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;68584:83;68576:122;;;::::0;-1:-1:-1;;;68576:122:0;;7396:2:1;68576:122:0::1;::::0;::::1;7378:21:1::0;7435:2;7415:18;;;7408:30;7474:28;7454:18;;;7447:56;7520:18;;68576:122:0::1;7194:350:1::0;68576:122:0::1;68709:71;68722:14;68738:10;68750:6;68758:4;68764:15;68709:12;:71::i;:::-;68431:357:::0;;;;:::o;72292:96::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;72367:13:::1;::::0;;-1:-1:-1;;72350:30:0;::::1;72367:13:::0;;;;::::1;;;72366:14;72350:30:::0;;::::1;;::::0;;72292:96::o;65065:210::-;65117:7;65126;2798:1;3404:7;;:19;;3396:63;;;;-1:-1:-1;;;3396:63:0;;;;;;;:::i;:::-;2798:1;3537:18;;65154:23:::1;::::0;;;::::1;;;:32;65146:69;;;::::0;-1:-1:-1;;;65146:69:0;;7751:2:1;65146:69:0::1;::::0;::::1;7733:21:1::0;7790:2;7770:18;;;7763:30;7829:27;7809:18;;;7802:55;7874:18;;65146:69:0::1;7549:349:1::0;65146:69:0::1;65233:34;65244:10;65256;65233;:34::i;:::-;65226:41;;;;2754:1:::0;3716:7;:22;65065:210;;:::o;62834:194::-;2798:1;3404:7;;:19;;3396:63;;;;-1:-1:-1;;;3396:63:0;;;;;;;:::i;:::-;2798:1;3537:18;;62913:17:::1;::::0;;;::::1;;;:26;62905:57;;;::::0;-1:-1:-1;;;62905:57:0;;8105:2:1;62905:57:0::1;::::0;::::1;8087:21:1::0;8144:2;8124:18;;;8117:30;-1:-1:-1;;;8163:18:1;;;8156:48;8221:18;;62905:57:0::1;7903:342:1::0;62905:57:0::1;62973:47;62989:10;63001;63013:6;62973:15;:47::i;:::-;-1:-1:-1::0;2754:1:0;3716:7;:22;62834:194::o;70625:770::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;47119:4:::1;70786:20;:44;;70778:93;;;::::0;-1:-1:-1;;;70778:93:0;;8452:2:1;70778:93:0::1;::::0;::::1;8434:21:1::0;8491:2;8471:18;;;8464:30;8530:34;8510:18;;;8503:62;-1:-1:-1;;;8581:18:1;;;8574:34;8625:19;;70778:93:0::1;8250:400:1::0;70778:93:0::1;70989:1;70960:26;:30;70952:68;;;::::0;-1:-1:-1;;;70952:68:0;;9207:2:1;70952:68:0::1;::::0;::::1;9189:21:1::0;9246:2;9226:18;;;9219:30;9285:27;9265:18;;;9258:55;9330:18;;70952:68:0::1;9005:349:1::0;70952:68:0::1;71033:19;:42:::0;;;71086:19:::1;:42:::0;;;71139:25:::1;:54:::0;;;71211:38:::1;::::0;967:25:1;;;71211:38:0::1;::::0;955:2:1;940:18;71211:38:0::1;;;;;;;71265:52;71297:19;;71265:52;;;;967:25:1::0;;955:2;940:18;;821:177;71265:52:0::1;;;;;;;;71333:54;71361:25;;71333:54;;;;967:25:1::0;;955:2;940:18;;821:177;71333:54:0::1;;;;;;;;70625:770:::0;;;:::o;547:271::-;616:14;;-1:-1:-1;;;;;616:14:0;602:10;:28;594:94;;;;-1:-1:-1;;;594:94:0;;9561:2:1;594:94:0;;;9543:21:1;9600:2;9580:18;;;9573:30;9639:34;9619:18;;;9612:62;-1:-1:-1;;;9690:18:1;;;9683:51;9751:19;;594:94:0;9359:417:1;594:94:0;717:5;;;724:14;704:35;;;-1:-1:-1;;;;;717:5:0;;;9993:34:1;;724:14:0;;;;10058:2:1;10043:18;;10036:43;704:35:0;;9928:18:1;704:35:0;;;;;;;758:14;;;;750:22;;-1:-1:-1;;;;;;750:22:0;;;-1:-1:-1;;;;;758:14:0;;750:22;;;;783:27;;;547:271::o;72512:126::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;72607:23:::1;::::0;;-1:-1:-1;;72580:50:0;::::1;72607:23:::0;;;;::::1;;;72606:24;72580:50:::0;;::::1;;::::0;;72512:126::o;69731:553::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;69930:12:::1;::::0;::::1;::::0;::::1;;;69926:164;;69990:12;::::0;-1:-1:-1;;;;;69966:37:0;;::::1;69990:12:::0;::::1;69966:37;;69958:66;;;;-1:-1:-1::0;;;69958:66:0::1;;;;;;;:::i;:::-;70205:5;::::0;70176:48:::1;::::0;-1:-1:-1;;;70176:48:0;;-1:-1:-1;;;;;70205:5:0;;::::1;70176:48;::::0;::::1;10264:51:1::0;10331:18;;;10324:34;;;70176:28:0;;::::1;::::0;::::1;::::0;10237:18:1;;70176:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;70240:36:0::1;::::0;;-1:-1:-1;;;;;10282:32:1;;10264:51;;10346:2;10331:18;;10324:34;;;70240:36:0::1;::::0;10237:18:1;70240:36:0::1;;;;;;;;69731:553:::0;;:::o;54740:1837::-;-1:-1:-1;;;;;55033:26:0;;54832:27;55033:26;;;:17;:26;;;;;;;54832:27;55218:23;55051:7;55218:14;:23::i;:::-;-1:-1:-1;;;;;55309:26:0;;55262:32;55309:26;;;:17;:26;;;;;;55196:45;;-1:-1:-1;55262:32:0;55309:31;:66;;;;-1:-1:-1;;;;;;55344:26:0;;;;;;:17;:26;;;;;;:31;55309:66;55305:388;;;-1:-1:-1;55527:19:0;55305:388;;;-1:-1:-1;;;;;55642:30:0;;;;;;:21;:30;;;;;;55615:66;;55679:1;;55616:57;;55617:19;;55616:25;:57::i;55615:66::-;55588:93;;55305:388;55828:1;55806:23;;55845:9;55840:730;-1:-1:-1;;;;;55864:21:0;;;;;;:12;:21;;;;;:28;55860:32;;55840:730;;;-1:-1:-1;;;;;55945:21:0;;55914:28;55945:21;;;:12;:21;;;;;:24;;55967:1;;55945:24;;;;;;:::i;:::-;;;;;;;;;;;55914:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55984:23;56010:9;:25;;;55984:51;;56194:15;56164:9;:26;;;:45;56160:123;;-1:-1:-1;47119:4:0;56160:123;56319:19;;;;56299:17;56387:86;47119:4;56387:60;56401:45;:15;56421:24;56401:19;:45::i;:::-;56387:9;;:13;:60::i;:86::-;56353:120;-1:-1:-1;56510:48:0;:19;56353:120;56510:23;:48::i;:::-;56488:70;;55899:671;;;;55894:3;;;;;:::i;:::-;;;;55840:730;;;;54960:1617;54740:1837;;;;;:::o;73214:133::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;73299:18:::1;:40:::0;;-1:-1:-1;;;;;;73299:40:0::1;-1:-1:-1::0;;;;;73299:40:0;;;::::1;::::0;;;::::1;::::0;;73214:133::o;71948:126::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72047:18:0::1;;::::0;;;:8:::1;:18;::::0;;;;;;-1:-1:-1;;72024:42:0;::::1;72047:18;::::0;;::::1;72045:21;72024:42;::::0;;71948:126::o;69171:128::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69251:33:0::1;;::::0;;;:15:::1;:33;::::0;;;;:40;;-1:-1:-1;;69251:40:0::1;69287:4;69251:40;::::0;;69171:128::o;72187:97::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;72264:12:::1;::::0;;-1:-1:-1;;72248:28:0;::::1;72264:12;::::0;;;::::1;;;72263:13;72248:28:::0;;::::1;;::::0;;72187:97::o;71403:537::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;71590:1:::1;71557:29;:34;;71549:72;;;::::0;-1:-1:-1;;;71549:72:0;;11225:2:1;71549:72:0::1;::::0;::::1;11207:21:1::0;11264:2;11244:18;;;11237:30;11303:27;11283:18;;;11276:55;11348:18;;71549:72:0::1;11023:349:1::0;71549:72:0::1;71658:1;71640:14;:19;;71632:57;;;::::0;-1:-1:-1;;;71632:57:0;;11579:2:1;71632:57:0::1;::::0;::::1;11561:21:1::0;11618:2;11598:18;;;11591:30;11657:27;11637:18;;;11630:55;11702:18;;71632:57:0::1;11377:349:1::0;71632:57:0::1;71702:28;:60:::0;;;71773:13:::1;:30:::0;;;71821:61:::1;::::0;967:25:1;;;71821:61:0::1;::::0;955:2:1;940:18;71821:61:0::1;;;;;;;71898:34;::::0;967:25:1;;;71898:34:0::1;::::0;955:2:1;940:18;71898:34:0::1;821:177:1::0;73089:117:0;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;73166:16:::1;:32:::0;;-1:-1:-1;;;;;;73166:32:0::1;-1:-1:-1::0;;;;;73166:32:0;;;::::1;::::0;;;::::1;::::0;;73089:117::o;70292:325::-;50173:5;;-1:-1:-1;;;;;50173:5:0;50159:10;:19;;:53;;-1:-1:-1;50196:16:0;;-1:-1:-1;;;;;50196:16:0;50182:10;:30;50159:53;:89;;;-1:-1:-1;50230:18:0;;-1:-1:-1;;;;;50230:18:0;50216:10;:32;50159:89;50151:124;;;;-1:-1:-1;;;50151:124:0;;11933:2:1;50151:124:0;;;11915:21:1;11972:2;11952:18;;;11945:30;-1:-1:-1;;;11991:18:1;;;11984:52;12053:18;;50151:124:0;11731:346:1;50151:124:0;70406:12:::1;::::0;:17;;:51:::1;;;70445:12;;70427:15;:30;70406:51;70384:125;;;::::0;-1:-1:-1;;;70384:125:0;;12284:2:1;70384:125:0::1;::::0;::::1;12266:21:1::0;12323:2;12303:18;;;12296:30;12362:26;12342:18;;;12335:54;12406:18;;70384:125:0::1;12082:348:1::0;70384:125:0::1;70520:15;:34:::0;;;70570:39:::1;::::0;967:25:1;;;70570:39:0::1;::::0;955:2:1;940:18;70570:39:0::1;821:177:1::0;56585:666:0;56632:7;56641;56665:23;;56692:1;56665:28;:59;;;-1:-1:-1;56697:22:0;;:27;56665:59;56661:583;;;-1:-1:-1;;56749:21:0;;56772;;56749;;56585:666::o;56661:583::-;56862:168;56910:101;56988:22;;56910:73;56978:4;56910:63;56961:11;;56910:46;56941:14;;56910:26;:24;:26::i;:::-;:30;;:46::i;:101::-;56862:21;;;:25;:168::i;:::-;57049;57097:101;57175:22;;57097:73;57165:4;57097:63;57148:11;;57097:46;57128:14;;57097:26;:24;:26::i;:101::-;57049:21;;;:25;:168::i;72396:108::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;72479:17:::1;::::0;;-1:-1:-1;;72458:38:0;::::1;72479:17:::0;;;;::::1;;;72478:18;72458:38:::0;;::::1;;::::0;;72396:108::o;72646:242::-;50173:5;;-1:-1:-1;;;;;50173:5:0;50159:10;:19;;:53;;-1:-1:-1;50196:16:0;;-1:-1:-1;;;;;50196:16:0;50182:10;:30;50159:53;:89;;;-1:-1:-1;50230:18:0;;-1:-1:-1;;;;;50230:18:0;50216:10;:32;50159:89;50151:124;;;;-1:-1:-1;;;50151:124:0;;11933:2:1;50151:124:0;;;11915:21:1;11972:2;11952:18;;;11945:30;-1:-1:-1;;;11991:18:1;;;11984:52;12053:18;;50151:124:0;11731:346:1;50151:124:0;72763:11:::1;:24:::0;;;72798:11:::1;:24:::0;;;72835:46;::::1;;;72863:6;:4;:6::i;:::-;72646:242:::0;;;:::o;72082:97::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;72157:14:::1;::::0;;-1:-1:-1;;72139:32:0;::::1;72157:14:::0;;;;::::1;;;72156:15;72139:32:::0;;::::1;;::::0;;72082:97::o;68824:298::-;50345:12;;;;;;;;:20;;:12;:20;50337:49;;;;-1:-1:-1;;;50337:49:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68938:40:0;::::1;;::::0;;;:24:::1;:40:::0;;;;;;;68979:10:::1;68938:52:::0;;;;;;;;::::1;;:83:::0;::::1;;;-1:-1:-1::0;69010:10:0::1;68994:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;68938:83;68930:122;;;::::0;-1:-1:-1;;;68930:122:0;;7396:2:1;68930:122:0::1;::::0;::::1;7378:21:1::0;7435:2;7415:18;;;7408:30;7474:28;7454:18;;;7447:56;7520:18;;68930:122:0::1;7194:350:1::0;68930:122:0::1;69063:51;69079:14;69095:10;69107:6;69063:15;:51::i;:::-;68824:298:::0;;:::o;72896:185::-;50018:5;;-1:-1:-1;;;;;50018:5:0;50004:10;:19;;:53;;-1:-1:-1;50041:16:0;;-1:-1:-1;;;;;50041:16:0;50027:10;:30;50004:53;49996:87;;;;-1:-1:-1;;;49996:87:0;;;;;;;:::i;:::-;72964:17:::1;::::0;::::1;;72960:65;;;73012:1;72998:11;:15:::0;72960:65:::1;73056:17;::::0;;-1:-1:-1;;73035:38:0;::::1;73056:17;::::0;;::::1;73055:18;73035:38;::::0;;72896:185::o;60101:226::-;-1:-1:-1;;;;;60184:33:0;;;;;;:15;:33;;;;;;;;60176:70;;;;-1:-1:-1;;;60176:70:0;;12637:2:1;60176:70:0;;;12619:21:1;12676:2;12656:18;;;12649:30;12715:26;12695:18;;;12688:54;12759:18;;60176:70:0;12435:348:1;60176:70:0;60282:10;60257:36;;;;:24;:36;;;;;;;-1:-1:-1;;;;;60257:54:0;;;;;;;;;;:61;;-1:-1:-1;;60257:61:0;60314:4;60257:61;;;60101:226::o;53640:184::-;53706:7;53733:83;47119:4;53733:57;53764:25;;53734:24;53750:7;-1:-1:-1;;;;;53598:26:0;53571:7;53598:26;;;:17;:26;;;;;;;53508:124;67885:363;67941:12;;67923:15;:30;67919:322;;;67970:14;:12;:14::i;:::-;67885:363::o;67919:322::-;68027:15;68044;68063:16;:14;:16::i;:::-;68094:21;:31;;;68140:21;:31;;;68026:53;;-1:-1:-1;68026:53:0;-1:-1:-1;68203:26:0;:24;:26::i;:::-;68186:14;:43;-1:-1:-1;;67885:363:0:o;20969:181::-;21027:7;;21059:5;21063:1;21059;:5;:::i;:::-;21047:17;;21088:1;21083;:6;;21075:46;;;;-1:-1:-1;;;21075:46:0;;13123:2:1;21075:46:0;;;13105:21:1;13162:2;13142:18;;;13135:30;13201:29;13181:18;;;13174:57;13248:18;;21075:46:0;12921:351:1;21075:46:0;21141:1;20969:181;-1:-1:-1;;;20969:181:0:o;21425:136::-;21483:7;21510:43;21514:1;21517;21510:43;;;;;;;;;;;;;;;;;:3;:43::i;22341:471::-;22399:7;22644:6;22640:47;;-1:-1:-1;22674:1:0;22667:8;;22640:47;22699:9;22711:5;22715:1;22711;:5;:::i;:::-;22699:17;-1:-1:-1;22744:1:0;22735:5;22739:1;22699:17;22735:5;:::i;:::-;:10;22727:56;;;;-1:-1:-1;;;22727:56:0;;13874:2:1;22727:56:0;;;13856:21:1;13913:2;13893:18;;;13886:30;13952:34;13932:18;;;13925:62;-1:-1:-1;;;14003:18:1;;;13996:31;14044:19;;22727:56:0;13672:397:1;23280:132:0;23338:7;23365:39;23369:1;23372;23365:39;;;;;;;;;;;;;;;;;:3;:39::i;61070:1626::-;61285:14;61301:4;50605:42;50629:7;50638:8;50605:23;:42::i;:::-;61327:13:::1;::::0;;;::::1;;;61326:14;::::0;:53:::1;;-1:-1:-1::0;61360:10:0::1;61344:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;:35;;:27:::0;:35:::1;61326:53;61318:96;;;::::0;-1:-1:-1;;;61318:96:0;;14276:2:1;61318:96:0::1;::::0;::::1;14258:21:1::0;14315:2;14295:18;;;14288:30;14354:32;14334:18;;;14327:60;14404:18;;61318:96:0::1;14074:354:1::0;61318:96:0::1;61445:1;61433:9;:13;61425:51;;;::::0;-1:-1:-1;;;61425:51:0;;14635:2:1;61425:51:0::1;::::0;::::1;14617:21:1::0;14674:2;14654:18;;;14647:30;14713:27;14693:18;;;14686:55;14758:18;;61425:51:0::1;14433:349:1::0;61425:51:0::1;-1:-1:-1::0;;;;;61495:24:0;::::1;;::::0;;;:8:::1;:24;::::0;;;;;::::1;;:33;61487:73;;;::::0;-1:-1:-1;;;61487:73:0;;14989:2:1;61487:73:0::1;::::0;::::1;14971:21:1::0;15028:2;15008:18;;;15001:30;15067:29;15047:18;;;15040:57;15114:18;;61487:73:0::1;14787:351:1::0;61487:73:0::1;61587:13;;61579:4;:21;;61571:60;;;::::0;-1:-1:-1;;;61571:60:0;;15345:2:1;61571:60:0::1;::::0;::::1;15327:21:1::0;15384:2;15364:18;;;15357:30;15423:28;15403:18;;;15396:56;15469:18;;61571:60:0::1;15143:350:1::0;61571:60:0::1;61658:28;;61650:4;:36;;61642:75;;;::::0;-1:-1:-1;;;61642:75:0;;15700:2:1;61642:75:0::1;::::0;::::1;15682:21:1::0;15739:2;15719:18;;;15712:30;15778:29;15758:18;;;15751:57;15825:18;;61642:75:0::1;15498:351:1::0;61642:75:0::1;61730:23;61756:20;61771:4;61756:14;:20::i;:::-;-1:-1:-1::0;;;;;61875:33:0;::::1;61787:14;61875:33:::0;;;:17:::1;:33;::::0;;;;;;;;61814:95;;-1:-1:-1;;16087:2:1;16083:15;;;16079:53;61814:95:0;;::::1;16067:66:1::0;;;;16149:12;;;16142:28;;;16186:12;;;16179:28;;;16223:12;;;16216:28;61730:46:0;;-1:-1:-1;61787:14:0;16260:13:1;;61814:95:0::1;::::0;;-1:-1:-1;;61814:95:0;;::::1;::::0;;;;;;61804:106;;61814:95:::1;61804:106:::0;;::::1;::::0;-1:-1:-1;;;;;61921:28:0;::::1;;::::0;;;:12:::1;:28:::0;;;;;61955:167:::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;61804:106;;-1:-1:-1;61921:28:0;61955:167;;;62056:25:::1;62002:15:::0;62076:4;62056:19:::1;:25::i;:::-;61955:167:::0;;::::1;::::0;;::::1;::::0;;;61921:202;;::::1;::::0;;::::1;::::0;;-1:-1:-1;61921:202:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;62228:12:::1;::::0;62188:96:::1;::::0;-1:-1:-1;;;;;62228:12:0::1;62243:14:::0;62267:4:::1;62274:9:::0;62188:31:::1;:96::i;:::-;62354:23;::::0;:38:::1;::::0;62382:9;62354:27:::1;:38::i;:::-;62328:23;:64:::0;-1:-1:-1;;;;;62439:33:0;::::1;;::::0;;;:17:::1;:33;::::0;;;;;:48:::1;::::0;62477:9;62439:37:::1;:48::i;:::-;-1:-1:-1::0;;;;;62403:33:0;::::1;;::::0;;;:17:::1;:33;::::0;;;;:84;;;;62556:46:::1;::::0;62421:14;;62556:23:::1;:46::i;:::-;62620:68;::::0;;16515:25:1;;;16571:2;16556:18;;16549:34;;;16599:18;;;16592:34;;;-1:-1:-1;;;;;16662:32:1;;;16657:2;16642:18;;16635:60;62620:68:0;::::1;::::0;::::1;::::0;16502:3:1;16487:19;62620:68:0::1;;;;;;;61307:1389;;61070:1626:::0;;;;;;;:::o;65426:790::-;65550:15;65567;65525:8;65535:4;50605:42;50629:7;50638:8;50605:23;:42::i;:::-;-1:-1:-1;;;;;65605:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;;;65644:8:::1;:18:::0;;;;;;;65605;;-1:-1:-1;65644:18:0;-1:-1:-1;65677:11:0;;65673:227:::1;;-1:-1:-1::0;;;;;65705:18:0;;::::1;65726:1;65705:18:::0;;;:8:::1;:18;::::0;;;;;:22;;;;65742:13:::1;::::0;;:52;;-1:-1:-1;;;65742:52:0;;10282:32:1;;;65742:52:0;;::::1;10264:51:1::0;;;;10331:18;;;10324:34;;;65742:13:0;::::1;::::0;:22:::1;::::0;10237:18:1;;65742:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;65852:13:0::1;::::0;65814:74:::1;::::0;;16908:25:1;;;-1:-1:-1;;;;;65852:13:0;;::::1;17002:2:1::0;16987:18;;16980:43;17059:15;;;17039:18;;;17032:43;65814:74:0;;;;::::1;::::0;::::1;::::0;;;;16896:2:1;65814:74:0;;::::1;65673:227;65954:11:::0;;65950:243:::1;;-1:-1:-1::0;;;;;65986:18:0;;::::1;66007:1;65986:18:::0;;;:8:::1;:18;::::0;;;;;:22;;;;66027:13:::1;::::0;:52;;-1:-1:-1;;;66027:52:0;;10282:32:1;;;66027:52:0::1;::::0;::::1;10264:51:1::0;10331:18;;;10324:34;;;66027:13:0;::::1;::::0;:22:::1;::::0;10237:18:1;;66027:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;66141:13:0::1;::::0;66103:74:::1;::::0;;16908:25:1;;;-1:-1:-1;;;;;66141:13:0;;::::1;17002:2:1::0;16987:18;;16980:43;17059:15;;;17039:18;;;17032:43;66103:74:0;;;;::::1;::::0;::::1;::::0;;;;16896:2:1;66103:74:0;;::::1;65950:243;65426:790:::0;;;;;;;:::o;63258:1670::-;63436:47;63447:14;63463:19;63436:10;:47::i;:::-;;;63496:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63496:28:0;63557:1;63535:19;;;:23;;;63557:1;63598:280;-1:-1:-1;;;;;63619:28:0;;;;;;:12;:28;;;;;:35;63615:39;;63598:280;;;-1:-1:-1;;;;;63690:28:0;;;;;;:12;:28;;;;;:31;;63719:1;;63690:31;;;;;;:::i;:::-;;;;;;;;;;;:38;;;63680:6;:48;63676:191;;;-1:-1:-1;;;;;63760:28:0;;;;;;:12;:28;;;;;:31;;63789:1;;63760:31;;;;;;:::i;:::-;;;;;;;;;;;63748:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63826:1;63810:17;;63846:5;;63676:191;63656:3;;;;:::i;:::-;;;;63598:280;;;-1:-1:-1;63896:16:0;;:26;;63888:54;;;;-1:-1:-1;;;63888:54:0;;17288:2:1;63888:54:0;;;17270:21:1;17327:2;17307:18;;;17300:30;-1:-1:-1;;;17346:18:1;;;17339:45;17401:18;;63888:54:0;17086:339:1;63888:54:0;63980:9;:26;;;63961:15;:45;;:71;;;-1:-1:-1;64010:14:0;;;;;;;:22;;64028:4;64010:22;63961:71;:110;;;-1:-1:-1;64052:10:0;64036:27;;;;:15;:27;;;;;;;;:35;;:27;:35;63961:110;63953:145;;;;-1:-1:-1;;;63953:145:0;;17632:2:1;63953:145:0;;;17614:21:1;17671:2;17651:18;;;17644:30;-1:-1:-1;;;17690:18:1;;;17683:52;17752:18;;63953:145:0;17430:346:1;63953:145:0;64131:19;;;;64167:13;;64163:756;;64258:23;;:38;;64286:9;64258:27;:38::i;:::-;64232:23;:64;-1:-1:-1;;;;;64347:33:0;;;;;;:17;:33;;;;;;:48;;64385:9;64347:37;:48::i;:::-;-1:-1:-1;;;;;64311:33:0;;;;;;:17;:33;;;;;;;;:84;;;;64467:12;:28;;;:43;;64496:13;;64467:43;;;;;;:::i;:::-;;;;;;;;;;;;;64460:50;;;;;;;;;;;;;;;;;;;;;;;;;;64587:46;;64611:14;;64587:23;:46::i;:::-;64762:12;;:53;;-1:-1:-1;;;64762:53:0;;-1:-1:-1;;;;;10282:32:1;;;64762:53:0;;;10264:51:1;10331:18;;;10324:34;;;64762:12:0;;;;:21;;10237:18:1;;64762:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;64837:70:0;;;17983:25:1;;;18039:2;18024:18;;18017:34;;;-1:-1:-1;;;;;18087:32:1;;;18067:18;;;18060:60;64837:70:0;;;;;;;;;;;17971:2:1;64837:70:0;;;64163:756;63362:1566;;;63258:1670;;;:::o;53365:133::-;53424:7;53451:39;53460:15;53477:12;;53451:8;:39::i;:::-;53444:46;;53365:133;:::o;66264:1613::-;66361:12;;66343:15;:30;66335:70;;;;-1:-1:-1;;;66335:70:0;;18333:2:1;66335:70:0;;;18315:21:1;18372:2;18352:18;;;18345:30;18411:29;18391:18;;;18384:57;18458:18;;66335:70:0;18131:351:1;66335:70:0;66766:27;66841:15;;66804:33;66824:12;;66804:15;:19;;:33;;;;:::i;:::-;66796:60;;;;:::i;:::-;66923:13;;;:38;;-1:-1:-1;;;66923:38:0;;66955:4;66923:38;;;3191:51:1;;;;66766:90:0;;-1:-1:-1;66907:13:0;;-1:-1:-1;;;;;66923:13:0;;:23;;3164:18:1;;66923:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66988:13;;:38;;-1:-1:-1;;;66988:38:0;;67020:4;66988:38;;;3191:51:1;66907:54:0;;-1:-1:-1;66972:13:0;;-1:-1:-1;;;;;66988:13:0;;;;:23;;3164:18:1;;66988:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66972:54;-1:-1:-1;67110:8:0;67045:61;67082:23;:19;67104:1;67082:23;:::i;:::-;67061:15;;67045:11;;:32;;:15;:32::i;:61::-;:73;;67037:109;;;;-1:-1:-1;;;67037:109:0;;18689:2:1;67037:109:0;;;18671:21:1;18728:2;18708:18;;;18701:30;18767:25;18747:18;;;18740:53;18810:18;;67037:109:0;18487:347:1;67037:109:0;67171:17;;;;67167:175;;;67277:8;67212:61;67249:23;:19;67271:1;67249:23;:::i;:::-;67228:15;;67212:11;;:32;;:15;:32::i;:61::-;:73;;67204:126;;;;-1:-1:-1;;;67204:126:0;;19041:2:1;67204:126:0;;;19023:21:1;19080:2;19060:18;;;19053:30;19119:34;19099:18;;;19092:62;-1:-1:-1;;;19170:18:1;;;19163:38;19218:19;;67204:126:0;18839:404:1;67204:126:0;67587:15;;67537:67;;67554:49;;67555:26;:19;67579:1;67555:23;:26::i;67554:49::-;67537:12;;;:16;:67::i;:::-;67522:12;:82;67618:15;;67654:16;:14;:16::i;:::-;67681:21;:31;;;67723:21;:31;;;67617:53;;-1:-1:-1;67617:53:0;-1:-1:-1;67782:26:0;:24;:26::i;:::-;67765:14;:43;67855:12;;67826:43;;-1:-1:-1;;;;;67855:12:0;;;3191:51:1;;67826:43:0;;3179:2:1;3164:18;67826:43:0;;;;;;;66297:1580;;;;;66264:1613::o;21898:192::-;21984:7;22020:12;22012:6;;;;22004:29;;;;-1:-1:-1;;;22004:29:0;;;;;;;;:::i;:::-;-1:-1:-1;22044:9:0;22056:5;22060:1;22056;:5;:::i;:::-;22044:17;21898:192;-1:-1:-1;;;;;21898:192:0:o;23942:345::-;24028:7;24130:12;24123:5;24115:28;;;;-1:-1:-1;;;24115:28:0;;;;;;;;:::i;:::-;-1:-1:-1;24154:9:0;24166:5;24170:1;24166;:5;:::i;58074:1538::-;58264:8;58260:46;;;58288:6;:4;:6::i;:::-;-1:-1:-1;;;;;58330:21:0;;;58326:1279;;58543:27;58589;58635;58680:30;58702:7;58680:21;:30::i;:::-;58521:189;;;;;;58772:20;58784:7;58772:11;:20::i;:::-;-1:-1:-1;;;;;58867:30:0;;;;;;:21;:30;;;;;:52;;;59006:42;;;59002:590;;59069:19;59091:44;:19;59115;59091:23;:44::i;:::-;59179:22;;59069:66;;-1:-1:-1;59179:39:0;;59069:66;59179:26;:39::i;:::-;59154:22;:64;59266:36;:19;59290:11;59266:23;:36::i;:::-;-1:-1:-1;;;;;59237:26:0;;;;;;:17;:26;;;;;:65;-1:-1:-1;59002:590:0;;;59343:19;59365:44;:19;59389;59365:23;:44::i;:::-;59453:22;;59343:66;;-1:-1:-1;59453:39:0;;59343:66;59453:26;:39::i;:::-;59428:22;:64;59540:36;:19;59564:11;59540:23;:36::i;:::-;-1:-1:-1;;;;;59511:26:0;;;;;;:17;:26;;;;;:65;-1:-1:-1;59002:590:0;58353:1252;;;58074:1538;;:::o;7279:402::-;7504:51;;;-1:-1:-1;;;;;20287:15:1;;;7504:51:0;;;20269:34:1;20339:15;;;20319:18;;;20312:43;20371:18;;;;20364:34;;;7504:51:0;;;;;;;;;;20204:18:1;;;;7504:51:0;;;;;;;-1:-1:-1;;;;;7504:51:0;-1:-1:-1;;;7504:51:0;;;7493:63;;-1:-1:-1;;;;7493:10:0;;;;:63;;7504:51;7493:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7457:99;;;;7575:7;:57;;;;-1:-1:-1;7587:11:0;;:16;;:44;;;7618:4;7607:24;;;;;;;;;;;;:::i;:::-;7567:106;;;;-1:-1:-1;;;7567:106:0;;20890:2:1;7567:106:0;;;20872:21:1;20929:2;20909:18;;;20902:30;20968:34;20948:18;;;20941:62;-1:-1:-1;;;21019:18:1;;;21012:34;21063:19;;7567:106:0;20688:400:1;44358:106:0;44416:7;44447:1;44443;:5;:13;;44455:1;44443:13;;;-1:-1:-1;44451:1:0;;44358:106;-1:-1:-1;44358:106:0:o;59620:436::-;-1:-1:-1;;;;;59682:21:0;;;59678:371;;59760:15;59777;59796;59803:7;59796:6;:15::i;:::-;-1:-1:-1;;;;;59826:17:0;;;;;;:8;:17;;;;;;;;:27;;;;59868:8;:17;;;;;:27;;;;59945:21;;59910:23;:32;;;;;:56;60016:21;;59981:23;:32;;;;;;;:56;-1:-1:-1;;59678:371:0;59620:436;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;636:180::-;695:6;748:2;736:9;727:7;723:23;719:32;716:52;;;764:1;761;754:12;716:52;-1:-1:-1;787:23:1;;636:180;-1:-1:-1;636:180:1:o;1003:248::-;1071:6;1079;1132:2;1120:9;1111:7;1107:23;1103:32;1100:52;;;1148:1;1145;1138:12;1100:52;-1:-1:-1;;1171:23:1;;;1241:2;1226:18;;;1213:32;;-1:-1:-1;1003:248:1:o;1256:1011::-;1485:2;1537:21;;;1607:13;;1510:18;;;1629:22;;;1456:4;;1485:2;1670;;1688:18;;;;1729:15;;;1456:4;1772:469;1786:6;1783:1;1780:13;1772:469;;;1845:13;;1883:9;;1871:22;;1933:11;;;1927:18;1913:12;;;1906:40;1986:11;;;1980:18;1966:12;;;1959:40;2022:4;2066:11;;;2060:18;2046:12;;;2039:40;2102:4;2146:11;;;2140:18;2126:12;;;2119:40;2188:4;2179:14;;;;2216:15;;;;1808:1;1801:9;1772:469;;;-1:-1:-1;2258:3:1;;1256:1011;-1:-1:-1;;;;;;;1256:1011:1:o;2272:391::-;2358:6;2366;2374;2382;2435:3;2423:9;2414:7;2410:23;2406:33;2403:53;;;2452:1;2449;2442:12;2403:53;2475:29;2494:9;2475:29;:::i;:::-;2465:39;2551:2;2536:18;;2523:32;;-1:-1:-1;2602:2:1;2587:18;;2574:32;;2653:2;2638:18;2625:32;;-1:-1:-1;2272:391:1;-1:-1:-1;;;2272:391:1:o;3253:316::-;3330:6;3338;3346;3399:2;3387:9;3378:7;3374:23;3370:32;3367:52;;;3415:1;3412;3405:12;3367:52;-1:-1:-1;;3438:23:1;;;3508:2;3493:18;;3480:32;;-1:-1:-1;3559:2:1;3544:18;;;3531:32;;3253:316;-1:-1:-1;3253:316:1:o;3574:254::-;3642:6;3650;3703:2;3691:9;3682:7;3678:23;3674:32;3671:52;;;3719:1;3716;3709:12;3671:52;3742:29;3761:9;3742:29;:::i;:::-;3732:39;3818:2;3803:18;;;;3790:32;;-1:-1:-1;;;3574:254:1:o;4157:260::-;4225:6;4233;4286:2;4274:9;4265:7;4261:23;4257:32;4254:52;;;4302:1;4299;4292:12;4254:52;4325:29;4344:9;4325:29;:::i;:::-;4315:39;;4373:38;4407:2;4396:9;4392:18;4373:38;:::i;:::-;4363:48;;4157:260;;;;;:::o;4422:118::-;4508:5;4501:13;4494:21;4487:5;4484:32;4474:60;;4530:1;4527;4520:12;4545:377;4619:6;4627;4635;4688:2;4676:9;4667:7;4663:23;4659:32;4656:52;;;4704:1;4701;4694:12;4656:52;4740:9;4727:23;4717:33;;4797:2;4786:9;4782:18;4769:32;4759:42;;4851:2;4840:9;4836:18;4823:32;4864:28;4886:5;4864:28;:::i;:::-;4911:5;4901:15;;;4545:377;;;;;:::o;5602:184::-;5672:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:52;;;5741:1;5738;5731:12;5693:52;-1:-1:-1;5764:16:1;;5602:184;-1:-1:-1;5602:184:1:o;5791:355::-;5993:2;5975:21;;;6032:2;6012:18;;;6005:30;6071:33;6066:2;6051:18;;6044:61;6137:2;6122:18;;5791:355::o;6151:345::-;6353:2;6335:21;;;6392:2;6372:18;;;6365:30;-1:-1:-1;;;6426:2:1;6411:18;;6404:51;6487:2;6472:18;;6151:345::o;6849:340::-;7051:2;7033:21;;;7090:2;7070:18;;;7063:30;-1:-1:-1;;;7124:2:1;7109:18;;7102:46;7180:2;7165:18;;6849:340::o;10369:245::-;10436:6;10489:2;10477:9;10468:7;10464:23;10460:32;10457:52;;;10505:1;10502;10495:12;10457:52;10537:9;10531:16;10556:28;10578:5;10556:28;:::i;10619:127::-;10680:10;10675:3;10671:20;10668:1;10661:31;10711:4;10708:1;10701:15;10735:4;10732:1;10725:15;10751:127;10812:10;10807:3;10803:20;10800:1;10793:31;10843:4;10840:1;10833:15;10867:4;10864:1;10857:15;10883:135;10922:3;-1:-1:-1;;10943:17:1;;10940:43;;;10963:18;;:::i;:::-;-1:-1:-1;11010:1:1;10999:13;;10883:135::o;12788:128::-;12828:3;12859:1;12855:6;12852:1;12849:13;12846:39;;;12865:18;;:::i;:::-;-1:-1:-1;12901:9:1;;12788:128::o;13277:168::-;13317:7;13383:1;13379;13375:6;13371:14;13368:1;13365:21;13360:1;13353:9;13346:17;13342:45;13339:71;;;13390:18;;:::i;:::-;-1:-1:-1;13430:9:1;;13277:168::o;13450:217::-;13490:1;13516;13506:132;;13560:10;13555:3;13551:20;13548:1;13541:31;13595:4;13592:1;13585:15;13623:4;13620:1;13613:15;13506:132;-1:-1:-1;13652:9:1;;13450:217::o;19248:258::-;19320:1;19330:113;19344:6;19341:1;19338:13;19330:113;;;19420:11;;;19414:18;19401:11;;;19394:39;19366:2;19359:10;19330:113;;;19461:6;19458:1;19455:13;19452:48;;;-1:-1:-1;;19496:1:1;19478:16;;19471:27;19248:258::o;19511:383::-;19660:2;19649:9;19642:21;19623:4;19692:6;19686:13;19735:6;19730:2;19719:9;19715:18;19708:34;19751:66;19810:6;19805:2;19794:9;19790:18;19785:2;19777:6;19773:15;19751:66;:::i;:::-;19878:2;19857:15;-1:-1:-1;;19853:29:1;19838:45;;;;19885:2;19834:54;;19511:383;-1:-1:-1;;19511:383:1:o;19899:125::-;19939:4;19967:1;19964;19961:8;19958:34;;;19972:18;;:::i;:::-;-1:-1:-1;20009:9:1;;19899:125::o;20409:274::-;20538:3;20576:6;20570:13;20592:53;20638:6;20633:3;20626:4;20618:6;20614:17;20592:53;:::i;:::-;20661:16;;;;;20409:274;-1:-1:-1;;20409:274:1:o
Swarm Source
ipfs://2d11967dd0fb1e13d8811c4da956c0f4949eb84d59cba471870b4840a8b1e95f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.