Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 23 from a total of 23 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 21310003 | 46 hrs ago | IN | 0 ETH | 0.01037743 | ||||
Boost | 21289998 | 4 days ago | IN | 0 ETH | 0.00229215 | ||||
Boost | 21277873 | 6 days ago | IN | 0 ETH | 0.00280948 | ||||
Boost | 21268397 | 7 days ago | IN | 0 ETH | 0.00315779 | ||||
Boost | 21253022 | 9 days ago | IN | 0 ETH | 0.0037162 | ||||
Claim | 21195125 | 18 days ago | IN | 0 ETH | 0.00566801 | ||||
Boost | 21159382 | 22 days ago | IN | 0 ETH | 0.01022122 | ||||
Boost | 21159362 | 22 days ago | IN | 0 ETH | 0.01340815 | ||||
Boost | 21014245 | 43 days ago | IN | 0 ETH | 0.0033822 | ||||
Claim | 21001915 | 44 days ago | IN | 0 ETH | 0.00304028 | ||||
Boost | 20922228 | 56 days ago | IN | 0 ETH | 0.01204198 | ||||
Boost | 20921603 | 56 days ago | IN | 0 ETH | 0.00776248 | ||||
Boost | 20921564 | 56 days ago | IN | 0 ETH | 0.01138523 | ||||
Boost | 20921482 | 56 days ago | IN | 0 ETH | 0.01083661 | ||||
Boost | 20921475 | 56 days ago | IN | 0 ETH | 0.0107275 | ||||
Boost | 20921466 | 56 days ago | IN | 0 ETH | 0.0123771 | ||||
Boost | 20918496 | 56 days ago | IN | 0 ETH | 0.00414034 | ||||
Boost | 20844888 | 66 days ago | IN | 0 ETH | 0.00283294 | ||||
Boost | 20833855 | 68 days ago | IN | 0 ETH | 0.0057743 | ||||
Boost | 20808641 | 71 days ago | IN | 0 ETH | 0.00299102 | ||||
Boost | 20758966 | 78 days ago | IN | 0 ETH | 0.00044675 | ||||
Boost | 20706652 | 86 days ago | IN | 0 ETH | 0.00059701 | ||||
Boost | 20698578 | 87 days ago | IN | 0 ETH | 0.00085499 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
VeBoostDelegationMultiRewards
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-09-02 */ // SPDX-License-Identifier: MIT pragma solidity =0.8.10 ^0.8.0 ^0.8.1; // lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // lib/openzeppelin-contracts/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // lib/openzeppelin-contracts/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // src/interfaces/IVeBoost.sol interface IVeBoost { function approve(address, uint256) external; function boost(address, uint256, uint256, address) external; function delegable_balance(address) external returns (uint256); function permit(address, address, uint256, uint256, uint8, bytes32, bytes32) external; function received_balance(address) external returns (uint256); } // lib/openzeppelin-contracts/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // src/VeBoostDelegationMultiRewards.sol // Original idea and credit: // VeSDTDelegation 0x6037Bb1BBa598bf88D816cAD90A28cC00fE3ff64 by AladdinDAO // Mostly forked from AladdinDAO, except that now there is a minimum period to delegate boost // and there are 2 tokens as reward rather than one. contract VeBoostDelegationMultiRewards is Ownable { using SafeERC20 for IERC20; /// Errors error NOT_ALLOWED(); error NOT_STARTED_YET(); error TOO_LOW(); error TOKEN_NOT_SUPPORTED(); error ZERO_ADDRESS(); /// @notice Emitted when someone boost the `LockerProxy` contract. /// @param _owner The address of veToken owner. /// @param _recipient The address of recipient who will receive the pool share. /// @param _amount The amount of veToken to boost. /// @param _endtime The timestamp in seconds when the boost will end. event Boost(address indexed _owner, address indexed _recipient, uint256 _amount, uint256 _endtime); /// @notice Emitted when someone checkpoint pending rewards. /// @param _timestamp The timestamp in seconds when the checkpoint happened. /// @param _rewardToken The token reward address /// @param _amount The amount of pending rewards distributed. event CheckpointReward(uint256 _timestamp, address _rewardToken, uint256 _amount); /// @notice Emitted when user claim pending rewards /// @param _owner The owner of the pool share. /// @param _recipient The address of recipient who will receive the rewards. /// @param _token The token claimed /// @param _amount The amount of pending rewards claimed. event Claim(address indexed _owner, address indexed _recipient, address indexed _token, uint256 _amount); /// @notice Emitted when a new min boost duration has set /// @param _duration Min boosting duration event MinBoostDurationSet(uint256 _duration); uint256 private constant REWARD_CHECKPOINT_DELAY = 1 days; /// @dev The number of seconds in a week. uint256 private constant WEEK = 86400 * 7; address public constant SDT = 0x73968b9a57c6E53d41345FD57a6E6ae27d6CDB2F; /// @notice Reward tokens address public immutable REWARD_TOKEN; /// @dev The address of Token Vote-Escrowed Boost contract. // solhint-disable-next-line const-name-snakecase address public immutable veTOKEN_BOOST; // REWARD_TOKEN VeBoost /// @dev The minimum boost duration uint256 public minBoostDuration = 4 * WEEK; /// @notice The decimal of the vault share. // solhint-disable-next-line const-name-snakecase uint8 public constant decimals = 18; /// @notice The address of lockerProxy contract. address public immutable lockerProxy; /// @dev Compiler will pack this into single `uint256`. /// The boost power can be represented as `bias - slope * (t - ts)` if the time `t` and `ts` /// is in the same epoch. If epoch cross happens, we will change the corresponding value based /// on slope changes. struct Point { // The bias for the linear function uint112 bias; // The slop for the linear function uint112 slope; // The start timestamp in seconds for current epoch. // `uint32` should be enough for next 83 years. uint32 ts; } /// @dev Compiler will pack this into single `uint256`. struct RewardData { // The current balance of reward token. uint128 balance; // The timestamp in second when last distribute happened. uint128 timestamp; } /// @notice Mapping from user address to current updated point. /// @dev The global information is stored in address(0) mapping(address => Point) public boosts; /// @notice Mapping from user address to boost endtime to slope changes. /// @dev The global information is stored in address(0) mapping(address => mapping(uint256 => uint256)) public slopeChanges; /// @notice Mapping from user address to week timestamp to the boost power. /// @dev The global information is stored in address(0) mapping(address => mapping(uint256 => uint256)) public historyBoosts; /// @notice Mapping from token -> week timestamp -> number of rewards accured during the week. mapping(address => mapping(uint256 => uint256)) public weeklyRewards; /// @notice Mapping from user address -> token address -> reward claimed week timestamp. mapping(address => mapping(address => uint256)) public claimIndex; /// @notice The lastest reward distribute information. mapping(address => RewardData) public lastRewards; /** * Constructor ********************************* */ constructor(address _lockerProxy, address _rewardToken, address _veTOKEN_BOOST, uint256 _startTimestamp) { lockerProxy = _lockerProxy; REWARD_TOKEN = _rewardToken; veTOKEN_BOOST = _veTOKEN_BOOST; boosts[address(0)] = Point({bias: 0, slope: 0, ts: uint32(block.timestamp)}); // REWARD_TOKEN info lastRewards[REWARD_TOKEN] = RewardData({balance: 0, timestamp: uint128(_startTimestamp)}); // SDT info lastRewards[SDT] = RewardData({balance: 0, timestamp: uint128(_startTimestamp)}); } /** * View Functions ********************************* */ /// @notice Return the current total pool shares. function totalSupply() external view returns (uint256) { Point memory p = _checkpointRead(address(0)); return p.bias - p.slope * (block.timestamp - p.ts); } /// @notice Return the current pool share for the user. /// @param _user The address of the user to query. function balanceOf(address _user) external view returns (uint256) { if (_user == address(0)) return 0; Point memory p = _checkpointRead(_user); return p.bias - p.slope * (block.timestamp - p.ts); } /** * Mutated Functions ********************************* */ /// @notice Boost some veToken to `LockerProxy` contract permited. /// @dev Use `_amount=-1` to boost all available power. /// @param _amount The amount of veToken to boost. /// @param _endtime The timestamp in seconds when the boost will end. /// @param _recipient The address of recipient who will receive the pool share. /// @param _deadline The deadline in seconds for the permit signature. /// @param _v The V part of the signature /// @param _r The R part of the signature /// @param _s The S part of the signature function boostPermit( uint256 _amount, uint256 _endtime, address _recipient, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external { // set allowance IVeBoost(veTOKEN_BOOST).permit(msg.sender, address(this), _amount, _deadline, _v, _r, _s); // do delegation boost(_amount, _endtime, _recipient); } /// @notice Boost some veToken to `lockerProxy` contract. /// @dev Use `_amount=-1` to boost all available power. /// @param _amount The amount of veToken to boost. /// @param _endtime The timestamp in seconds when the boost will end. /// @param _recipient The address of recipient who will receive the pool share. function boost(uint256 _amount, uint256 _endtime, address _recipient) public { if (_recipient == address(0)) revert ZERO_ADDRESS(); if (_amount == type(uint256).max) { _amount = IVeBoost(veTOKEN_BOOST).delegable_balance(msg.sender); } // check if the _endTime is at least minBoostDuration uint256 currentWeek = block.timestamp / WEEK * WEEK; if (_endtime < currentWeek + minBoostDuration) revert TOO_LOW(); IVeBoost(veTOKEN_BOOST).boost(lockerProxy, _amount, _endtime, msg.sender); _boost(_amount, _endtime, _recipient); } /// @notice Claim rewards for some user. /// @param _user The address of user to claim. /// @param _recipient The address of recipient who will receive the reward. /// @param _token The address of the token to claim function claim(address _user, address _recipient, address _token) public { if (_user != msg.sender) { if (_recipient != _user) revert NOT_ALLOWED(); } if (_user == address(0)) revert ZERO_ADDRESS(); if (REWARD_TOKEN != _token && SDT != _token) revert TOKEN_NOT_SUPPORTED(); // during claiming, update the point if 1 day pasts, since we will not use the latest point Point memory p = boosts[address(0)]; if (block.timestamp >= p.ts + REWARD_CHECKPOINT_DELAY) { _checkpointWrite(address(0), p); boosts[address(0)] = p; } // during claiming, update the point if 1 day pasts, since we will not use the latest point p = boosts[_user]; if (block.timestamp >= p.ts + REWARD_CHECKPOINT_DELAY) { _checkpointWrite(_user, p); boosts[_user] = p; } // checkpoint weekly reward _checkpointReward(_token, false); // claim reward _claim(_user, _recipient, _token); } /// @notice Claim all rewards for some user. /// @param _user The address of user to claim. /// @param _recipient The address of recipient who will receive the reward. function claimAll(address _user, address _recipient) external { claim(_user, _recipient, REWARD_TOKEN); claim(_user, _recipient, SDT); } /// @notice Force checkpoint reward status for one token. /// @param _token reward token to checkpoint function checkpointReward(address _token) external { if (_token != REWARD_TOKEN && _token != SDT) revert TOKEN_NOT_SUPPORTED(); _checkpointReward(_token, true); } /// @notice Force checkpoint reward status for all reward tokens. function checkpointRewards() external { _checkpointReward(REWARD_TOKEN, true); _checkpointReward(SDT, true); } /// @notice Force checkpoint user information. /// @dev User `_user=address(0)` to checkpoint total supply. /// @param _user The address of user to checkpoint. function checkpoint(address _user) external { Point memory p = boosts[_user]; _checkpointWrite(_user, p); boosts[_user] = p; } /// @notice Set the minimum duration for delegate boost /// @param _duration minimum boosting duration function setMinBoostDuration(uint256 _duration) external onlyOwner { minBoostDuration = _duration; emit MinBoostDurationSet(_duration); } /** * Internal Functions ********************************* */ /// @dev Internal function to update boost records /// @param _amount The amount of veToken to boost. /// @param _endtime The timestamp in seconds when the boost will end. /// @param _recipient The address of recipient who will receive the pool share. function _boost(uint256 _amount, uint256 _endtime, address _recipient) internal { if (claimIndex[_recipient][REWARD_TOKEN] == 0) { claimIndex[_recipient][REWARD_TOKEN] = (block.timestamp / WEEK) * WEEK; claimIndex[_recipient][SDT] = (block.timestamp / WEEK) * WEEK; } // _endtime should always be multiple of WEEK uint256 _slope = _amount / (_endtime - block.timestamp); uint256 _bias = _slope * (_endtime - block.timestamp); // update global state _update(_bias, _slope, _endtime, address(0)); // update user state _update(_bias, _slope, _endtime, _recipient); emit Boost(msg.sender, _recipient, _amount, _endtime); } /// @dev Internal function to update veBoost point /// @param _bias The bias delta of the point. /// @param _slope The slope delta of the point. /// @param _endtime The endtime in seconds for the boost. /// @param _user The address of user to update. function _update(uint256 _bias, uint256 _slope, uint256 _endtime, address _user) internal { Point memory p = boosts[_user]; _checkpointWrite(_user, p); p.bias += uint112(_bias); p.slope += uint112(_slope); slopeChanges[_user][_endtime] += _slope; boosts[_user] = p; if (p.ts % WEEK == 0) { historyBoosts[_user][p.ts] = p.bias; } } /// @dev Internal function to claim user rewards. /// @param _user The address of user to claim. /// @param _recipient The address of recipient who will receive the reward. /// @return The amount of reward claimed. function _claim(address _user, address _recipient, address _token) internal returns (uint256) { uint256 _index = claimIndex[_user][_token]; uint256 _lastTime = lastRewards[_token].timestamp; uint256 _amount = 0; uint256 _thisWeek = (block.timestamp / WEEK) * WEEK; // claim at most 50 weeks in one tx for (uint256 i = 0; i < 50;) { // we don't claim rewards from current week. if (_index >= _lastTime || _index >= _thisWeek) break; uint256 _totalPower = historyBoosts[address(0)][_index]; uint256 _userPower = historyBoosts[_user][_index]; if (_totalPower != 0 && _userPower != 0) { _amount += (_userPower * weeklyRewards[_token][_index]) / _totalPower; } _index += WEEK; unchecked { ++i; } } claimIndex[_user][_token] = _index; if (_amount > 0) { lastRewards[_token].balance -= uint128(_amount); IERC20(_token).safeTransfer(_recipient, _amount); } emit Claim(_user, _recipient, _token, _amount); return _amount; } /// @dev Internal function to read checkpoint result without change state. /// @param _user The address of user to checkpoint. /// @return The result point for the user. function _checkpointRead(address _user) internal view returns (Point memory) { Point memory p = boosts[_user]; if (p.ts == 0) { p.ts = uint32(block.timestamp); } if (p.ts == block.timestamp) { return p; } uint256 ts = (p.ts / WEEK) * WEEK; for (uint256 i = 0; i < 255;) { ts += WEEK; uint256 _slopeChange = 0; if (ts > block.timestamp) { ts = block.timestamp; } else { _slopeChange = slopeChanges[_user][ts]; } p.bias -= p.slope * uint112(ts - p.ts); p.slope -= uint112(_slopeChange); p.ts = uint32(ts); if (p.ts == block.timestamp) { break; } unchecked { ++i; } } return p; } /// @dev Internal function to read checkpoint result and change state. /// @param _user The address of user to checkpoint. function _checkpointWrite(address _user, Point memory p) internal { if (p.ts == 0) p.ts = uint32(block.timestamp); if (p.ts == block.timestamp) return; uint256 ts = (p.ts / WEEK) * WEEK; for (uint256 i = 0; i < 255;) { ts += WEEK; uint256 _slopeChange = 0; if (ts > block.timestamp) { ts = block.timestamp; } else { _slopeChange = slopeChanges[_user][ts]; } p.bias -= p.slope * uint112(ts - p.ts); p.slope -= uint112(_slopeChange); p.ts = uint32(ts); if (ts % WEEK == 0) { historyBoosts[_user][ts] = p.bias; } if (p.ts == block.timestamp) { break; } unchecked { ++i; } } } /// @dev Internal function to checkpoint the rewards /// @param _force Whether to do force checkpoint. function _checkpointReward(address _token, bool _force) internal { uint256 _lastTime = lastRewards[_token].timestamp; // We only claim in the next week, so the update can delay 1 day. if (!_force && block.timestamp <= _lastTime + REWARD_CHECKPOINT_DELAY) return; if (block.timestamp < _lastTime) revert NOT_STARTED_YET(); // update timestamp uint256 _sinceLast = block.timestamp - _lastTime; lastRewards[_token].timestamp = uint128(block.timestamp); // update balance uint256 _balance = IERC20(_token).balanceOf(address(this)); uint256 _amount = _balance - lastRewards[_token].balance; lastRewards[_token].balance = uint128(_balance); if (_amount > 0) { uint256 _thisWeek = (_lastTime / WEEK) * WEEK; // 20 should be enough, since we are doing checkpoint every week. for (uint256 i; i < 20;) { uint256 _nextWeek = _thisWeek + WEEK; if (block.timestamp < _nextWeek) { if (_sinceLast == 0) { weeklyRewards[_token][_thisWeek] += _amount; } else { weeklyRewards[_token][_thisWeek] += (_amount * (block.timestamp - _lastTime)) / _sinceLast; } break; } else { if (_sinceLast == 0 && _nextWeek == _lastTime) { weeklyRewards[_token][_thisWeek] += _amount; } else { weeklyRewards[_token][_thisWeek] += (_amount * (_nextWeek - _lastTime)) / _sinceLast; } } _lastTime = _nextWeek; _thisWeek = _nextWeek; unchecked { ++i; } } } emit CheckpointReward(block.timestamp, _token, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_lockerProxy","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_veTOKEN_BOOST","type":"address"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NOT_ALLOWED","type":"error"},{"inputs":[],"name":"NOT_STARTED_YET","type":"error"},{"inputs":[],"name":"TOKEN_NOT_SUPPORTED","type":"error"},{"inputs":[],"name":"TOO_LOW","type":"error"},{"inputs":[],"name":"ZERO_ADDRESS","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endtime","type":"uint256"}],"name":"Boost","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"_rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"CheckpointReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"MinBoostDurationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_endtime","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"boost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_endtime","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"boostPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boosts","outputs":[{"internalType":"uint112","name":"bias","type":"uint112"},{"internalType":"uint112","name":"slope","type":"uint112"},{"internalType":"uint32","name":"ts","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"checkpointReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkpointRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"claimIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"historyBoosts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastRewards","outputs":[{"internalType":"uint128","name":"balance","type":"uint128"},{"internalType":"uint128","name":"timestamp","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockerProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBoostDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setMinBoostDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"slopeChanges","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"veTOKEN_BOOST","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"weeklyRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040526200001462093a806004620001f3565b6001553480156200002457600080fd5b50604051620023af380380620023af83398101604081905262000047916200023e565b6200005233620001a3565b6001600160a01b0393841660c052918316608090815290831660a052604080516060810182526000808252602082810182815263ffffffff4281168587019081528480526002845294517fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b805493519651909216600160e01b026001600160e01b036001600160701b03978816600160701b026001600160e01b03199095169290971691909117929092179490941617909255825180840184528181526001600160801b03958616818401818152955190971682526007808452848320915195518716600160801b9081029688169690961790915583518085019094528184528383019687527373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f90915290525192518216029116177f359208e09319e8a5760ec9f339ad854699e99f49bf6cc8f59d80638bb9f233af5562000290565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008160001904831182151516156200021c57634e487b7160e01b600052601160045260246000fd5b500290565b80516001600160a01b03811681146200023957600080fd5b919050565b600080600080608085870312156200025557600080fd5b620002608562000221565b9350620002706020860162000221565b9250620002806040860162000221565b6060959095015193969295505050565b60805160a05160c0516120a962000306600039600081816102b701526106ea01526000818161040a015281816106110152818161072601526107d3015260008181610399015281816104f601528181610584015281816108520152818161090e015281816112b9015261131c01526120a96000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806375e77914116100de57806399248ea711610097578063dcbd3c1611610071578063dcbd3c16146103e9578063f2fde38b146103f2578063f7126daa14610405578063fdabc9861461042c57600080fd5b806399248ea714610394578063a972985e146103bb578063ba32c619146103ce57600080fd5b806375e77914146102875780637bf3b656146102b25780638589efaa146102f15780638c9249b6146103045780638da5cb5b1461032f578063911ffbdb1461034057600080fd5b8063495667541161013057806349566754146102085780635767bba51461021b5780635e1c75e11461022e5780635e5746341461024157806370a082311461026c578063715018a61461027f57600080fd5b8063168561441461017857806318160ddd146101b65780631a4568be146101be5780632a554842146101d3578063313ce567146101db5780633c13fd4e146101f5575b600080fd5b6101a3610186366004611d0d565b600360209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6101a361049c565b6101d16101cc366004611d37565b6104f4565b005b6101d161057f565b6101e3601281565b60405160ff90911681526020016101ad565b6101d1610203366004611d52565b6105cb565b6101d1610216366004611d87565b610793565b6101d1610229366004611df3565b61084b565b6101d161023c366004611e26565b610899565b6101a361024f366004611df3565b600660209081526000928352604080842090915290825290205481565b6101a361027a366004611d37565b610b88565b6101d1610bf7565b6101a3610295366004611d0d565b600560209081526000928352604080842090915290825290205481565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ad565b6101d16102ff366004611e60565b610c09565b6101a3610312366004611d0d565b600460209081526000928352604080842090915290825290205481565b6000546001600160a01b03166102d9565b61037461034e366004611d37565b6007602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016101ad565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b6101d16103c9366004611d37565b610c4c565b6102d97373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f81565b6101a360015481565b6101d1610400366004611d37565b610d1d565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b61047061043a366004611d37565b6002602052600090815260409020546001600160701b0380821691600160701b810490911690600160e01b900463ffffffff1683565b604080516001600160701b03948516815293909216602084015263ffffffff16908201526060016101ad565b6000806104a96000610d98565b9050806040015163ffffffff16426104c19190611e8f565b81602001516001600160701b03166104d99190611ea6565b81516104ee91906001600160701b0316611e8f565b91505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415801561055357506001600160a01b0381167373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f14155b1561057157604051630859dc9b60e31b815260040160405180910390fd5b61057c816001610f33565b50565b6105aa7f00000000000000000000000000000000000000000000000000000000000000006001610f33565b6105c97373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f6001610f33565b565b6001600160a01b0381166105f25760405163538ba4f960e01b815260040160405180910390fd5b6000198314156106895760405163654184a360e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ca830946906024016020604051808303816000875af1158015610662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106869190611ec5565b92505b600062093a806106998142611ef4565b6106a39190611ea6565b9050600154816106b39190611f08565b8310156106d35760405163da269aeb60e01b815260040160405180910390fd5b60405163b4b3c24960e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201869052604482018590523360648301527f0000000000000000000000000000000000000000000000000000000000000000169063b4b3c24990608401600060405180830381600087803b15801561076a57600080fd5b505af115801561077e573d6000803e3d6000fd5b5050505061078d84848461129b565b50505050565b60405163d505accf60e01b8152336004820152306024820152604481018890526064810185905260ff8416608482015260a4810183905260c481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d505accf9060e401600060405180830381600087803b15801561081f57600080fd5b505af1158015610833573d6000803e3d6000fd5b505050506108428787876105cb565b50505050505050565b61087682827f0000000000000000000000000000000000000000000000000000000000000000610899565b61089582827373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f610899565b5050565b6001600160a01b03831633146108db57826001600160a01b0316826001600160a01b0316146108db57604051634ae18d2b60e11b815260040160405180910390fd5b6001600160a01b0383166109025760405163538ba4f960e01b815260040160405180910390fd5b806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415801561096157507373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f6001600160a01b03821614155b1561097f57604051630859dc9b60e31b815260040160405180910390fd5b6000805260026020908152604080516060810182527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b546001600160701b038082168352600160701b82041693820193909352600160e01b90920463ffffffff169082018190526109f4906201518090611f08565b4210610a8657610a0560008261142c565b600080526002602090815281517fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b805492840151604085015163ffffffff16600160e01b026001600160e01b036001600160701b03928316600160701b026001600160e01b0319909616929094169190911793909317919091169190911790555b506001600160a01b038316600090815260026020908152604091829020825160608101845290546001600160701b038082168352600160701b82041692820192909252600160e01b90910463ffffffff1691810182905290610aec906201518090611f08565b4210610b6b57610afc848261142c565b6001600160a01b0384166000908152600260209081526040918290208351815492850151938501516001600160701b039182166001600160e01b031990941693909317600160701b9190941602929092176001600160e01b0316600160e01b63ffffffff909216919091021790555b610b76826000610f33565b610b818484846115a9565b5050505050565b60006001600160a01b038216610ba057506000919050565b6000610bab83610d98565b9050806040015163ffffffff1642610bc39190611e8f565b81602001516001600160701b0316610bdb9190611ea6565b8151610bf091906001600160701b0316611e8f565b9392505050565b610bff6117f6565b6105c96000611850565b610c116117f6565b60018190556040518181527f87a837aa345b991042ab96eea215c447de6f13656fe9b72ba2403b09123353429060200160405180910390a150565b6001600160a01b038116600090815260026020908152604091829020825160608101845290546001600160701b038082168352600160701b82041692820192909252600160e01b90910463ffffffff1691810191909152610cad828261142c565b6001600160a01b039091166000908152600260209081526040918290208351815492850151939094015163ffffffff16600160e01b026001600160e01b036001600160701b03948516600160701b026001600160e01b031990941694909516939093179190911792909216179055565b610d256117f6565b6001600160a01b038116610d8f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61057c81611850565b6040805160608082018352600080835260208084018290528385018290526001600160a01b0386168252600281529084902084519283018552546001600160701b038082168452600160701b82041691830191909152600160e01b900463ffffffff169281018390529091610e145763ffffffff421660408201525b42816040015163ffffffff161415610e2c5792915050565b600062093a8080836040015163ffffffff16610e489190611ef4565b610e529190611ea6565b905060005b60ff811015610f2a57610e6d62093a8083611f08565b9150600042831115610e8157429250610ea7565b506001600160a01b03851660009081526003602090815260408083208584529091529020545b6040840151610ebc9063ffffffff1684611e8f565b8460200151610ecb9190611f20565b84518590610eda908390611f4f565b6001600160701b0316905250602084018051829190610efa908390611f4f565b6001600160701b031690525063ffffffff831660408501819052421415610f215750610f2a565b50600101610e57565b50909392505050565b6001600160a01b038216600090815260076020526040902054600160801b90046001600160801b031681158015610f765750610f726201518082611f08565b4211155b15610f8057505050565b80421015610fa157604051631298796160e11b815260040160405180910390fd5b6000610fad8242611e8f565b6001600160a01b0385166000818152600760205260408082208054426001600160801b03908116600160801b029116179055516370a0823160e01b8152306004820152929350916370a0823190602401602060405180830381865afa15801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190611ec5565b6001600160a01b0386166000908152600760205260408120549192509061106e906001600160801b031683611e8f565b6001600160a01b038716600090815260076020526040902080546fffffffffffffffffffffffffffffffff19166001600160801b0385161790559050801561124a57600062093a806110c08187611ef4565b6110ca9190611ea6565b905060005b60148110156112475760006110e762093a8084611f08565b9050804210156111925785611134576001600160a01b038916600090815260056020908152604080832086845290915281208054869290611129908490611f08565b9091555061118c9050565b8561113f8842611e8f565b6111499086611ea6565b6111539190611ef4565b6001600160a01b038a16600090815260056020908152604080832087845290915281208054909190611186908490611f08565b90915550505b50611247565b8515801561119f57508681145b156111e2576001600160a01b0389166000908152600560209081526040808320868452909152812080548692906111d7908490611f08565b9091555061123a9050565b856111ed8883611e8f565b6111f79086611ea6565b6112019190611ef4565b6001600160a01b038a16600090815260056020908152604080832087845290915281208054909190611234908490611f08565b90915550505b95508591506001016110cf565b50505b604080514281526001600160a01b03881660208201529081018290527fbf0c4ac76ab63248cad1df9f75eb510576f75da67993cc2de2e551dfb59871769060600160405180910390a1505050505050565b6001600160a01b0380821660009081526006602090815260408083207f0000000000000000000000000000000000000000000000000000000000000000909416835292905220546113965762093a806112f48142611ef4565b6112fe9190611ea6565b6001600160a01b0380831660009081526006602090815260408083207f00000000000000000000000000000000000000000000000000000000000000009094168352929052205562093a806113538142611ef4565b61135d9190611ea6565b6001600160a01b03821660009081526006602090815260408083207373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f84529091529020555b60006113a24284611e8f565b6113ac9085611ef4565b905060006113ba4285611e8f565b6113c49083611ea6565b90506113d381838660006118a0565b6113df818386866118a0565b60408051868152602081018690526001600160a01b0385169133917f993a2001796b9d8c514dfd97840a470d9100ecf84f5edc41809b3afcca52d114910160405180910390a35050505050565b604081015163ffffffff166114485763ffffffff421660408201525b42816040015163ffffffff16141561145e575050565b600062093a8080836040015163ffffffff1661147a9190611ef4565b6114849190611ea6565b905060005b60ff81101561078d5761149f62093a8083611f08565b91506000428311156114b3574292506114d9565b506001600160a01b03841660009081526003602090815260408083208584529091529020545b60408401516114ee9063ffffffff1684611e8f565b84602001516114fd9190611f20565b8451859061150c908390611f4f565b6001600160701b031690525060208401805182919061152c908390611f4f565b6001600160701b031690525063ffffffff8316604085015261155162093a8084611f77565b6115885783516001600160a01b038616600090815260046020908152604080832087845290915290206001600160701b0390911690555b42846040015163ffffffff1614156115a0575061078d565b50600101611489565b6001600160a01b038381166000908152600660209081526040808320938516835292815282822054600790915291812054909190600160801b90046001600160801b0316828062093a806115fd8142611ef4565b6116079190611ea6565b905060005b60328110156116f25783851015806116245750818510155b1561162e576116f2565b60008581527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec60209081526040808320546001600160a01b038d1684526004835281842089855290925290912054811580159061168a57508015155b156116d6576001600160a01b03891660009081526005602090815260408083208a845290915290205482906116bf9083611ea6565b6116c99190611ef4565b6116d39086611f08565b94505b6116e362093a8088611f08565b9650826001019250505061160c565b506001600160a01b038089166000908152600660209081526040808320938a168352929052208490558115611794576001600160a01b038616600090815260076020526040812080548492906117529084906001600160801b0316611f8b565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506117948783886001600160a01b0316611a389092919063ffffffff16565b856001600160a01b0316876001600160a01b0316896001600160a01b03167fc1405953cccdad6b442e266c84d66ad671e2534c6584f8e6ef92802f7ad294d5856040516117e391815260200190565b60405180910390a4509695505050505050565b6000546001600160a01b031633146105c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d86565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116600090815260026020908152604091829020825160608101845290546001600160701b038082168352600160701b82041692820192909252600160e01b90910463ffffffff1691810191909152611901828261142c565b84816000018181516119139190611fab565b6001600160701b0316905250602081018051859190611933908390611fab565b6001600160701b03169052506001600160a01b038216600090815260036020908152604080832086845290915281208054869290611972908490611f08565b90915550506001600160a01b03821660009081526002602090815260409182902083518154928501519385015163ffffffff16600160e01b81026001600160e01b036001600160701b03968716600160701b026001600160e01b031990961696909316959095179390931716929092179091556119f39062093a8090611f77565b610b815780516001600160a01b039290921660009081526004602090815260408083209381015163ffffffff168352929052206001600160701b039091169055505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a8a908490611a8f565b505050565b6000611ae4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611b649092919063ffffffff16565b9050805160001480611b05575080806020019051810190611b059190611fd6565b611a8a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d86565b6060611b738484600085611b7b565b949350505050565b606082471015611bdc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d86565b600080866001600160a01b03168587604051611bf89190612024565b60006040518083038185875af1925050503d8060008114611c35576040519150601f19603f3d011682016040523d82523d6000602084013e611c3a565b606091505b5091509150611c4b87838387611c56565b979650505050505050565b60608315611cc2578251611cbb576001600160a01b0385163b611cbb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d86565b5081611b73565b611b738383815115611cd75781518083602001fd5b8060405162461bcd60e51b8152600401610d869190612040565b80356001600160a01b0381168114611d0857600080fd5b919050565b60008060408385031215611d2057600080fd5b611d2983611cf1565b946020939093013593505050565b600060208284031215611d4957600080fd5b610bf082611cf1565b600080600060608486031215611d6757600080fd5b8335925060208401359150611d7e60408501611cf1565b90509250925092565b600080600080600080600060e0888a031215611da257600080fd5b8735965060208801359550611db960408901611cf1565b945060608801359350608088013560ff81168114611dd657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611e0657600080fd5b611e0f83611cf1565b9150611e1d60208401611cf1565b90509250929050565b600080600060608486031215611e3b57600080fd5b611e4484611cf1565b9250611e5260208501611cf1565b9150611d7e60408501611cf1565b600060208284031215611e7257600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b600082821015611ea157611ea1611e79565b500390565b6000816000190483118215151615611ec057611ec0611e79565b500290565b600060208284031215611ed757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082611f0357611f03611ede565b500490565b60008219821115611f1b57611f1b611e79565b500190565b60006001600160701b0380831681851681830481118215151615611f4657611f46611e79565b02949350505050565b60006001600160701b0383811690831681811015611f6f57611f6f611e79565b039392505050565b600082611f8657611f86611ede565b500690565b60006001600160801b0383811690831681811015611f6f57611f6f611e79565b60006001600160701b03808316818516808303821115611fcd57611fcd611e79565b01949350505050565b600060208284031215611fe857600080fd5b81518015158114610bf057600080fd5b60005b83811015612013578181015183820152602001611ffb565b8381111561078d5750506000910152565b60008251612036818460208701611ff8565b9190910192915050565b602081526000825180602084015261205f816040850160208701611ff8565b601f01601f1916919091016040019291505056fea2646970667358221220f1a0ed489a5ec53dd4516b35caf4633840bfc1515e08e5f5c8068ae4fde7e42564736f6c634300080a003300000000000000000000000052f541764e6e90eebc5c21ff570de0e2d63766b6000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000d37a6aa3d8460bd2b6536d608103d880695a23cd0000000000000000000000000000000000000000000000000000000066cfba00
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806375e77914116100de57806399248ea711610097578063dcbd3c1611610071578063dcbd3c16146103e9578063f2fde38b146103f2578063f7126daa14610405578063fdabc9861461042c57600080fd5b806399248ea714610394578063a972985e146103bb578063ba32c619146103ce57600080fd5b806375e77914146102875780637bf3b656146102b25780638589efaa146102f15780638c9249b6146103045780638da5cb5b1461032f578063911ffbdb1461034057600080fd5b8063495667541161013057806349566754146102085780635767bba51461021b5780635e1c75e11461022e5780635e5746341461024157806370a082311461026c578063715018a61461027f57600080fd5b8063168561441461017857806318160ddd146101b65780631a4568be146101be5780632a554842146101d3578063313ce567146101db5780633c13fd4e146101f5575b600080fd5b6101a3610186366004611d0d565b600360209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6101a361049c565b6101d16101cc366004611d37565b6104f4565b005b6101d161057f565b6101e3601281565b60405160ff90911681526020016101ad565b6101d1610203366004611d52565b6105cb565b6101d1610216366004611d87565b610793565b6101d1610229366004611df3565b61084b565b6101d161023c366004611e26565b610899565b6101a361024f366004611df3565b600660209081526000928352604080842090915290825290205481565b6101a361027a366004611d37565b610b88565b6101d1610bf7565b6101a3610295366004611d0d565b600560209081526000928352604080842090915290825290205481565b6102d97f00000000000000000000000052f541764e6e90eebc5c21ff570de0e2d63766b681565b6040516001600160a01b0390911681526020016101ad565b6101d16102ff366004611e60565b610c09565b6101a3610312366004611d0d565b600460209081526000928352604080842090915290825290205481565b6000546001600160a01b03166102d9565b61037461034e366004611d37565b6007602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016101ad565b6102d97f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5281565b6101d16103c9366004611d37565b610c4c565b6102d97373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f81565b6101a360015481565b6101d1610400366004611d37565b610d1d565b6102d97f000000000000000000000000d37a6aa3d8460bd2b6536d608103d880695a23cd81565b61047061043a366004611d37565b6002602052600090815260409020546001600160701b0380821691600160701b810490911690600160e01b900463ffffffff1683565b604080516001600160701b03948516815293909216602084015263ffffffff16908201526060016101ad565b6000806104a96000610d98565b9050806040015163ffffffff16426104c19190611e8f565b81602001516001600160701b03166104d99190611ea6565b81516104ee91906001600160701b0316611e8f565b91505090565b7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd526001600160a01b0316816001600160a01b03161415801561055357506001600160a01b0381167373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f14155b1561057157604051630859dc9b60e31b815260040160405180910390fd5b61057c816001610f33565b50565b6105aa7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd526001610f33565b6105c97373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f6001610f33565b565b6001600160a01b0381166105f25760405163538ba4f960e01b815260040160405180910390fd5b6000198314156106895760405163654184a360e11b81523360048201527f000000000000000000000000d37a6aa3d8460bd2b6536d608103d880695a23cd6001600160a01b03169063ca830946906024016020604051808303816000875af1158015610662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106869190611ec5565b92505b600062093a806106998142611ef4565b6106a39190611ea6565b9050600154816106b39190611f08565b8310156106d35760405163da269aeb60e01b815260040160405180910390fd5b60405163b4b3c24960e01b81526001600160a01b037f00000000000000000000000052f541764e6e90eebc5c21ff570de0e2d63766b68116600483015260248201869052604482018590523360648301527f000000000000000000000000d37a6aa3d8460bd2b6536d608103d880695a23cd169063b4b3c24990608401600060405180830381600087803b15801561076a57600080fd5b505af115801561077e573d6000803e3d6000fd5b5050505061078d84848461129b565b50505050565b60405163d505accf60e01b8152336004820152306024820152604481018890526064810185905260ff8416608482015260a4810183905260c481018290527f000000000000000000000000d37a6aa3d8460bd2b6536d608103d880695a23cd6001600160a01b03169063d505accf9060e401600060405180830381600087803b15801561081f57600080fd5b505af1158015610833573d6000803e3d6000fd5b505050506108428787876105cb565b50505050505050565b61087682827f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52610899565b61089582827373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f610899565b5050565b6001600160a01b03831633146108db57826001600160a01b0316826001600160a01b0316146108db57604051634ae18d2b60e11b815260040160405180910390fd5b6001600160a01b0383166109025760405163538ba4f960e01b815260040160405180910390fd5b806001600160a01b03167f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd526001600160a01b03161415801561096157507373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f6001600160a01b03821614155b1561097f57604051630859dc9b60e31b815260040160405180910390fd5b6000805260026020908152604080516060810182527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b546001600160701b038082168352600160701b82041693820193909352600160e01b90920463ffffffff169082018190526109f4906201518090611f08565b4210610a8657610a0560008261142c565b600080526002602090815281517fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b805492840151604085015163ffffffff16600160e01b026001600160e01b036001600160701b03928316600160701b026001600160e01b0319909616929094169190911793909317919091169190911790555b506001600160a01b038316600090815260026020908152604091829020825160608101845290546001600160701b038082168352600160701b82041692820192909252600160e01b90910463ffffffff1691810182905290610aec906201518090611f08565b4210610b6b57610afc848261142c565b6001600160a01b0384166000908152600260209081526040918290208351815492850151938501516001600160701b039182166001600160e01b031990941693909317600160701b9190941602929092176001600160e01b0316600160e01b63ffffffff909216919091021790555b610b76826000610f33565b610b818484846115a9565b5050505050565b60006001600160a01b038216610ba057506000919050565b6000610bab83610d98565b9050806040015163ffffffff1642610bc39190611e8f565b81602001516001600160701b0316610bdb9190611ea6565b8151610bf091906001600160701b0316611e8f565b9392505050565b610bff6117f6565b6105c96000611850565b610c116117f6565b60018190556040518181527f87a837aa345b991042ab96eea215c447de6f13656fe9b72ba2403b09123353429060200160405180910390a150565b6001600160a01b038116600090815260026020908152604091829020825160608101845290546001600160701b038082168352600160701b82041692820192909252600160e01b90910463ffffffff1691810191909152610cad828261142c565b6001600160a01b039091166000908152600260209081526040918290208351815492850151939094015163ffffffff16600160e01b026001600160e01b036001600160701b03948516600160701b026001600160e01b031990941694909516939093179190911792909216179055565b610d256117f6565b6001600160a01b038116610d8f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61057c81611850565b6040805160608082018352600080835260208084018290528385018290526001600160a01b0386168252600281529084902084519283018552546001600160701b038082168452600160701b82041691830191909152600160e01b900463ffffffff169281018390529091610e145763ffffffff421660408201525b42816040015163ffffffff161415610e2c5792915050565b600062093a8080836040015163ffffffff16610e489190611ef4565b610e529190611ea6565b905060005b60ff811015610f2a57610e6d62093a8083611f08565b9150600042831115610e8157429250610ea7565b506001600160a01b03851660009081526003602090815260408083208584529091529020545b6040840151610ebc9063ffffffff1684611e8f565b8460200151610ecb9190611f20565b84518590610eda908390611f4f565b6001600160701b0316905250602084018051829190610efa908390611f4f565b6001600160701b031690525063ffffffff831660408501819052421415610f215750610f2a565b50600101610e57565b50909392505050565b6001600160a01b038216600090815260076020526040902054600160801b90046001600160801b031681158015610f765750610f726201518082611f08565b4211155b15610f8057505050565b80421015610fa157604051631298796160e11b815260040160405180910390fd5b6000610fad8242611e8f565b6001600160a01b0385166000818152600760205260408082208054426001600160801b03908116600160801b029116179055516370a0823160e01b8152306004820152929350916370a0823190602401602060405180830381865afa15801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190611ec5565b6001600160a01b0386166000908152600760205260408120549192509061106e906001600160801b031683611e8f565b6001600160a01b038716600090815260076020526040902080546fffffffffffffffffffffffffffffffff19166001600160801b0385161790559050801561124a57600062093a806110c08187611ef4565b6110ca9190611ea6565b905060005b60148110156112475760006110e762093a8084611f08565b9050804210156111925785611134576001600160a01b038916600090815260056020908152604080832086845290915281208054869290611129908490611f08565b9091555061118c9050565b8561113f8842611e8f565b6111499086611ea6565b6111539190611ef4565b6001600160a01b038a16600090815260056020908152604080832087845290915281208054909190611186908490611f08565b90915550505b50611247565b8515801561119f57508681145b156111e2576001600160a01b0389166000908152600560209081526040808320868452909152812080548692906111d7908490611f08565b9091555061123a9050565b856111ed8883611e8f565b6111f79086611ea6565b6112019190611ef4565b6001600160a01b038a16600090815260056020908152604080832087845290915281208054909190611234908490611f08565b90915550505b95508591506001016110cf565b50505b604080514281526001600160a01b03881660208201529081018290527fbf0c4ac76ab63248cad1df9f75eb510576f75da67993cc2de2e551dfb59871769060600160405180910390a1505050505050565b6001600160a01b0380821660009081526006602090815260408083207f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52909416835292905220546113965762093a806112f48142611ef4565b6112fe9190611ea6565b6001600160a01b0380831660009081526006602090815260408083207f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd529094168352929052205562093a806113538142611ef4565b61135d9190611ea6565b6001600160a01b03821660009081526006602090815260408083207373968b9a57c6e53d41345fd57a6e6ae27d6cdb2f84529091529020555b60006113a24284611e8f565b6113ac9085611ef4565b905060006113ba4285611e8f565b6113c49083611ea6565b90506113d381838660006118a0565b6113df818386866118a0565b60408051868152602081018690526001600160a01b0385169133917f993a2001796b9d8c514dfd97840a470d9100ecf84f5edc41809b3afcca52d114910160405180910390a35050505050565b604081015163ffffffff166114485763ffffffff421660408201525b42816040015163ffffffff16141561145e575050565b600062093a8080836040015163ffffffff1661147a9190611ef4565b6114849190611ea6565b905060005b60ff81101561078d5761149f62093a8083611f08565b91506000428311156114b3574292506114d9565b506001600160a01b03841660009081526003602090815260408083208584529091529020545b60408401516114ee9063ffffffff1684611e8f565b84602001516114fd9190611f20565b8451859061150c908390611f4f565b6001600160701b031690525060208401805182919061152c908390611f4f565b6001600160701b031690525063ffffffff8316604085015261155162093a8084611f77565b6115885783516001600160a01b038616600090815260046020908152604080832087845290915290206001600160701b0390911690555b42846040015163ffffffff1614156115a0575061078d565b50600101611489565b6001600160a01b038381166000908152600660209081526040808320938516835292815282822054600790915291812054909190600160801b90046001600160801b0316828062093a806115fd8142611ef4565b6116079190611ea6565b905060005b60328110156116f25783851015806116245750818510155b1561162e576116f2565b60008581527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec60209081526040808320546001600160a01b038d1684526004835281842089855290925290912054811580159061168a57508015155b156116d6576001600160a01b03891660009081526005602090815260408083208a845290915290205482906116bf9083611ea6565b6116c99190611ef4565b6116d39086611f08565b94505b6116e362093a8088611f08565b9650826001019250505061160c565b506001600160a01b038089166000908152600660209081526040808320938a168352929052208490558115611794576001600160a01b038616600090815260076020526040812080548492906117529084906001600160801b0316611f8b565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506117948783886001600160a01b0316611a389092919063ffffffff16565b856001600160a01b0316876001600160a01b0316896001600160a01b03167fc1405953cccdad6b442e266c84d66ad671e2534c6584f8e6ef92802f7ad294d5856040516117e391815260200190565b60405180910390a4509695505050505050565b6000546001600160a01b031633146105c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d86565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116600090815260026020908152604091829020825160608101845290546001600160701b038082168352600160701b82041692820192909252600160e01b90910463ffffffff1691810191909152611901828261142c565b84816000018181516119139190611fab565b6001600160701b0316905250602081018051859190611933908390611fab565b6001600160701b03169052506001600160a01b038216600090815260036020908152604080832086845290915281208054869290611972908490611f08565b90915550506001600160a01b03821660009081526002602090815260409182902083518154928501519385015163ffffffff16600160e01b81026001600160e01b036001600160701b03968716600160701b026001600160e01b031990961696909316959095179390931716929092179091556119f39062093a8090611f77565b610b815780516001600160a01b039290921660009081526004602090815260408083209381015163ffffffff168352929052206001600160701b039091169055505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a8a908490611a8f565b505050565b6000611ae4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611b649092919063ffffffff16565b9050805160001480611b05575080806020019051810190611b059190611fd6565b611a8a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d86565b6060611b738484600085611b7b565b949350505050565b606082471015611bdc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d86565b600080866001600160a01b03168587604051611bf89190612024565b60006040518083038185875af1925050503d8060008114611c35576040519150601f19603f3d011682016040523d82523d6000602084013e611c3a565b606091505b5091509150611c4b87838387611c56565b979650505050505050565b60608315611cc2578251611cbb576001600160a01b0385163b611cbb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d86565b5081611b73565b611b738383815115611cd75781518083602001fd5b8060405162461bcd60e51b8152600401610d869190612040565b80356001600160a01b0381168114611d0857600080fd5b919050565b60008060408385031215611d2057600080fd5b611d2983611cf1565b946020939093013593505050565b600060208284031215611d4957600080fd5b610bf082611cf1565b600080600060608486031215611d6757600080fd5b8335925060208401359150611d7e60408501611cf1565b90509250925092565b600080600080600080600060e0888a031215611da257600080fd5b8735965060208801359550611db960408901611cf1565b945060608801359350608088013560ff81168114611dd657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611e0657600080fd5b611e0f83611cf1565b9150611e1d60208401611cf1565b90509250929050565b600080600060608486031215611e3b57600080fd5b611e4484611cf1565b9250611e5260208501611cf1565b9150611d7e60408501611cf1565b600060208284031215611e7257600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b600082821015611ea157611ea1611e79565b500390565b6000816000190483118215151615611ec057611ec0611e79565b500290565b600060208284031215611ed757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082611f0357611f03611ede565b500490565b60008219821115611f1b57611f1b611e79565b500190565b60006001600160701b0380831681851681830481118215151615611f4657611f46611e79565b02949350505050565b60006001600160701b0383811690831681811015611f6f57611f6f611e79565b039392505050565b600082611f8657611f86611ede565b500690565b60006001600160801b0383811690831681811015611f6f57611f6f611e79565b60006001600160701b03808316818516808303821115611fcd57611fcd611e79565b01949350505050565b600060208284031215611fe857600080fd5b81518015158114610bf057600080fd5b60005b83811015612013578181015183820152602001611ffb565b8381111561078d5750506000910152565b60008251612036818460208701611ff8565b9190910192915050565b602081526000825180602084015261205f816040850160208701611ff8565b601f01601f1916919091016040019291505056fea2646970667358221220f1a0ed489a5ec53dd4516b35caf4633840bfc1515e08e5f5c8068ae4fde7e42564736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000052f541764e6e90eebc5c21ff570de0e2d63766b6000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000d37a6aa3d8460bd2b6536d608103d880695a23cd0000000000000000000000000000000000000000000000000000000066cfba00
-----Decoded View---------------
Arg [0] : _lockerProxy (address): 0x52f541764E6e90eeBc5c21Ff570De0e2D63766B6
Arg [1] : _rewardToken (address): 0xD533a949740bb3306d119CC777fa900bA034cd52
Arg [2] : _veTOKEN_BOOST (address): 0xD37A6aa3d8460Bd2b6536d608103D880695A23CD
Arg [3] : _startTimestamp (uint256): 1724889600
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000052f541764e6e90eebc5c21ff570de0e2d63766b6
Arg [1] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [2] : 000000000000000000000000d37a6aa3d8460bd2b6536d608103d880695a23cd
Arg [3] : 0000000000000000000000000000000000000000000000000000000066cfba00
Deployed Bytecode Sourcemap
26067:18073:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29719:67;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;597:25:1;;;585:2;570:18;29719:67:0;;;;;;;;31247:179;;;:::i;35606:185::-;;;;;;:::i;:::-;;:::i;:::-;;35870:133;;;:::i;28403:35::-;;28436:2;28403:35;;;;;996:4:1;984:17;;;966:36;;954:2;939:18;28403:35:0;824:184:1;33201:618:0;;;;;;:::i;:::-;;:::i;32436:417::-;;;;;;:::i;:::-;;:::i;35326:159::-;;;;;;:::i;:::-;;:::i;34063:1072::-;;;;;;:::i;:::-;;:::i;30285:65::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;31551:231;;;;;;:::i;:::-;;:::i;17984:103::-;;;:::i;30114:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;28501:36;;;;;;;;-1:-1:-1;;;;;2800:32:1;;;2782:51;;2770:2;2755:18;28501:36:0;2636:203:1;36465:160:0;;;;;;:::i;:::-;;:::i;29937:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;17343:87;17389:7;17416:6;-1:-1:-1;;;;;17416:6:0;17343:87;;30419:49;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;30419:49:0;;;;-1:-1:-1;;;30419:49:0;;;;;;;;;-1:-1:-1;;;;;3274:15:1;;;3256:34;;3326:15;;;;3321:2;3306:18;;3299:43;3176:18;30419:49:0;3029:319:1;27970:37:0;;;;;36186:158;;;;;;:::i;:::-;;:::i;27858:72::-;;27888:42;27858:72;;28248:42;;;;;;18242:201;;;;;;:::i;:::-;;:::i;28136:38::-;;;;;29532:39;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29532:39:0;;;;-1:-1:-1;;;29532:39:0;;;;;;-1:-1:-1;;;29532:39:0;;;;;;;;;;-1:-1:-1;;;;;3620:15:1;;;3602:34;;3672:15;;;;3667:2;3652:18;;3645:43;3736:10;3724:23;3704:18;;;3697:51;3541:2;3526:18;29532:39:0;3353:401:1;31247:179:0;31293:7;31313:14;31330:27;31354:1;31330:15;:27::i;:::-;31313:44;;31413:1;:4;;;31395:22;;:15;:22;;;;:::i;:::-;31384:1;:7;;;-1:-1:-1;;;;;31384:34:0;;;;;:::i;:::-;31375:6;;:43;;;-1:-1:-1;;;;;31375:43:0;;:::i;:::-;31368:50;;;31247:179;:::o;35606:185::-;35682:12;-1:-1:-1;;;;;35672:22:0;:6;-1:-1:-1;;;;;35672:22:0;;;:39;;;;-1:-1:-1;;;;;;35698:13:0;;27888:42;35698:13;;35672:39;35668:73;;;35720:21;;-1:-1:-1;;;35720:21:0;;;;;;;;;;;35668:73;35752:31;35770:6;35778:4;35752:17;:31::i;:::-;35606:185;:::o;35870:133::-;35919:37;35937:12;35951:4;35919:17;:37::i;:::-;35967:28;27888:42;35990:4;35967:17;:28::i;:::-;35870:133::o;33201:618::-;-1:-1:-1;;;;;33293:24:0;;33289:51;;33326:14;;-1:-1:-1;;;33326:14:0;;;;;;;;;;;33289:51;-1:-1:-1;;33355:7:0;:28;33351:124;;;33410:53;;-1:-1:-1;;;33410:53:0;;33452:10;33410:53;;;2782:51:1;33419:13:0;-1:-1:-1;;;;;33410:41:0;;;;2755:18:1;;33410:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33400:63;;33351:124;33550:19;27840:9;33572:22;27840:9;33572:15;:22;:::i;:::-;:29;;;;:::i;:::-;33550:51;;33641:16;;33627:11;:30;;;;:::i;:::-;33616:8;:41;33612:63;;;33666:9;;-1:-1:-1;;;33666:9:0;;;;;;;;;;;33612:63;33688:73;;-1:-1:-1;;;33688:73:0;;-1:-1:-1;;;;;33718:11:0;5060:15:1;;33688:73:0;;;5042:34:1;5092:18;;;5085:34;;;5135:18;;;5128:34;;;33750:10:0;5178:18:1;;;5171:43;33697:13:0;33688:29;;;;4976:19:1;;33688:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33774:37;33781:7;33790:8;33800:10;33774:6;:37::i;:::-;33278:541;33201:618;;;:::o;32436:417::-;32681:89;;-1:-1:-1;;;32681:89:0;;32712:10;32681:89;;;5574:34:1;32732:4:0;5624:18:1;;;5617:43;5676:18;;;5669:34;;;5719:18;;;5712:34;;;5795:4;5783:17;;5762:19;;;5755:46;5817:19;;;5810:35;;;5861:19;;;5854:35;;;32690:13:0;-1:-1:-1;;;;;32681:30:0;;;;5508:19:1;;32681:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32809:36;32815:7;32824:8;32834:10;32809:5;:36::i;:::-;32436:417;;;;;;;:::o;35326:159::-;35399:38;35405:5;35412:10;35424:12;35399:5;:38::i;:::-;35448:29;35454:5;35461:10;27888:42;35448:5;:29::i;:::-;35326:159;;:::o;34063:1072::-;-1:-1:-1;;;;;34151:19:0;;34160:10;34151:19;34147:97;;34205:5;-1:-1:-1;;;;;34191:19:0;:10;-1:-1:-1;;;;;34191:19:0;;34187:45;;34219:13;;-1:-1:-1;;;34219:13:0;;;;;;;;;;;34187:45;-1:-1:-1;;;;;34258:19:0;;34254:46;;34286:14;;-1:-1:-1;;;34286:14:0;;;;;;;;;;;34254:46;34331:6;-1:-1:-1;;;;;34315:22:0;:12;-1:-1:-1;;;;;34315:22:0;;;:39;;;;-1:-1:-1;27888:42:0;-1:-1:-1;;;;;34341:13:0;;;;34315:39;34311:73;;;34363:21;;-1:-1:-1;;;34363:21:0;;;;;;;;;;;34311:73;34498:14;34515:18;;:6;:18;;;;;34498:35;;;;;;;34515:18;34498:35;-1:-1:-1;;;;;34498:35:0;;;;;-1:-1:-1;;;34498:35:0;;;;;;;;;;-1:-1:-1;;;34498:35:0;;;;;;;;;;;34567:30;;27746:6;;34567:30;:::i;:::-;34548:15;:49;34544:150;;34614:31;34639:1;34643;34614:16;:31::i;:::-;34660:18;;;:6;:18;;;;:22;;:18;:22;;;;;;:18;:22;;;;;-1:-1:-1;;;34660:22:0;-1:-1:-1;;;;;;;;;;34660:22:0;;;-1:-1:-1;;;34660:22:0;-1:-1:-1;;;;;;34660:22:0;;;;;;;;;;;;;;;;;;;;;;;;;34544:150;-1:-1:-1;;;;;;34811:13:0;;;;;;:6;:13;;;;;;;;;34807:17;;;;;;;;;-1:-1:-1;;;;;34807:17:0;;;;;-1:-1:-1;;;34807:17:0;;;;;;;;;;-1:-1:-1;;;34807:17:0;;;;;;;;;;;;34858:30;;27746:6;;34858:30;:::i;:::-;34839:15;:49;34835:140;;34905:26;34922:5;34929:1;34905:16;:26::i;:::-;-1:-1:-1;;;;;34946:13:0;;;;;;:6;:13;;;;;;;;;:17;;;;;;;;;;;;-1:-1:-1;;;;;34946:17:0;;;-1:-1:-1;;;;;;34946:17:0;;;;;;;-1:-1:-1;;;34946:17:0;;;;;;;;;-1:-1:-1;;;;;34946:17:0;-1:-1:-1;;;34946:17:0;;;;;;;;;;;34835:140;35024:32;35042:6;35050:5;35024:17;:32::i;:::-;35094:33;35101:5;35108:10;35120:6;35094;:33::i;:::-;;34136:999;34063:1072;;;:::o;31551:231::-;31608:7;-1:-1:-1;;;;;31632:19:0;;31628:33;;-1:-1:-1;31660:1:0;;31551:231;-1:-1:-1;31551:231:0:o;31628:33::-;31674:14;31691:22;31707:5;31691:15;:22::i;:::-;31674:39;;31769:1;:4;;;31751:22;;:15;:22;;;;:::i;:::-;31740:1;:7;;;-1:-1:-1;;;;;31740:34:0;;;;;:::i;:::-;31731:6;;:43;;;-1:-1:-1;;;;;31731:43:0;;:::i;:::-;31724:50;31551:231;-1:-1:-1;;;31551:231:0:o;17984:103::-;17229:13;:11;:13::i;:::-;18049:30:::1;18076:1;18049:18;:30::i;36465:160::-:0;17229:13;:11;:13::i;:::-;36543:16:::1;:28:::0;;;36587:30:::1;::::0;597:25:1;;;36587:30:0::1;::::0;585:2:1;570:18;36587:30:0::1;;;;;;;36465:160:::0;:::o;36186:158::-;-1:-1:-1;;;;;36258:13:0;;36241:14;36258:13;;;:6;:13;;;;;;;;;36241:30;;;;;;;;;-1:-1:-1;;;;;36241:30:0;;;;;-1:-1:-1;;;36241:30:0;;;;;;;;;;-1:-1:-1;;;36241:30:0;;;;;;;;;;;;36282:26;36258:13;36241:30;36282:16;:26::i;:::-;-1:-1:-1;;;;;36319:13:0;;;;;;;:6;:13;;;;;;;;;:17;;;;;;;;;;;;;;;-1:-1:-1;;;36319:17:0;-1:-1:-1;;;;;;;;;;36319:17:0;;;-1:-1:-1;;;36319:17:0;-1:-1:-1;;;;;;36319:17:0;;;;;;;;;;;;;;;;;;;;;;36186:158::o;18242:201::-;17229:13;:11;:13::i;:::-;-1:-1:-1;;;;;18331:22:0;::::1;18323:73;;;::::0;-1:-1:-1;;;18323:73:0;;6102:2:1;18323:73:0::1;::::0;::::1;6084:21:1::0;6141:2;6121:18;;;6114:30;6180:34;6160:18;;;6153:62;-1:-1:-1;;;6231:18:1;;;6224:36;6277:19;;18323:73:0::1;;;;;;;;;18407:28;18426:8;18407:18;:28::i;40087:922::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40192:13:0;;;;:6;:13;;;;;;40175:30;;;;;;;;-1:-1:-1;;;;;40175:30:0;;;;;-1:-1:-1;;;40175:30:0;;;;;;;;;;-1:-1:-1;;;40175:30:0;;;;;;;;;;-1:-1:-1;;40218:72:0;;40248:30;40262:15;40248:30;:4;;;:30;40218:72;40312:15;40304:1;:4;;;:23;;;40300:64;;;40351:1;40087:922;-1:-1:-1;;40087:922:0:o;40300:64::-;40376:10;27840:9;;40390:1;:4;;;:11;;;;;;:::i;:::-;40389:20;;;;:::i;:::-;40376:33;;40425:9;40420:563;40444:3;40440:1;:7;40420:563;;;40465:10;27840:9;40465:10;;:::i;:::-;;;40490:20;40538:15;40533:2;:20;40529:160;;;40579:15;40574:20;;40529:160;;;-1:-1:-1;;;;;;40650:19:0;;;;;;:12;:19;;;;;;;;:23;;;;;;;;;40529:160;40738:4;;;;40733:9;;;;:2;:9;:::i;:::-;40715:1;:7;;;:28;;;;:::i;:::-;40705:38;;:1;;:38;;;;;:::i;:::-;-1:-1:-1;;;;;40705:38:0;;;-1:-1:-1;40758:7:0;;;:32;;40777:12;;40758:7;:32;;40777:12;;40758:32;:::i;:::-;-1:-1:-1;;;;;40758:32:0;;;-1:-1:-1;40805:17:0;;;:4;;;:17;;;40851:15;40843:23;40839:69;;;40887:5;;;40839:69;-1:-1:-1;40953:3:0;;40420:563;;;-1:-1:-1;41000:1:0;;40087:922;-1:-1:-1;;;40087:922:0:o;42170:1967::-;-1:-1:-1;;;;;42266:19:0;;42246:17;42266:19;;;:11;:19;;;;;:29;-1:-1:-1;;;42266:29:0;;-1:-1:-1;;;;;42266:29:0;42385:7;;:65;;;;-1:-1:-1;42415:35:0;27746:6;42415:9;:35;:::i;:::-;42396:15;:54;;42385:65;42381:78;;;42452:7;42170:1967;;:::o;42381:78::-;42491:9;42473:15;:27;42469:57;;;42509:17;;-1:-1:-1;;;42509:17:0;;;;;;;;;;;42469:57;42568:18;42589:27;42607:9;42589:15;:27;:::i;:::-;-1:-1:-1;;;;;42627:19:0;;;;;;:11;:19;;;;;;:56;;42667:15;-1:-1:-1;;;;;42627:56:0;;;-1:-1:-1;;;42627:56:0;;;;;;42742:39;-1:-1:-1;;;42742:39:0;;42775:4;42742:39;;;2782:51:1;42568:48:0;;-1:-1:-1;42627:19:0;42742:24;;2755:18:1;;42742:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42821:19:0;;42792:15;42821:19;;;:11;:19;;;;;:27;42723:58;;-1:-1:-1;42792:15:0;42810:38;;-1:-1:-1;;;;;42821:27:0;42723:58;42810:38;:::i;:::-;-1:-1:-1;;;;;42859:19:0;;;;;;:11;:19;;;;;:47;;-1:-1:-1;;42859:47:0;-1:-1:-1;;;;;42859:47:0;;;;;42792:56;-1:-1:-1;42923:11:0;;42919:1145;;42951:17;27840:9;42972:16;27840:9;42972;:16;:::i;:::-;42971:25;;;;:::i;:::-;42951:45;;43095:9;43090:963;43110:2;43106:1;:6;43090:963;;;43134:17;43154:16;27840:9;43154;:16;:::i;:::-;43134:36;;43211:9;43193:15;:27;43189:695;;;43249:15;43245:262;;-1:-1:-1;;;;;43293:21:0;;;;;;:13;:21;;;;;;;;:32;;;;;;;;:43;;43329:7;;43293:21;:43;;43329:7;;43293:43;:::i;:::-;;;;-1:-1:-1;43245:262:0;;-1:-1:-1;43245:262:0;;43473:10;43441:27;43459:9;43441:15;:27;:::i;:::-;43430:39;;:7;:39;:::i;:::-;43429:54;;;;:::i;:::-;-1:-1:-1;;;;;43393:21:0;;;;;;:13;:21;;;;;;;;:32;;;;;;;;:90;;:32;;:21;:90;;;;;:::i;:::-;;;;-1:-1:-1;;43245:262:0;43529:5;;;43189:695;43587:15;;:41;;;;;43619:9;43606;:22;43587:41;43583:282;;;-1:-1:-1;;;;;43657:21:0;;;;;;:13;:21;;;;;;;;:32;;;;;;;;:43;;43693:7;;43657:21;:43;;43693:7;;43657:43;:::i;:::-;;;;-1:-1:-1;43583:282:0;;-1:-1:-1;43583:282:0;;43831:10;43805:21;43817:9;43805;:21;:::i;:::-;43794:33;;:7;:33;:::i;:::-;43793:48;;;;:::i;:::-;-1:-1:-1;;;;;43757:21:0;;;;;;:13;:21;;;;;;;;:32;;;;;;;;:84;;:32;;:21;:84;;;;;:::i;:::-;;;;-1:-1:-1;;43583:282:0;43914:9;-1:-1:-1;43914:9:0;;-1:-1:-1;44015:3:0;;43090:963;;;;42936:1128;42919:1145;44079:50;;;44096:15;7044:25:1;;-1:-1:-1;;;;;7105:32:1;;7100:2;7085:18;;7078:60;7154:18;;;7147:34;;;44079:50:0;;7032:2:1;7017:18;44079:50:0;;;;;;;42235:1902;;;;42170:1967;;:::o;36986:747::-;-1:-1:-1;;;;;37081:22:0;;;;;;;:10;:22;;;;;;;;37104:12;37081:36;;;;;;;;;;37077:220;;27840:9;37179:22;27840:9;37179:15;:22;:::i;:::-;37178:31;;;;:::i;:::-;-1:-1:-1;;;;;37139:22:0;;;;;;;:10;:22;;;;;;;;37162:12;37139:36;;;;;;;;;:70;27840:9;37255:22;27840:9;37255:15;:22;:::i;:::-;37254:31;;;;:::i;:::-;-1:-1:-1;;;;;37224:22:0;;;;;;:10;:22;;;;;;;;27888:42;37224:27;;;;;;;:61;37077:220;37364:14;37392:26;37403:15;37392:8;:26;:::i;:::-;37381:38;;:7;:38;:::i;:::-;37364:55;-1:-1:-1;37430:13:0;37456:26;37467:15;37456:8;:26;:::i;:::-;37446:37;;:6;:37;:::i;:::-;37430:53;;37528:44;37536:5;37543:6;37551:8;37569:1;37528:7;:44::i;:::-;37615;37623:5;37630:6;37638:8;37648:10;37615:7;:44::i;:::-;37677:48;;;7366:25:1;;;7422:2;7407:18;;7400:34;;;-1:-1:-1;;;;;37677:48:0;;;37683:10;;37677:48;;7339:18:1;37677:48:0;;;;;;;37066:667;;36986:747;;;:::o;41150:899::-;41231:4;;;;:9;;41227:45;;41242:30;41256:15;41242:30;:4;;;:30;41227:45;41295:15;41287:1;:4;;;:23;;;41283:36;;;41150:899;;:::o;41283:36::-;41331:10;27840:9;;41345:1;:4;;;:11;;;;;;:::i;:::-;41344:20;;;;:::i;:::-;41331:33;;41380:9;41375:667;41399:3;41395:1;:7;41375:667;;;41420:10;27840:9;41420:10;;:::i;:::-;;;41445:20;41493:15;41488:2;:20;41484:160;;;41534:15;41529:20;;41484:160;;;-1:-1:-1;;;;;;41605:19:0;;;;;;:12;:19;;;;;;;;:23;;;;;;;;;41484:160;41693:4;;;;41688:9;;;;:2;:9;:::i;:::-;41670:1;:7;;;:28;;;;:::i;:::-;41660:38;;:1;;:38;;;;;:::i;:::-;-1:-1:-1;;;;;41660:38:0;;;-1:-1:-1;41713:7:0;;;:32;;41732:12;;41713:7;:32;;41732:12;;41713:32;:::i;:::-;-1:-1:-1;;;;;41713:32:0;;;-1:-1:-1;41760:17:0;;;:4;;;:17;41798:9;27840;41774:2;41798:9;:::i;:::-;41794:88;;41860:6;;-1:-1:-1;;;;;41833:20:0;;41860:6;41833:20;;;:13;:20;;;;;;;;:24;;;;;;;;-1:-1:-1;;;;;41833:33:0;;;;;41794:88;41910:15;41902:1;:4;;;:23;;;41898:69;;;41946:5;;;41898:69;-1:-1:-1;42012:3:0;;41375:667;;38684:1210;-1:-1:-1;;;;;38806:17:0;;;38769:7;38806:17;;;:10;:17;;;;;;;;:25;;;;;;;;;;;;38862:11;:19;;;;;;:29;38769:7;;38806:25;-1:-1:-1;;;38862:29:0;;-1:-1:-1;;;;;38862:29:0;38769:7;;27840:9;38953:22;27840:9;38953:15;:22;:::i;:::-;38952:31;;;;:::i;:::-;38932:51;;39046:9;39041:551;39065:2;39061:1;:6;39041:551;;;39157:9;39147:6;:19;;:42;;;;39180:9;39170:6;:19;;39147:42;39143:53;;;39191:5;;39143:53;39211:19;39233:33;;;:25;;:33;;;:25;:33;;;;-1:-1:-1;;;;;39302:20:0;;;;39233:13;39302:20;;;;;:28;;;;;;;;;;39349:16;;;;;:35;;-1:-1:-1;39369:15:0;;;39349:35;39345:145;;;-1:-1:-1;;;;;39430:21:0;;;;;;:13;:21;;;;;;;;:29;;;;;;;;;39463:11;;39417:42;;:10;:42;:::i;:::-;39416:58;;;;:::i;:::-;39405:69;;;;:::i;:::-;;;39345:145;39504:14;27840:9;39504:14;;:::i;:::-;;;39562:3;;;;;39070:522;;39041:551;;;-1:-1:-1;;;;;;39602:17:0;;;;;;;:10;:17;;;;;;;;:25;;;;;;;;;:34;;;39653:11;;39649:154;;-1:-1:-1;;;;;39681:19:0;;;;;;:11;:19;;;;;:47;;39720:7;;39681:19;:47;;39720:7;;-1:-1:-1;;;;;39681:47:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;39681:47:0;;;;;-1:-1:-1;;;;;39681:47:0;;;;;;39743:48;39771:10;39783:7;39750:6;-1:-1:-1;;;;;39743:27:0;;;:48;;;;;:::i;:::-;39845:6;-1:-1:-1;;;;;39820:41:0;39833:10;-1:-1:-1;;;;;39820:41:0;39826:5;-1:-1:-1;;;;;39820:41:0;;39853:7;39820:41;;;;597:25:1;;585:2;570:18;;451:177;39820:41:0;;;;;;;;-1:-1:-1;39879:7:0;38684:1210;-1:-1:-1;;;;;;38684:1210:0:o;17508:132::-;17389:7;17416:6;-1:-1:-1;;;;;17416:6:0;15592:10;17572:23;17564:68;;;;-1:-1:-1;;;17564:68:0;;8015:2:1;17564:68:0;;;7997:21:1;;;8034:18;;;8027:30;8093:34;8073:18;;;8066:62;8145:18;;17564:68:0;7813:356:1;18603:191:0;18677:16;18696:6;;-1:-1:-1;;;;;18713:17:0;;;-1:-1:-1;;;;;;18713:17:0;;;;;;18746:40;;18696:6;;;;;;;18746:40;;18677:16;18746:40;18666:128;18603:191;:::o;38017:424::-;-1:-1:-1;;;;;38135:13:0;;38118:14;38135:13;;;:6;:13;;;;;;;;;38118:30;;;;;;;;;-1:-1:-1;;;;;38118:30:0;;;;;-1:-1:-1;;;38118:30:0;;;;;;;;;;-1:-1:-1;;;38118:30:0;;;;;;;;;;;;38159:26;38135:13;38118:30;38159:16;:26::i;:::-;38214:5;38196:1;:6;;:24;;;;;;;:::i;:::-;-1:-1:-1;;;;;38196:24:0;;;-1:-1:-1;38231:7:0;;;:26;;38250:6;;38231:7;:26;;38250:6;;38231:26;:::i;:::-;-1:-1:-1;;;;;38231:26:0;;;-1:-1:-1;;;;;;38270:19:0;;;;;;:12;:19;;;;;;;;:29;;;;;;;;:39;;38303:6;;38270:19;:39;;38303:6;;38270:39;:::i;:::-;;;;-1:-1:-1;;;;;;;38320:13:0;;;;;;:6;:13;;;;;;;;;:17;;;;;;;;;;;;;;-1:-1:-1;;;38320:17:0;;-1:-1:-1;;;;;;;;;;38320:17:0;;;-1:-1:-1;;;38320:17:0;-1:-1:-1;;;;;;38320:17:0;;;;;;;;;;;;;;;;;;;;;;;38354:11;;27840:9;;38354:11;:::i;:::-;38350:84;;38416:6;;-1:-1:-1;;;;;38387:20:0;;;;38416:6;38387:20;;;:13;:20;;;;;;;;38408:4;;;;38387:26;;;;;;;;-1:-1:-1;;;;;38387:35:0;;;;;-1:-1:-1;;;38017:424:0:o;19675:177::-;19785:58;;;-1:-1:-1;;;;;8620:32:1;;19785:58:0;;;8602:51:1;8669:18;;;;8662:34;;;19785:58:0;;;;;;;;;;8575:18:1;;;;19785:58:0;;;;;;;;-1:-1:-1;;;;;19785:58:0;-1:-1:-1;;;19785:58:0;;;19758:86;;19778:5;;19758:19;:86::i;:::-;19675:177;;;:::o;23998:649::-;24422:23;24448:69;24476:4;24448:69;;;;;;;;;;;;;;;;;24456:5;-1:-1:-1;;;;;24448:27:0;;;:69;;;;;:::i;:::-;24422:95;;24536:10;:17;24557:1;24536:22;:56;;;;24573:10;24562:30;;;;;;;;;;;;:::i;:::-;24528:111;;;;-1:-1:-1;;;24528:111:0;;9191:2:1;24528:111:0;;;9173:21:1;9230:2;9210:18;;;9203:30;9269:34;9249:18;;;9242:62;-1:-1:-1;;;9320:18:1;;;9313:40;9370:19;;24528:111:0;8989:406:1;9451:229:0;9588:12;9620:52;9642:6;9650:4;9656:1;9659:12;9620:21;:52::i;:::-;9613:59;9451:229;-1:-1:-1;;;;9451:229:0:o;10537:455::-;10707:12;10765:5;10740:21;:30;;10732:81;;;;-1:-1:-1;;;10732:81:0;;9602:2:1;10732:81:0;;;9584:21:1;9641:2;9621:18;;;9614:30;9680:34;9660:18;;;9653:62;-1:-1:-1;;;9731:18:1;;;9724:36;9777:19;;10732:81:0;9400:402:1;10732:81:0;10825:12;10839:23;10866:6;-1:-1:-1;;;;;10866:11:0;10885:5;10892:4;10866:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10824:73;;;;10915:69;10942:6;10950:7;10959:10;10971:12;10915:26;:69::i;:::-;10908:76;10537:455;-1:-1:-1;;;;;;;10537:455:0:o;13110:644::-;13295:12;13324:7;13320:427;;;13352:17;;13348:290;;-1:-1:-1;;;;;6991:19:0;;;13562:60;;;;-1:-1:-1;;;13562:60:0;;10551:2:1;13562:60:0;;;10533:21:1;10590:2;10570:18;;;10563:30;10629:31;10609:18;;;10602:59;10678:18;;13562:60:0;10349:353:1;13562:60:0;-1:-1:-1;13659:10:0;13652:17;;13320:427;13702:33;13710:10;13722:12;14457:17;;:21;14453:388;;14689:10;14683:17;14746:15;14733:10;14729:2;14725:19;14718:44;14453:388;14816:12;14809:20;;-1:-1:-1;;;14809:20:0;;;;;;;;:::i;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:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:186::-;692:6;745:2;733:9;724:7;720:23;716:32;713:52;;;761:1;758;751:12;713:52;784:29;803:9;784:29;:::i;1013:322::-;1090:6;1098;1106;1159:2;1147:9;1138:7;1134:23;1130:32;1127:52;;;1175:1;1172;1165:12;1127:52;1211:9;1198:23;1188:33;;1268:2;1257:9;1253:18;1240:32;1230:42;;1291:38;1325:2;1314:9;1310:18;1291:38;:::i;:::-;1281:48;;1013:322;;;;;:::o;1340:687::-;1451:6;1459;1467;1475;1483;1491;1499;1552:3;1540:9;1531:7;1527:23;1523:33;1520:53;;;1569:1;1566;1559:12;1520:53;1605:9;1592:23;1582:33;;1662:2;1651:9;1647:18;1634:32;1624:42;;1685:38;1719:2;1708:9;1704:18;1685:38;:::i;:::-;1675:48;;1770:2;1759:9;1755:18;1742:32;1732:42;;1824:3;1813:9;1809:19;1796:33;1869:4;1862:5;1858:16;1851:5;1848:27;1838:55;;1889:1;1886;1879:12;1838:55;1340:687;;;;-1:-1:-1;1340:687:1;;;;1912:5;1964:3;1949:19;;1936:33;;-1:-1:-1;2016:3:1;2001:19;;;1988:33;;1340:687;-1:-1:-1;;1340:687:1:o;2032:260::-;2100:6;2108;2161:2;2149:9;2140:7;2136:23;2132:32;2129:52;;;2177:1;2174;2167:12;2129:52;2200:29;2219:9;2200:29;:::i;:::-;2190:39;;2248:38;2282:2;2271:9;2267:18;2248:38;:::i;:::-;2238:48;;2032:260;;;;;:::o;2297:334::-;2374:6;2382;2390;2443:2;2431:9;2422:7;2418:23;2414:32;2411:52;;;2459:1;2456;2449:12;2411:52;2482:29;2501:9;2482:29;:::i;:::-;2472:39;;2530:38;2564:2;2553:9;2549:18;2530:38;:::i;:::-;2520:48;;2587:38;2621:2;2610:9;2606:18;2587:38;:::i;2844:180::-;2903:6;2956:2;2944:9;2935:7;2931:23;2927:32;2924:52;;;2972:1;2969;2962:12;2924:52;-1:-1:-1;2995:23:1;;2844:180;-1:-1:-1;2844:180:1:o;3759:127::-;3820:10;3815:3;3811:20;3808:1;3801:31;3851:4;3848:1;3841:15;3875:4;3872:1;3865:15;3891:125;3931:4;3959:1;3956;3953:8;3950:34;;;3964:18;;:::i;:::-;-1:-1:-1;4001:9:1;;3891:125::o;4021:168::-;4061:7;4127:1;4123;4119:6;4115:14;4112:1;4109:21;4104:1;4097:9;4090:17;4086:45;4083:71;;;4134:18;;:::i;:::-;-1:-1:-1;4174:9:1;;4021:168::o;4194:184::-;4264:6;4317:2;4305:9;4296:7;4292:23;4288:32;4285:52;;;4333:1;4330;4323:12;4285:52;-1:-1:-1;4356:16:1;;4194:184;-1:-1:-1;4194:184:1:o;4383:127::-;4444:10;4439:3;4435:20;4432:1;4425:31;4475:4;4472:1;4465:15;4499:4;4496:1;4489:15;4515:120;4555:1;4581;4571:35;;4586:18;;:::i;:::-;-1:-1:-1;4620:9:1;;4515:120::o;4640:128::-;4680:3;4711:1;4707:6;4704:1;4701:13;4698:39;;;4717:18;;:::i;:::-;-1:-1:-1;4753:9:1;;4640:128::o;6307:283::-;6347:7;-1:-1:-1;;;;;6436:2:1;6433:1;6429:10;6466:2;6463:1;6459:10;6522:3;6518:2;6514:12;6509:3;6506:21;6499:3;6492:11;6485:19;6481:47;6478:73;;;6531:18;;:::i;:::-;6571:13;;6307:283;-1:-1:-1;;;;6307:283:1:o;6595:242::-;6635:4;-1:-1:-1;;;;;6744:10:1;;;;6714;;6766:12;;;6763:38;;;6781:18;;:::i;:::-;6818:13;;6595:242;-1:-1:-1;;;6595:242:1:o;7445:112::-;7477:1;7503;7493:35;;7508:18;;:::i;:::-;-1:-1:-1;7542:9:1;;7445:112::o;7562:246::-;7602:4;-1:-1:-1;;;;;7715:10:1;;;;7685;;7737:12;;;7734:38;;;7752:18;;:::i;8174:249::-;8214:3;-1:-1:-1;;;;;8299:2:1;8296:1;8292:10;8329:2;8326:1;8322:10;8360:3;8356:2;8352:12;8347:3;8344:21;8341:47;;;8368:18;;:::i;:::-;8404:13;;8174:249;-1:-1:-1;;;;8174:249:1:o;8707:277::-;8774:6;8827:2;8815:9;8806:7;8802:23;8798:32;8795:52;;;8843:1;8840;8833:12;8795:52;8875:9;8869:16;8928:5;8921:13;8914:21;8907:5;8904:32;8894:60;;8950:1;8947;8940:12;9807:258;9879:1;9889:113;9903:6;9900:1;9897:13;9889:113;;;9979:11;;;9973:18;9960:11;;;9953:39;9925:2;9918:10;9889:113;;;10020:6;10017:1;10014:13;10011:48;;;-1:-1:-1;;10055:1:1;10037:16;;10030:27;9807:258::o;10070:274::-;10199:3;10237:6;10231:13;10253:53;10299:6;10294:3;10287:4;10279:6;10275:17;10253:53;:::i;:::-;10322:16;;;;;10070:274;-1:-1:-1;;10070:274:1:o;10707:383::-;10856:2;10845:9;10838:21;10819:4;10888:6;10882:13;10931:6;10926:2;10915:9;10911:18;10904:34;10947:66;11006:6;11001:2;10990:9;10986:18;10981:2;10973:6;10969:15;10947:66;:::i;:::-;11074:2;11053:15;-1:-1:-1;;11049:29:1;11034:45;;;;11081:2;11030:54;;10707:383;-1:-1:-1;;10707:383:1:o
Swarm Source
ipfs://f1a0ed489a5ec53dd4516b35caf4633840bfc1515e08e5f5c8068ae4fde7e425
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.861909 | 22,987.0906 | $19,812.79 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.