More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 96 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 21710226 | 6 days ago | IN | 0 ETH | 0.00072663 | ||||
Approve | 21657492 | 13 days ago | IN | 0 ETH | 0.00068639 | ||||
Withdraw | 21229562 | 73 days ago | IN | 0 ETH | 0.00179094 | ||||
Emergency Withdr... | 21197243 | 77 days ago | IN | 0 ETH | 0.00057698 | ||||
Approve | 21197225 | 77 days ago | IN | 0 ETH | 0.00056537 | ||||
Withdraw | 20532711 | 170 days ago | IN | 0 ETH | 0.00030526 | ||||
Emergency Withdr... | 19990689 | 246 days ago | IN | 0 ETH | 0.00358599 | ||||
Emergency Withdr... | 19327095 | 339 days ago | IN | 0 ETH | 0.00872334 | ||||
Approve | 19327093 | 339 days ago | IN | 0 ETH | 0.00331574 | ||||
Approve | 18544971 | 449 days ago | IN | 0 ETH | 0.00152103 | ||||
Emergency Withdr... | 17674141 | 570 days ago | IN | 0 ETH | 0.00146722 | ||||
Emergency Withdr... | 17438684 | 604 days ago | IN | 0 ETH | 0.00218008 | ||||
Emergency Withdr... | 17438045 | 604 days ago | IN | 0 ETH | 0.00056693 | ||||
Emergency Withdr... | 17438045 | 604 days ago | IN | 0 ETH | 0.00240907 | ||||
Approve | 17437959 | 604 days ago | IN | 0 ETH | 0.00105319 | ||||
Set Early Withdr... | 17437815 | 604 days ago | IN | 0 ETH | 0.00062489 | ||||
Emergency Withdr... | 17321189 | 620 days ago | IN | 0 ETH | 0.00480649 | ||||
Create_lock | 17166323 | 642 days ago | IN | 0 ETH | 0.01455475 | ||||
Approve | 17094554 | 652 days ago | IN | 0 ETH | 0.00153838 | ||||
Create_lock | 17093910 | 652 days ago | IN | 0 ETH | 0.00644385 | ||||
Approve | 16993846 | 666 days ago | IN | 0 ETH | 0.00094505 | ||||
Increase_unlock_... | 16952786 | 672 days ago | IN | 0 ETH | 0.00172004 | ||||
Create_lock | 16952117 | 672 days ago | IN | 0 ETH | 0.00406911 | ||||
Withdraw | 16897060 | 680 days ago | IN | 0 ETH | 0.00160929 | ||||
Withdraw | 16866364 | 684 days ago | IN | 0 ETH | 0.00161114 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
13135357 | 1250 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
VoteEscrow
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-31 */ // SPDX-License-Identifier: MIXED // File @openzeppelin/contracts/token/ERC20/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } } // File @openzeppelin/contracts/utils/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/utils/cryptography/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File @openzeppelin/contracts/utils/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Implementation 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. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") {} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } // File @openzeppelin/contracts/utils/math/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File @openzeppelin/contracts/utils/math/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits. * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's, * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1. * * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module. * * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting * power can be queried through the public accessors {getVotes} and {getPastVotes}. * * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this * will significantly increase the base gas cost of transfers. * * _Available since v4.2._ */ abstract contract ERC20Votes is ERC20Permit { struct Checkpoint { uint32 fromBlock; uint224 votes; } bytes32 private constant _DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); mapping(address => address) private _delegates; mapping(address => Checkpoint[]) private _checkpoints; Checkpoint[] private _totalSupplyCheckpoints; /** * @dev Emitted when an account changes their delegate. */ event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /** * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power. */ event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); /** * @dev Get the `pos`-th checkpoint for `account`. */ function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) { return _checkpoints[account][pos]; } /** * @dev Get number of checkpoints for `account`. */ function numCheckpoints(address account) public view virtual returns (uint32) { return SafeCast.toUint32(_checkpoints[account].length); } /** * @dev Get the address `account` is currently delegating to. */ function delegates(address account) public view virtual returns (address) { return _delegates[account]; } /** * @dev Gets the current votes balance for `account` */ function getVotes(address account) public view returns (uint256) { uint256 pos = _checkpoints[account].length; return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; } /** * @dev Retrieve the number of votes for `account` at the end of `blockNumber`. * * Requirements: * * - `blockNumber` must have been already mined */ function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) { require(blockNumber < block.number, "ERC20Votes: block not yet mined"); return _checkpointsLookup(_checkpoints[account], blockNumber); } /** * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. * It is but NOT the sum of all the delegated votes! * * Requirements: * * - `blockNumber` must have been already mined */ function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) { require(blockNumber < block.number, "ERC20Votes: block not yet mined"); return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber); } /** * @dev Lookup a value in a list of (sorted) checkpoints. */ function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) { // We run a binary search to look for the earliest checkpoint taken after `blockNumber`. // // During the loop, the index of the wanted checkpoint remains in the range [low-1, high). // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant. // - If the middle checkpoint is after `blockNumber`, we look in [low, mid) // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high) // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not // out of bounds (in which case we're looking too far in the past and the result is 0). // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out // the same. uint256 high = ckpts.length; uint256 low = 0; while (low < high) { uint256 mid = Math.average(low, high); if (ckpts[mid].fromBlock > blockNumber) { high = mid; } else { low = mid + 1; } } return high == 0 ? 0 : ckpts[high - 1].votes; } /** * @dev Delegate votes from the sender to `delegatee`. */ function delegate(address delegatee) public virtual { return _delegate(_msgSender(), delegatee); } /** * @dev Delegates votes from signer to `delegatee` */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public virtual { require(block.timestamp <= expiry, "ERC20Votes: signature expired"); address signer = ECDSA.recover( _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), v, r, s ); require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce"); return _delegate(signer, delegatee); } /** * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1). */ function _maxSupply() internal view virtual returns (uint224) { return type(uint224).max; } /** * @dev Snapshots the totalSupply after it has been increased. */ function _mint(address account, uint256 amount) internal virtual override { super._mint(account, amount); require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes"); _writeCheckpoint(_totalSupplyCheckpoints, _add, amount); } /** * @dev Snapshots the totalSupply after it has been decreased. */ function _burn(address account, uint256 amount) internal virtual override { super._burn(account, amount); _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount); } /** * @dev Move voting power when tokens are transferred. * * Emits a {DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._afterTokenTransfer(from, to, amount); _moveVotingPower(delegates(from), delegates(to), amount); } /** * @dev Change delegation for `delegator` to `delegatee`. * * Emits events {DelegateChanged} and {DelegateVotesChanged}. */ function _delegate(address delegator, address delegatee) internal virtual { address currentDelegate = delegates(delegator); uint256 delegatorBalance = balanceOf(delegator); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveVotingPower(currentDelegate, delegatee, delegatorBalance); } function _moveVotingPower( address src, address dst, uint256 amount ) private { if (src != dst && amount > 0) { if (src != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount); emit DelegateVotesChanged(src, oldWeight, newWeight); } if (dst != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount); emit DelegateVotesChanged(dst, oldWeight, newWeight); } } } function _writeCheckpoint( Checkpoint[] storage ckpts, function(uint256, uint256) view returns (uint256) op, uint256 delta ) private returns (uint256 oldWeight, uint256 newWeight) { uint256 pos = ckpts.length; oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes; newWeight = op(oldWeight, delta); if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) { ckpts[pos - 1].votes = SafeCast.toUint224(newWeight); } else { ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)})); } } function _add(uint256 a, uint256 b) private pure returns (uint256) { return a + b; } function _subtract(uint256 a, uint256 b) private pure returns (uint256) { return a - b; } } // File @openzeppelin/contracts/access/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/interfaces/IVotingEscrow.sol // License-Identifier: UNLICENSED // Standard Curvefi voting escrow interface // We want to use a standard iface to allow compatibility pragma solidity ^0.8.0; interface IVotingEscrow { // Following are used in Fee distribution contracts e.g. /* https://etherscan.io/address/0x74c6cade3ef61d64dcc9b97490d9fbb231e4bdcc#code */ // struct Point { // int128 bias; // int128 slope; // uint256 ts; // uint256 blk; // } // function user_point_epoch(address addr) external view returns (uint256); // function epoch() external view returns (uint256); // function user_point_history(address addr, uint256 loc) external view returns (Point); // function checkpoint() external; /* https://etherscan.io/address/0x2e57627ACf6c1812F99e274d0ac61B786c19E74f#readContract */ // Gauge proxy requires the following. inherit from ERC20 // balanceOf // totalSupply function deposit_for(address _addr, uint256 _value) external; function create_lock(uint256 _value, uint256 _unlock_time) external; function increase_amount(uint256 _value) external; function increase_unlock_time(uint256 _unlock_time) external; function withdraw() external; // Extra required views function supply() external view returns (uint256); // function transferOwnership(address addr) external; } // File contracts/governance/VoteEscrow.sol // License-Identifier: UNLICENSED pragma solidity 0.8.7; contract VoteEscrow is ERC20Votes, ReentrancyGuard, Ownable, IVotingEscrow { using SafeERC20 for IERC20; struct LockedBalance { uint256 amount; uint256 end; } // flags uint256 public constant MINDAYS = 7; uint256 public constant MAXDAYS = 3 * 365; uint256 public constant MAXTIME = MAXDAYS * 1 days; // 3 years uint256 public constant MAX_WITHDRAWAL_PENALTY = 50000; // 50% uint256 public constant PRECISION = 100000; // 5 decimals address public lockedToken; address public penaltyCollector; uint256 public minLockedAmount; uint256 public earlyWithdrawPenaltyRate; uint256 public override supply; mapping(address => LockedBalance) public locked; mapping(address => uint256) public mintedForLock; address public constant burn = 0x000000000000000000000000000000000000dEaD; /* =============== EVENTS ==================== */ event Deposit(address indexed provider, uint256 value, uint256 locktime, uint256 timestamp); event Withdraw(address indexed provider, uint256 value, uint256 timestamp); event PenaltyCollectorSet(address indexed addr); event EarlyWithdrawPenaltySet(uint256 indexed penalty); event MinLockedAmountSet(uint256 indexed amount); constructor( string memory _name, string memory _symbol, address _lockedToken, uint256 _minLockedAmount ) ERC20(_name, _symbol) ERC20Permit(_name) { lockedToken = _lockedToken; minLockedAmount = _minLockedAmount; earlyWithdrawPenaltyRate = 30000; // 30% } function deposit_for(address _addr, uint256 _value) external override { require(_value >= minLockedAmount, "VE:VL0"); _deposit_for(_addr, _value, 0); } function create_lock(uint256 _value, uint256 _days) external override { require(_value >= minLockedAmount, "less than min amount"); require(locked[_msgSender()].amount == 0, "Withdraw old tokens first"); require(_days >= MINDAYS, "Voting lock can be 7 days min"); require(_days <= MAXDAYS, "Voting lock can be 4 years max"); _deposit_for(_msgSender(), _value, _days); } function increase_amount(uint256 _value) external override { require(_value >= minLockedAmount, "less than min amount"); _deposit_for(_msgSender(), _value, 0); } function increase_unlock_time(uint256 _days) external override { require(_days >= MINDAYS, "Voting lock can be 7 days min"); require(_days <= MAXDAYS, "Voting lock can be 4 years max"); _deposit_for(_msgSender(), 0, _days); } function withdraw() external override nonReentrant { LockedBalance storage _locked = locked[_msgSender()]; uint256 _now = block.timestamp; require(_locked.amount > 0, "Nothing to withdraw"); require(_now >= _locked.end, "The lock didn't expire"); uint256 _amount = _locked.amount; _locked.end = 0; _locked.amount = 0; _burn(_msgSender(), mintedForLock[_msgSender()]); mintedForLock[_msgSender()] = 0; IERC20(lockedToken).safeTransfer(_msgSender(), _amount); emit Withdraw(_msgSender(), _amount, _now); } // This will charge PENALTY if lock is not expired yet function emergencyWithdraw() external nonReentrant { LockedBalance storage _locked = locked[_msgSender()]; uint256 _now = block.timestamp; require(_locked.amount > 0, "Nothing to withdraw"); uint256 _amount = _locked.amount; if (_now < _locked.end) { uint256 _fee = (_amount * earlyWithdrawPenaltyRate) / PRECISION; _penalize(_fee); _amount = _amount - _fee; } _locked.end = 0; supply -= _locked.amount; _locked.amount = 0; _burn(_msgSender(), mintedForLock[_msgSender()]); mintedForLock[_msgSender()] = 0; IERC20(lockedToken).safeTransfer(_msgSender(), _amount); emit Withdraw(_msgSender(), _amount, _now); } /* ========== RESTRICTED FUNCTIONS ========== */ function setMinLockedAmount(uint256 _minLockedAmount) external onlyOwner { minLockedAmount = _minLockedAmount; emit MinLockedAmountSet(_minLockedAmount); } function setEarlyWithdrawPenaltyRate(uint256 _earlyWithdrawPenaltyRate) external onlyOwner { require(_earlyWithdrawPenaltyRate <= MAX_WITHDRAWAL_PENALTY, "withdrawal penalty is too high"); // <= 50% earlyWithdrawPenaltyRate = _earlyWithdrawPenaltyRate; emit EarlyWithdrawPenaltySet(_earlyWithdrawPenaltyRate); } function setPenaltyCollector(address _addr) external onlyOwner { penaltyCollector = _addr; emit PenaltyCollectorSet(_addr); } /* ========== PUBLIC FUNCTIONS ========== */ function locked__of(address _addr) external view returns (uint256) { return locked[_addr].amount; } function locked__end(address _addr) external view returns (uint256) { return locked[_addr].end; } function voting_power_unlock_time(uint256 _value, uint256 _unlockTime) public view returns (uint256) { uint256 _now = block.timestamp; if (_unlockTime <= _now) return 0; uint256 _lockedSeconds = _unlockTime - _now; if (_lockedSeconds >= MAXTIME) { return _value; } return (_value * _lockedSeconds) / MAXTIME; } function voting_power_locked_days(uint256 _value, uint256 _days) public view returns (uint256) { if (_days >= MAXDAYS) { return _value; } return (_value * _days) / MAXDAYS; } /* ========== INTERNAL FUNCTIONS ========== */ function _deposit_for( address _addr, uint256 _value, uint256 _days ) internal nonReentrant { LockedBalance storage _locked = locked[_addr]; uint256 _now = block.timestamp; uint256 _amount = _locked.amount; uint256 _end = _locked.end; uint256 _vp; if (_amount == 0) { _vp = voting_power_locked_days(_value, _days); _locked.amount = _value; _locked.end = _now + _days * 1 days; } else if (_days == 0) { _vp = voting_power_unlock_time(_value, _end); _locked.amount = _amount + _value; } else { require(_value == 0, "Cannot increase amount and extend lock in the same time"); _vp = voting_power_locked_days(_amount, _days); _locked.end = _end + _days * 1 days; require(_locked.end - _now <= MAXTIME, "Cannot extend lock to more than 4 years"); } require(_vp > 0, "No benefit to lock"); if (_value > 0) { IERC20(lockedToken).safeTransferFrom(_msgSender(), address(this), _value); } _mint(_addr, _vp); mintedForLock[_addr] += _vp; supply += _value; emit Deposit(_addr, _locked.amount, _locked.end, _now); } function _penalize(uint256 _amount) internal { // TODO: we cannot burn univ2/sushi LP tokens, therefore they need to be sent to 0xdead or this needs to change if (penaltyCollector != address(0)) { // send to collector if `penaltyCollector` set IERC20(lockedToken).safeTransfer(penaltyCollector, _amount); } else { ERC20Burnable(lockedToken).burn(_amount); } } function _withdraw() internal { LockedBalance storage _locked = locked[_msgSender()]; uint256 _now = block.timestamp; require(_locked.amount > 0, "Nothing to withdraw"); uint256 _amount = _locked.amount; if (_now < _locked.end) { uint256 _fee = (_amount * earlyWithdrawPenaltyRate) / PRECISION; _penalize(_fee); _amount = _amount - _fee; } _locked.end = 0; _locked.amount = 0; _burn(_msgSender(), mintedForLock[_msgSender()]); mintedForLock[_msgSender()] = 0; supply -= _amount; IERC20(lockedToken).safeTransfer(_msgSender(), _amount); emit Withdraw(_msgSender(), _amount, _now); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_lockedToken","type":"address"},{"internalType":"uint256","name":"_minLockedAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"locktime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"EarlyWithdrawPenaltySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinLockedAmountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"PenaltyCollectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXDAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXTIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WITHDRAWAL_PENALTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINDAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20Votes.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"create_lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"deposit_for","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyWithdrawPenaltyRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increase_amount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"increase_unlock_time","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"locked","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"locked__end","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"locked__of","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedForLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"penaltyCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"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":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_earlyWithdrawPenaltyRate","type":"uint256"}],"name":"setEarlyWithdrawPenaltyRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minLockedAmount","type":"uint256"}],"name":"setMinLockedAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPenaltyCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"voting_power_locked_days","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_unlockTime","type":"uint256"}],"name":"voting_power_unlock_time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620034cd380380620034cd8339810160408190526200005a9162000324565b8380604051806040016040528060018152602001603160f81b8152508686816003908051906020019062000090929190620001c7565b508051620000a6906004906020840190620001c7565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a018190528183019890985260608101959095526080808601939093523085830152805180860390920182529390920190925280519401939093209092526101005250506001600955620001433362000175565b600b80546001600160a01b0319166001600160a01b039390931692909217909155600d555050617530600e556200040a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001d590620003b7565b90600052602060002090601f016020900481019282620001f9576000855562000244565b82601f106200021457805160ff191683800117855562000244565b8280016001018555821562000244579182015b828111156200024457825182559160200191906001019062000227565b506200025292915062000256565b5090565b5b8082111562000252576000815560010162000257565b600082601f8301126200027f57600080fd5b81516001600160401b03808211156200029c576200029c620003f4565b604051601f8301601f19908116603f01168101908282118183101715620002c757620002c7620003f4565b81604052838152602092508683858801011115620002e457600080fd5b600091505b83821015620003085785820183015181830184015290820190620002e9565b838211156200031a5760008385830101525b9695505050505050565b600080600080608085870312156200033b57600080fd5b84516001600160401b03808211156200035357600080fd5b62000361888389016200026d565b955060208701519150808211156200037857600080fd5b5062000387878288016200026d565b604087015190945090506001600160a01b0381168114620003a757600080fd5b6060959095015193969295505050565b600181811c90821680620003cc57607f821691505b60208210811415620003ee57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e05161010051610120516130736200045a600039600061127a015260006119af015260006119fe015260006119d90152600061195d0152600061198601526130736000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80636fcfff451161019d578063aaf5eb68116100e9578063d505accf116100a2578063ee00ef3a1161007c578063ee00ef3a146106e9578063eff7a612146106f1578063f1127ed814610704578063f2fde38b1461074157600080fd5b8063d505accf14610695578063db2e21bc146106a8578063dd62ed3e146106b057600080fd5b8063aaf5eb68146105f4578063adc63589146105fe578063ae6ef65f1461062a578063c3cda52014610633578063cbf9fe5f14610646578063d08a12ff1461068257600080fd5b80638e539e8c11610156578063a25b39b711610130578063a25b39b7146105b2578063a457c2d7146105bb578063a8a4a376146105ce578063a9059cbb146105e157600080fd5b80638e539e8c1461058457806395d89b41146105975780639ab24eb01461059f57600080fd5b80636fcfff45146104f457806370a082311461051c578063715018a61461054557806373426cff1461054d5780637ecebe00146105605780638da5cb5b1461057357600080fd5b8063313ce5671161025c5780633ccfd60b11610215578063587cde1e116101ef578063587cde1e1461048f5780635b7d8f05146104bb5780635c19a95c146104ce57806365fc3873146104e157600080fd5b80633ccfd60b1461046b57806344df8e70146104735780634957677c1461047c57600080fd5b8063313ce567146104065780633644e5151461041557806338b4321b1461041d57806339509351146104305780633a46273e146104435780633a46b1a81461045857600080fd5b8063113f6653116102ae578063113f6653146103a65780631767c433146103c657806318160ddd146103cf5780632060176b146103d757806323b872dd146103e0578063308097b2146103f357600080fd5b80630193512b146102f6578063047fc9aa1461033257806306fdde031461033b578063095ea7b3146103505780630f45cc81146103735780630f51c09c1461039e575b600080fd5b61031f610304366004612c5c565b6001600160a01b031660009081526010602052604090205490565b6040519081526020015b60405180910390f35b61031f600f5481565b610343610754565b6040516103299190612e8b565b61036361035e366004612d50565b6107e6565b6040519015158152602001610329565b600b54610386906001600160a01b031681565b6040516001600160a01b039091168152602001610329565b61031f600781565b61031f6103b4366004612c5c565b60116020526000908152604090205481565b61031f61044781565b60025461031f565b61031f61c35081565b6103636103ee366004612caa565b6107fd565b600c54610386906001600160a01b031681565b60405160128152602001610329565b61031f6108ae565b61031f61042b366004612e4d565b6108bd565b61036361043e366004612d50565b61092a565b610456610451366004612d50565b610966565b005b61031f610466366004612d50565b6109b1565b610456610a24565b61038661dead81565b61045661048a366004612e34565b610b83565b61038661049d366004612c5c565b6001600160a01b039081166000908152600660205260409020541690565b6104566104c9366004612c5c565b610bdb565b6104566104dc366004612c5c565b610c4f565b6104566104ef366004612e4d565b610c59565b610507610502366004612c5c565b610dad565b60405163ffffffff9091168152602001610329565b61031f61052a366004612c5c565b6001600160a01b031660009081526020819052604090205490565b610456610dcf565b61031f61055b366004612e4d565b610e05565b61031f61056e366004612c5c565b610e2e565b600a546001600160a01b0316610386565b61031f610592366004612e34565b610e4c565b610343610ea8565b61031f6105ad366004612c5c565b610eb7565b61031f600d5481565b6103636105c9366004612d50565b610f3e565b6104566105dc366004612e34565b610fd7565b6103636105ef366004612d50565b611086565b61031f620186a081565b61031f61060c366004612c5c565b6001600160a01b031660009081526010602052604090206001015490565b61031f600e5481565b610456610641366004612d7a565b611093565b61066d610654366004612c5c565b6010602052600090815260409020805460019091015482565b60408051928352602083019190915201610329565b610456610690366004612e34565b6111c9565b6104566106a3366004612ce6565b611226565b61045661138a565b61031f6106be366004612c77565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61031f61147e565b6104566106ff366004612e34565b611490565b610717610712366004612dd2565b61153f565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610329565b61045661074f366004612c5c565b6115c3565b60606003805461076390612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461078f90612fc6565b80156107dc5780601f106107b1576101008083540402835291602001916107dc565b820191906000526020600020905b8154815290600101906020018083116107bf57829003601f168201915b5050505050905090565b60006107f333848461165b565b5060015b92915050565b600061080a84848461177f565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156108945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6108a1853385840361165b565b60019150505b9392505050565b60006108b8611959565b905090565b6000428083116108d15760009150506107f7565b60006108dd8285612f83565b90506108ee61044762015180612f64565b81106108fe5784925050506107f7565b61090d61044762015180612f64565b6109178287612f64565b6109219190612f42565b95945050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107f3918590610961908690612f2a565b61165b565b600d548110156109a15760405162461bcd60e51b8152602060048201526006602482015265056453a564c360d41b604482015260640161088b565b6109ad82826000611a4c565b5050565b6000438210610a025760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400604482015260640161088b565b6001600160a01b03831660009081526007602052604090206108a79083611d1d565b60026009541415610a475760405162461bcd60e51b815260040161088b90612ef3565b600260095533600090815260106020526040902080544290610aa15760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015260640161088b565b8160010154811015610aee5760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b604482015260640161088b565b81546000600184018190558355610b15335b33600090815260116020526040902054611dda565b33600081815260116020526040812055600b54610b3e916001600160a01b039091169083611df2565b604080518281526020810184905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a25050600160095550565b600d54811015610bcc5760405162461bcd60e51b81526020600482015260146024820152731b195cdcc81d1a185b881b5a5b88185b5bdd5b9d60621b604482015260640161088b565b610bd833826000611a4c565b50565b600a546001600160a01b03163314610c055760405162461bcd60e51b815260040161088b90612ebe565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f2541601c97bce42b47813f2be715ba4eb0a571f2aafaf35cda2054137d9a79af90600090a250565b610bd83382611e5a565b600d54821015610ca25760405162461bcd60e51b81526020600482015260146024820152731b195cdcc81d1a185b881b5a5b88185b5bdd5b9d60621b604482015260640161088b565b3360009081526010602052604090205415610cff5760405162461bcd60e51b815260206004820152601960248201527f5769746864726177206f6c6420746f6b656e7320666972737400000000000000604482015260640161088b565b6007811015610d505760405162461bcd60e51b815260206004820152601d60248201527f566f74696e67206c6f636b2063616e20626520372064617973206d696e000000604482015260640161088b565b610447811115610da25760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000604482015260640161088b565b6109ad338383611a4c565b6001600160a01b0381166000908152600760205260408120546107f790611ed3565b600a546001600160a01b03163314610df95760405162461bcd60e51b815260040161088b90612ebe565b610e036000611f3c565b565b60006104478210610e175750816107f7565b610447610e248385612f64565b6108a79190612f42565b6001600160a01b0381166000908152600560205260408120546107f7565b6000438210610e9d5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400604482015260640161088b565b6107f7600883611d1d565b60606004805461076390612fc6565b6001600160a01b0381166000908152600760205260408120548015610f2b576001600160a01b0383166000908152600760205260409020610ef9600183612f83565b81548110610f0957610f09613027565b60009182526020909120015464010000000090046001600160e01b0316610f2e565b60005b6001600160e01b03169392505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610fc05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161088b565b610fcd338585840361165b565b5060019392505050565b600a546001600160a01b031633146110015760405162461bcd60e51b815260040161088b90612ebe565b61c3508111156110535760405162461bcd60e51b815260206004820152601e60248201527f7769746864726177616c2070656e616c747920697320746f6f20686967680000604482015260640161088b565b600e81905560405181907fa7d10353d34f5fe96bad91fa358f55fbea8ad6ee0d30924022d2b58e77f476e390600090a250565b60006107f333848461177f565b834211156110e35760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e61747572652065787069726564000000604482015260640161088b565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009061115d906111559060a00160405160208183030381529060405280519060200120611f8e565b858585611fdc565b905061116881612004565b86146111b65760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000604482015260640161088b565b6111c08188611e5a565b50505050505050565b600a546001600160a01b031633146111f35760405162461bcd60e51b815260040161088b90612ebe565b600d81905560405181907f9a8dc7fb9d13b0f5acaf673226d570d31ec15d8a813fceced1eb36ad11afebc590600090a250565b834211156112765760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161088b565b60007f00000000000000000000000000000000000000000000000000000000000000008888886112a58c612004565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061130082611f8e565b9050600061131082878787611fdc565b9050896001600160a01b0316816001600160a01b0316146113735760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161088b565b61137e8a8a8a61165b565b50505050505050505050565b600260095414156113ad5760405162461bcd60e51b815260040161088b90612ef3565b6002600955336000908152601060205260409020805442906114075760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015260640161088b565b8154600183015482101561144c576000620186a0600e54836114299190612f64565b6114339190612f42565b905061143e8161202c565b6114488183612f83565b9150505b600083600101819055508260000154600f600082825461146c9190612f83565b909155505060008355610b1533610b00565b61148d61044762015180612f64565b81565b60078110156114e15760405162461bcd60e51b815260206004820152601d60248201527f566f74696e67206c6f636b2063616e20626520372064617973206d696e000000604482015260640161088b565b6104478111156115335760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000604482015260640161088b565b610bd833600083611a4c565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff841690811061158357611583613027565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b600a546001600160a01b031633146115ed5760405162461bcd60e51b815260040161088b90612ebe565b6001600160a01b0381166116525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088b565b610bd881611f3c565b6001600160a01b0383166116bd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161088b565b6001600160a01b03821661171e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161088b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166117e35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161088b565b6001600160a01b0382166118455760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161088b565b6001600160a01b038316600090815260208190526040902054818110156118bd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161088b565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906118f4908490612f2a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161194091815260200190565b60405180910390a36119538484846120bb565b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614156119a857507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b60026009541415611a6f5760405162461bcd60e51b815260040161088b90612ef3565b60026009556001600160a01b038316600090815260106020526040812080546001820154919242929082611acd57611aa78787610e05565b8786559050611ab98662015180612f64565b611ac39085612f2a565b6001860155611c08565b85611aef57611adc87836108bd565b9050611ae88784612f2a565b8555611c08565b8615611b635760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f7420696e63726561736520616d6f756e7420616e6420657874656e60448201527f64206c6f636b20696e207468652073616d652074696d65000000000000000000606482015260840161088b565b611b6d8387610e05565b9050611b7c8662015180612f64565b611b869083612f2a565b6001860155611b9a61044762015180612f64565b848660010154611baa9190612f83565b1115611c085760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420657874656e64206c6f636b20746f206d6f7265207468616e206044820152663420796561727360c81b606482015260840161088b565b60008111611c4d5760405162461bcd60e51b81526020600482015260126024820152714e6f2062656e6566697420746f206c6f636b60701b604482015260640161088b565b8615611c6b57611c6b33600b546001600160a01b031690308a6120ed565b611c758882612125565b6001600160a01b03881660009081526011602052604081208054839290611c9d908490612f2a565b9250508190555086600f6000828254611cb69190612f2a565b90915550508454600186015460408051928352602083019190915281018590526001600160a01b038916907f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9060600160405180910390a250506001600955505050505050565b8154600090815b81811015611d81576000611d3882846121af565b905084868281548110611d4d57611d4d613027565b60009182526020909120015463ffffffff161115611d6d57809250611d7b565b611d78816001612f2a565b91505b50611d24565b8115611dc55784611d93600184612f83565b81548110611da357611da3613027565b60009182526020909120015464010000000090046001600160e01b0316611dc8565b60005b6001600160e01b031695945050505050565b611de482826121ca565b611953600861231f8361232b565b6040516001600160a01b038316602482015260448101829052611e5590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526124a4565b505050565b6001600160a01b038281166000818152600660208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611953828483612576565b600063ffffffff821115611f385760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161088b565b5090565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006107f7611f9b611959565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611fed878787876126b3565b91509150611ffa816127a0565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b600c546001600160a01b03161561205a57600c54600b54610bd8916001600160a01b03918216911683611df2565b600b54604051630852cd8d60e31b8152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b1580156120a057600080fd5b505af11580156120b4573d6000803e3d6000fd5b5050505050565b6001600160a01b03838116600090815260066020526040808220548584168352912054611e5592918216911683612576565b6040516001600160a01b03808516602483015283166044820152606481018290526119539085906323b872dd60e01b90608401611e1e565b61212f828261295b565b6002546001600160e01b0310156121a15760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b606482015260840161088b565b6119536008612a428361232b565b60006121be6002848418612f42565b6108a790848416612f2a565b6001600160a01b03821661222a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161088b565b6001600160a01b0382166000908152602081905260409020548181101561229e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161088b565b6001600160a01b03831660009081526020819052604081208383039055600280548492906122cd908490612f83565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611e55836000846120bb565b60006108a78284612f83565b8254600090819080156123765785612344600183612f83565b8154811061235457612354613027565b60009182526020909120015464010000000090046001600160e01b0316612379565b60005b6001600160e01b0316925061239283858763ffffffff16565b91506000811180156123d0575043866123ac600184612f83565b815481106123bc576123bc613027565b60009182526020909120015463ffffffff16145b15612430576123de82612a4e565b866123ea600184612f83565b815481106123fa576123fa613027565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555061249b565b85604051806040016040528061244543611ed3565b63ffffffff16815260200161245985612a4e565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b60006124f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ab79092919063ffffffff16565b805190915015611e5557808060200190518101906125179190612e12565b611e555760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161088b565b816001600160a01b0316836001600160a01b0316141580156125985750600081115b15611e55576001600160a01b03831615612626576001600160a01b038316600090815260076020526040812081906125d39061231f8561232b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161261b929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e55576001600160a01b0382166000908152600760205260408120819061265c90612a428561232b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516126a4929190918252602082015260400190565b60405180910390a25050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156126ea5750600090506003612797565b8460ff16601b1415801561270257508460ff16601c14155b156127135750600090506004612797565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612767573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661279057600060019250925050612797565b9150600090505b94509492505050565b60008160048111156127b4576127b4613011565b14156127bd5750565b60018160048111156127d1576127d1613011565b141561281f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161088b565b600281600481111561283357612833613011565b14156128815760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161088b565b600381600481111561289557612895613011565b14156128ee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161088b565b600481600481111561290257612902613011565b1415610bd85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161088b565b6001600160a01b0382166129b15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161088b565b80600260008282546129c39190612f2a565b90915550506001600160a01b038216600090815260208190526040812080548392906129f0908490612f2a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36109ad600083836120bb565b60006108a78284612f2a565b60006001600160e01b03821115611f385760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161088b565b6060612ac68484600085612ace565b949350505050565b606082471015612b2f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161088b565b843b612b7d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161088b565b600080866001600160a01b03168587604051612b999190612e6f565b60006040518083038185875af1925050503d8060008114612bd6576040519150601f19603f3d011682016040523d82523d6000602084013e612bdb565b606091505b5091509150612beb828286612bf6565b979650505050505050565b60608315612c055750816108a7565b825115612c155782518084602001fd5b8160405162461bcd60e51b815260040161088b9190612e8b565b80356001600160a01b0381168114612c4657600080fd5b919050565b803560ff81168114612c4657600080fd5b600060208284031215612c6e57600080fd5b6108a782612c2f565b60008060408385031215612c8a57600080fd5b612c9383612c2f565b9150612ca160208401612c2f565b90509250929050565b600080600060608486031215612cbf57600080fd5b612cc884612c2f565b9250612cd660208501612c2f565b9150604084013590509250925092565b600080600080600080600060e0888a031215612d0157600080fd5b612d0a88612c2f565b9650612d1860208901612c2f565b95506040880135945060608801359350612d3460808901612c4b565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d6357600080fd5b612d6c83612c2f565b946020939093013593505050565b60008060008060008060c08789031215612d9357600080fd5b612d9c87612c2f565b95506020870135945060408701359350612db860608801612c4b565b92506080870135915060a087013590509295509295509295565b60008060408385031215612de557600080fd5b612dee83612c2f565b9150602083013563ffffffff81168114612e0757600080fd5b809150509250929050565b600060208284031215612e2457600080fd5b815180151581146108a757600080fd5b600060208284031215612e4657600080fd5b5035919050565b60008060408385031215612e6057600080fd5b50508035926020909101359150565b60008251612e81818460208701612f9a565b9190910192915050565b6020815260008251806020840152612eaa816040850160208701612f9a565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612f3d57612f3d612ffb565b500190565b600082612f5f57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612f7e57612f7e612ffb565b500290565b600082821015612f9557612f95612ffb565b500390565b60005b83811015612fb5578181015183820152602001612f9d565b838111156119535750506000910152565b600181811c90821680612fda57607f821691505b6020821081141561202657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea264697066735822122071d1c8e09ad43c8df857c62438c82cd6ef2834834463d4fdb02aa90afe1327cf64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000041bfba56b9ba48d0a83775d89c247180617266bc00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000011566f746520457363726f7765642053475400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057665534754000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c80636fcfff451161019d578063aaf5eb68116100e9578063d505accf116100a2578063ee00ef3a1161007c578063ee00ef3a146106e9578063eff7a612146106f1578063f1127ed814610704578063f2fde38b1461074157600080fd5b8063d505accf14610695578063db2e21bc146106a8578063dd62ed3e146106b057600080fd5b8063aaf5eb68146105f4578063adc63589146105fe578063ae6ef65f1461062a578063c3cda52014610633578063cbf9fe5f14610646578063d08a12ff1461068257600080fd5b80638e539e8c11610156578063a25b39b711610130578063a25b39b7146105b2578063a457c2d7146105bb578063a8a4a376146105ce578063a9059cbb146105e157600080fd5b80638e539e8c1461058457806395d89b41146105975780639ab24eb01461059f57600080fd5b80636fcfff45146104f457806370a082311461051c578063715018a61461054557806373426cff1461054d5780637ecebe00146105605780638da5cb5b1461057357600080fd5b8063313ce5671161025c5780633ccfd60b11610215578063587cde1e116101ef578063587cde1e1461048f5780635b7d8f05146104bb5780635c19a95c146104ce57806365fc3873146104e157600080fd5b80633ccfd60b1461046b57806344df8e70146104735780634957677c1461047c57600080fd5b8063313ce567146104065780633644e5151461041557806338b4321b1461041d57806339509351146104305780633a46273e146104435780633a46b1a81461045857600080fd5b8063113f6653116102ae578063113f6653146103a65780631767c433146103c657806318160ddd146103cf5780632060176b146103d757806323b872dd146103e0578063308097b2146103f357600080fd5b80630193512b146102f6578063047fc9aa1461033257806306fdde031461033b578063095ea7b3146103505780630f45cc81146103735780630f51c09c1461039e575b600080fd5b61031f610304366004612c5c565b6001600160a01b031660009081526010602052604090205490565b6040519081526020015b60405180910390f35b61031f600f5481565b610343610754565b6040516103299190612e8b565b61036361035e366004612d50565b6107e6565b6040519015158152602001610329565b600b54610386906001600160a01b031681565b6040516001600160a01b039091168152602001610329565b61031f600781565b61031f6103b4366004612c5c565b60116020526000908152604090205481565b61031f61044781565b60025461031f565b61031f61c35081565b6103636103ee366004612caa565b6107fd565b600c54610386906001600160a01b031681565b60405160128152602001610329565b61031f6108ae565b61031f61042b366004612e4d565b6108bd565b61036361043e366004612d50565b61092a565b610456610451366004612d50565b610966565b005b61031f610466366004612d50565b6109b1565b610456610a24565b61038661dead81565b61045661048a366004612e34565b610b83565b61038661049d366004612c5c565b6001600160a01b039081166000908152600660205260409020541690565b6104566104c9366004612c5c565b610bdb565b6104566104dc366004612c5c565b610c4f565b6104566104ef366004612e4d565b610c59565b610507610502366004612c5c565b610dad565b60405163ffffffff9091168152602001610329565b61031f61052a366004612c5c565b6001600160a01b031660009081526020819052604090205490565b610456610dcf565b61031f61055b366004612e4d565b610e05565b61031f61056e366004612c5c565b610e2e565b600a546001600160a01b0316610386565b61031f610592366004612e34565b610e4c565b610343610ea8565b61031f6105ad366004612c5c565b610eb7565b61031f600d5481565b6103636105c9366004612d50565b610f3e565b6104566105dc366004612e34565b610fd7565b6103636105ef366004612d50565b611086565b61031f620186a081565b61031f61060c366004612c5c565b6001600160a01b031660009081526010602052604090206001015490565b61031f600e5481565b610456610641366004612d7a565b611093565b61066d610654366004612c5c565b6010602052600090815260409020805460019091015482565b60408051928352602083019190915201610329565b610456610690366004612e34565b6111c9565b6104566106a3366004612ce6565b611226565b61045661138a565b61031f6106be366004612c77565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61031f61147e565b6104566106ff366004612e34565b611490565b610717610712366004612dd2565b61153f565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610329565b61045661074f366004612c5c565b6115c3565b60606003805461076390612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461078f90612fc6565b80156107dc5780601f106107b1576101008083540402835291602001916107dc565b820191906000526020600020905b8154815290600101906020018083116107bf57829003601f168201915b5050505050905090565b60006107f333848461165b565b5060015b92915050565b600061080a84848461177f565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156108945760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6108a1853385840361165b565b60019150505b9392505050565b60006108b8611959565b905090565b6000428083116108d15760009150506107f7565b60006108dd8285612f83565b90506108ee61044762015180612f64565b81106108fe5784925050506107f7565b61090d61044762015180612f64565b6109178287612f64565b6109219190612f42565b95945050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107f3918590610961908690612f2a565b61165b565b600d548110156109a15760405162461bcd60e51b8152602060048201526006602482015265056453a564c360d41b604482015260640161088b565b6109ad82826000611a4c565b5050565b6000438210610a025760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400604482015260640161088b565b6001600160a01b03831660009081526007602052604090206108a79083611d1d565b60026009541415610a475760405162461bcd60e51b815260040161088b90612ef3565b600260095533600090815260106020526040902080544290610aa15760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015260640161088b565b8160010154811015610aee5760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b604482015260640161088b565b81546000600184018190558355610b15335b33600090815260116020526040902054611dda565b33600081815260116020526040812055600b54610b3e916001600160a01b039091169083611df2565b604080518281526020810184905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a25050600160095550565b600d54811015610bcc5760405162461bcd60e51b81526020600482015260146024820152731b195cdcc81d1a185b881b5a5b88185b5bdd5b9d60621b604482015260640161088b565b610bd833826000611a4c565b50565b600a546001600160a01b03163314610c055760405162461bcd60e51b815260040161088b90612ebe565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f2541601c97bce42b47813f2be715ba4eb0a571f2aafaf35cda2054137d9a79af90600090a250565b610bd83382611e5a565b600d54821015610ca25760405162461bcd60e51b81526020600482015260146024820152731b195cdcc81d1a185b881b5a5b88185b5bdd5b9d60621b604482015260640161088b565b3360009081526010602052604090205415610cff5760405162461bcd60e51b815260206004820152601960248201527f5769746864726177206f6c6420746f6b656e7320666972737400000000000000604482015260640161088b565b6007811015610d505760405162461bcd60e51b815260206004820152601d60248201527f566f74696e67206c6f636b2063616e20626520372064617973206d696e000000604482015260640161088b565b610447811115610da25760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000604482015260640161088b565b6109ad338383611a4c565b6001600160a01b0381166000908152600760205260408120546107f790611ed3565b600a546001600160a01b03163314610df95760405162461bcd60e51b815260040161088b90612ebe565b610e036000611f3c565b565b60006104478210610e175750816107f7565b610447610e248385612f64565b6108a79190612f42565b6001600160a01b0381166000908152600560205260408120546107f7565b6000438210610e9d5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400604482015260640161088b565b6107f7600883611d1d565b60606004805461076390612fc6565b6001600160a01b0381166000908152600760205260408120548015610f2b576001600160a01b0383166000908152600760205260409020610ef9600183612f83565b81548110610f0957610f09613027565b60009182526020909120015464010000000090046001600160e01b0316610f2e565b60005b6001600160e01b03169392505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610fc05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161088b565b610fcd338585840361165b565b5060019392505050565b600a546001600160a01b031633146110015760405162461bcd60e51b815260040161088b90612ebe565b61c3508111156110535760405162461bcd60e51b815260206004820152601e60248201527f7769746864726177616c2070656e616c747920697320746f6f20686967680000604482015260640161088b565b600e81905560405181907fa7d10353d34f5fe96bad91fa358f55fbea8ad6ee0d30924022d2b58e77f476e390600090a250565b60006107f333848461177f565b834211156110e35760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e61747572652065787069726564000000604482015260640161088b565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009061115d906111559060a00160405160208183030381529060405280519060200120611f8e565b858585611fdc565b905061116881612004565b86146111b65760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000604482015260640161088b565b6111c08188611e5a565b50505050505050565b600a546001600160a01b031633146111f35760405162461bcd60e51b815260040161088b90612ebe565b600d81905560405181907f9a8dc7fb9d13b0f5acaf673226d570d31ec15d8a813fceced1eb36ad11afebc590600090a250565b834211156112765760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161088b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112a58c612004565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061130082611f8e565b9050600061131082878787611fdc565b9050896001600160a01b0316816001600160a01b0316146113735760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161088b565b61137e8a8a8a61165b565b50505050505050505050565b600260095414156113ad5760405162461bcd60e51b815260040161088b90612ef3565b6002600955336000908152601060205260409020805442906114075760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015260640161088b565b8154600183015482101561144c576000620186a0600e54836114299190612f64565b6114339190612f42565b905061143e8161202c565b6114488183612f83565b9150505b600083600101819055508260000154600f600082825461146c9190612f83565b909155505060008355610b1533610b00565b61148d61044762015180612f64565b81565b60078110156114e15760405162461bcd60e51b815260206004820152601d60248201527f566f74696e67206c6f636b2063616e20626520372064617973206d696e000000604482015260640161088b565b6104478111156115335760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000604482015260640161088b565b610bd833600083611a4c565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff841690811061158357611583613027565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b600a546001600160a01b031633146115ed5760405162461bcd60e51b815260040161088b90612ebe565b6001600160a01b0381166116525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088b565b610bd881611f3c565b6001600160a01b0383166116bd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161088b565b6001600160a01b03821661171e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161088b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166117e35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161088b565b6001600160a01b0382166118455760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161088b565b6001600160a01b038316600090815260208190526040902054818110156118bd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161088b565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906118f4908490612f2a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161194091815260200190565b60405180910390a36119538484846120bb565b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000014614156119a857507fcef776c95bc17f36b2c6a59b8871f056f10d7d6fc6b1ce44db7ab1a4b12c47e490565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f12412b41c3eda451006455fd210817cb7010af150fafd4ea19ebde6ba77e9523828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b60026009541415611a6f5760405162461bcd60e51b815260040161088b90612ef3565b60026009556001600160a01b038316600090815260106020526040812080546001820154919242929082611acd57611aa78787610e05565b8786559050611ab98662015180612f64565b611ac39085612f2a565b6001860155611c08565b85611aef57611adc87836108bd565b9050611ae88784612f2a565b8555611c08565b8615611b635760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f7420696e63726561736520616d6f756e7420616e6420657874656e60448201527f64206c6f636b20696e207468652073616d652074696d65000000000000000000606482015260840161088b565b611b6d8387610e05565b9050611b7c8662015180612f64565b611b869083612f2a565b6001860155611b9a61044762015180612f64565b848660010154611baa9190612f83565b1115611c085760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420657874656e64206c6f636b20746f206d6f7265207468616e206044820152663420796561727360c81b606482015260840161088b565b60008111611c4d5760405162461bcd60e51b81526020600482015260126024820152714e6f2062656e6566697420746f206c6f636b60701b604482015260640161088b565b8615611c6b57611c6b33600b546001600160a01b031690308a6120ed565b611c758882612125565b6001600160a01b03881660009081526011602052604081208054839290611c9d908490612f2a565b9250508190555086600f6000828254611cb69190612f2a565b90915550508454600186015460408051928352602083019190915281018590526001600160a01b038916907f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9060600160405180910390a250506001600955505050505050565b8154600090815b81811015611d81576000611d3882846121af565b905084868281548110611d4d57611d4d613027565b60009182526020909120015463ffffffff161115611d6d57809250611d7b565b611d78816001612f2a565b91505b50611d24565b8115611dc55784611d93600184612f83565b81548110611da357611da3613027565b60009182526020909120015464010000000090046001600160e01b0316611dc8565b60005b6001600160e01b031695945050505050565b611de482826121ca565b611953600861231f8361232b565b6040516001600160a01b038316602482015260448101829052611e5590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526124a4565b505050565b6001600160a01b038281166000818152600660208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611953828483612576565b600063ffffffff821115611f385760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161088b565b5090565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006107f7611f9b611959565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611fed878787876126b3565b91509150611ffa816127a0565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b600c546001600160a01b03161561205a57600c54600b54610bd8916001600160a01b03918216911683611df2565b600b54604051630852cd8d60e31b8152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b1580156120a057600080fd5b505af11580156120b4573d6000803e3d6000fd5b5050505050565b6001600160a01b03838116600090815260066020526040808220548584168352912054611e5592918216911683612576565b6040516001600160a01b03808516602483015283166044820152606481018290526119539085906323b872dd60e01b90608401611e1e565b61212f828261295b565b6002546001600160e01b0310156121a15760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b606482015260840161088b565b6119536008612a428361232b565b60006121be6002848418612f42565b6108a790848416612f2a565b6001600160a01b03821661222a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161088b565b6001600160a01b0382166000908152602081905260409020548181101561229e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161088b565b6001600160a01b03831660009081526020819052604081208383039055600280548492906122cd908490612f83565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611e55836000846120bb565b60006108a78284612f83565b8254600090819080156123765785612344600183612f83565b8154811061235457612354613027565b60009182526020909120015464010000000090046001600160e01b0316612379565b60005b6001600160e01b0316925061239283858763ffffffff16565b91506000811180156123d0575043866123ac600184612f83565b815481106123bc576123bc613027565b60009182526020909120015463ffffffff16145b15612430576123de82612a4e565b866123ea600184612f83565b815481106123fa576123fa613027565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555061249b565b85604051806040016040528061244543611ed3565b63ffffffff16815260200161245985612a4e565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b60006124f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ab79092919063ffffffff16565b805190915015611e5557808060200190518101906125179190612e12565b611e555760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161088b565b816001600160a01b0316836001600160a01b0316141580156125985750600081115b15611e55576001600160a01b03831615612626576001600160a01b038316600090815260076020526040812081906125d39061231f8561232b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161261b929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e55576001600160a01b0382166000908152600760205260408120819061265c90612a428561232b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516126a4929190918252602082015260400190565b60405180910390a25050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156126ea5750600090506003612797565b8460ff16601b1415801561270257508460ff16601c14155b156127135750600090506004612797565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612767573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661279057600060019250925050612797565b9150600090505b94509492505050565b60008160048111156127b4576127b4613011565b14156127bd5750565b60018160048111156127d1576127d1613011565b141561281f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161088b565b600281600481111561283357612833613011565b14156128815760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161088b565b600381600481111561289557612895613011565b14156128ee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161088b565b600481600481111561290257612902613011565b1415610bd85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161088b565b6001600160a01b0382166129b15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161088b565b80600260008282546129c39190612f2a565b90915550506001600160a01b038216600090815260208190526040812080548392906129f0908490612f2a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36109ad600083836120bb565b60006108a78284612f2a565b60006001600160e01b03821115611f385760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161088b565b6060612ac68484600085612ace565b949350505050565b606082471015612b2f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161088b565b843b612b7d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161088b565b600080866001600160a01b03168587604051612b999190612e6f565b60006040518083038185875af1925050503d8060008114612bd6576040519150601f19603f3d011682016040523d82523d6000602084013e612bdb565b606091505b5091509150612beb828286612bf6565b979650505050505050565b60608315612c055750816108a7565b825115612c155782518084602001fd5b8160405162461bcd60e51b815260040161088b9190612e8b565b80356001600160a01b0381168114612c4657600080fd5b919050565b803560ff81168114612c4657600080fd5b600060208284031215612c6e57600080fd5b6108a782612c2f565b60008060408385031215612c8a57600080fd5b612c9383612c2f565b9150612ca160208401612c2f565b90509250929050565b600080600060608486031215612cbf57600080fd5b612cc884612c2f565b9250612cd660208501612c2f565b9150604084013590509250925092565b600080600080600080600060e0888a031215612d0157600080fd5b612d0a88612c2f565b9650612d1860208901612c2f565b95506040880135945060608801359350612d3460808901612c4b565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d6357600080fd5b612d6c83612c2f565b946020939093013593505050565b60008060008060008060c08789031215612d9357600080fd5b612d9c87612c2f565b95506020870135945060408701359350612db860608801612c4b565b92506080870135915060a087013590509295509295509295565b60008060408385031215612de557600080fd5b612dee83612c2f565b9150602083013563ffffffff81168114612e0757600080fd5b809150509250929050565b600060208284031215612e2457600080fd5b815180151581146108a757600080fd5b600060208284031215612e4657600080fd5b5035919050565b60008060408385031215612e6057600080fd5b50508035926020909101359150565b60008251612e81818460208701612f9a565b9190910192915050565b6020815260008251806020840152612eaa816040850160208701612f9a565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612f3d57612f3d612ffb565b500190565b600082612f5f57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612f7e57612f7e612ffb565b500290565b600082821015612f9557612f95612ffb565b500390565b60005b83811015612fb5578181015183820152602001612f9d565b838111156119535750506000910152565b600181811c90821680612fda57607f821691505b6020821081141561202657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea264697066735822122071d1c8e09ad43c8df857c62438c82cd6ef2834834463d4fdb02aa90afe1327cf64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000041bfba56b9ba48d0a83775d89c247180617266bc00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000011566f746520457363726f7765642053475400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057665534754000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Vote Escrowed SGT
Arg [1] : _symbol (string): veSGT
Arg [2] : _lockedToken (address): 0x41bFBa56B9Ba48D0a83775d89c247180617266bc
Arg [3] : _minLockedAmount (uint256): 100
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 00000000000000000000000041bfba56b9ba48d0a83775d89c247180617266bc
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [5] : 566f746520457363726f77656420534754000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 7665534754000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
75767:8389:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80727:113;;;;;;:::i;:::-;-1:-1:-1;;;;;80812:13:0;80785:7;80812:13;;;:6;:13;;;;;:20;;80727:113;;;;5504:25:1;;;5492:2;5477:18;80727:113:0;;;;;;;;76429:30;;;;;;6555:100;;;:::i;:::-;;;;;;;:::i;8722:169::-;;;;;;:::i;:::-;;:::i;:::-;;;5331:14:1;;5324:22;5306:41;;5294:2;5279:18;8722:169:0;5166:187:1;76273:26:0;;;;;-1:-1:-1;;;;;76273:26:0;;;;;;-1:-1:-1;;;;;4463:32:1;;;4445:51;;4433:2;4418:18;76273:26:0;4299:203:1;75980:35:0;;76014:1;75980:35;;76522:48;;;;;;:::i;:::-;;;;;;;;;;;;;;76022:41;;76056:7;76022:41;;7675:108;7763:12;;7675:108;;76140:54;;76189:5;76140:54;;9373:492;;;;;;:::i;:::-;;:::i;76306:31::-;;;;;-1:-1:-1;;;;;76306:31:0;;;7517:93;;;7600:2;24132:36:1;;24120:2;24105:18;7517:93:0;23990:184:1;49526:115:0;;;:::i;80967:382::-;;;;;;:::i;:::-;;:::i;10274:215::-;;;;;;:::i;:::-;;:::i;77401:174::-;;;;;;:::i;:::-;;:::i;:::-;;62553:251;;;;;;:::i;:::-;;:::i;78467:609::-;;;:::i;76577:73::-;;76608:42;76577:73;;78010:184;;;;;;:::i;:::-;;:::i;61953:119::-;;;;;;:::i;:::-;-1:-1:-1;;;;;62045:19:0;;;62018:7;62045:19;;;:10;:19;;;;;;;;61953:119;80519:148;;;;;;:::i;:::-;;:::i;64992:112::-;;;;;;:::i;:::-;;:::i;77583:419::-;;;;;;:::i;:::-;;:::i;61709:151::-;;;;;;:::i;:::-;;:::i;:::-;;;23967:10:1;23955:23;;;23937:42;;23925:2;23910:18;61709:151:0;23793:192:1;7846:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;7947:18:0;7920:7;7947:18;;;;;;;;;;;;7846:127;70818:94;;;:::i;81357:219::-;;;;;;:::i;:::-;;:::i;49268:128::-;;;;;;:::i;:::-;;:::i;70167:87::-;70240:6;;-1:-1:-1;;;;;70240:6:0;70167:87;;63093:242;;;;;;:::i;:::-;;:::i;6774:104::-;;;:::i;62156:195::-;;;;;;:::i;:::-;;:::i;76344:30::-;;;;;;10992:413;;;;;;:::i;:::-;;:::i;80168:343::-;;;;;;:::i;:::-;;:::i;8186:175::-;;;;;;:::i;:::-;;:::i;76208:42::-;;76244:6;76208:42;;80848:111;;;;;;:::i;:::-;-1:-1:-1;;;;;80934:13:0;80907:7;80934:13;;;:6;:13;;;;;:17;;;;80848:111;76381:39;;;;;;65186:589;;;;;;:::i;:::-;;:::i;76468:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;23390:25:1;;;23446:2;23431:18;;23424:34;;;;23363:18;76468:47:0;23216:248:1;79982:178:0;;;;;;:::i;:::-;;:::i;48557:645::-;;;;;;:::i;:::-;;:::i;79144:774::-;;;:::i;8424:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8540:18:0;;;8513:7;8540:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8424:151;76072:50;;;:::i;78202:257::-;;;;;;:::i;:::-;;:::i;61479:150::-;;;;;;:::i;:::-;;:::i;:::-;;;;22907:13:1;;22922:10;22903:30;22885:49;;22994:4;22982:17;;;22976:24;-1:-1:-1;;;;;22972:50:1;22950:20;;;22943:80;;;;22858:18;61479:150:0;22683:346:1;71067:192:0;;;;;;:::i;:::-;;:::i;6555:100::-;6609:13;6642:5;6635:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6555:100;:::o;8722:169::-;8805:4;8822:39;4324:10;8845:7;8854:6;8822:8;:39::i;:::-;-1:-1:-1;8879:4:0;8722:169;;;;;:::o;9373:492::-;9513:4;9530:36;9540:6;9548:9;9559:6;9530:9;:36::i;:::-;-1:-1:-1;;;;;9606:19:0;;9579:24;9606:19;;;:11;:19;;;;;;;;4324:10;9606:33;;;;;;;;9658:26;;;;9650:79;;;;-1:-1:-1;;;9650:79:0;;14964:2:1;9650:79:0;;;14946:21:1;15003:2;14983:18;;;14976:30;15042:34;15022:18;;;15015:62;-1:-1:-1;;;15093:18:1;;;15086:38;15141:19;;9650:79:0;;;;;;;;;9765:57;9774:6;4324:10;9815:6;9796:16;:25;9765:8;:57::i;:::-;9853:4;9846:11;;;9373:492;;;;;;:::o;49526:115::-;49586:7;49613:20;:18;:20::i;:::-;49606:27;;49526:115;:::o;80967:382::-;81059:7;81094:15;81124:19;;;81120:33;;81152:1;81145:8;;;;;81120:33;81164:22;81189:18;81203:4;81189:11;:18;:::i;:::-;81164:43;-1:-1:-1;76106:16:0;76056:7;76116:6;76106:16;:::i;:::-;81222:14;:25;81218:71;;81271:6;81264:13;;;;;;81218:71;76106:16;76056:7;76116:6;76106:16;:::i;:::-;81307:23;81316:14;81307:6;:23;:::i;:::-;81306:35;;;;:::i;:::-;81299:42;80967:382;-1:-1:-1;;;;;80967:382:0:o;10274:215::-;4324:10;10362:4;10411:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10411:34:0;;;;;;;;;;10362:4;;10379:80;;10402:7;;10411:47;;10448:10;;10411:47;:::i;:::-;10379:8;:80::i;77401:174::-;77500:15;;77490:6;:25;;77482:44;;;;-1:-1:-1;;;77482:44:0;;21074:2:1;77482:44:0;;;21056:21:1;21113:1;21093:18;;;21086:29;-1:-1:-1;;;21131:18:1;;;21124:36;21177:18;;77482:44:0;20872:329:1;77482:44:0;77537:30;77550:5;77557:6;77565:1;77537:12;:30::i;:::-;77401:174;;:::o;62553:251::-;62634:7;62676:12;62662:11;:26;62654:70;;;;-1:-1:-1;;;62654:70:0;;8802:2:1;62654:70:0;;;8784:21:1;8841:2;8821:18;;;8814:30;8880:33;8860:18;;;8853:61;8931:18;;62654:70:0;8600:355:1;62654:70:0;-1:-1:-1;;;;;62761:21:0;;;;;;:12;:21;;;;;62742:54;;62784:11;62742:18;:54::i;78467:609::-;73224:1;73820:7;;:19;;73812:63;;;;-1:-1:-1;;;73812:63:0;;;;;;;:::i;:::-;73224:1;73953:7;:18;4324:10;78529:29:::1;78561:20:::0;;;:6:::1;:20;::::0;;;;78641:14;;78607:15:::1;::::0;78633:50:::1;;;::::0;-1:-1:-1;;;78633:50:0;;10637:2:1;78633:50:0::1;::::0;::::1;10619:21:1::0;10676:2;10656:18;;;10649:30;-1:-1:-1;;;10695:18:1;;;10688:49;10754:18;;78633:50:0::1;10435:343:1::0;78633:50:0::1;78710:7;:11;;;78702:4;:19;;78694:54;;;::::0;-1:-1:-1;;;78694:54:0;;22534:2:1;78694:54:0::1;::::0;::::1;22516:21:1::0;22573:2;22553:18;;;22546:30;-1:-1:-1;;;22592:18:1;;;22585:52;22654:18;;78694:54:0::1;22332:346:1::0;78694:54:0::1;78777:14:::0;;78759:15:::1;78802:11;::::0;::::1;:15:::0;;;78828:18;;78857:48:::1;4324:10:::0;78863:12:::1;4324:10:::0;78877:27:::1;::::0;;;:13:::1;:27;::::0;;;;;78857:5:::1;:48::i;:::-;4324:10:::0;78946:1:::1;78916:27:::0;;;:13:::1;:27;::::0;;;;:31;78965:11:::1;::::0;78958:55:::1;::::0;-1:-1:-1;;;;;78965:11:0;;::::1;::::0;79005:7;78958:32:::1;:55::i;:::-;79031:37;::::0;;23390:25:1;;;23446:2;23431:18;;23424:34;;;4324:10:0;;79031:37:::1;::::0;23363:18:1;79031:37:0::1;;;;;;;-1:-1:-1::0;;73180:1:0;74132:7;:22;-1:-1:-1;78467:609:0:o;78010:184::-;78098:15;;78088:6;:25;;78080:58;;;;-1:-1:-1;;;78080:58:0;;19967:2:1;78080:58:0;;;19949:21:1;20006:2;19986:18;;;19979:30;-1:-1:-1;;;20025:18:1;;;20018:50;20085:18;;78080:58:0;19765:344:1;78080:58:0;78149:37;4324:10;78176:6;78184:1;78149:12;:37::i;:::-;78010:184;:::o;80519:148::-;70240:6;;-1:-1:-1;;;;;70240:6:0;4324:10;70387:23;70379:68;;;;-1:-1:-1;;;70379:68:0;;;;;;;:::i;:::-;80593:16:::1;:24:::0;;-1:-1:-1;;;;;;80593:24:0::1;-1:-1:-1::0;;;;;80593:24:0;::::1;::::0;;::::1;::::0;;;80633:26:::1;::::0;::::1;::::0;-1:-1:-1;;80633:26:0::1;80519:148:::0;:::o;64992:112::-;65062:34;4324:10;65086:9;65062;:34::i;77583:419::-;77682:15;;77672:6;:25;;77664:58;;;;-1:-1:-1;;;77664:58:0;;19967:2:1;77664:58:0;;;19949:21:1;20006:2;19986:18;;;19979:30;-1:-1:-1;;;20025:18:1;;;20018:50;20085:18;;77664:58:0;19765:344:1;77664:58:0;4324:10;77741:20;;;;:6;:20;;;;;:27;:32;77733:70;;;;-1:-1:-1;;;77733:70:0;;16918:2:1;77733:70:0;;;16900:21:1;16957:2;16937:18;;;16930:30;16996:27;16976:18;;;16969:55;17041:18;;77733:70:0;16716:349:1;77733:70:0;76014:1;77822:5;:16;;77814:58;;;;-1:-1:-1;;;77814:58:0;;18439:2:1;77814:58:0;;;18421:21:1;18478:2;18458:18;;;18451:30;18517:31;18497:18;;;18490:59;18566:18;;77814:58:0;18237:353:1;77814:58:0;76056:7;77891:5;:16;;77883:59;;;;-1:-1:-1;;;77883:59:0;;15790:2:1;77883:59:0;;;15772:21:1;15829:2;15809:18;;;15802:30;15868:32;15848:18;;;15841:60;15918:18;;77883:59:0;15588:354:1;77883:59:0;77953:41;4324:10;77980:6;77988:5;77953:12;:41::i;61709:151::-;-1:-1:-1;;;;;61823:21:0;;61779:6;61823:21;;;:12;:21;;;;;:28;61805:47;;:17;:47::i;70818:94::-;70240:6;;-1:-1:-1;;;;;70240:6:0;4324:10;70387:23;70379:68;;;;-1:-1:-1;;;70379:68:0;;;;;;;:::i;:::-;70883:21:::1;70901:1;70883:9;:21::i;:::-;70818:94::o:0;81357:219::-;81443:7;76056;81467:5;:16;81463:62;;-1:-1:-1;81507:6:0;81500:13;;81463:62;76056:7;81543:14;81552:5;81543:6;:14;:::i;:::-;81542:26;;;;:::i;49268:128::-;-1:-1:-1;;;;;49364:14:0;;49337:7;49364:14;;;:7;:14;;;;;46654;49364:24;46562:114;63093:242;63163:7;63205:12;63191:11;:26;63183:70;;;;-1:-1:-1;;;63183:70:0;;8802:2:1;63183:70:0;;;8784:21:1;8841:2;8821:18;;;8814:30;8880:33;8860:18;;;8853:61;8931:18;;63183:70:0;8600:355:1;63183:70:0;63271:56;63290:23;63315:11;63271:18;:56::i;6774:104::-;6830:13;6863:7;6856:14;;;;;:::i;62156:195::-;-1:-1:-1;;;;;62246:21:0;;62212:7;62246:21;;;:12;:21;;;;;:28;62292:8;;:51;;-1:-1:-1;;;;;62307:21:0;;;;;;:12;:21;;;;;62329:7;62335:1;62329:3;:7;:::i;:::-;62307:30;;;;;;;;:::i;:::-;;;;;;;;;;:36;;;;-1:-1:-1;;;;;62307:36:0;62292:51;;;62303:1;62292:51;-1:-1:-1;;;;;62285:58:0;;62156:195;-1:-1:-1;;;62156:195:0:o;10992:413::-;4324:10;11085:4;11129:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11129:34:0;;;;;;;;;;11182:35;;;;11174:85;;;;-1:-1:-1;;;11174:85:0;;21768:2:1;11174:85:0;;;21750:21:1;21807:2;21787:18;;;21780:30;21846:34;21826:18;;;21819:62;-1:-1:-1;;;21897:18:1;;;21890:35;21942:19;;11174:85:0;21566:401:1;11174:85:0;11295:67;4324:10;11318:7;11346:15;11327:16;:34;11295:8;:67::i;:::-;-1:-1:-1;11393:4:0;;10992:413;-1:-1:-1;;;10992:413:0:o;80168:343::-;70240:6;;-1:-1:-1;;;;;70240:6:0;4324:10;70387:23;70379:68;;;;-1:-1:-1;;;70379:68:0;;;;;;;:::i;:::-;76189:5:::1;80278:25;:51;;80270:94;;;::::0;-1:-1:-1;;;80270:94:0;;17272:2:1;80270:94:0::1;::::0;::::1;17254:21:1::0;17311:2;17291:18;;;17284:30;17350:32;17330:18;;;17323:60;17400:18;;80270:94:0::1;17070:354:1::0;80270:94:0::1;80385:24;:52:::0;;;80453:50:::1;::::0;80412:25;;80453:50:::1;::::0;;;::::1;80168:343:::0;:::o;8186:175::-;8272:4;8289:42;4324:10;8313:9;8324:6;8289:9;:42::i;65186:589::-;65404:6;65385:15;:25;;65377:67;;;;-1:-1:-1;;;65377:67:0;;9162:2:1;65377:67:0;;;9144:21:1;9201:2;9181:18;;;9174:30;9240:31;9220:18;;;9213:59;9289:18;;65377:67:0;8960:353:1;65377:67:0;65527:58;;;60730:71;65527:58;;;6367:25:1;-1:-1:-1;;;;;6428:32:1;;6408:18;;;6401:60;;;;6477:18;;;6470:34;;;6520:18;;;6513:34;;;65455:14:0;;65472:174;;65500:87;;6339:19:1;;65527:58:0;;;;;;;;;;;;65517:69;;;;;;65500:16;:87::i;:::-;65602:1;65618;65634;65472:13;:174::i;:::-;65455:191;;65674:17;65684:6;65674:9;:17::i;:::-;65665:5;:26;65657:64;;;;-1:-1:-1;;;65657:64:0;;10283:2:1;65657:64:0;;;10265:21:1;10322:2;10302:18;;;10295:30;10361:27;10341:18;;;10334:55;10406:18;;65657:64:0;10081:349:1;65657:64:0;65739:28;65749:6;65757:9;65739;:28::i;:::-;65732:35;65186:589;;;;;;:::o;79982:178::-;70240:6;;-1:-1:-1;;;;;70240:6:0;4324:10;70387:23;70379:68;;;;-1:-1:-1;;;70379:68:0;;;;;;;:::i;:::-;80066:15:::1;:34:::0;;;80116:36:::1;::::0;80084:16;;80116:36:::1;::::0;;;::::1;79982:178:::0;:::o;48557:645::-;48801:8;48782:15;:27;;48774:69;;;;-1:-1:-1;;;48774:69:0;;11795:2:1;48774:69:0;;;11777:21:1;11834:2;11814:18;;;11807:30;11873:31;11853:18;;;11846:59;11922:18;;48774:69:0;11593:353:1;48774:69:0;48856:18;48898:16;48916:5;48923:7;48932:5;48939:16;48949:5;48939:9;:16::i;:::-;48887:79;;;;;;5827:25:1;;;;-1:-1:-1;;;;;5926:15:1;;;5906:18;;;5899:43;5978:15;;;;5958:18;;;5951:43;6010:18;;;6003:34;6053:19;;;6046:35;6097:19;;;6090:35;;;5799:19;;48887:79:0;;;;;;;;;;;;48877:90;;;;;;48856:111;;48980:12;48995:28;49012:10;48995:16;:28::i;:::-;48980:43;;49036:14;49053:28;49067:4;49073:1;49076;49079;49053:13;:28::i;:::-;49036:45;;49110:5;-1:-1:-1;;;;;49100:15:0;:6;-1:-1:-1;;;;;49100:15:0;;49092:58;;;;-1:-1:-1;;;49092:58:0;;14605:2:1;49092:58:0;;;14587:21:1;14644:2;14624:18;;;14617:30;14683:32;14663:18;;;14656:60;14733:18;;49092:58:0;14403:354:1;49092:58:0;49163:31;49172:5;49179:7;49188:5;49163:8;:31::i;:::-;48763:439;;;48557:645;;;;;;;:::o;79144:774::-;73224:1;73820:7;;:19;;73812:63;;;;-1:-1:-1;;;73812:63:0;;;;;;;:::i;:::-;73224:1;73953:7;:18;4324:10;79206:29:::1;79238:20:::0;;;:6:::1;:20;::::0;;;;79318:14;;79284:15:::1;::::0;79310:50:::1;;;::::0;-1:-1:-1;;;79310:50:0;;10637:2:1;79310:50:0::1;::::0;::::1;10619:21:1::0;10676:2;10656:18;;;10649:30;-1:-1:-1;;;10695:18:1;;;10688:49;10754:18;;79310:50:0::1;10435:343:1::0;79310:50:0::1;79389:14:::0;;79425:11:::1;::::0;::::1;::::0;79418:18;::::1;79414:183;;;79453:12;76244:6;79479:24;;79469:7;:34;;;;:::i;:::-;79468:48;;;;:::i;:::-;79453:63;;79531:15;79541:4;79531:9;:15::i;:::-;79571:14;79581:4:::0;79571:7;:14:::1;:::i;:::-;79561:24;;79438:159;79414:183;79621:1;79607:7;:11;;:15;;;;79643:7;:14;;;79633:6;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;79685:1:0::1;79668:18:::0;;79697:48:::1;4324:10:::0;79703:12:::1;4244:98:::0;76072:50;76106:16;76056:7;76116:6;76106:16;:::i;:::-;76072:50;:::o;78202:257::-;76014:1;78284:5;:16;;78276:58;;;;-1:-1:-1;;;78276:58:0;;18439:2:1;78276:58:0;;;18421:21:1;18478:2;18458:18;;;18451:30;18517:31;18497:18;;;18490:59;18566:18;;78276:58:0;18237:353:1;78276:58:0;76056:7;78353:5;:16;;78345:59;;;;-1:-1:-1;;;78345:59:0;;15790:2:1;78345:59:0;;;15772:21:1;15829:2;15809:18;;;15802:30;15868:32;15848:18;;;15841:60;15918:18;;78345:59:0;15588:354:1;78345:59:0;78415:36;4324:10;78442:1;78445:5;78415:12;:36::i;61479:150::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;61595:21:0;;;;;;:12;:21;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;61588:33;;;;;;;;;61595:26;;61588:33;;;;;;;;;-1:-1:-1;;;;;61588:33:0;;;;;;;;;61479:150;-1:-1:-1;;;61479:150:0:o;71067:192::-;70240:6;;-1:-1:-1;;;;;70240:6:0;4324:10;70387:23;70379:68;;;;-1:-1:-1;;;70379:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;71156:22:0;::::1;71148:73;;;::::0;-1:-1:-1;;;71148:73:0;;10985:2:1;71148:73:0::1;::::0;::::1;10967:21:1::0;11024:2;11004:18;;;10997:30;11063:34;11043:18;;;11036:62;-1:-1:-1;;;11114:18:1;;;11107:36;11160:19;;71148:73:0::1;10783:402:1::0;71148:73:0::1;71232:19;71242:8;71232:9;:19::i;14676:380::-:0;-1:-1:-1;;;;;14812:19:0;;14804:68;;;;-1:-1:-1;;;14804:68:0;;19204:2:1;14804:68:0;;;19186:21:1;19243:2;19223:18;;;19216:30;19282:34;19262:18;;;19255:62;-1:-1:-1;;;19333:18:1;;;19326:34;19377:19;;14804:68:0;19002:400:1;14804:68:0;-1:-1:-1;;;;;14891:21:0;;14883:68;;;;-1:-1:-1;;;14883:68:0;;11392:2:1;14883:68:0;;;11374:21:1;11431:2;11411:18;;;11404:30;11470:34;11450:18;;;11443:62;-1:-1:-1;;;11521:18:1;;;11514:32;11563:19;;14883:68:0;11190:398:1;14883:68:0;-1:-1:-1;;;;;14964:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15016:32;;5504:25:1;;;15016:32:0;;5477:18:1;15016:32:0;;;;;;;14676:380;;;:::o;11895:733::-;-1:-1:-1;;;;;12035:20:0;;12027:70;;;;-1:-1:-1;;;12027:70:0;;18033:2:1;12027:70:0;;;18015:21:1;18072:2;18052:18;;;18045:30;18111:34;18091:18;;;18084:62;-1:-1:-1;;;18162:18:1;;;18155:35;18207:19;;12027:70:0;17831:401:1;12027:70:0;-1:-1:-1;;;;;12116:23:0;;12108:71;;;;-1:-1:-1;;;12108:71:0;;8398:2:1;12108:71:0;;;8380:21:1;8437:2;8417:18;;;8410:30;8476:34;8456:18;;;8449:62;-1:-1:-1;;;8527:18:1;;;8520:33;8570:19;;12108:71:0;8196:399:1;12108:71:0;-1:-1:-1;;;;;12276:17:0;;12252:21;12276:17;;;;;;;;;;;12312:23;;;;12304:74;;;;-1:-1:-1;;;12304:74:0;;12153:2:1;12304:74:0;;;12135:21:1;12192:2;12172:18;;;12165:30;12231:34;12211:18;;;12204:62;-1:-1:-1;;;12282:18:1;;;12275:36;12328:19;;12304:74:0;11951:402:1;12304:74:0;-1:-1:-1;;;;;12414:17:0;;;:9;:17;;;;;;;;;;;12434:22;;;12414:42;;12478:20;;;;;;;;:30;;12450:6;;12414:9;12478:30;;12450:6;;12478:30;:::i;:::-;;;;;;;;12543:9;-1:-1:-1;;;;;12526:35:0;12535:6;-1:-1:-1;;;;;12526:35:0;;12554:6;12526:35;;;;5504:25:1;;5492:2;5477:18;;5358:177;12526:35:0;;;;;;;;12574:46;12594:6;12602:9;12613:6;12574:19;:46::i;:::-;12016:612;11895:733;;;:::o;44347:281::-;44400:7;44441:16;44424:13;:33;44420:201;;;-1:-1:-1;44481:24:0;;44347:281::o;44420:201::-;-1:-1:-1;44817:73:0;;;44567:10;44817:73;;;;6817:25:1;;;;44579:12:0;6858:18:1;;;6851:34;44593:15:0;6901:18:1;;;6894:34;44861:13:0;6944:18:1;;;6937:34;44884:4:0;6987:19:1;;;;6980:61;;;;44817:73:0;;;;;;;;;;6789:19:1;;;;44817:73:0;;;44807:84;;;;;;49526:115::o;81638:1314::-;73224:1;73820:7;;:19;;73812:63;;;;-1:-1:-1;;;73812:63:0;;;;;;;:::i;:::-;73224:1;73953:7;:18;-1:-1:-1;;;;;81805:13:0;::::1;81773:29;81805:13:::0;;;:6:::1;:13;::::0;;;;81888:14;;81928:11:::1;::::0;::::1;::::0;81805:13;;81844:15:::1;::::0;81928:11;81976:12;81972:638:::1;;82011:39;82036:6;82044:5;82011:24;:39::i;:::-;82065:23:::0;;;82005:45;-1:-1:-1;82124:14:0::1;:5:::0;82132:6:::1;82124:14;:::i;:::-;82117:21;::::0;:4;:21:::1;:::i;:::-;82103:11;::::0;::::1;:35:::0;81972:638:::1;;;82160:10:::0;82156:454:::1;;82193:38;82218:6;82226:4;82193:24;:38::i;:::-;82187:44:::0;-1:-1:-1;82263:16:0::1;82273:6:::0;82263:7;:16:::1;:::i;:::-;82246:33:::0;;82156:454:::1;;;82320:11:::0;;82312:79:::1;;;::::0;-1:-1:-1;;;82312:79:0;;13370:2:1;82312:79:0::1;::::0;::::1;13352:21:1::0;13409:2;13389:18;;;13382:30;13448:34;13428:18;;;13421:62;13519:25;13499:18;;;13492:53;13562:19;;82312:79:0::1;13168:419:1::0;82312:79:0::1;82412:40;82437:7;82446:5;82412:24;:40::i;:::-;82406:46:::0;-1:-1:-1;82488:14:0::1;:5:::0;82496:6:::1;82488:14;:::i;:::-;82481:21;::::0;:4;:21:::1;:::i;:::-;82467:11;::::0;::::1;:35:::0;76106:16:::1;76056:7;76116:6;76106:16;:::i;:::-;82539:4;82525:7;:11;;;:18;;;;:::i;:::-;:29;;82517:81;;;::::0;-1:-1:-1;;;82517:81:0;;13794:2:1;82517:81:0::1;::::0;::::1;13776:21:1::0;13833:2;13813:18;;;13806:30;13872:34;13852:18;;;13845:62;-1:-1:-1;;;13923:18:1;;;13916:37;13970:19;;82517:81:0::1;13592:403:1::0;82517:81:0::1;82634:1;82628:3;:7;82620:38;;;::::0;-1:-1:-1;;;82620:38:0;;20316:2:1;82620:38:0::1;::::0;::::1;20298:21:1::0;20355:2;20335:18;;;20328:30;-1:-1:-1;;;20374:18:1;;;20367:48;20432:18;;82620:38:0::1;20114:342:1::0;82620:38:0::1;82673:10:::0;;82669:116:::1;;82700:73;4324:10:::0;82707:11:::1;::::0;-1:-1:-1;;;;;82707:11:0::1;::::0;82759:4:::1;82766:6:::0;82700:36:::1;:73::i;:::-;82795:17;82801:5;82808:3;82795:5;:17::i;:::-;-1:-1:-1::0;;;;;82823:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;:27;;82847:3;;82823:20;:27:::1;::::0;82847:3;;82823:27:::1;:::i;:::-;;;;;;;;82871:6;82861;;:16;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;82910:14:0;;82926:11:::1;::::0;::::1;::::0;82895:49:::1;::::0;;23671:25:1;;;23727:2;23712:18;;23705:34;;;;23755:18;;23748:34;;;-1:-1:-1;;;;;82895:49:0;::::1;::::0;::::1;::::0;23659:2:1;23644:18;82895:49:0::1;;;;;;;-1:-1:-1::0;;73180:1:0;74132:7;:22;-1:-1:-1;;;;;;81638:1314:0:o;63424:1482::-;64557:12;;63523:7;;;64606:236;64619:4;64613:3;:10;64606:236;;;64640:11;64654:23;64667:3;64672:4;64654:12;:23::i;:::-;64640:37;;64719:11;64696:5;64702:3;64696:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;:34;64692:139;;;64758:3;64751:10;;64692:139;;;64808:7;:3;64814:1;64808:7;:::i;:::-;64802:13;;64692:139;64625:217;64606:236;;;64861:9;;:37;;64877:5;64883:8;64890:1;64883:4;:8;:::i;:::-;64877:15;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;-1:-1:-1;;;;;64877:21:0;64861:37;;;64873:1;64861:37;-1:-1:-1;;;;;64854:44:0;;63424:1482;-1:-1:-1;;;;;63424:1482:0:o;66465:194::-;66550:28;66562:7;66571:6;66550:11;:28::i;:::-;66591:60;66608:23;66633:9;66644:6;66591:16;:60::i;26600:211::-;26744:58;;-1:-1:-1;;;;;5079:32:1;;26744:58:0;;;5061:51:1;5128:18;;;5121:34;;;26717:86:0;;26737:5;;-1:-1:-1;;;26767:23:0;5034:18:1;;26744:58:0;;;;-1:-1:-1;;26744:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;26744:58:0;-1:-1:-1;;;;;;26744:58:0;;;;;;;;;;26717:19;:86::i;:::-;26600:211;;;:::o;67225:388::-;-1:-1:-1;;;;;62045:19:0;;;67310:23;62045:19;;;:10;:19;;;;;;;;;;7947:18;;;;;;;67425:21;;;;:33;;;-1:-1:-1;;;;;;67425:33:0;;;;;;;67476:54;;62045:19;;;;;7947:18;;67425:33;;62045:19;;;67476:54;;67310:23;67476:54;67543:62;67560:15;67577:9;67588:16;67543;:62::i;54384:190::-;54440:6;54476:16;54467:25;;;54459:76;;;;-1:-1:-1;;;54459:76:0;;18797:2:1;54459:76:0;;;18779:21:1;18836:2;18816:18;;;18809:30;18875:34;18855:18;;;18848:62;-1:-1:-1;;;18926:18:1;;;18919:36;18972:19;;54459:76:0;18595:402:1;54459:76:0;-1:-1:-1;54560:5:0;54384:190::o;71267:173::-;71342:6;;;-1:-1:-1;;;;;71359:17:0;;;-1:-1:-1;;;;;;71359:17:0;;;;;;;71392:40;;71342:6;;;71359:17;71342:6;;71392:40;;71323:16;;71392:40;71312:128;71267:173;:::o;45541:167::-;45618:7;45645:55;45667:20;:18;:20::i;:::-;45689:10;41172:57;;-1:-1:-1;;;41172:57:0;;;4160:27:1;4203:11;;;4196:27;;;4239:12;;;4232:28;;;41135:7:0;;4276:12:1;;41172:57:0;;;;;;;;;;;;41162:68;;;;;;41155:75;;41042:196;;;;;39844:279;39972:7;39993:17;40012:18;40034:25;40045:4;40051:1;40054;40057;40034:10;:25::i;:::-;39992:67;;;;40070:18;40082:5;40070:11;:18::i;:::-;-1:-1:-1;40106:9:0;39844:279;-1:-1:-1;;;;;39844:279:0:o;49779:207::-;-1:-1:-1;;;;;49900:14:0;;49839:15;49900:14;;;:7;:14;;;;;46654;;46791:1;46773:19;;;;46654:14;49961:17;49856:130;49779:207;;;:::o;82960:439::-;83141:16;;-1:-1:-1;;;;;83141:16:0;:30;83137:255;;83281:16;;83255:11;;83248:59;;-1:-1:-1;;;;;83255:11:0;;;;83281:16;83299:7;83248:32;:59::i;83137:255::-;83354:11;;83340:40;;-1:-1:-1;;;83340:40:0;;;;;5504:25:1;;;-1:-1:-1;;;;;83354:11:0;;;;83340:31;;5477:18:1;;83340:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82960:439;:::o;66799:262::-;-1:-1:-1;;;;;62045:19:0;;;62018:7;62045:19;;;:10;:19;;;;;;;;;;;;;;;66997:56;;62045:19;;;;;67046:6;66997:16;:56::i;26819:248::-;26990:68;;-1:-1:-1;;;;;4765:15:1;;;26990:68:0;;;4747:34:1;4817:15;;4797:18;;;4790:43;4849:18;;;4842:34;;;26963:96:0;;26983:5;;-1:-1:-1;;;27013:27:0;4682:18:1;;26990:68:0;4507:375:1;66081:290:0;66166:28;66178:7;66187:6;66166:11;:28::i;:::-;7763:12;;-1:-1:-1;;;;;;66213:29:0;66205:90;;;;-1:-1:-1;;;66205:90:0;;15373:2:1;66205:90:0;;;15355:21:1;15412:2;15392:18;;;15385:30;15451:34;15431:18;;;15424:62;-1:-1:-1;;;15502:18:1;;;15495:46;15558:19;;66205:90:0;15171:412:1;66205:90:0;66308:55;66325:23;66350:4;66356:6;66308:16;:55::i;50682:156::-;50744:7;50819:11;50829:1;50820:5;;;50819:11;:::i;:::-;50809:21;;50810:5;;;50809:21;:::i;13647:591::-;-1:-1:-1;;;;;13731:21:0;;13723:67;;;;-1:-1:-1;;;13723:67:0;;17631:2:1;13723:67:0;;;17613:21:1;17670:2;17650:18;;;17643:30;17709:34;17689:18;;;17682:62;-1:-1:-1;;;17760:18:1;;;17753:31;17801:19;;13723:67:0;17429:397:1;13723:67:0;-1:-1:-1;;;;;13890:18:0;;13865:22;13890:18;;;;;;;;;;;13927:24;;;;13919:71;;;;-1:-1:-1;;;13919:71:0;;9520:2:1;13919:71:0;;;9502:21:1;9559:2;9539:18;;;9532:30;9598:34;9578:18;;;9571:62;-1:-1:-1;;;9649:18:1;;;9642:32;9691:19;;13919:71:0;9318:398:1;13919:71:0;-1:-1:-1;;;;;14026:18:0;;:9;:18;;;;;;;;;;14047:23;;;14026:44;;14092:12;:22;;14064:6;;14026:9;14092:22;;14064:6;;14092:22;:::i;:::-;;;;-1:-1:-1;;14132:37:0;;5504:25:1;;;14158:1:0;;-1:-1:-1;;;;;14132:37:0;;;;;5492:2:1;5477:18;14132:37:0;;;;;;;14182:48;14202:7;14219:1;14223:6;14182:19;:48::i;69031:103::-;69094:7;69121:5;69125:1;69121;:5;:::i;68272:645::-;68509:12;;68446:17;;;;68544:8;;:35;;68559:5;68565:7;68571:1;68565:3;:7;:::i;:::-;68559:14;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;;-1:-1:-1;;;;;68559:20:0;68544:35;;;68555:1;68544:35;-1:-1:-1;;;;;68532:47:0;;;68602:20;68605:9;68616:5;68602:2;:20;;:::i;:::-;68590:32;;68645:1;68639:3;:7;:51;;;;-1:-1:-1;68678:12:0;68650:5;68656:7;68662:1;68656:3;:7;:::i;:::-;68650:14;;;;;;;;:::i;:::-;;;;;;;;;;:24;;;:40;68639:51;68635:275;;;68730:29;68749:9;68730:18;:29::i;:::-;68707:5;68713:7;68719:1;68713:3;:7;:::i;:::-;68707:14;;;;;;;;:::i;:::-;;;;;;;;:20;;;:52;;;;;-1:-1:-1;;;;;68707:52:0;;;;;-1:-1:-1;;;;;68707:52:0;;;;;;68635:275;;;68792:5;68803:94;;;;;;;;68826:31;68844:12;68826:17;:31::i;:::-;68803:94;;;;;;68866:29;68885:9;68866:18;:29::i;:::-;-1:-1:-1;;;;;68803:94:0;;;;;;68792:106;;;;;;;-1:-1:-1;68792:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68635:275;68484:433;68272:645;;;;;;:::o;29173:716::-;29597:23;29623:69;29651:4;29623:69;;;;;;;;;;;;;;;;;29631:5;-1:-1:-1;;;;;29623:27:0;;;:69;;;;;:::i;:::-;29707:17;;29597:95;;-1:-1:-1;29707:21:0;29703:179;;29804:10;29793:30;;;;;;;;;;;;:::i;:::-;29785:85;;;;-1:-1:-1;;;29785:85:0;;20663:2:1;29785:85:0;;;20645:21:1;20702:2;20682:18;;;20675:30;20741:34;20721:18;;;20714:62;-1:-1:-1;;;20792:18:1;;;20785:40;20842:19;;29785:85:0;20461:406:1;67621:643:0;67753:3;-1:-1:-1;;;;;67746:10:0;:3;-1:-1:-1;;;;;67746:10:0;;;:24;;;;;67769:1;67760:6;:10;67746:24;67742:515;;;-1:-1:-1;;;;;67791:17:0;;;67787:224;;-1:-1:-1;;;;;67887:17:0;;67830;67887;;;:12;:17;;;;;67830;;67870:54;;67906:9;67917:6;67870:16;:54::i;:::-;67829:95;;;;67969:3;-1:-1:-1;;;;;67948:47:0;;67974:9;67985;67948:47;;;;;;23390:25:1;;;23446:2;23431:18;;23424:34;23378:2;23363:18;;23216:248;67948:47:0;;;;;;;;67810:201;;67787:224;-1:-1:-1;;;;;68031:17:0;;;68027:219;;-1:-1:-1;;;;;68127:17:0;;68070;68127;;;:12;:17;;;;;68070;;68110:49;;68146:4;68152:6;68110:16;:49::i;:::-;68069:90;;;;68204:3;-1:-1:-1;;;;;68183:47:0;;68209:9;68220;68183:47;;;;;;23390:25:1;;;23446:2;23431:18;;23424:34;23378:2;23363:18;;23216:248;68183:47:0;;;;;;;;68050:196;;67621:643;;;:::o;38073:1632::-;38204:7;;39138:66;39125:79;;39121:163;;;-1:-1:-1;39237:1:0;;-1:-1:-1;39241:30:0;39221:51;;39121:163;39298:1;:7;;39303:2;39298:7;;:18;;;;;39309:1;:7;;39314:2;39309:7;;39298:18;39294:102;;;-1:-1:-1;39349:1:0;;-1:-1:-1;39353:30:0;39333:51;;39294:102;39510:24;;;39493:14;39510:24;;;;;;;;;7279:25:1;;;7352:4;7340:17;;7320:18;;;7313:45;;;;7374:18;;;7367:34;;;7417:18;;;7410:34;;;39510:24:0;;7251:19:1;;39510:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39510:24:0;;-1:-1:-1;;39510:24:0;;;-1:-1:-1;;;;;;;39549:20:0;;39545:103;;39602:1;39606:29;39586:50;;;;;;;39545:103;39668:6;-1:-1:-1;39676:20:0;;-1:-1:-1;38073:1632:0;;;;;;;;:::o;32735:643::-;32813:20;32804:5;:29;;;;;;;;:::i;:::-;;32800:571;;;32735:643;:::o;32800:571::-;32911:29;32902:5;:38;;;;;;;;:::i;:::-;;32898:473;;;32957:34;;-1:-1:-1;;;32957:34:0;;8045:2:1;32957:34:0;;;8027:21:1;8084:2;8064:18;;;8057:30;8123:26;8103:18;;;8096:54;8167:18;;32957:34:0;7843:348:1;32898:473:0;33022:35;33013:5;:44;;;;;;;;:::i;:::-;;33009:362;;;33074:41;;-1:-1:-1;;;33074:41:0;;9923:2:1;33074:41:0;;;9905:21:1;9962:2;9942:18;;;9935:30;10001:33;9981:18;;;9974:61;10052:18;;33074:41:0;9721:355:1;33009:362:0;33146:30;33137:5;:39;;;;;;;;:::i;:::-;;33133:238;;;33193:44;;-1:-1:-1;;;33193:44:0;;12560:2:1;33193:44:0;;;12542:21:1;12599:2;12579:18;;;12572:30;12638:34;12618:18;;;12611:62;-1:-1:-1;;;12689:18:1;;;12682:32;12731:19;;33193:44:0;12358:398:1;33133:238:0;33268:30;33259:5;:39;;;;;;;;:::i;:::-;;33255:116;;;33315:44;;-1:-1:-1;;;33315:44:0;;14202:2:1;33315:44:0;;;14184:21:1;14241:2;14221:18;;;14214:30;14280:34;14260:18;;;14253:62;-1:-1:-1;;;14331:18:1;;;14324:32;14373:19;;33315:44:0;14000:398:1;12915:399:0;-1:-1:-1;;;;;12999:21:0;;12991:65;;;;-1:-1:-1;;;12991:65:0;;22174:2:1;12991:65:0;;;22156:21:1;22213:2;22193:18;;;22186:30;22252:33;22232:18;;;22225:61;22303:18;;12991:65:0;21972:355:1;12991:65:0;13147:6;13131:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13164:18:0;;:9;:18;;;;;;;;;;:28;;13186:6;;13164:9;:28;;13186:6;;13164:28;:::i;:::-;;;;-1:-1:-1;;13208:37:0;;5504:25:1;;;-1:-1:-1;;;;;13208:37:0;;;13225:1;;13208:37;;5492:2:1;5477:18;13208:37:0;;;;;;;13258:48;13286:1;13290:7;13299:6;13258:19;:48::i;68925:98::-;68983:7;69010:5;69014:1;69010;:5;:::i;52414:195::-;52471:7;-1:-1:-1;;;;;52499:26:0;;;52491:78;;;;-1:-1:-1;;;52491:78:0;;16510:2:1;52491:78:0;;;16492:21:1;16549:2;16529:18;;;16522:30;16588:34;16568:18;;;16561:62;-1:-1:-1;;;16639:18:1;;;16632:37;16686:19;;52491:78:0;16308:403:1;21420:229:0;21557:12;21589:52;21611:6;21619:4;21625:1;21628:12;21589:21;:52::i;:::-;21582:59;21420:229;-1:-1:-1;;;;21420:229:0:o;22540:510::-;22710:12;22768:5;22743:21;:30;;22735:81;;;;-1:-1:-1;;;22735:81:0;;12963:2:1;22735:81:0;;;12945:21:1;13002:2;12982:18;;;12975:30;13041:34;13021:18;;;13014:62;-1:-1:-1;;;13092:18:1;;;13085:36;13138:19;;22735:81:0;12761:402:1;22735:81:0;18937:20;;22827:60;;;;-1:-1:-1;;;22827:60:0;;19609:2:1;22827:60:0;;;19591:21:1;19648:2;19628:18;;;19621:30;19687:31;19667:18;;;19660:59;19736:18;;22827:60:0;19407:353:1;22827:60:0;22901:12;22915:23;22942:6;-1:-1:-1;;;;;22942:11:0;22961:5;22968:4;22942:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22900:73;;;;22991:51;23008:7;23017:10;23029:12;22991:16;:51::i;:::-;22984:58;22540:510;-1:-1:-1;;;;;;;22540:510:0:o;25226:712::-;25376:12;25405:7;25401:530;;;-1:-1:-1;25436:10:0;25429:17;;25401:530;25550:17;;:21;25546:374;;25748:10;25742:17;25809:15;25796:10;25792:2;25788:19;25781:44;25546:374;25891:12;25884:20;;-1:-1:-1;;;25884: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:156::-;258:20;;318:4;307:16;;297:27;;287:55;;338:1;335;328:12;353:186;412:6;465:2;453:9;444:7;440:23;436:32;433:52;;;481:1;478;471:12;433:52;504:29;523:9;504:29;:::i;544:260::-;612:6;620;673:2;661:9;652:7;648:23;644:32;641:52;;;689:1;686;679:12;641:52;712:29;731:9;712:29;:::i;:::-;702:39;;760:38;794:2;783:9;779:18;760:38;:::i;:::-;750:48;;544:260;;;;;:::o;809:328::-;886:6;894;902;955:2;943:9;934:7;930:23;926:32;923:52;;;971:1;968;961:12;923:52;994:29;1013:9;994:29;:::i;:::-;984:39;;1042:38;1076:2;1065:9;1061:18;1042:38;:::i;:::-;1032:48;;1127:2;1116:9;1112:18;1099:32;1089:42;;809:328;;;;;:::o;1142:606::-;1253:6;1261;1269;1277;1285;1293;1301;1354:3;1342:9;1333:7;1329:23;1325:33;1322:53;;;1371:1;1368;1361:12;1322:53;1394:29;1413:9;1394:29;:::i;:::-;1384:39;;1442:38;1476:2;1465:9;1461:18;1442:38;:::i;:::-;1432:48;;1527:2;1516:9;1512:18;1499:32;1489:42;;1578:2;1567:9;1563:18;1550:32;1540:42;;1601:37;1633:3;1622:9;1618:19;1601:37;:::i;:::-;1591:47;;1685:3;1674:9;1670:19;1657:33;1647:43;;1737:3;1726:9;1722:19;1709:33;1699:43;;1142:606;;;;;;;;;;:::o;1753:254::-;1821:6;1829;1882:2;1870:9;1861:7;1857:23;1853:32;1850:52;;;1898:1;1895;1888:12;1850:52;1921:29;1940:9;1921:29;:::i;:::-;1911:39;1997:2;1982:18;;;;1969:32;;-1:-1:-1;;;1753:254:1:o;2012:531::-;2114:6;2122;2130;2138;2146;2154;2207:3;2195:9;2186:7;2182:23;2178:33;2175:53;;;2224:1;2221;2214:12;2175:53;2247:29;2266:9;2247:29;:::i;:::-;2237:39;;2323:2;2312:9;2308:18;2295:32;2285:42;;2374:2;2363:9;2359:18;2346:32;2336:42;;2397:36;2429:2;2418:9;2414:18;2397:36;:::i;:::-;2387:46;;2480:3;2469:9;2465:19;2452:33;2442:43;;2532:3;2521:9;2517:19;2504:33;2494:43;;2012:531;;;;;;;;:::o;2548:350::-;2615:6;2623;2676:2;2664:9;2655:7;2651:23;2647:32;2644:52;;;2692:1;2689;2682:12;2644:52;2715:29;2734:9;2715:29;:::i;:::-;2705:39;;2794:2;2783:9;2779:18;2766:32;2838:10;2831:5;2827:22;2820:5;2817:33;2807:61;;2864:1;2861;2854:12;2807:61;2887:5;2877:15;;;2548:350;;;;;:::o;2903:277::-;2970:6;3023:2;3011:9;3002:7;2998:23;2994:32;2991:52;;;3039:1;3036;3029:12;2991:52;3071:9;3065:16;3124:5;3117:13;3110:21;3103:5;3100:32;3090:60;;3146:1;3143;3136:12;3185:180;3244:6;3297:2;3285:9;3276:7;3272:23;3268:32;3265:52;;;3313:1;3310;3303:12;3265:52;-1:-1:-1;3336:23:1;;3185:180;-1:-1:-1;3185:180:1:o;3370:248::-;3438:6;3446;3499:2;3487:9;3478:7;3474:23;3470:32;3467:52;;;3515:1;3512;3505:12;3467:52;-1:-1:-1;;3538:23:1;;;3608:2;3593:18;;;3580:32;;-1:-1:-1;3370:248:1:o;3623:274::-;3752:3;3790:6;3784:13;3806:53;3852:6;3847:3;3840:4;3832:6;3828:17;3806:53;:::i;:::-;3875:16;;;;;3623:274;-1:-1:-1;;3623:274:1:o;7455:383::-;7604:2;7593:9;7586:21;7567:4;7636:6;7630:13;7679:6;7674:2;7663:9;7659:18;7652:34;7695:66;7754:6;7749:2;7738:9;7734:18;7729:2;7721:6;7717:15;7695:66;:::i;:::-;7822:2;7801:15;-1:-1:-1;;7797:29:1;7782:45;;;;7829:2;7778:54;;7455:383;-1:-1:-1;;7455:383:1:o;15947:356::-;16149:2;16131:21;;;16168:18;;;16161:30;16227:34;16222:2;16207:18;;16200:62;16294:2;16279:18;;15947:356::o;21206:355::-;21408:2;21390:21;;;21447:2;21427:18;;;21420:30;21486:33;21481:2;21466:18;;21459:61;21552:2;21537:18;;21206:355::o;24179:128::-;24219:3;24250:1;24246:6;24243:1;24240:13;24237:39;;;24256:18;;:::i;:::-;-1:-1:-1;24292:9:1;;24179:128::o;24312:217::-;24352:1;24378;24368:132;;24422:10;24417:3;24413:20;24410:1;24403:31;24457:4;24454:1;24447:15;24485:4;24482:1;24475:15;24368:132;-1:-1:-1;24514:9:1;;24312:217::o;24534:168::-;24574:7;24640:1;24636;24632:6;24628:14;24625:1;24622:21;24617:1;24610:9;24603:17;24599:45;24596:71;;;24647:18;;:::i;:::-;-1:-1:-1;24687:9:1;;24534:168::o;24707:125::-;24747:4;24775:1;24772;24769:8;24766:34;;;24780:18;;:::i;:::-;-1:-1:-1;24817:9:1;;24707:125::o;24837:258::-;24909:1;24919:113;24933:6;24930:1;24927:13;24919:113;;;25009:11;;;25003:18;24990:11;;;24983:39;24955:2;24948:10;24919:113;;;25050:6;25047:1;25044:13;25041:48;;;-1:-1:-1;;25085:1:1;25067:16;;25060:27;24837:258::o;25100:380::-;25179:1;25175:12;;;;25222;;;25243:61;;25297:4;25289:6;25285:17;25275:27;;25243:61;25350:2;25342:6;25339:14;25319:18;25316:38;25313:161;;;25396:10;25391:3;25387:20;25384:1;25377:31;25431:4;25428:1;25421:15;25459:4;25456:1;25449:15;25485:127;25546:10;25541:3;25537:20;25534:1;25527:31;25577:4;25574:1;25567:15;25601:4;25598:1;25591:15;25617:127;25678:10;25673:3;25669:20;25666:1;25659:31;25709:4;25706:1;25699:15;25733:4;25730:1;25723:15;25749:127;25810:10;25805:3;25801:20;25798:1;25791:31;25841:4;25838:1;25831:15;25865:4;25862:1;25855:15
Swarm Source
ipfs://71d1c8e09ad43c8df857c62438c82cd6ef2834834463d4fdb02aa90afe1327cf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $7.34 | 612.6305 | $4,497 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.