More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,055 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Get Reward | 66568857 | 7 days ago | IN | 0 POL | 0.01327953 | ||||
Withdraw Locked | 64726128 | 54 days ago | IN | 0 POL | 0.01062531 | ||||
Get Reward | 64726111 | 54 days ago | IN | 0 POL | 0.00872268 | ||||
Withdraw Locked | 64413263 | 62 days ago | IN | 0 POL | 0.00653821 | ||||
Get Reward | 64413229 | 62 days ago | IN | 0 POL | 0.00457662 | ||||
Withdraw Locked | 64322946 | 64 days ago | IN | 0 POL | 0.01536799 | ||||
Get Reward | 64322689 | 64 days ago | IN | 0 POL | 0.01008357 | ||||
Get Reward | 64312727 | 64 days ago | IN | 0 POL | 0.01332306 | ||||
Get Reward | 64070247 | 70 days ago | IN | 0 POL | 0.01114484 | ||||
Withdraw Locked | 63991601 | 72 days ago | IN | 0 POL | 0.00606114 | ||||
Get Reward | 63949399 | 73 days ago | IN | 0 POL | 0.01253794 | ||||
Withdraw Locked | 63921551 | 74 days ago | IN | 0 POL | 0.05450663 | ||||
Get Reward | 63920539 | 74 days ago | IN | 0 POL | 0.05562382 | ||||
Get Reward | 63352981 | 88 days ago | IN | 0 POL | 0.01008389 | ||||
Get Reward | 63350051 | 88 days ago | IN | 0 POL | 0.01255356 | ||||
Nominate New Own... | 63116809 | 94 days ago | IN | 0 POL | 0.00146184 | ||||
Get Reward | 62893840 | 99 days ago | IN | 0 POL | 0.01053636 | ||||
Withdraw Locked | 62875597 | 100 days ago | IN | 0 POL | 0.00614652 | ||||
Get Reward | 62875560 | 100 days ago | IN | 0 POL | 0.00578685 | ||||
Get Reward | 62337184 | 113 days ago | IN | 0 POL | 0.01114484 | ||||
Get Reward | 62321796 | 113 days ago | IN | 0 POL | 0.00508962 | ||||
Get Reward | 62266405 | 115 days ago | IN | 0 POL | 0.00812055 | ||||
Get Reward | 62048747 | 120 days ago | IN | 0 POL | 0.01184272 | ||||
Get Reward | 61865872 | 125 days ago | IN | 0 POL | 0.01114484 | ||||
Get Reward | 61699469 | 129 days ago | IN | 0 POL | 0.00759714 |
Loading...
Loading
Contract Name:
StakingRewardsDualV5_UBO_KLIMA
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-03-28 */ // 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.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 is Owned, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for ERC20; /* ========== STATE VARIABLES ========== */ // Instances IveC3 private veC3; ERC20 private rewardsToken0; ERC20 private rewardsToken1; IUniswapV2Pair 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 = IUniswapV2Pair(_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 c3PerLPToken() public view returns (uint256) { // Get the amount of FRAX 'inside' of the lp tokens uint256 c3_per_lp_token; { uint256 total_c3_reserves; (uint256 reserve0, uint256 reserve1, ) = (stakingToken.getReserves()); if (c3_is_token0) total_c3_reserves = reserve0; else total_c3_reserves = reserve1; c3_per_lp_token = total_c3_reserves.mul(1e18).div(stakingToken.totalSupply()); } return c3_per_lp_token; } function userStakedC3(address account) public view returns (uint256) { return (c3PerLPToken()).mul(_locked_liquidity[account]).div(1e18); } function minVeC3ForMaxBoost(address account) public view returns (uint256) { return (userStakedC3(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_UBO_KLIMA.sol pragma solidity >=0.6.11; //pragma experimental ABIEncoderV2; contract StakingRewardsDualV5_UBO_KLIMA is C3StakingRewardsDualV5 { constructor ( address _owner, address _rewardsToken0, address _rewardsToken1, // KLIMA is E9 address _stakingToken, address _c3_address, address _timelock_address, address _veC3_address ) C3StakingRewardsDualV5(_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":[],"name":"c3PerLPToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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.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":"userStakedC3","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
60806040526729a2241af62c0000600b556305a39a80600c5562015180600d55673782dace9d900000600e55671bc16d674ec80000600f5562093a8060135560006015556023805460ff191660011790553480156200005d57600080fd5b506040516200390b3803806200390b83398101604081905262000080916200030e565b86868686868686866001600160a01b038116620000e45760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f7420626520300000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1506001600255600480546001600160a01b038089166001600160a01b0319928316178355600580548983169084161790556006805488831690841681179091556003805486841690851617905560078054928716929093169190911790915560006011819055601281905560408051630dfe168160e01b815290519193630dfe16819282820192602092908290030181865afa158015620001e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002069190620003a3565b9050836001600160a01b0316816001600160a01b031614156200023657601e805460ff1916600117905562000241565b601e805460ff191690555b6023805462ffff001916905542600a8190556013546200026e919062000287602090811b6200201117901c565b60095550620003e89d5050505050505050505050505050565b600080620002968385620003c1565b905083811015620002ea5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620000db565b9392505050565b80516001600160a01b03811681146200030957600080fd5b919050565b600080600080600080600060e0888a0312156200032a57600080fd5b6200033588620002f1565b96506200034560208901620002f1565b95506200035560408901620002f1565b94506200036560608901620002f1565b93506200037560808901620002f1565b92506200038560a08901620002f1565b91506200039560c08901620002f1565b905092959891949750929550565b600060208284031215620003b657600080fd5b620002ea82620002f1565b60008219821115620003e357634e487b7160e01b600052601160045260246000fd5b500190565b61351380620003f86000396000f3fe608060405234801561001057600080fd5b50600436106103f05760003560e01c8063941d9f6511610215578063dc6663c711610125578063ed48f6f7116100b8578063fbf5133311610087578063fbf51333146108d6578063fce6fd13146108e9578063fe271f5f146108fb578063ff0063fc1461091b578063fff6cae91461092457600080fd5b8063ed48f6f714610886578063ee89e02f1461088e578063f12f1447146108b0578063f9706f44146108c357600080fd5b8063e1ba95d2116100f4578063e1ba95d21461084e578063e9f2838e14610856578063eb3c209e1461086a578063ebe2b12b1461087d57600080fd5b8063dc6663c714610818578063de6e86f01461082b578063de9853ad14610833578063e01f62bf1461084657600080fd5b8063bbb781cc116101a8578063cc1a378f11610177578063cc1a378f146107c3578063cd3daf9d146107d6578063cdc82e80146107de578063d239f003146107e7578063d9f96e8d146107ef57600080fd5b8063bbb781cc14610771578063bdacb30314610787578063c126d1aa1461079a578063c8f33c91146107ba57600080fd5b8063a1ec508a116101e4578063a1ec508a14610744578063a2217bc51461074d578063af00f4e214610755578063b94c4dcb1461076857600080fd5b8063941d9f65146106dd5780639637927f146106f05780639b8c15a8146107035780639c5303eb1461073157600080fd5b80633d18b912116103105780636a231b03116102a35780637b31c19a116102725780637b31c19a1461066e5780638980f11f146106765780638bad86a7146106895780638da5cb5b146106b757806392eefe9b146106ca57600080fd5b80636a231b031461062a5780636ce46bc31461064a5780636e27cef91461065d57806379ba50971461066657600080fd5b806353a47bb7116102df57806353a47bb7146105d7578063643504671461060257806364f2c0601461060f57806367feda3e1461061757600080fd5b80633d18b9121461057757806351654f7f1461057f57806351e3fc171461058857806352732bc81461059b57600080fd5b80631e090f0111610388578063323331ca11610357578063323331ca1461052857806336f89af21461053d578063386a9525146105665780633b8105b31461056f57600080fd5b80631e090f01146104b957806328ef934e146104d95780632ca1a895146104ec57806331ca208c146104f557600080fd5b8063170feb76116103c4578063170feb761461047857806317b18c891461048b5780631b3e870a1461049e5780631c1f78eb146104b157600080fd5b80628cc262146103f55780630d7bac4f14610422578063144e8034146104435780631627540c14610463575b600080fd5b6104086104033660046130bc565b61092c565b604080519283526020830191909152015b60405180910390f35b6104356104303660046130d7565b610a4c565b604051908152602001610419565b6104356104513660046130bc565b60166020526000908152604090205481565b6104766104713660046130bc565b610aa5565b005b6104356104863660046130bc565b610b71565b6104766104993660046130f0565b610c56565b6104766104ac3660046130bc565b610c92565b610408610d53565b6104cc6104c73660046130bc565b610d84565b6040516104199190613112565b6104766104e7366004613180565b610e2b565b61043560115481565b6105186105033660046130bc565b60226020526000908152604090205460ff1681565b6040519015158152602001610419565b60235461051890640100000000900460ff1681565b61043561054b3660046130bc565b6001600160a01b03166000908152601d602052604090205490565b61043560135481565b610476610ef8565b610408610f5c565b610435600f5481565b6104766105963660046130d7565b610ff7565b6104766105a93660046130bc565b3360009081526021602090815260408083206001600160a01b0394909416835292905220805460ff19169055565b6001546105ea906001600160a01b031681565b6040516001600160a01b039091168152602001610419565b6023546105189060ff1681565b601b54610435565b6008546105ea906001600160a01b031681565b6104356106383660046130bc565b60196020526000908152604090205481565b6104766106583660046131b9565b61107f565b610435600d5481565b61047661122f565b610476611319565b6104766106843660046131e5565b61137b565b61069c6106973660046130bc565b6114b6565b60408051938452602084019290925290820152606001610419565b6000546105ea906001600160a01b031681565b6104766106d83660046130bc565b611666565b6104766106eb3660046130bc565b6116c7565b6023546105189062010000900460ff1681565b61051861071136600461320f565b602160209081526000928352604080842090915290825290205460ff1681565b61047661073f3660046130bc565b61172f565b61043560125481565b610476611791565b6104766107633660046130f0565b6117ed565b610435600c5481565b6023546105189065010000000000900460ff1681565b6104766107953660046130bc565b61193b565b6104356107a83660046130bc565b60186020526000908152604090205481565b610435600a5481565b6104766107d13660046130d7565b61199c565b610408611aaa565b610435600b5481565b610476611b39565b6104356107fd3660046130bc565b6001600160a01b03166000908152601c602052604090205490565b6007546105ea906001600160a01b031681565b610435611b99565b610476610841366004613250565b611ccb565b601a54610435565b610476611d65565b602354610518906301000000900460ff1681565b6104766108783660046131e5565b611dc3565b61043560095481565b610476611e8c565b61051861089c3660046130bc565b602080526000908152604090205460ff1681565b6104766108be3660046130bc565b611ef0565b6104356108d13660046130bc565b611f88565b6104356108e43660046130bc565b611fa1565b60235461051890610100900460ff1681565b6104356109093660046130bc565b60176020526000908152604090205481565b610435600e5481565b610476611fd4565b60008060008061093a611aaa565b6001600160a01b0387166000908152601d60205260409020549193509150610969575060009485945092505050565b6001600160a01b0385166000908152601860209081526040808320546016909252909120546109db91906109d590670de0b6b3a7640000906109cf906109b0908890612077565b6001600160a01b038b166000908152601d6020526040902054906120b9565b90612138565b90612011565b6001600160a01b038616600090815260196020908152604080832054601790925290912054610a4191906109d590670de0b6b3a7640000906109cf90610a22908890612077565b6001600160a01b038c166000908152601d6020526040902054906120b9565b935093505050915091565b600080610a8e610a7f600c546109cf610a78670de0b6b3a7640000600b5461207790919063ffffffff16565b87906120b9565b670de0b6b3a764000090612011565b9050600b54811115610a9f5750600b545b92915050565b6000546001600160a01b03163314610b1c5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b60648201526084015b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22906020015b60405180910390a150565b600080610b7d83611f88565b90508015610c4d576003546040516370a0823160e01b81526001600160a01b038581166004830152600092610c0f9285926109cf92670de0b6b3a7640000929116906370a0823190602401602060405180830381865afa158015610be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c099190613289565b906120b9565b90506000610c34670de0b6b3a76400006109cf600f54856120b990919063ffffffff16565b9050600f54811115610c455750600f545b949350505050565b50600092915050565b600280541415610c785760405162461bcd60e51b8152600401610b13906132a2565b60028055610c89338084844261217a565b50506001600255565b6000546001600160a01b0316331480610cb557506007546001600160a01b031633145b610cd15760405162461bcd60e51b8152600401610b13906132d9565b6001600160a01b038116600090815260208052604090205460ff161515600114610d335760405162461bcd60e51b81526020600482015260136024820152721059191c995cdcc81b9bdb995e1a5cdd185b9d606a1b6044820152606401610b13565b6001600160a01b031660009081526020805260409020805460ff19169055565b600080610d6d6013546011546120b990919063ffffffff16565b601354601254610d7c916120b9565b915091509091565b6001600160a01b0381166000908152601f60209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610e2057838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020019060010190610dbc565b505050509050919050565b60235460ff610100909104161515600114610e585760405162461bcd60e51b8152600401610b1390613308565b6001600160a01b038416600090815260216020908152604080832033845290915290205460ff168015610e99575033600090815260208052604090205460ff165b610ee55760405162461bcd60e51b815260206004820152601a60248201527f4d69672e20696e76616c6964206f7220756e617070726f7665640000000000006044820152606401610b13565b610ef2843385858561217a565b50505050565b6000546001600160a01b0316331480610f1b57506007546001600160a01b031633145b610f375760405162461bcd60e51b8152600401610b13906132d9565b6023805465ff0000000000198116650100000000009182900460ff1615909102179055565b600080600280541415610f815760405162461bcd60e51b8152600401610b13906132a2565b60028055602354640100000000900460ff1615610fe05760405162461bcd60e51b815260206004820152601960248201527f5265776172647320636f6c6c656374696f6e20706175736564000000000000006044820152606401610b13565b610fea3333612532565b9150915060016002559091565b6002805414156110195760405162461bcd60e51b8152600401610b13906132a2565b600280556023546301000000900460ff161561106c5760405162461bcd60e51b815260206004820152601260248201527115da5d1a191c985dd85b1cc81c185d5cd95960721b6044820152606401610b13565b611077333383612740565b506001600255565b6000546001600160a01b03163314806110a257506007546001600160a01b031633145b6110be5760405162461bcd60e51b8152600401610b13906132d9565b670de0b6b3a76400008310156111225760405162461bcd60e51b8152602060048201526024808201527f4d756c74206d757374206265203e3d204d554c5449504c4945525f505245434960448201526329a4a7a760e11b6064820152608401610b13565b600081116111725760405162461bcd60e51b815260206004820152601960248201527f7665433320706374206d6178206d757374206265203e3d2030000000000000006044820152606401610b13565b600b839055600f829055600e8190556040518281527f6b04d7611e06fe226eebfd39936d0c17ed4750a86ec9bd223924335d955288689060200160405180910390a17fa1676084a9eea08c6f205b60799323b364a1bd8e10aba89f0fbd94cfbf68b5dd600b546040516111e791815260200190565b60405180910390a17f5341dc8814a88b3b792bc9de97825af6a74034e43f5263d2ebc8407936723fe6600e5460405161122291815260200190565b60405180910390a1505050565b6001546001600160a01b031633146112a75760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610b13565b600054600154604080516001600160a01b0393841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031633148061133c57506007546001600160a01b031633145b6113585760405162461bcd60e51b8152600401610b13906132d9565b6023805464ff000000001981166401000000009182900460ff1615909102179055565b6000546001600160a01b031633148061139e57506007546001600160a01b031633145b6113ba5760405162461bcd60e51b8152600401610b13906132d9565b602354610100900460ff166113f7576006546001600160a01b03838116911614156113f75760405162461bcd60e51b8152600401610b1390613308565b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af115801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190613332565b50604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2891015b60405180910390a15050565b6001600160a01b0381166000908152601d602052604081205490806114da84610b71565b6001600160a01b0385166000908152601c60205260408120549193509015801561151a57506001600160a01b0385166000908152601d6020526040902054155b15611526575081611554565b6001600160a01b038516600090815260106020526040902054611551906002906109cf908690612011565b90505b6000915060005b6001600160a01b0386166000908152601f602052604090205481101561165d576001600160a01b0386166000908152601f602052604081208054839081106115a5576115a561334f565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600081608001519050428260600151116116115750670de0b6b3a76400005b60408201516000611638670de0b6b3a76400006109cf611631868a612011565b85906120b9565b90506116448782612011565b96505050505080806116559061337b565b91505061155b565b50509193909250565b6000546001600160a01b031633148061168957506007546001600160a01b031633145b6116a55760405162461bcd60e51b8152600401610b13906132d9565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806116ea57506007546001600160a01b031633145b6117065760405162461bcd60e51b8152600401610b13906132d9565b6001600160a01b03166000908152602260205260409020805460ff19811660ff90911615179055565b6000546001600160a01b031633148061175257506007546001600160a01b031633145b61176e5760405162461bcd60e51b8152600401610b13906132d9565b6001600160a01b031660009081526020805260409020805460ff19166001179055565b6000546001600160a01b03163314806117b457506007546001600160a01b031633145b6117d05760405162461bcd60e51b8152600401610b13906132d9565b6023805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b031633148061181057506007546001600160a01b031633145b61182c5760405162461bcd60e51b8152600401610b13906132d9565b600182101561187d5760405162461bcd60e51b815260206004820152601960248201527f4d756c206d61782074696d65206d757374206265203e3d2031000000000000006044820152606401610b13565b60018110156118ce5760405162461bcd60e51b815260206004820152601960248201527f4d756c206d696e2074696d65206d757374206265203e3d2031000000000000006044820152606401610b13565b600c829055600d8190556040518281527f0e3e3fae480c6f92291358a02bc83f04ee1971d5488596bffda7929d57ab470f9060200160405180910390a16040518181527f0534d208d75dfdbfacc1204745dd9b3c4c37e8cfc05eb5e8e3ae538aedb0a9fa906020016114aa565b6000546001600160a01b031633148061195e57506007546001600160a01b031633145b61197a5760405162461bcd60e51b8152600401610b13906132d9565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806119bf57506007546001600160a01b031633145b806119d457506008546001600160a01b031633145b611a195760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb716103a3635961037b91031ba39363960511b6044820152606401610b13565b6009541580611a29575060095442115b611a755760405162461bcd60e51b815260206004820152601860248201527f52657761726420706572696f6420696e636f6d706c65746500000000000000006044820152606401610b13565b60138190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d390602001610b66565b600080601a5460001480611abe5750601b54155b15611acf5750506014546015549091565b611b07611afe601b546109cf670de0b6b3a7640000610c09601154610c09600a54611af8612ac0565b90612077565b60145490612011565b610d7c611b30601b546109cf670de0b6b3a7640000610c09601254610c09600a54611af8612ac0565b60155490612011565b6000546001600160a01b0316331480611b5c57506007546001600160a01b031633145b611b785760405162461bcd60e51b8152600401610b13906132d9565b6023805463ff00000019811663010000009182900460ff1615909102179055565b6000806000806000600660009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1891906133ad565b50601e546001600160701b0392831694509116915060ff1615611c3d57819250611c41565b8092505b600654604080516318160ddd60e01b81529051611cc2926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb09190613289565b6109cf85670de0b6b3a76400006120b9565b95945050505050565b6000546001600160a01b0316331480611cee57506007546001600160a01b031633145b80611d0357506008546001600160a01b031633145b611d485760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb716103a3635961037b91031ba39363960511b6044820152606401610b13565b601183905560128290558015611d6057611d60611fd4565b505050565b6000546001600160a01b0316331480611d8857506007546001600160a01b031633145b611da45760405162461bcd60e51b8152600401610b13906132d9565b6023805462ff0000198116620100009182900460ff1615909102179055565b60235460ff610100909104161515600114611df05760405162461bcd60e51b8152600401610b1390613308565b6001600160a01b038216600090815260216020908152604080832033845290915290205460ff168015611e31575033600090815260208052604090205460ff165b611e7d5760405162461bcd60e51b815260206004820152601a60248201527f4d69672e20696e76616c6964206f7220756e617070726f7665640000000000006044820152606401610b13565b611e88823383612740565b5050565b6000546001600160a01b0316331480611eaf57506007546001600160a01b031633145b611ecb5760405162461bcd60e51b8152600401610b13906132d9565b60235460ff1615611edc5760006012555b6023805460ff19811660ff90911615179055565b6001600160a01b038116600090815260208052604090205460ff16611f575760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d69677261746f72206164647265737300000000000000006044820152606401610b13565b3360009081526021602090815260408083206001600160a01b0394909416835292905220805460ff19166001179055565b6000610a9f670de0b6b3a76400006109cf600e54610c09865b6001600160a01b0381166000908152601c6020526040812054610a9f90670de0b6b3a7640000906109cf90610c09611b99565b600954421115611fe857611fe6612ad3565b565b600080611ff3611aaa565b60148290556015819055909250905061200a612ac0565b600a555050565b60008061201e83856133f2565b9050838110156120705760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b13565b9392505050565b600061207083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612db1565b6000826120c857506000610a9f565b60006120d4838561340a565b9050826120e18583613429565b146120705760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b13565b600061207083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612de2565b8460016121878282612e10565b60235465010000000000900460ff1615806121b5575033600090815260208052604090205460ff1615156001145b6122015760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720706175736564206f7220696e206d6967726174696f6e00006044820152606401610b13565b600085116122515760405162461bcd60e51b815260206004820152601960248201527f4d757374207374616b65206d6f7265207468616e207a65726f000000000000006044820152606401610b13565b6001600160a01b03871660009081526022602052604090205460ff16156122ba5760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320686173206265656e20677265796c697374656400000000006044820152606401610b13565b600d5484101561230c5760405162461bcd60e51b815260206004820152601a60248201527f4d696e696d756d207374616b652074696d65206e6f74206d65740000000000006044820152606401610b13565b600c5484111561235e5760405162461bcd60e51b815260206004820152601b60248201527f547279696e6720746f206c6f636b20666f7220746f6f206c6f6e6700000000006044820152606401610b13565b600061236985610a4c565b6001600160a01b0389166000908152601c602090815260408083205490516bffffffffffffffffffffffff1960608e901b169281019290925260348201889052605482018a905260748201529192509060940160408051601f1981840301815282825280516020918201206001600160a01b038d166000908152601f835283902060a0850184528185529184018990529183018a90529092509060608101612411888a612011565b8152602090810185905282546001818101855560009485529382902083516005909202019081559082015192810192909255604081015160028301556060810151600383015560800151600490910155600654612479906001600160a01b031689308a612eff565b601a546124869088612011565b601a556001600160a01b0389166000908152601c60205260409020546124ac9088612011565b6001600160a01b038a166000908152601c60205260408120919091556124d3908a90612e10565b60408051888152602081018890529081018290526001600160a01b0389811660608301528a16907ff400e72e69ef4402819dfc57eeddc66f5eb69bf405e0e8098b1946ec1ac14a229060800160405180910390a2505050505050505050565b6000808360016125428282612e10565b6001600160a01b03861660009081526018602090815260408083205460199092529091205490945092508315612653576001600160a01b038681166000908152601860205260408082209190915560048054915163a9059cbb60e01b8152888416918101919091526024810187905291169063a9059cbb906044016020604051808303816000875af11580156125dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126009190613332565b50600454604080518681526001600160a01b039283166020820152878316818301529051918816917f1d2f2ca53af5d2f333bd32fdd45f9c52ad8ebe31414f7792912077fcb3876dff9181900360600190a25b8215612737576001600160a01b0386811660009081526019602052604080822091909155600554905163a9059cbb60e01b815287831660048201526024810186905291169063a9059cbb906044016020604051808303816000875af11580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e49190613332565b50600554604080518581526001600160a01b039283166020820152878316818301529051918816917f1d2f2ca53af5d2f333bd32fdd45f9c52ad8ebe31414f7792912077fcb3876dff9181900360600190a25b50509250929050565b61274a8383612532565b50506127816040518060a0016040528060008019168152602001600081526020016000815260200160008152602001600081525090565b600060408201819052805b6001600160a01b0386166000908152601f6020526040902054811015612880576001600160a01b0386166000908152601f602052604090208054829081106127d6576127d661334f565b90600052602060002090600502016000015484141561286e576001600160a01b0386166000908152601f602052604090208054829081106128195761281961334f565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509250809150612880565b806128788161337b565b91505061278c565b50815183146128c35760405162461bcd60e51b815260206004820152600f60248201526e14dd185ad9481b9bdd08199bdd5b99608a1b6044820152606401610b13565b8160600151421015806128e3575060235462010000900460ff1615156001145b80612901575033600090815260208052604090205460ff1615156001145b6129465760405162461bcd60e51b81526020600482015260166024820152755374616b65206973207374696c6c206c6f636b65642160501b6044820152606401610b13565b60408201518015612ab857601a5461295e9082612077565b601a556001600160a01b0386166000908152601c60205260409020546129849082612077565b6001600160a01b0387166000908152601c6020908152604080832093909355601f9052208054839081106129ba576129ba61334f565b6000918252602082206005909102018181556001810182905560028101829055600381018290556004018190556129f2908790612e10565b60065460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015612a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a699190613332565b5060408051828152602081018690526001600160a01b03878116828401529151918816917f1d9308f6b22a2754a1c622bb30889e8f8f956c83e524d039e9d65d5f052eb9089181900360600190a25b505050505050565b6000612ace42600954613027565b905090565b6009544211612b245760405162461bcd60e51b815260206004820152601b60248201527f506572696f6420686173206e6f742065787069726564207965742100000000006044820152606401610b13565b6000601354612b3e6009544261207790919063ffffffff16565b612b489190613429565b600480546040516370a0823160e01b815230928101929092529192506000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbb9190613289565b6005546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2d9190613289565b905081612c4d612c3e8560016133f2565b601354601154610c09916120b9565b1115612c9b5760405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f75676820433320617661696c61626c650000000000000000006044820152606401610b13565b60235460ff1615612d235780612cc4612cb58560016133f2565b601354601254610c09916120b9565b1115612d235760405162461bcd60e51b815260206004820152602860248201527f4e6f7420656e6f75676820746f6b656e3120617661696c61626c6520666f7220604482015267726577617264732160c01b6064820152608401610b13565b601354612d4290612d3990610c09866001612011565b60095490612011565b600955600080612d50611aaa565b601482905560158190559092509050612d67612ac0565b600a556006546040516001600160a01b0390911681527f6f2b3b3aaf1881d69a5d40565500f93ea73df36e7b6a29bf48b21479a9237fe99060200160405180910390a15050505050565b60008184841115612dd55760405162461bcd60e51b8152600401610b139190613477565b506000611cc284866134aa565b60008183612e035760405162461bcd60e51b8152600401610b139190613477565b506000611cc28486613429565b8015612e1e57612e1e611fd4565b6001600160a01b03821615611e88576000806000612e3b856114b6565b925092509250612e4a8561303d565b6001600160a01b0385166000908152601060205260409020829055828110612eb4576000612e788285612077565b601b54909150612e889082612011565b601b55612e958482612011565b6001600160a01b0387166000908152601d602052604090205550612ef8565b6000612ec08483612077565b601b54909150612ed09082612077565b601b55612edd8482612077565b6001600160a01b0387166000908152601d6020526040902055505b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612f6391906134c1565b6000604051808303816000865af19150503d8060008114612fa0576040519150601f19603f3d011682016040523d82523d6000602084013e612fa5565b606091505b5091509150818015612fcf575080511580612fcf575080806020019051810190612fcf9190613332565b612ab85760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610b13565b60008183106130365781612070565b5090919050565b6001600160a01b0381161561309d576000806130588361092c565b6001600160a01b038516600090815260186020908152604080832094909455601981528382209290925560145460168352838220556015546017909252919091205550505b50565b80356001600160a01b03811681146130b757600080fd5b919050565b6000602082840312156130ce57600080fd5b612070826130a0565b6000602082840312156130e957600080fd5b5035919050565b6000806040838503121561310357600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156131735781518051855286810151878601528581015186860152606080820151908601526080908101519085015260a0909301929085019060010161312f565b5091979650505050505050565b6000806000806080858703121561319657600080fd5b61319f856130a0565b966020860135965060408601359560600135945092505050565b6000806000606084860312156131ce57600080fd5b505081359360208301359350604090920135919050565b600080604083850312156131f857600080fd5b613201836130a0565b946020939093013593505050565b6000806040838503121561322257600080fd5b61322b836130a0565b9150613239602084016130a0565b90509250929050565b801515811461309d57600080fd5b60008060006060848603121561326557600080fd5b8335925060208401359150604084013561327e81613242565b809150509250925092565b60006020828403121561329b57600080fd5b5051919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601590820152744e6f74206f776e6572206f722074696d656c6f636b60581b604082015260600190565b60208082526010908201526f2737ba1034b71036b4b3b930ba34b7b760811b604082015260600190565b60006020828403121561334457600080fd5b815161207081613242565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561338f5761338f613365565b5060010190565b80516001600160701b03811681146130b757600080fd5b6000806000606084860312156133c257600080fd5b6133cb84613396565b92506133d960208501613396565b9150604084015163ffffffff8116811461327e57600080fd5b6000821982111561340557613405613365565b500190565b600081600019048311821515161561342457613424613365565b500290565b60008261344657634e487b7160e01b600052601260045260246000fd5b500490565b60005b8381101561346657818101518382015260200161344e565b83811115610ef25750506000910152565b602081526000825180602084015261349681604085016020870161344b565b601f01601f19169190910160400192915050565b6000828210156134bc576134bc613365565b500390565b600082516134d381846020870161344b565b919091019291505056fea26469706673582212201b89121ffe56d889a0a819888fcda1b9bae75a4c2138732f69d641496f4ea89264736f6c634300080b00330000000000000000000000008c250a8128c76b25103174d0cf9dee4800ebfecd000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c60000000000000000000000004e78011ce80ee02d2c3e649fb657e458982578150000000000000000000000005400a05b8b45eaf9105315b4f2e31f806ab706de000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c60000000000000000000000009dca574b1b6bd51cbd02a3d98716597bd84c45eb0000000000000000000000006a88a0abb9be9f9050ff87753b84613f4e28361b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103f05760003560e01c8063941d9f6511610215578063dc6663c711610125578063ed48f6f7116100b8578063fbf5133311610087578063fbf51333146108d6578063fce6fd13146108e9578063fe271f5f146108fb578063ff0063fc1461091b578063fff6cae91461092457600080fd5b8063ed48f6f714610886578063ee89e02f1461088e578063f12f1447146108b0578063f9706f44146108c357600080fd5b8063e1ba95d2116100f4578063e1ba95d21461084e578063e9f2838e14610856578063eb3c209e1461086a578063ebe2b12b1461087d57600080fd5b8063dc6663c714610818578063de6e86f01461082b578063de9853ad14610833578063e01f62bf1461084657600080fd5b8063bbb781cc116101a8578063cc1a378f11610177578063cc1a378f146107c3578063cd3daf9d146107d6578063cdc82e80146107de578063d239f003146107e7578063d9f96e8d146107ef57600080fd5b8063bbb781cc14610771578063bdacb30314610787578063c126d1aa1461079a578063c8f33c91146107ba57600080fd5b8063a1ec508a116101e4578063a1ec508a14610744578063a2217bc51461074d578063af00f4e214610755578063b94c4dcb1461076857600080fd5b8063941d9f65146106dd5780639637927f146106f05780639b8c15a8146107035780639c5303eb1461073157600080fd5b80633d18b912116103105780636a231b03116102a35780637b31c19a116102725780637b31c19a1461066e5780638980f11f146106765780638bad86a7146106895780638da5cb5b146106b757806392eefe9b146106ca57600080fd5b80636a231b031461062a5780636ce46bc31461064a5780636e27cef91461065d57806379ba50971461066657600080fd5b806353a47bb7116102df57806353a47bb7146105d7578063643504671461060257806364f2c0601461060f57806367feda3e1461061757600080fd5b80633d18b9121461057757806351654f7f1461057f57806351e3fc171461058857806352732bc81461059b57600080fd5b80631e090f0111610388578063323331ca11610357578063323331ca1461052857806336f89af21461053d578063386a9525146105665780633b8105b31461056f57600080fd5b80631e090f01146104b957806328ef934e146104d95780632ca1a895146104ec57806331ca208c146104f557600080fd5b8063170feb76116103c4578063170feb761461047857806317b18c891461048b5780631b3e870a1461049e5780631c1f78eb146104b157600080fd5b80628cc262146103f55780630d7bac4f14610422578063144e8034146104435780631627540c14610463575b600080fd5b6104086104033660046130bc565b61092c565b604080519283526020830191909152015b60405180910390f35b6104356104303660046130d7565b610a4c565b604051908152602001610419565b6104356104513660046130bc565b60166020526000908152604090205481565b6104766104713660046130bc565b610aa5565b005b6104356104863660046130bc565b610b71565b6104766104993660046130f0565b610c56565b6104766104ac3660046130bc565b610c92565b610408610d53565b6104cc6104c73660046130bc565b610d84565b6040516104199190613112565b6104766104e7366004613180565b610e2b565b61043560115481565b6105186105033660046130bc565b60226020526000908152604090205460ff1681565b6040519015158152602001610419565b60235461051890640100000000900460ff1681565b61043561054b3660046130bc565b6001600160a01b03166000908152601d602052604090205490565b61043560135481565b610476610ef8565b610408610f5c565b610435600f5481565b6104766105963660046130d7565b610ff7565b6104766105a93660046130bc565b3360009081526021602090815260408083206001600160a01b0394909416835292905220805460ff19169055565b6001546105ea906001600160a01b031681565b6040516001600160a01b039091168152602001610419565b6023546105189060ff1681565b601b54610435565b6008546105ea906001600160a01b031681565b6104356106383660046130bc565b60196020526000908152604090205481565b6104766106583660046131b9565b61107f565b610435600d5481565b61047661122f565b610476611319565b6104766106843660046131e5565b61137b565b61069c6106973660046130bc565b6114b6565b60408051938452602084019290925290820152606001610419565b6000546105ea906001600160a01b031681565b6104766106d83660046130bc565b611666565b6104766106eb3660046130bc565b6116c7565b6023546105189062010000900460ff1681565b61051861071136600461320f565b602160209081526000928352604080842090915290825290205460ff1681565b61047661073f3660046130bc565b61172f565b61043560125481565b610476611791565b6104766107633660046130f0565b6117ed565b610435600c5481565b6023546105189065010000000000900460ff1681565b6104766107953660046130bc565b61193b565b6104356107a83660046130bc565b60186020526000908152604090205481565b610435600a5481565b6104766107d13660046130d7565b61199c565b610408611aaa565b610435600b5481565b610476611b39565b6104356107fd3660046130bc565b6001600160a01b03166000908152601c602052604090205490565b6007546105ea906001600160a01b031681565b610435611b99565b610476610841366004613250565b611ccb565b601a54610435565b610476611d65565b602354610518906301000000900460ff1681565b6104766108783660046131e5565b611dc3565b61043560095481565b610476611e8c565b61051861089c3660046130bc565b602080526000908152604090205460ff1681565b6104766108be3660046130bc565b611ef0565b6104356108d13660046130bc565b611f88565b6104356108e43660046130bc565b611fa1565b60235461051890610100900460ff1681565b6104356109093660046130bc565b60176020526000908152604090205481565b610435600e5481565b610476611fd4565b60008060008061093a611aaa565b6001600160a01b0387166000908152601d60205260409020549193509150610969575060009485945092505050565b6001600160a01b0385166000908152601860209081526040808320546016909252909120546109db91906109d590670de0b6b3a7640000906109cf906109b0908890612077565b6001600160a01b038b166000908152601d6020526040902054906120b9565b90612138565b90612011565b6001600160a01b038616600090815260196020908152604080832054601790925290912054610a4191906109d590670de0b6b3a7640000906109cf90610a22908890612077565b6001600160a01b038c166000908152601d6020526040902054906120b9565b935093505050915091565b600080610a8e610a7f600c546109cf610a78670de0b6b3a7640000600b5461207790919063ffffffff16565b87906120b9565b670de0b6b3a764000090612011565b9050600b54811115610a9f5750600b545b92915050565b6000546001600160a01b03163314610b1c5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b60648201526084015b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22906020015b60405180910390a150565b600080610b7d83611f88565b90508015610c4d576003546040516370a0823160e01b81526001600160a01b038581166004830152600092610c0f9285926109cf92670de0b6b3a7640000929116906370a0823190602401602060405180830381865afa158015610be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c099190613289565b906120b9565b90506000610c34670de0b6b3a76400006109cf600f54856120b990919063ffffffff16565b9050600f54811115610c455750600f545b949350505050565b50600092915050565b600280541415610c785760405162461bcd60e51b8152600401610b13906132a2565b60028055610c89338084844261217a565b50506001600255565b6000546001600160a01b0316331480610cb557506007546001600160a01b031633145b610cd15760405162461bcd60e51b8152600401610b13906132d9565b6001600160a01b038116600090815260208052604090205460ff161515600114610d335760405162461bcd60e51b81526020600482015260136024820152721059191c995cdcc81b9bdb995e1a5cdd185b9d606a1b6044820152606401610b13565b6001600160a01b031660009081526020805260409020805460ff19169055565b600080610d6d6013546011546120b990919063ffffffff16565b601354601254610d7c916120b9565b915091509091565b6001600160a01b0381166000908152601f60209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610e2057838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020019060010190610dbc565b505050509050919050565b60235460ff610100909104161515600114610e585760405162461bcd60e51b8152600401610b1390613308565b6001600160a01b038416600090815260216020908152604080832033845290915290205460ff168015610e99575033600090815260208052604090205460ff165b610ee55760405162461bcd60e51b815260206004820152601a60248201527f4d69672e20696e76616c6964206f7220756e617070726f7665640000000000006044820152606401610b13565b610ef2843385858561217a565b50505050565b6000546001600160a01b0316331480610f1b57506007546001600160a01b031633145b610f375760405162461bcd60e51b8152600401610b13906132d9565b6023805465ff0000000000198116650100000000009182900460ff1615909102179055565b600080600280541415610f815760405162461bcd60e51b8152600401610b13906132a2565b60028055602354640100000000900460ff1615610fe05760405162461bcd60e51b815260206004820152601960248201527f5265776172647320636f6c6c656374696f6e20706175736564000000000000006044820152606401610b13565b610fea3333612532565b9150915060016002559091565b6002805414156110195760405162461bcd60e51b8152600401610b13906132a2565b600280556023546301000000900460ff161561106c5760405162461bcd60e51b815260206004820152601260248201527115da5d1a191c985dd85b1cc81c185d5cd95960721b6044820152606401610b13565b611077333383612740565b506001600255565b6000546001600160a01b03163314806110a257506007546001600160a01b031633145b6110be5760405162461bcd60e51b8152600401610b13906132d9565b670de0b6b3a76400008310156111225760405162461bcd60e51b8152602060048201526024808201527f4d756c74206d757374206265203e3d204d554c5449504c4945525f505245434960448201526329a4a7a760e11b6064820152608401610b13565b600081116111725760405162461bcd60e51b815260206004820152601960248201527f7665433320706374206d6178206d757374206265203e3d2030000000000000006044820152606401610b13565b600b839055600f829055600e8190556040518281527f6b04d7611e06fe226eebfd39936d0c17ed4750a86ec9bd223924335d955288689060200160405180910390a17fa1676084a9eea08c6f205b60799323b364a1bd8e10aba89f0fbd94cfbf68b5dd600b546040516111e791815260200190565b60405180910390a17f5341dc8814a88b3b792bc9de97825af6a74034e43f5263d2ebc8407936723fe6600e5460405161122291815260200190565b60405180910390a1505050565b6001546001600160a01b031633146112a75760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610b13565b600054600154604080516001600160a01b0393841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031633148061133c57506007546001600160a01b031633145b6113585760405162461bcd60e51b8152600401610b13906132d9565b6023805464ff000000001981166401000000009182900460ff1615909102179055565b6000546001600160a01b031633148061139e57506007546001600160a01b031633145b6113ba5760405162461bcd60e51b8152600401610b13906132d9565b602354610100900460ff166113f7576006546001600160a01b03838116911614156113f75760405162461bcd60e51b8152600401610b1390613308565b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af115801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190613332565b50604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2891015b60405180910390a15050565b6001600160a01b0381166000908152601d602052604081205490806114da84610b71565b6001600160a01b0385166000908152601c60205260408120549193509015801561151a57506001600160a01b0385166000908152601d6020526040902054155b15611526575081611554565b6001600160a01b038516600090815260106020526040902054611551906002906109cf908690612011565b90505b6000915060005b6001600160a01b0386166000908152601f602052604090205481101561165d576001600160a01b0386166000908152601f602052604081208054839081106115a5576115a561334f565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600081608001519050428260600151116116115750670de0b6b3a76400005b60408201516000611638670de0b6b3a76400006109cf611631868a612011565b85906120b9565b90506116448782612011565b96505050505080806116559061337b565b91505061155b565b50509193909250565b6000546001600160a01b031633148061168957506007546001600160a01b031633145b6116a55760405162461bcd60e51b8152600401610b13906132d9565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806116ea57506007546001600160a01b031633145b6117065760405162461bcd60e51b8152600401610b13906132d9565b6001600160a01b03166000908152602260205260409020805460ff19811660ff90911615179055565b6000546001600160a01b031633148061175257506007546001600160a01b031633145b61176e5760405162461bcd60e51b8152600401610b13906132d9565b6001600160a01b031660009081526020805260409020805460ff19166001179055565b6000546001600160a01b03163314806117b457506007546001600160a01b031633145b6117d05760405162461bcd60e51b8152600401610b13906132d9565b6023805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b031633148061181057506007546001600160a01b031633145b61182c5760405162461bcd60e51b8152600401610b13906132d9565b600182101561187d5760405162461bcd60e51b815260206004820152601960248201527f4d756c206d61782074696d65206d757374206265203e3d2031000000000000006044820152606401610b13565b60018110156118ce5760405162461bcd60e51b815260206004820152601960248201527f4d756c206d696e2074696d65206d757374206265203e3d2031000000000000006044820152606401610b13565b600c829055600d8190556040518281527f0e3e3fae480c6f92291358a02bc83f04ee1971d5488596bffda7929d57ab470f9060200160405180910390a16040518181527f0534d208d75dfdbfacc1204745dd9b3c4c37e8cfc05eb5e8e3ae538aedb0a9fa906020016114aa565b6000546001600160a01b031633148061195e57506007546001600160a01b031633145b61197a5760405162461bcd60e51b8152600401610b13906132d9565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806119bf57506007546001600160a01b031633145b806119d457506008546001600160a01b031633145b611a195760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb716103a3635961037b91031ba39363960511b6044820152606401610b13565b6009541580611a29575060095442115b611a755760405162461bcd60e51b815260206004820152601860248201527f52657761726420706572696f6420696e636f6d706c65746500000000000000006044820152606401610b13565b60138190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d390602001610b66565b600080601a5460001480611abe5750601b54155b15611acf5750506014546015549091565b611b07611afe601b546109cf670de0b6b3a7640000610c09601154610c09600a54611af8612ac0565b90612077565b60145490612011565b610d7c611b30601b546109cf670de0b6b3a7640000610c09601254610c09600a54611af8612ac0565b60155490612011565b6000546001600160a01b0316331480611b5c57506007546001600160a01b031633145b611b785760405162461bcd60e51b8152600401610b13906132d9565b6023805463ff00000019811663010000009182900460ff1615909102179055565b6000806000806000600660009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1891906133ad565b50601e546001600160701b0392831694509116915060ff1615611c3d57819250611c41565b8092505b600654604080516318160ddd60e01b81529051611cc2926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb09190613289565b6109cf85670de0b6b3a76400006120b9565b95945050505050565b6000546001600160a01b0316331480611cee57506007546001600160a01b031633145b80611d0357506008546001600160a01b031633145b611d485760405162461bcd60e51b81526020600482015260166024820152752737ba1037bbb716103a3635961037b91031ba39363960511b6044820152606401610b13565b601183905560128290558015611d6057611d60611fd4565b505050565b6000546001600160a01b0316331480611d8857506007546001600160a01b031633145b611da45760405162461bcd60e51b8152600401610b13906132d9565b6023805462ff0000198116620100009182900460ff1615909102179055565b60235460ff610100909104161515600114611df05760405162461bcd60e51b8152600401610b1390613308565b6001600160a01b038216600090815260216020908152604080832033845290915290205460ff168015611e31575033600090815260208052604090205460ff165b611e7d5760405162461bcd60e51b815260206004820152601a60248201527f4d69672e20696e76616c6964206f7220756e617070726f7665640000000000006044820152606401610b13565b611e88823383612740565b5050565b6000546001600160a01b0316331480611eaf57506007546001600160a01b031633145b611ecb5760405162461bcd60e51b8152600401610b13906132d9565b60235460ff1615611edc5760006012555b6023805460ff19811660ff90911615179055565b6001600160a01b038116600090815260208052604090205460ff16611f575760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d69677261746f72206164647265737300000000000000006044820152606401610b13565b3360009081526021602090815260408083206001600160a01b0394909416835292905220805460ff19166001179055565b6000610a9f670de0b6b3a76400006109cf600e54610c09865b6001600160a01b0381166000908152601c6020526040812054610a9f90670de0b6b3a7640000906109cf90610c09611b99565b600954421115611fe857611fe6612ad3565b565b600080611ff3611aaa565b60148290556015819055909250905061200a612ac0565b600a555050565b60008061201e83856133f2565b9050838110156120705760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b13565b9392505050565b600061207083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612db1565b6000826120c857506000610a9f565b60006120d4838561340a565b9050826120e18583613429565b146120705760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b13565b600061207083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612de2565b8460016121878282612e10565b60235465010000000000900460ff1615806121b5575033600090815260208052604090205460ff1615156001145b6122015760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720706175736564206f7220696e206d6967726174696f6e00006044820152606401610b13565b600085116122515760405162461bcd60e51b815260206004820152601960248201527f4d757374207374616b65206d6f7265207468616e207a65726f000000000000006044820152606401610b13565b6001600160a01b03871660009081526022602052604090205460ff16156122ba5760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320686173206265656e20677265796c697374656400000000006044820152606401610b13565b600d5484101561230c5760405162461bcd60e51b815260206004820152601a60248201527f4d696e696d756d207374616b652074696d65206e6f74206d65740000000000006044820152606401610b13565b600c5484111561235e5760405162461bcd60e51b815260206004820152601b60248201527f547279696e6720746f206c6f636b20666f7220746f6f206c6f6e6700000000006044820152606401610b13565b600061236985610a4c565b6001600160a01b0389166000908152601c602090815260408083205490516bffffffffffffffffffffffff1960608e901b169281019290925260348201889052605482018a905260748201529192509060940160408051601f1981840301815282825280516020918201206001600160a01b038d166000908152601f835283902060a0850184528185529184018990529183018a90529092509060608101612411888a612011565b8152602090810185905282546001818101855560009485529382902083516005909202019081559082015192810192909255604081015160028301556060810151600383015560800151600490910155600654612479906001600160a01b031689308a612eff565b601a546124869088612011565b601a556001600160a01b0389166000908152601c60205260409020546124ac9088612011565b6001600160a01b038a166000908152601c60205260408120919091556124d3908a90612e10565b60408051888152602081018890529081018290526001600160a01b0389811660608301528a16907ff400e72e69ef4402819dfc57eeddc66f5eb69bf405e0e8098b1946ec1ac14a229060800160405180910390a2505050505050505050565b6000808360016125428282612e10565b6001600160a01b03861660009081526018602090815260408083205460199092529091205490945092508315612653576001600160a01b038681166000908152601860205260408082209190915560048054915163a9059cbb60e01b8152888416918101919091526024810187905291169063a9059cbb906044016020604051808303816000875af11580156125dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126009190613332565b50600454604080518681526001600160a01b039283166020820152878316818301529051918816917f1d2f2ca53af5d2f333bd32fdd45f9c52ad8ebe31414f7792912077fcb3876dff9181900360600190a25b8215612737576001600160a01b0386811660009081526019602052604080822091909155600554905163a9059cbb60e01b815287831660048201526024810186905291169063a9059cbb906044016020604051808303816000875af11580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e49190613332565b50600554604080518581526001600160a01b039283166020820152878316818301529051918816917f1d2f2ca53af5d2f333bd32fdd45f9c52ad8ebe31414f7792912077fcb3876dff9181900360600190a25b50509250929050565b61274a8383612532565b50506127816040518060a0016040528060008019168152602001600081526020016000815260200160008152602001600081525090565b600060408201819052805b6001600160a01b0386166000908152601f6020526040902054811015612880576001600160a01b0386166000908152601f602052604090208054829081106127d6576127d661334f565b90600052602060002090600502016000015484141561286e576001600160a01b0386166000908152601f602052604090208054829081106128195761281961334f565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509250809150612880565b806128788161337b565b91505061278c565b50815183146128c35760405162461bcd60e51b815260206004820152600f60248201526e14dd185ad9481b9bdd08199bdd5b99608a1b6044820152606401610b13565b8160600151421015806128e3575060235462010000900460ff1615156001145b80612901575033600090815260208052604090205460ff1615156001145b6129465760405162461bcd60e51b81526020600482015260166024820152755374616b65206973207374696c6c206c6f636b65642160501b6044820152606401610b13565b60408201518015612ab857601a5461295e9082612077565b601a556001600160a01b0386166000908152601c60205260409020546129849082612077565b6001600160a01b0387166000908152601c6020908152604080832093909355601f9052208054839081106129ba576129ba61334f565b6000918252602082206005909102018181556001810182905560028101829055600381018290556004018190556129f2908790612e10565b60065460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015612a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a699190613332565b5060408051828152602081018690526001600160a01b03878116828401529151918816917f1d9308f6b22a2754a1c622bb30889e8f8f956c83e524d039e9d65d5f052eb9089181900360600190a25b505050505050565b6000612ace42600954613027565b905090565b6009544211612b245760405162461bcd60e51b815260206004820152601b60248201527f506572696f6420686173206e6f742065787069726564207965742100000000006044820152606401610b13565b6000601354612b3e6009544261207790919063ffffffff16565b612b489190613429565b600480546040516370a0823160e01b815230928101929092529192506000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbb9190613289565b6005546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2d9190613289565b905081612c4d612c3e8560016133f2565b601354601154610c09916120b9565b1115612c9b5760405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f75676820433320617661696c61626c650000000000000000006044820152606401610b13565b60235460ff1615612d235780612cc4612cb58560016133f2565b601354601254610c09916120b9565b1115612d235760405162461bcd60e51b815260206004820152602860248201527f4e6f7420656e6f75676820746f6b656e3120617661696c61626c6520666f7220604482015267726577617264732160c01b6064820152608401610b13565b601354612d4290612d3990610c09866001612011565b60095490612011565b600955600080612d50611aaa565b601482905560158190559092509050612d67612ac0565b600a556006546040516001600160a01b0390911681527f6f2b3b3aaf1881d69a5d40565500f93ea73df36e7b6a29bf48b21479a9237fe99060200160405180910390a15050505050565b60008184841115612dd55760405162461bcd60e51b8152600401610b139190613477565b506000611cc284866134aa565b60008183612e035760405162461bcd60e51b8152600401610b139190613477565b506000611cc28486613429565b8015612e1e57612e1e611fd4565b6001600160a01b03821615611e88576000806000612e3b856114b6565b925092509250612e4a8561303d565b6001600160a01b0385166000908152601060205260409020829055828110612eb4576000612e788285612077565b601b54909150612e889082612011565b601b55612e958482612011565b6001600160a01b0387166000908152601d602052604090205550612ef8565b6000612ec08483612077565b601b54909150612ed09082612077565b601b55612edd8482612077565b6001600160a01b0387166000908152601d6020526040902055505b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612f6391906134c1565b6000604051808303816000865af19150503d8060008114612fa0576040519150601f19603f3d011682016040523d82523d6000602084013e612fa5565b606091505b5091509150818015612fcf575080511580612fcf575080806020019051810190612fcf9190613332565b612ab85760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610b13565b60008183106130365781612070565b5090919050565b6001600160a01b0381161561309d576000806130588361092c565b6001600160a01b038516600090815260186020908152604080832094909455601981528382209290925560145460168352838220556015546017909252919091205550505b50565b80356001600160a01b03811681146130b757600080fd5b919050565b6000602082840312156130ce57600080fd5b612070826130a0565b6000602082840312156130e957600080fd5b5035919050565b6000806040838503121561310357600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156131735781518051855286810151878601528581015186860152606080820151908601526080908101519085015260a0909301929085019060010161312f565b5091979650505050505050565b6000806000806080858703121561319657600080fd5b61319f856130a0565b966020860135965060408601359560600135945092505050565b6000806000606084860312156131ce57600080fd5b505081359360208301359350604090920135919050565b600080604083850312156131f857600080fd5b613201836130a0565b946020939093013593505050565b6000806040838503121561322257600080fd5b61322b836130a0565b9150613239602084016130a0565b90509250929050565b801515811461309d57600080fd5b60008060006060848603121561326557600080fd5b8335925060208401359150604084013561327e81613242565b809150509250925092565b60006020828403121561329b57600080fd5b5051919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601590820152744e6f74206f776e6572206f722074696d656c6f636b60581b604082015260600190565b60208082526010908201526f2737ba1034b71036b4b3b930ba34b7b760811b604082015260600190565b60006020828403121561334457600080fd5b815161207081613242565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561338f5761338f613365565b5060010190565b80516001600160701b03811681146130b757600080fd5b6000806000606084860312156133c257600080fd5b6133cb84613396565b92506133d960208501613396565b9150604084015163ffffffff8116811461327e57600080fd5b6000821982111561340557613405613365565b500190565b600081600019048311821515161561342457613424613365565b500290565b60008261344657634e487b7160e01b600052601260045260246000fd5b500490565b60005b8381101561346657818101518382015260200161344e565b83811115610ef25750506000910152565b602081526000825180602084015261349681604085016020870161344b565b601f01601f19169190910160400192915050565b6000828210156134bc576134bc613365565b500390565b600082516134d381846020870161344b565b919091019291505056fea26469706673582212201b89121ffe56d889a0a819888fcda1b9bae75a4c2138732f69d641496f4ea89264736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008c250a8128c76b25103174d0cf9dee4800ebfecd000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c60000000000000000000000004e78011ce80ee02d2c3e649fb657e458982578150000000000000000000000005400a05b8b45eaf9105315b4f2e31f806ab706de000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c60000000000000000000000009dca574b1b6bd51cbd02a3d98716597bd84c45eb0000000000000000000000006a88a0abb9be9f9050ff87753b84613f4e28361b
-----Decoded View---------------
Arg [0] : _owner (address): 0x8C250a8128c76B25103174d0Cf9dee4800EBfECd
Arg [1] : _rewardsToken0 (address): 0xad01DFfe604CDc172D8237566eE3a3ab6524d4C6
Arg [2] : _rewardsToken1 (address): 0x4e78011Ce80ee02d2c3e649Fb657E45898257815
Arg [3] : _stakingToken (address): 0x5400A05B8B45EaF9105315B4F2e31F806AB706dE
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] : 0000000000000000000000005400a05b8b45eaf9105315b4f2e31f806ab706de
Arg [4] : 000000000000000000000000ad01dffe604cdc172d8237566ee3a3ab6524d4c6
Arg [5] : 0000000000000000000000009dca574b1b6bd51cbd02a3d98716597bd84c45eb
Arg [6] : 0000000000000000000000006a88a0abb9be9f9050ff87753b84613f4e28361b
Deployed Bytecode Sourcemap
74889:472:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57825:541;;;;;;:::i;:::-;;:::i;:::-;;;;557:25:1;;;613:2;598:18;;591:34;;;;530:18;57825:541:0;;;;;;;;52902:450;;;;;;:::i;:::-;;:::i;:::-;;;967:25:1;;;955:2;940:18;52902:450:0;821:177:1;48236:58:0;;;;;;:::i;:::-;;;;;;;;;;;;;;398:141;;;;;;:::i;:::-;;:::i;:::-;;54398:900;;;;;;:::i;:::-;;:::i;61277:163::-;;;;;;:::i;:::-;;:::i;69907:261::-;;;;;;:::i;:::-;;:::i;58374:204::-;;;:::i;52761:133::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;68997:357::-;;;;;;:::i;:::-;;:::i;47959:26::-;;;;;;49127:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2833:14:1;;2826:22;2808:41;;2796:2;2781:18;49127:40:0;2668:187:1;49518:35:0;;;;;;;;;;;;52576:127;;;;;;:::i;:::-;-1:-1:-1;;;;;52669:26:0;52642:7;52669:26;;;:17;:26;;;;;;;52576:127;48049:39;;;;;;72858:96;;;:::i;65631:210::-;;;:::i;47788:50::-;;;;;;63400:194;;;;;;:::i;:::-;;:::i;60961:183::-;;;;;;:::i;:::-;61107:10;61082:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;61082:54:0;;;;;;;;;;61075:61;;-1:-1:-1;;61075:61:0;;;60961: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;49208:36:0;;;;;;;;;52410:111;52491:22;;52410:111;;47222:33;;;;;-1:-1:-1;;;;;47222:33:0;;;48416:43;;;;;;:::i;:::-;;;;;;;;;;;;;;71191:770;;;;;;:::i;:::-;;:::i;47573:36::-;;;;;;547:271;;;:::i;73078:126::-;;;:::i;70297:553::-;;;;;;:::i;:::-;;:::i;55306:1837::-;;;;;;:::i;:::-;;:::i;:::-;;;;4035:25:1;;;4091:2;4076:18;;4069:34;;;;4119:18;;;4112:34;4023:2;4008:18;55306:1837:0;3833:319:1;139:20:0;;;;;-1:-1:-1;;;;;139:20:0;;;73780:133;;;;;;:::i;:::-;;:::i;72514:126::-;;;;;;:::i;:::-;;:::i;49364:26::-;;;;;;;;;;;;49005:76;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;69737:128;;;;;;:::i;:::-;;:::i;47992:26::-;;;;;;72753:97;;;:::i;71969:537::-;;;;;;:::i;:::-;;:::i;47494:61::-;;;;;;49579:25;;;;;;;;;;;;73655:117;;;;;;:::i;:::-;;:::i;48366:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;47340:29;;;;;;70858:325;;;;;;:::i;:::-;;:::i;57151:666::-;;;:::i;47420:50::-;;;;;;72962:108;;;:::i;52108:128::-;;;;;;:::i;:::-;-1:-1:-1;;;;;52202:26:0;52175:7;52202:26;;;:17;:26;;;;;;;52108:128;47153:31;;;;;-1:-1:-1;;;;;47153:31:0;;;53501:539;;;:::i;73212:242::-;;;;;;:::i;:::-;;:::i;51942:113::-;52024:23;;51942:113;;72648:97;;;:::i;49463:29::-;;;;;;;;;;;;69390:298;;;;;;:::i;:::-;;:::i;47306:27::-;;;;;;73462:185;;;:::i;48894:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;60667:226;;;;;;:::i;:::-;;:::i;54209:181::-;;;;;;:::i;:::-;;:::i;54048:153::-;;;;;;:::i;:::-;;:::i;49251:24::-;;;;;;;;;;;;48301:58;;;;;;:::i;:::-;;;;;;;;;;;;;;47661:56;;;;;;68451:363;;;:::i;57825:541::-;57879:7;57888;57909:22;57933;57959:16;:14;:16::i;:::-;-1:-1:-1;;;;;57990:26:0;;;;;;:17;:26;;;;;;57908:67;;-1:-1:-1;57908:67:0;-1:-1:-1;57986:76:0;;-1:-1:-1;58045:1:0;;;;-1:-1:-1;57825:541:0;-1:-1:-1;;;57825:541:0:o;57986:76::-;-1:-1:-1;;;;;58195:17:0;;;;;;:8;:17;;;;;;;;;58145:23;:32;;;;;;;58094:119;;58195:17;58094:96;;58185:4;;58095:84;;58126:52;;:14;;:18;:52::i;:::-;-1:-1:-1;;;;;58095:26:0;;;;;;:17;:26;;;;;;;:30;:84::i;:::-;58094:90;;:96::i;:::-;:100;;:119::i;:::-;-1:-1:-1;;;;;58329:17:0;;;;;;:8;:17;;;;;;;;;58279:23;:32;;;;;;;58228:119;;58329:17;58228:96;;58319:4;;58229:84;;58260:52;;:14;;:18;:52::i;:::-;-1:-1:-1;;;;;58229:26:0;;;;;;:17;:26;;;;;;;:30;:84::i;58228:119::-;58072:286;;;;;;57825:541;;;:::o;52902:450::-;52961:7;52981:23;53020:200;53072:133;53176:28;;53072:77;53103:45;47116:4;53103:19;;:23;;:45;;;;:::i;:::-;53072:4;;:30;:77::i;:133::-;47116:4;;53020:33;:200::i;:::-;52981:239;;53253:19;;53235:15;:37;53231:80;;;-1:-1:-1;53292:19:0;;53231:80;53329:15;52902:450;-1:-1:-1;;52902: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;54398:900::-;54460:7;54633:33;54669:27;54688:7;54669:18;:27::i;:::-;54633:63;-1:-1:-1;54711:29:0;;54707:516;;54786:4;;:23;;-1:-1:-1;;;54786:23:0;;-1:-1:-1;;;;;3209:32:1;;;54786:23:0;;;3191:51:1;54756:26:0;;54785:82;;54841:25;;54785:51;;47116:4;;54786;;;:14;;3164:18:1;;54786:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54785:29;;:51::i;:82::-;54756:111;;54896:23;54922:73;47116:4;54923:45;54948:19;;54924:18;54923:24;;:45;;;;:::i;54922:73::-;54896:99;;55091:19;;55073:15;:37;55069:80;;;-1:-1:-1;55130:19:0;;55069:80;55173:15;54398:900;-1:-1:-1;;;;54398:900:0:o;54707:516::-;-1:-1:-1;55222:1:0;;54398:900;-1:-1:-1;;54398:900:0:o;61277:163::-;2798:1;3404:7;;:19;;3396:63;;;;-1:-1:-1;;;3396:63:0;;;;;;;:::i;:::-;2798:1;3537:18;;61362:70:::1;61375:10;::::0;61399:9;61410:4;61416:15:::1;61362:12;:70::i;:::-;-1:-1:-1::0;;2754:1:0;3716:7;:22;61277:163::o;69907:261::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69998:33:0;::::1;;::::0;;;:15:::1;:33:::0;;;;;;::::1;;:41;;:33:::0;:41:::1;69990:73;;;::::0;-1:-1:-1;;;69990:73:0;;6703:2:1;69990: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;;69990:73:0::1;6501:343:1::0;69990:73:0::1;-1:-1:-1::0;;;;;70127:33:0::1;;::::0;;;:15:::1;:33:::0;;;;;70120:40;;-1:-1:-1;;70120:40:0::1;::::0;;69907:261::o;58374:204::-;58429:7;58438;58480:32;58496:15;;58480:11;;:15;;:32;;;;:::i;:::-;58543:15;;58527:11;;:32;;:15;:32::i;:::-;58458:112;;;;58374:204;;:::o;52761:133::-;-1:-1:-1;;;;;52865:21:0;;;;;;:12;:21;;;;;;;;52858:28;;;;;;;;;;;;;;;;;52825:20;;52858:28;;52865:21;;52858:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52761:133;;;:::o;68997:357::-;50340:12;;;;;;;;:20;;:12;:20;50332:49;;;;-1:-1:-1;;;50332:49:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69150:40:0;::::1;;::::0;;;:24:::1;:40;::::0;;;;;;;69191:10:::1;69150:52:::0;;;;;;;;::::1;;:83:::0;::::1;;;-1:-1:-1::0;69222:10:0::1;69206:27;::::0;;;:15:::1;:27:::0;;;;;;::::1;;69150:83;69142:122;;;::::0;-1:-1:-1;;;69142:122:0;;7396:2:1;69142:122:0::1;::::0;::::1;7378:21:1::0;7435:2;7415:18;;;7408:30;7474:28;7454:18;;;7447:56;7520:18;;69142:122:0::1;7194:350:1::0;69142:122:0::1;69275:71;69288:14;69304:10;69316:6;69324:4;69330:15;69275:12;:71::i;:::-;68997:357:::0;;;;:::o;72858:96::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;72933:13:::1;::::0;;-1:-1:-1;;72916:30:0;::::1;72933:13:::0;;;;::::1;;;72932:14;72916:30:::0;;::::1;;::::0;;72858:96::o;65631:210::-;65683:7;65692;2798:1;3404:7;;:19;;3396:63;;;;-1:-1:-1;;;3396:63:0;;;;;;;:::i;:::-;2798:1;3537:18;;65720:23:::1;::::0;;;::::1;;;:32;65712:69;;;::::0;-1:-1:-1;;;65712:69:0;;7751:2:1;65712:69:0::1;::::0;::::1;7733:21:1::0;7790:2;7770:18;;;7763:30;7829:27;7809:18;;;7802:55;7874:18;;65712:69:0::1;7549:349:1::0;65712:69:0::1;65799:34;65810:10;65822;65799;:34::i;:::-;65792:41;;;;2754:1:::0;3716:7;:22;65631:210;;:::o;63400:194::-;2798:1;3404:7;;:19;;3396:63;;;;-1:-1:-1;;;3396:63:0;;;;;;;:::i;:::-;2798:1;3537:18;;63479:17:::1;::::0;;;::::1;;;:26;63471:57;;;::::0;-1:-1:-1;;;63471:57:0;;8105:2:1;63471: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;;63471:57:0::1;7903:342:1::0;63471:57:0::1;63539:47;63555:10;63567;63579:6;63539:15;:47::i;:::-;-1:-1:-1::0;2754:1:0;3716:7;:22;63400:194::o;71191:770::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;47116:4:::1;71352:20;:44;;71344:93;;;::::0;-1:-1:-1;;;71344:93:0;;8452:2:1;71344: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;;71344:93:0::1;8250:400:1::0;71344:93:0::1;71555:1;71526:26;:30;71518:68;;;::::0;-1:-1:-1;;;71518:68:0;;9207:2:1;71518:68:0::1;::::0;::::1;9189:21:1::0;9246:2;9226:18;;;9219:30;9285:27;9265:18;;;9258:55;9330:18;;71518:68:0::1;9005:349:1::0;71518:68:0::1;71599:19;:42:::0;;;71652:19:::1;:42:::0;;;71705:25:::1;:54:::0;;;71777:38:::1;::::0;967:25:1;;;71777:38:0::1;::::0;955:2:1;940:18;71777:38:0::1;;;;;;;71831:52;71863:19;;71831:52;;;;967:25:1::0;;955:2;940:18;;821:177;71831:52:0::1;;;;;;;;71899:54;71927:25;;71899:54;;;;967:25:1::0;;955:2;940:18;;821:177;71899:54:0::1;;;;;;;;71191: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;73078:126::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;73173:23:::1;::::0;;-1:-1:-1;;73146:50:0;::::1;73173:23:::0;;;;::::1;;;73172:24;73146:50:::0;;::::1;;::::0;;73078:126::o;70297:553::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;70496:12:::1;::::0;::::1;::::0;::::1;;;70492:164;;70556:12;::::0;-1:-1:-1;;;;;70532:37:0;;::::1;70556:12:::0;::::1;70532:37;;70524:66;;;;-1:-1:-1::0;;;70524:66:0::1;;;;;;;:::i;:::-;70771:5;::::0;70742:48:::1;::::0;-1:-1:-1;;;70742:48:0;;-1:-1:-1;;;;;70771:5:0;;::::1;70742:48;::::0;::::1;10264:51:1::0;10331:18;;;10324:34;;;70742:28:0;;::::1;::::0;::::1;::::0;10237:18:1;;70742:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;70806:36:0::1;::::0;;-1:-1:-1;;;;;10282:32:1;;10264:51;;10346:2;10331:18;;10324:34;;;70806:36:0::1;::::0;10237:18:1;70806:36:0::1;;;;;;;;70297:553:::0;;:::o;55306:1837::-;-1:-1:-1;;;;;55599:26:0;;55398:27;55599:26;;;:17;:26;;;;;;;55398:27;55784:23;55617:7;55784:14;:23::i;:::-;-1:-1:-1;;;;;55875:26:0;;55828:32;55875:26;;;:17;:26;;;;;;55762:45;;-1:-1:-1;55828:32:0;55875:31;:66;;;;-1:-1:-1;;;;;;55910:26:0;;;;;;:17;:26;;;;;;:31;55875:66;55871:388;;;-1:-1:-1;56093:19:0;55871:388;;;-1:-1:-1;;;;;56208:30:0;;;;;;:21;:30;;;;;;56181:66;;56245:1;;56182:57;;56183:19;;56182:25;:57::i;56181:66::-;56154:93;;55871:388;56394:1;56372:23;;56411:9;56406:730;-1:-1:-1;;;;;56430:21:0;;;;;;:12;:21;;;;;:28;56426:32;;56406:730;;;-1:-1:-1;;;;;56511:21:0;;56480:28;56511:21;;;:12;:21;;;;;:24;;56533:1;;56511:24;;;;;;:::i;:::-;;;;;;;;;;;56480:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56550:23;56576:9;:25;;;56550:51;;56760:15;56730:9;:26;;;:45;56726:123;;-1:-1:-1;47116:4:0;56726:123;56885:19;;;;56865:17;56953:86;47116:4;56953:60;56967:45;:15;56987:24;56967:19;:45::i;:::-;56953:9;;:13;:60::i;:86::-;56919:120;-1:-1:-1;57076:48:0;:19;56919:120;57076:23;:48::i;:::-;57054:70;;56465:671;;;;56460:3;;;;;:::i;:::-;;;;56406:730;;;;55526:1617;55306:1837;;;;;:::o;73780:133::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;73865:18:::1;:40:::0;;-1:-1:-1;;;;;;73865:40:0::1;-1:-1:-1::0;;;;;73865:40:0;;;::::1;::::0;;;::::1;::::0;;73780:133::o;72514:126::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72613:18:0::1;;::::0;;;:8:::1;:18;::::0;;;;;;-1:-1:-1;;72590:42:0;::::1;72613:18;::::0;;::::1;72611:21;72590:42;::::0;;72514:126::o;69737:128::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69817:33:0::1;;::::0;;;:15:::1;:33:::0;;;;;:40;;-1:-1:-1;;69817:40:0::1;69853:4;69817:40;::::0;;69737:128::o;72753:97::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;72830:12:::1;::::0;;-1:-1:-1;;72814:28:0;::::1;72830:12;::::0;;;::::1;;;72829:13;72814:28:::0;;::::1;;::::0;;72753:97::o;71969:537::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;72156:1:::1;72123:29;:34;;72115:72;;;::::0;-1:-1:-1;;;72115:72:0;;11225:2:1;72115:72:0::1;::::0;::::1;11207:21:1::0;11264:2;11244:18;;;11237:30;11303:27;11283:18;;;11276:55;11348:18;;72115:72:0::1;11023:349:1::0;72115:72:0::1;72224:1;72206:14;:19;;72198:57;;;::::0;-1:-1:-1;;;72198:57:0;;11579:2:1;72198:57:0::1;::::0;::::1;11561:21:1::0;11618:2;11598:18;;;11591:30;11657:27;11637:18;;;11630:55;11702:18;;72198:57:0::1;11377:349:1::0;72198:57:0::1;72268:28;:60:::0;;;72339:13:::1;:30:::0;;;72387:61:::1;::::0;967:25:1;;;72387:61:0::1;::::0;955:2:1;940:18;72387:61:0::1;;;;;;;72464:34;::::0;967:25:1;;;72464:34:0::1;::::0;955:2:1;940:18;72464:34:0::1;821:177:1::0;73655:117:0;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;73732:16:::1;:32:::0;;-1:-1:-1;;;;;;73732:32:0::1;-1:-1:-1::0;;;;;73732:32:0;;;::::1;::::0;;;::::1;::::0;;73655:117::o;70858:325::-;50168:5;;-1:-1:-1;;;;;50168:5:0;50154:10;:19;;:53;;-1:-1:-1;50191:16:0;;-1:-1:-1;;;;;50191:16:0;50177:10;:30;50154:53;:89;;;-1:-1:-1;50225:18:0;;-1:-1:-1;;;;;50225:18:0;50211:10;:32;50154:89;50146:124;;;;-1:-1:-1;;;50146:124:0;;11933:2:1;50146:124:0;;;11915:21:1;11972:2;11952:18;;;11945:30;-1:-1:-1;;;11991:18:1;;;11984:52;12053:18;;50146:124:0;11731:346:1;50146:124:0;70972:12:::1;::::0;:17;;:51:::1;;;71011:12;;70993:15;:30;70972:51;70950:125;;;::::0;-1:-1:-1;;;70950:125:0;;12284:2:1;70950:125:0::1;::::0;::::1;12266:21:1::0;12323:2;12303:18;;;12296:30;12362:26;12342:18;;;12335:54;12406:18;;70950:125:0::1;12082:348:1::0;70950:125:0::1;71086:15;:34:::0;;;71136:39:::1;::::0;967:25:1;;;71136:39:0::1;::::0;955:2:1;940:18;71136:39:0::1;821:177:1::0;57151:666:0;57198:7;57207;57231:23;;57258:1;57231:28;:59;;;-1:-1:-1;57263:22:0;;:27;57231:59;57227:583;;;-1:-1:-1;;57315:21:0;;57338;;57315;;57151:666::o;57227:583::-;57428:168;57476:101;57554:22;;57476:73;57544:4;57476:63;57527:11;;57476:46;57507:14;;57476:26;:24;:26::i;:::-;:30;;:46::i;:101::-;57428:21;;;:25;:168::i;:::-;57615;57663:101;57741:22;;57663:73;57731:4;57663:63;57714:11;;57663:46;57694:14;;57663:26;:24;:26::i;:101::-;57615:21;;;:25;:168::i;72962:108::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;73045:17:::1;::::0;;-1:-1:-1;;73024:38:0;::::1;73045:17:::0;;;;::::1;;;73044:18;73024:38:::0;;::::1;;::::0;;72962:108::o;53501:539::-;53546:7;53627:23;53676:25;53717:16;53735;53758:12;;;;;;;;;-1:-1:-1;;;;;53758:12:0;-1:-1:-1;;;;;53758:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53804:12:0;;-1:-1:-1;;;;;53716:69:0;;;;-1:-1:-1;53716:69:0;;;-1:-1:-1;53804:12:0;;53800:94;;;53838:8;53818:28;;53800:94;;;53886:8;53866:28;;53800:94;53961:12;;:26;;;-1:-1:-1;;;53961:26:0;;;;53929:59;;-1:-1:-1;;;;;53961:12:0;;:24;;:26;;;;;;;;;;;;;;:12;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53929:27;:17;53951:4;53929:21;:27::i;:59::-;53911:77;53501:539;-1:-1:-1;;;;;53501:539:0:o;73212:242::-;50168:5;;-1:-1:-1;;;;;50168:5:0;50154:10;:19;;:53;;-1:-1:-1;50191:16:0;;-1:-1:-1;;;;;50191:16:0;50177:10;:30;50154:53;:89;;;-1:-1:-1;50225:18:0;;-1:-1:-1;;;;;50225:18:0;50211:10;:32;50154:89;50146:124;;;;-1:-1:-1;;;50146:124:0;;11933:2:1;50146:124:0;;;11915:21:1;11972:2;11952:18;;;11945:30;-1:-1:-1;;;11991:18:1;;;11984:52;12053:18;;50146:124:0;11731:346:1;50146:124:0;73329:11:::1;:24:::0;;;73364:11:::1;:24:::0;;;73401:46;::::1;;;73429:6;:4;:6::i;:::-;73212:242:::0;;;:::o;72648:97::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;72723:14:::1;::::0;;-1:-1:-1;;72705:32:0;::::1;72723:14:::0;;;;::::1;;;72722:15;72705:32:::0;;::::1;;::::0;;72648:97::o;69390:298::-;50340:12;;;;;;;;:20;;:12;:20;50332:49;;;;-1:-1:-1;;;50332:49:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69504:40:0;::::1;;::::0;;;:24:::1;:40;::::0;;;;;;;69545:10:::1;69504:52:::0;;;;;;;;::::1;;:83:::0;::::1;;;-1:-1:-1::0;69576:10:0::1;69560:27;::::0;;;:15:::1;:27:::0;;;;;;::::1;;69504:83;69496:122;;;::::0;-1:-1:-1;;;69496:122:0;;7396:2:1;69496:122:0::1;::::0;::::1;7378:21:1::0;7435:2;7415:18;;;7408:30;7474:28;7454:18;;;7447:56;7520:18;;69496:122:0::1;7194:350:1::0;69496:122:0::1;69629:51;69645:14;69661:10;69673:6;69629:15;:51::i;:::-;69390:298:::0;;:::o;73462:185::-;50013:5;;-1:-1:-1;;;;;50013:5:0;49999:10;:19;;:53;;-1:-1:-1;50036:16:0;;-1:-1:-1;;;;;50036:16:0;50022:10;:30;49999:53;49991:87;;;;-1:-1:-1;;;49991:87:0;;;;;;;:::i;:::-;73530:17:::1;::::0;::::1;;73526:65;;;73578:1;73564:11;:15:::0;73526:65:::1;73622:17;::::0;;-1:-1:-1;;73601:38:0;::::1;73622:17;::::0;;::::1;73621:18;73601:38;::::0;;73462:185::o;60667:226::-;-1:-1:-1;;;;;60750:33:0;;;;;;:15;:33;;;;;;;;60742:70;;;;-1:-1:-1;;;60742:70:0;;13285:2:1;60742:70:0;;;13267:21:1;13324:2;13304:18;;;13297:30;13363:26;13343:18;;;13336:54;13407:18;;60742:70:0;13083:348:1;60742:70:0;60848:10;60823:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;60823:54:0;;;;;;;;;;:61;;-1:-1:-1;;60823:61:0;60880:4;60823:61;;;60667:226::o;54209:181::-;54275:7;54302:80;47116:4;54302:54;54330:25;;54303:21;54316:7;54048:153;-1:-1:-1;;;;;54156:26:0;;54108:7;54156:26;;;:17;:26;;;;;;54135:58;;54188:4;;54135:48;;54136:14;:12;:14::i;68451:363::-;68507:12;;68489:15;:30;68485:322;;;68536:14;:12;:14::i;:::-;68451:363::o;68485:322::-;68593:15;68610;68629:16;:14;:16::i;:::-;68660:21;:31;;;68706:21;:31;;;68592:53;;-1:-1:-1;68592:53:0;-1:-1:-1;68769:26:0;:24;:26::i;:::-;68752:14;:43;-1:-1:-1;;68451: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;;13771:2:1;21075:46:0;;;13753:21:1;13810:2;13790:18;;;13783:30;13849:29;13829:18;;;13822:57;13896:18;;21075:46:0;13569: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;;14522:2:1;22727:56:0;;;14504:21:1;14561:2;14541:18;;;14534:30;14600:34;14580:18;;;14573:62;-1:-1:-1;;;14651:18:1;;;14644:31;14692:19;;22727:56:0;14320:397:1;23280:132:0;23338:7;23365:39;23369:1;23372;23365:39;;;;;;;;;;;;;;;;;:3;:39::i;61636:1626::-;61851:14;61867:4;50600:42;50624:7;50633:8;50600:23;:42::i;:::-;61893:13:::1;::::0;;;::::1;;;61892:14;::::0;:53:::1;;-1:-1:-1::0;61926:10:0::1;61910:27;::::0;;;:15:::1;:27:::0;;;;;;::::1;;:35;;:27:::0;:35:::1;61892:53;61884:96;;;::::0;-1:-1:-1;;;61884:96:0;;14924:2:1;61884:96:0::1;::::0;::::1;14906:21:1::0;14963:2;14943:18;;;14936:30;15002:32;14982:18;;;14975:60;15052:18;;61884:96:0::1;14722:354:1::0;61884:96:0::1;62011:1;61999:9;:13;61991:51;;;::::0;-1:-1:-1;;;61991:51:0;;15283:2:1;61991:51:0::1;::::0;::::1;15265:21:1::0;15322:2;15302:18;;;15295:30;15361:27;15341:18;;;15334:55;15406:18;;61991:51:0::1;15081:349:1::0;61991:51:0::1;-1:-1:-1::0;;;;;62061:24:0;::::1;;::::0;;;:8:::1;:24;::::0;;;;;::::1;;:33;62053:73;;;::::0;-1:-1:-1;;;62053:73:0;;15637:2:1;62053:73:0::1;::::0;::::1;15619:21:1::0;15676:2;15656:18;;;15649:30;15715:29;15695:18;;;15688:57;15762:18;;62053:73:0::1;15435:351:1::0;62053:73:0::1;62153:13;;62145:4;:21;;62137:60;;;::::0;-1:-1:-1;;;62137:60:0;;15993:2:1;62137:60:0::1;::::0;::::1;15975:21:1::0;16032:2;16012:18;;;16005:30;16071:28;16051:18;;;16044:56;16117:18;;62137:60:0::1;15791:350:1::0;62137:60:0::1;62224:28;;62216:4;:36;;62208:75;;;::::0;-1:-1:-1;;;62208:75:0;;16348:2:1;62208:75:0::1;::::0;::::1;16330:21:1::0;16387:2;16367:18;;;16360:30;16426:29;16406:18;;;16399:57;16473:18;;62208:75:0::1;16146:351:1::0;62208:75:0::1;62296:23;62322:20;62337:4;62322:14;:20::i;:::-;-1:-1:-1::0;;;;;62441:33:0;::::1;62353:14;62441:33:::0;;;:17:::1;:33;::::0;;;;;;;;62380:95;;-1:-1:-1;;16735:2:1;16731:15;;;16727:53;62380:95:0;;::::1;16715:66:1::0;;;;16797:12;;;16790:28;;;16834:12;;;16827:28;;;16871:12;;;16864:28;62296:46:0;;-1:-1:-1;62353:14:0;16908:13:1;;62380:95:0::1;::::0;;-1:-1:-1;;62380:95:0;;::::1;::::0;;;;;;62370:106;;62380:95:::1;62370:106:::0;;::::1;::::0;-1:-1:-1;;;;;62487:28:0;::::1;;::::0;;;:12:::1;:28:::0;;;;;62521:167:::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;62370:106;;-1:-1:-1;62487:28:0;62521:167;;;62622:25:::1;62568:15:::0;62642:4;62622:19:::1;:25::i;:::-;62521:167:::0;;::::1;::::0;;::::1;::::0;;;62487:202;;::::1;::::0;;::::1;::::0;;-1:-1:-1;62487: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;62794:12:::1;::::0;62754:96:::1;::::0;-1:-1:-1;;;;;62794:12:0::1;62809:14:::0;62833:4:::1;62840:9:::0;62754:31:::1;:96::i;:::-;62920:23;::::0;:38:::1;::::0;62948:9;62920:27:::1;:38::i;:::-;62894:23;:64:::0;-1:-1:-1;;;;;63005:33:0;::::1;;::::0;;;:17:::1;:33;::::0;;;;;:48:::1;::::0;63043:9;63005:37:::1;:48::i;:::-;-1:-1:-1::0;;;;;62969:33:0;::::1;;::::0;;;:17:::1;:33;::::0;;;;:84;;;;63122:46:::1;::::0;62987:14;;63122:23:::1;:46::i;:::-;63186:68;::::0;;17163:25:1;;;17219:2;17204:18;;17197:34;;;17247:18;;;17240:34;;;-1:-1:-1;;;;;17310:32:1;;;17305:2;17290:18;;17283:60;63186:68:0;::::1;::::0;::::1;::::0;17150:3:1;17135:19;63186:68:0::1;;;;;;;61873:1389;;61636:1626:::0;;;;;;;:::o;65992:790::-;66116:15;66133;66091:8;66101:4;50600:42;50624:7;50633:8;50600:23;:42::i;:::-;-1:-1:-1;;;;;66171:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;;;66210:8:::1;:18:::0;;;;;;;66171;;-1:-1:-1;66210:18:0;-1:-1:-1;66243:11:0;;66239:227:::1;;-1:-1:-1::0;;;;;66271:18:0;;::::1;66292:1;66271:18:::0;;;:8:::1;:18;::::0;;;;;:22;;;;66308:13:::1;::::0;;:52;;-1:-1:-1;;;66308:52:0;;10282:32:1;;;66308:52:0;;::::1;10264:51:1::0;;;;10331:18;;;10324:34;;;66308:13:0;::::1;::::0;:22:::1;::::0;10237:18:1;;66308:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;66418:13:0::1;::::0;66380:74:::1;::::0;;17556:25:1;;;-1:-1:-1;;;;;66418:13:0;;::::1;17650:2:1::0;17635:18;;17628:43;17707:15;;;17687:18;;;17680:43;66380:74:0;;;;::::1;::::0;::::1;::::0;;;;17544:2:1;66380:74:0;;::::1;66239:227;66520:11:::0;;66516:243:::1;;-1:-1:-1::0;;;;;66552:18:0;;::::1;66573:1;66552:18:::0;;;:8:::1;:18;::::0;;;;;:22;;;;66593:13:::1;::::0;:52;;-1:-1:-1;;;66593:52:0;;10282:32:1;;;66593:52:0::1;::::0;::::1;10264:51:1::0;10331:18;;;10324:34;;;66593:13:0;::::1;::::0;:22:::1;::::0;10237:18:1;;66593:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;66707:13:0::1;::::0;66669:74:::1;::::0;;17556:25:1;;;-1:-1:-1;;;;;66707:13:0;;::::1;17650:2:1::0;17635:18;;17628:43;17707:15;;;17687:18;;;17680:43;66669:74:0;;;;::::1;::::0;::::1;::::0;;;;17544:2:1;66669:74:0;;::::1;66516:243;65992:790:::0;;;;;;;:::o;63824:1670::-;64002:47;64013:14;64029:19;64002:10;:47::i;:::-;;;64062:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64062:28:0;64123:1;64101:19;;;:23;;;64123:1;64164:280;-1:-1:-1;;;;;64185:28:0;;;;;;:12;:28;;;;;:35;64181:39;;64164:280;;;-1:-1:-1;;;;;64256:28:0;;;;;;:12;:28;;;;;:31;;64285:1;;64256:31;;;;;;:::i;:::-;;;;;;;;;;;:38;;;64246:6;:48;64242:191;;;-1:-1:-1;;;;;64326:28:0;;;;;;:12;:28;;;;;:31;;64355:1;;64326:31;;;;;;:::i;:::-;;;;;;;;;;;64314:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64392:1;64376:17;;64412:5;;64242:191;64222:3;;;;:::i;:::-;;;;64164:280;;;-1:-1:-1;64462:16:0;;:26;;64454:54;;;;-1:-1:-1;;;64454:54:0;;17936:2:1;64454:54:0;;;17918:21:1;17975:2;17955:18;;;17948:30;-1:-1:-1;;;17994:18:1;;;17987:45;18049:18;;64454:54:0;17734:339:1;64454:54:0;64546:9;:26;;;64527:15;:45;;:71;;;-1:-1:-1;64576:14:0;;;;;;;:22;;64594:4;64576:22;64527:71;:110;;;-1:-1:-1;64618:10:0;64602:27;;;;:15;:27;;;;;;;;:35;;:27;:35;64527:110;64519:145;;;;-1:-1:-1;;;64519:145:0;;18280:2:1;64519:145:0;;;18262:21:1;18319:2;18299:18;;;18292:30;-1:-1:-1;;;18338:18:1;;;18331:52;18400:18;;64519:145:0;18078:346:1;64519:145:0;64697:19;;;;64733:13;;64729:756;;64824:23;;:38;;64852:9;64824:27;:38::i;:::-;64798:23;:64;-1:-1:-1;;;;;64913:33:0;;;;;;:17;:33;;;;;;:48;;64951:9;64913:37;:48::i;:::-;-1:-1:-1;;;;;64877:33:0;;;;;;:17;:33;;;;;;;;:84;;;;65033:12;:28;;;:43;;65062:13;;65033:43;;;;;;:::i;:::-;;;;;;;;;;;;;65026:50;;;;;;;;;;;;;;;;;;;;;;;;;;65153:46;;65177:14;;65153:23;:46::i;:::-;65328:12;;:53;;-1:-1:-1;;;65328:53:0;;-1:-1:-1;;;;;10282:32:1;;;65328:53:0;;;10264:51:1;10331:18;;;10324:34;;;65328:12:0;;;;:21;;10237:18:1;;65328:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;65403:70:0;;;18631:25:1;;;18687:2;18672:18;;18665:34;;;-1:-1:-1;;;;;18735:32:1;;;18715:18;;;18708:60;65403:70:0;;;;;;;;;;;18619:2:1;65403:70:0;;;64729:756;63928:1566;;;63824:1670;;;:::o;53360:133::-;53419:7;53446:39;53455:15;53472:12;;53446:8;:39::i;:::-;53439:46;;53360:133;:::o;66830:1613::-;66927:12;;66909:15;:30;66901:70;;;;-1:-1:-1;;;66901:70:0;;18981:2:1;66901:70:0;;;18963:21:1;19020:2;19000:18;;;18993:30;19059:29;19039:18;;;19032:57;19106:18;;66901:70:0;18779:351:1;66901:70:0;67332:27;67407:15;;67370:33;67390:12;;67370:15;:19;;:33;;;;:::i;:::-;67362:60;;;;:::i;:::-;67489:13;;;:38;;-1:-1:-1;;;67489:38:0;;67521:4;67489:38;;;3191:51:1;;;;67332:90:0;;-1:-1:-1;67473:13:0;;-1:-1:-1;;;;;67489:13:0;;:23;;3164:18:1;;67489:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67554:13;;:38;;-1:-1:-1;;;67554:38:0;;67586:4;67554:38;;;3191:51:1;67473:54:0;;-1:-1:-1;67538:13:0;;-1:-1:-1;;;;;67554:13:0;;;;:23;;3164:18:1;;67554:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67538:54;-1:-1:-1;67676:8:0;67611:61;67648:23;:19;67670:1;67648:23;:::i;:::-;67627:15;;67611:11;;:32;;:15;:32::i;:61::-;:73;;67603:109;;;;-1:-1:-1;;;67603:109:0;;19337:2:1;67603:109:0;;;19319:21:1;19376:2;19356:18;;;19349:30;19415:25;19395:18;;;19388:53;19458:18;;67603:109:0;19135:347:1;67603:109:0;67737:17;;;;67733:175;;;67843:8;67778:61;67815:23;:19;67837:1;67815:23;:::i;:::-;67794:15;;67778:11;;:32;;:15;:32::i;:61::-;:73;;67770:126;;;;-1:-1:-1;;;67770:126:0;;19689:2:1;67770:126:0;;;19671:21:1;19728:2;19708:18;;;19701:30;19767:34;19747:18;;;19740:62;-1:-1:-1;;;19818:18:1;;;19811:38;19866:19;;67770:126:0;19487:404:1;67770:126:0;68153:15;;68103:67;;68120:49;;68121:26;:19;68145:1;68121:23;:26::i;68120:49::-;68103:12;;;:16;:67::i;:::-;68088:12;:82;68184:15;;68220:16;:14;:16::i;:::-;68247:21;:31;;;68289:21;:31;;;68183:53;;-1:-1:-1;68183:53:0;-1:-1:-1;68348:26:0;:24;:26::i;:::-;68331:14;:43;68421:12;;68392:43;;-1:-1:-1;;;;;68421:12:0;;;3191:51:1;;68392:43:0;;3179:2:1;3164:18;68392:43:0;;;;;;;66863:1580;;;;;66830: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;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;58640:1538::-;58830:8;58826:46;;;58854:6;:4;:6::i;:::-;-1:-1:-1;;;;;58896:21:0;;;58892:1279;;59109:27;59155;59201;59246:30;59268:7;59246:21;:30::i;:::-;59087:189;;;;;;59338:20;59350:7;59338:11;:20::i;:::-;-1:-1:-1;;;;;59433:30:0;;;;;;:21;:30;;;;;:52;;;59572:42;;;59568:590;;59635:19;59657:44;:19;59681;59657:23;:44::i;:::-;59745:22;;59635:66;;-1:-1:-1;59745:39:0;;59635:66;59745:26;:39::i;:::-;59720:22;:64;59832:36;:19;59856:11;59832:23;:36::i;:::-;-1:-1:-1;;;;;59803:26:0;;;;;;:17;:26;;;;;:65;-1:-1:-1;59568:590:0;;;59909:19;59931:44;:19;59955;59931:23;:44::i;:::-;60019:22;;59909:66;;-1:-1:-1;60019:39:0;;59909:66;60019:26;:39::i;:::-;59994:22;:64;60106:36;:19;60130:11;60106:23;:36::i;:::-;-1:-1:-1;;;;;60077:26:0;;;;;;:17;:26;;;;;:65;-1:-1:-1;59568:590:0;58919:1252;;;58640:1538;;:::o;7279:402::-;7504:51;;;-1:-1:-1;;;;;20935:15:1;;;7504:51:0;;;20917:34:1;20987:15;;;20967:18;;;20960:43;21019:18;;;;21012:34;;;7504:51:0;;;;;;;;;;20852: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;;21538:2:1;7567:106:0;;;21520:21:1;21577:2;21557:18;;;21550:30;21616:34;21596:18;;;21589:62;-1:-1:-1;;;21667:18:1;;;21660:34;21711:19;;7567:106:0;21336: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;60186:436::-;-1:-1:-1;;;;;60248:21:0;;;60244:371;;60326:15;60343;60362;60369:7;60362:6;:15::i;:::-;-1:-1:-1;;;;;60392:17:0;;;;;;:8;:17;;;;;;;;:27;;;;60434:8;:17;;;;;:27;;;;60511:21;;60476:23;:32;;;;;:56;60582:21;;60547:23;:32;;;;;;;:56;-1:-1:-1;;60244:371:0;60186: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;12435:188::-;12514:13;;-1:-1:-1;;;;;12556:42:1;;12546:53;;12536:81;;12613:1;12610;12603:12;12628:450;12715:6;12723;12731;12784:2;12772:9;12763:7;12759:23;12755:32;12752:52;;;12800:1;12797;12790:12;12752:52;12823:40;12853:9;12823:40;:::i;:::-;12813:50;;12882:49;12927:2;12916:9;12912:18;12882:49;:::i;:::-;12872:59;;12974:2;12963:9;12959:18;12953:25;13018:10;13011:5;13007:22;13000:5;12997:33;12987:61;;13044:1;13041;13034:12;13436:128;13476:3;13507:1;13503:6;13500:1;13497:13;13494:39;;;13513:18;;:::i;:::-;-1:-1:-1;13549:9:1;;13436:128::o;13925:168::-;13965:7;14031:1;14027;14023:6;14019:14;14016:1;14013:21;14008:1;14001:9;13994:17;13990:45;13987:71;;;14038:18;;:::i;:::-;-1:-1:-1;14078:9:1;;13925:168::o;14098:217::-;14138:1;14164;14154:132;;14208:10;14203:3;14199:20;14196:1;14189:31;14243:4;14240:1;14233:15;14271:4;14268:1;14261:15;14154:132;-1:-1:-1;14300:9:1;;14098:217::o;19896:258::-;19968:1;19978:113;19992:6;19989:1;19986:13;19978:113;;;20068:11;;;20062:18;20049:11;;;20042:39;20014:2;20007:10;19978:113;;;20109:6;20106:1;20103:13;20100:48;;;-1:-1:-1;;20144:1:1;20126:16;;20119:27;19896:258::o;20159:383::-;20308:2;20297:9;20290:21;20271:4;20340:6;20334:13;20383:6;20378:2;20367:9;20363:18;20356:34;20399:66;20458:6;20453:2;20442:9;20438:18;20433:2;20425:6;20421:15;20399:66;:::i;:::-;20526:2;20505:15;-1:-1:-1;;20501:29:1;20486:45;;;;20533:2;20482:54;;20159:383;-1:-1:-1;;20159:383:1:o;20547:125::-;20587:4;20615:1;20612;20609:8;20606:34;;;20620:18;;:::i;:::-;-1:-1:-1;20657:9:1;;20547:125::o;21057:274::-;21186:3;21224:6;21218:13;21240:53;21286:6;21281:3;21274:4;21266:6;21262:17;21240:53;:::i;:::-;21309:16;;;;;21057:274;-1:-1:-1;;21057:274:1:o
Swarm Source
ipfs://1b89121ffe56d889a0a819888fcda1b9bae75a4c2138732f69d641496f4ea892
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.