Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 159 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Migrate | 12199506 | 1419 days ago | IN | 0 ETH | 0.00889779 | ||||
Migrate | 12199426 | 1419 days ago | IN | 0 ETH | 0.02425258 | ||||
Peg In | 12198600 | 1419 days ago | IN | 0 ETH | 0.00456545 | ||||
Peg In | 12198534 | 1419 days ago | IN | 0 ETH | 0.0048386 | ||||
Peg In | 12197907 | 1419 days ago | IN | 0 ETH | 0.00394112 | ||||
Peg In | 12190514 | 1420 days ago | IN | 0 ETH | 0.00529523 | ||||
Peg In | 12188277 | 1420 days ago | IN | 0 ETH | 0.00731257 | ||||
Peg In | 12187458 | 1421 days ago | IN | 0 ETH | 0.00643846 | ||||
Peg Out | 12183811 | 1421 days ago | IN | 0 ETH | 0.0108845 | ||||
Peg Out | 12173162 | 1423 days ago | IN | 0 ETH | 0.010355 | ||||
Peg In | 12172287 | 1423 days ago | IN | 0 ETH | 0.00377676 | ||||
Peg In | 12172287 | 1423 days ago | IN | 0 ETH | 0.00278336 | ||||
Peg In | 12171170 | 1423 days ago | IN | 0 ETH | 0.00243207 | ||||
Peg Out | 12168880 | 1423 days ago | IN | 0 ETH | 0.014096 | ||||
Peg Out | 12165877 | 1424 days ago | IN | 0 ETH | 0.010346 | ||||
Peg Out | 12165549 | 1424 days ago | IN | 0 ETH | 0.0108905 | ||||
Peg In | 12163974 | 1424 days ago | IN | 0 ETH | 0.00456652 | ||||
Peg In | 12161217 | 1425 days ago | IN | 0 ETH | 0.01113079 | ||||
Peg In | 12161197 | 1425 days ago | IN | 0 ETH | 0.01280013 | ||||
Peg Out | 12159960 | 1425 days ago | IN | 0 ETH | 0.014102 | ||||
Peg In | 12159931 | 1425 days ago | IN | 0 ETH | 0.00569531 | ||||
Peg Out | 12159923 | 1425 days ago | IN | 0 ETH | 0.014093 | ||||
Peg In | 12159568 | 1425 days ago | IN | 0 ETH | 0.00546126 | ||||
Peg Out | 12159536 | 1425 days ago | IN | 0 ETH | 0.014093 | ||||
Peg In | 12159098 | 1425 days ago | IN | 0 ETH | 0.00585315 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PERC20Vault
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-20 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.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/math/SafeMath.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @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 in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.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 SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/introspection/IERC1820Registry.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the global ERC1820 Registry, as defined in the * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register * implementers for interfaces in this registry, as well as query support. * * Implementers may be shared by multiple accounts, and can also implement more * than a single interface for each account. Contracts can implement interfaces * for themselves, but externally-owned accounts (EOA) must delegate this to a * contract. * * {IERC165} interfaces can also be queried via the registry. * * For an in-depth explanation and source code analysis, see the EIP text. */ interface IERC1820Registry { /** * @dev Sets `newManager` as the manager for `account`. A manager of an * account is able to set interface implementers for it. * * By default, each account is its own manager. Passing a value of `0x0` in * `newManager` will reset the manager to this initial state. * * Emits a {ManagerChanged} event. * * Requirements: * * - the caller must be the current manager for `account`. */ function setManager(address account, address newManager) external; /** * @dev Returns the manager for `account`. * * See {setManager}. */ function getManager(address account) external view returns (address); /** * @dev Sets the `implementer` contract as ``account``'s implementer for * `interfaceHash`. * * `account` being the zero address is an alias for the caller's address. * The zero address can also be used in `implementer` to remove an old one. * * See {interfaceHash} to learn how these are created. * * Emits an {InterfaceImplementerSet} event. * * Requirements: * * - the caller must be the current manager for `account`. * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not * end in 28 zeroes). * - `implementer` must implement {IERC1820Implementer} and return true when * queried for support, unless `implementer` is the caller. See * {IERC1820Implementer-canImplementInterfaceForAddress}. */ function setInterfaceImplementer(address account, bytes32 interfaceHash, address implementer) external; /** * @dev Returns the implementer of `interfaceHash` for `account`. If no such * implementer is registered, returns the zero address. * * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28 * zeroes), `account` will be queried for support of it. * * `account` being the zero address is an alias for the caller's address. */ function getInterfaceImplementer(address account, bytes32 interfaceHash) external view returns (address); /** * @dev Returns the interface hash for an `interfaceName`, as defined in the * corresponding * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP]. */ function interfaceHash(string calldata interfaceName) external pure returns (bytes32); /** * @notice Updates the cache with whether the contract implements an ERC165 interface or not. * @param account Address of the contract for which to update the cache. * @param interfaceId ERC165 interface for which to update the cache. */ function updateERC165Cache(address account, bytes4 interfaceId) external; /** * @notice Checks whether a contract implements an ERC165 interface or not. * If the result is not cached a direct lookup on the contract address is performed. * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling * {updateERC165Cache} with the contract address. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account` implements `interfaceId`, false otherwise. */ function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool); /** * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account` implements `interfaceId`, false otherwise. */ function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool); event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer); event ManagerChanged(address indexed account, address indexed newManager); } // File: @openzeppelin/contracts/token/ERC777/IERC777Recipient.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP. * * Accounts can be notified of {IERC777} tokens being sent to them by having a * contract implement this interface (contract holders can be their own * implementer) and registering it on the * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. * * See {IERC1820Registry} and {ERC1820Implementer}. */ interface IERC777Recipient { /** * @dev Called by an {IERC777} token contract whenever tokens are being * moved or created into a registered account (`to`). The type of operation * is conveyed by `from` being the zero address or not. * * This call occurs _after_ the token contract's state is updated, so * {IERC777-balanceOf}, etc., can be used to query the post-operation state. * * This function may revert to prevent the operation from being executed. */ function tokensReceived( address operator, address from, address to, uint256 amount, bytes calldata userData, bytes calldata operatorData ) external; } // File: contracts/IWETH.sol pragma solidity ^0.6.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; function balanceOf(address who) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function allowance(address owner, address spender) external returns (uint256); } // File: contracts/AbstractOwnable.sol pragma solidity ^0.6.0; abstract contract AbstractOwnable { modifier onlyOwner() { require(_owner() == msg.sender, "caller is not the owner"); _; } function _owner() internal virtual returns(address); } // File: contracts/Withdrawable.sol pragma solidity >=0.4.24; abstract contract Withdrawable is AbstractOwnable { using SafeERC20 for IERC20; address constant ETHER = address(0); event LogWithdrawToken( address indexed _from, address indexed _token, uint amount ); /** * @dev Withdraw asset. * @param asset Asset to be withdrawn. */ function adminWithdraw(address asset) public onlyOwner { uint tokenBalance = adminWithdrawAllowed(asset); require(tokenBalance > 0, "admin witdraw not allowed"); _withdraw(asset, tokenBalance); } function _withdraw(address _tokenAddress, uint _amount) internal { if (_tokenAddress == ETHER) { msg.sender.transfer(_amount); } else { IERC20(_tokenAddress).safeTransfer(msg.sender, _amount); } emit LogWithdrawToken(msg.sender, _tokenAddress, _amount); } // can be overridden to disallow withdraw for some token function adminWithdrawAllowed(address asset) internal virtual view returns(uint allowedAmount) { allowedAmount = asset == ETHER ? address(this).balance : IERC20(asset).balanceOf(address(this)); } } // File: contracts/PERC20OnEosVault.sol pragma solidity ^0.6.0; contract PERC20Vault is Withdrawable, IERC777Recipient { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; IERC1820Registry constant private _erc1820 = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); bytes32 constant private TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); EnumerableSet.AddressSet private supportedTokens; address public PNETWORK; IWETH public weth; event PegIn( address _tokenAddress, address _tokenSender, uint256 _tokenAmount, string _destinationAddress, bytes _userData ); constructor( address _weth, address [] memory _tokensToSupport ) public { PNETWORK = msg.sender; for (uint256 i = 0; i < _tokensToSupport.length; i++) { supportedTokens.add(_tokensToSupport[i]); } weth = IWETH(_weth); _erc1820.setInterfaceImplementer(address(this), TOKENS_RECIPIENT_INTERFACE_HASH, address(this)); } modifier onlyPNetwork() { require(msg.sender == PNETWORK, "Caller must be PNETWORK address!"); _; } receive() external payable { require(msg.sender == address(weth)); } function setWeth(address _weth) external onlyPNetwork { weth = IWETH(_weth); } function setPNetwork(address _pnetwork) external onlyPNetwork { PNETWORK = _pnetwork; } function IS_TOKEN_SUPPORTED(address _token) external view returns(bool) { return supportedTokens.contains(_token); } function _owner() internal override returns(address) { return PNETWORK; } function adminWithdrawAllowed(address asset) internal override view returns(uint) { return supportedTokens.contains(asset) ? 0 : super.adminWithdrawAllowed(asset); } function addSupportedToken( address _tokenAddress ) external onlyPNetwork returns (bool SUCCESS) { supportedTokens.add(_tokenAddress); return true; } function removeSupportedToken( address _tokenAddress ) external onlyPNetwork returns (bool SUCCESS) { return supportedTokens.remove(_tokenAddress); } function getSupportedTokens() external view returns(address[] memory res) { res = new address[](supportedTokens.length()); for (uint256 i = 0; i < supportedTokens.length(); i++) { res[i] = supportedTokens.at(i); } } function pegIn( uint256 _tokenAmount, address _tokenAddress, string calldata _destinationAddress ) external returns (bool) { return pegIn(_tokenAmount, _tokenAddress, _destinationAddress, ""); } function pegIn( uint256 _tokenAmount, address _tokenAddress, string memory _destinationAddress, bytes memory _userData ) public returns (bool) { require(supportedTokens.contains(_tokenAddress), "Token at supplied address is NOT supported!"); require(_tokenAmount > 0, "Token amount must be greater than zero!"); IERC20(_tokenAddress).safeTransferFrom(msg.sender, address(this), _tokenAmount); emit PegIn(_tokenAddress, msg.sender, _tokenAmount, _destinationAddress, _userData); return true; } /** * @dev Implementation of IERC777Recipient. */ function tokensReceived( address /*operator*/, address from, address to, uint256 amount, bytes calldata userData, bytes calldata /*operatorData*/ ) external override { address _tokenAddress = msg.sender; require(supportedTokens.contains(_tokenAddress), "caller is not a supported ERC777 token!"); require(to == address(this), "Token receiver is not this contract"); if (userData.length > 0) { require(amount > 0, "Token amount must be greater than zero!"); (bytes32 tag, string memory _destinationAddress) = abi.decode(userData, (bytes32, string)); require(tag == keccak256("ERC777-pegIn"), "Invalid tag for automatic pegIn on ERC777 send"); emit PegIn(_tokenAddress, from, amount, _destinationAddress, userData); } } function pegInEth(string calldata _destinationAddress) external payable returns (bool) { return pegInEth(_destinationAddress, ""); } function pegInEth( string memory _destinationAddress, bytes memory _userData ) public payable returns (bool) { require(supportedTokens.contains(address(weth)), "WETH is NOT supported!"); require(msg.value > 0, "Ethers amount must be greater than zero!"); weth.deposit.value(msg.value)(); emit PegIn(address(weth), msg.sender, msg.value, _destinationAddress, _userData); return true; } function pegOut( address payable _tokenRecipient, address _tokenAddress, uint256 _tokenAmount ) external onlyPNetwork returns (bool) { if (_tokenAddress == address(weth)) { weth.withdraw(_tokenAmount); _tokenRecipient.transfer(_tokenAmount); } else { IERC20(_tokenAddress).safeTransfer(_tokenRecipient, _tokenAmount); } return true; } function migrate( address payable _to ) external onlyPNetwork { for (uint256 i = 0; i < supportedTokens.length(); i++) { address tokenAddress = supportedTokens.at(i); _migrateSingle(_to, tokenAddress); } } function destroy() external onlyPNetwork { for (uint256 i = 0; i < supportedTokens.length(); i++) { address tokenAddress = supportedTokens.at(i); require(IERC20(tokenAddress).balanceOf(address(this)) == 0, "Balance of supported tokens must be 0"); } selfdestruct(msg.sender); } function migrateSingle( address payable _to, address _tokenAddress ) external onlyPNetwork { _migrateSingle(_to, _tokenAddress); } function _migrateSingle( address payable _to, address _tokenAddress ) private { if (supportedTokens.contains(_tokenAddress)) { uint balance = IERC20(_tokenAddress).balanceOf(address(this)); IERC20(_tokenAddress).safeTransfer(_to, balance); supportedTokens.remove(_tokenAddress); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address[]","name":"_tokensToSupport","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogWithdrawToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenSender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"indexed":false,"internalType":"string","name":"_destinationAddress","type":"string"},{"indexed":false,"internalType":"bytes","name":"_userData","type":"bytes"}],"name":"PegIn","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"IS_TOKEN_SUPPORTED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PNETWORK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"addSupportedToken","outputs":[{"internalType":"bool","name":"SUCCESS","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"adminWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getSupportedTokens","outputs":[{"internalType":"address[]","name":"res","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"migrateSingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"string","name":"_destinationAddress","type":"string"}],"name":"pegIn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"string","name":"_destinationAddress","type":"string"},{"internalType":"bytes","name":"_userData","type":"bytes"}],"name":"pegIn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_destinationAddress","type":"string"},{"internalType":"bytes","name":"_userData","type":"bytes"}],"name":"pegInEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_destinationAddress","type":"string"}],"name":"pegInEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_tokenRecipient","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"pegOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"removeSupportedToken","outputs":[{"internalType":"bool","name":"SUCCESS","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pnetwork","type":"address"}],"name":"setPNetwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"name":"setWeth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200330738038062003307833981810160405260408110156200003757600080fd5b8101908080519060200190929190805160405193929190846401000000008211156200006257600080fd5b838201915060208201858111156200007957600080fd5b82518660208202830111640100000000821117156200009757600080fd5b8083526020830192505050908051906020019060200280838360005b83811015620000d0578082015181840152602081019050620000b3565b5050505090500160405250505033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008090505b81518110156200016c576200015d8282815181106200013f57fe5b60200260200101516000620002d460201b620023e51790919060201c565b50808060010191505062000124565b5081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d3060405180807f455243373737546f6b656e73526563697069656e74000000000000000000000081525060150190506040518091039020306040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b158015620002b357600080fd5b505af1158015620002c8573d6000803e3d6000fd5b505050505050620003a9565b600062000304836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200030c60201b60201c565b905092915050565b60006200032083836200038660201b60201c565b6200037b57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000380565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b612f4e80620003b96000396000f3fe60806040526004361061010c5760003560e01c806383c09d4211610095578063c7e3af6b11610064578063c7e3af6b1461088f578063cc3ae6e614610a30578063ce5494bb14610ac1578063d3c7c2c714610b12578063e62ece3014610b7e5761016d565b806383c09d4214610692578063a0e8d7ca14610725578063a28835b6146107ed578063b8d1452f1461083e5761016d565b80632c99d4e2116100dc5780632c99d4e2146104fb5780633fc8cef3146105525780636d69fcaf146105a9578063763191901461061257806383197ef01461067b5761016d565b806223de29146101725780630a23b33b146102b75780631328ed3c146103205780631bc4da52146103915761016d565b3661016d57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461016b57600080fd5b005b600080fd5b34801561017e57600080fd5b506102b5600480360360c081101561019557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561021c57600080fd5b82018360208201111561022e57600080fd5b8035906020019184600183028401116401000000008311171561025057600080fd5b90919293919293908035906020019064010000000081111561027157600080fd5b82018360208201111561028357600080fd5b803590602001918460018302840111640100000000831117156102a557600080fd5b9091929391929390505050610bcf565b005b3480156102c357600080fd5b50610306600480360360208110156102da57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fc1565b604051808215151515815260200191505060405180910390f35b34801561032c57600080fd5b5061038f6004803603604081101561034357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fde565b005b6104e1600480360360408110156103a757600080fd5b81019080803590602001906401000000008111156103c457600080fd5b8201836020820111156103d657600080fd5b803590602001918460018302840111640100000000831117156103f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561045b57600080fd5b82018360208201111561046d57600080fd5b8035906020019184600183028401116401000000008311171561048f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506110af565b604051808215151515815260200191505060405180910390f35b34801561050757600080fd5b506105106113da565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561055e57600080fd5b50610567611400565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105b557600080fd5b506105f8600480360360208110156105cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611426565b604051808215151515815260200191505060405180910390f35b34801561061e57600080fd5b506106616004803603602081101561063557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611509565b604051808215151515815260200191505060405180910390f35b34801561068757600080fd5b506106906115e9565b005b34801561069e57600080fd5b5061070b600480360360608110156106b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611813565b604051808215151515815260200191505060405180910390f35b34801561073157600080fd5b506107d36004803603606081101561074857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561078f57600080fd5b8201836020820111156107a157600080fd5b803590602001918460018302840111640100000000831117156107c357600080fd5b9091929391929390505050611a3e565b604051808215151515815260200191505060405180910390f35b3480156107f957600080fd5b5061083c6004803603602081101561081057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa9565b005b34801561084a57600080fd5b5061088d6004803603602081101561086157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611be2565b005b34801561089b57600080fd5b50610a16600480360360808110156108b257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184600183028401116401000000008311171561092d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561099057600080fd5b8201836020820111156109a257600080fd5b803590602001918460018302840111640100000000831117156109c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ce9565b604051808215151515815260200191505060405180910390f35b610aa760048036036020811015610a4657600080fd5b8101908080359060200190640100000000811115610a6357600080fd5b820183602082011115610a7557600080fd5b80359060200191846001830284011164010000000083111715610a9757600080fd5b9091929391929390505050611f5f565b604051808215151515815260200191505060405180910390f35b348015610acd57600080fd5b50610b1060048036036020811015610ae457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc6565b005b348015610b1e57600080fd5b50610b276120d4565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b6a578082015181840152602081019050610b4f565b505050509050019250505060405180910390f35b348015610b8a57600080fd5b50610bcd60048036036020811015610ba157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612193565b005b6000339050610be881600061229a90919063ffffffff16565b610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612ef26027913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612dd86023913960400191505060405180910390fd5b6000858590501115610fb65760008611610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612e796027913960400191505060405180910390fd5b6000606086866040811015610d3a57600080fd5b810190808035906020019092919080359060200190640100000000811115610d6157600080fd5b820183602082011115610d7357600080fd5b80359060200191846001830284011164010000000083111715610d9557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050509150915060405180807f4552433737372d706567496e0000000000000000000000000000000000000000815250600c01905060405180910390208214610e73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612e20602e913960400191505060405180910390fd5b7fd45bf0460398ad3b27d2bd85144872898591943b81eca880e34fca0a229aa0dc838b8a848b8b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001838103835286818151815260200191508051906020019080838360005b83811015610f48578082015181840152602081019050610f2d565b50505050905090810190601f168015610f755780820380516001836020036101000a031916815260200191505b508381038252858582818152602001925080828437600081840152601f19601f8201169050808301925050509850505050505050505060405180910390a150505b505050505050505050565b6000610fd782600061229a90919063ffffffff16565b9050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b6110ab82826122ca565b5050565b60006110e7600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061229a90919063ffffffff16565b611159576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f57455448206973204e4f5420737570706f72746564210000000000000000000081525060200191505060405180910390fd5b600034116111b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612ea06028913960400191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561121c57600080fd5b505af1158015611230573d6000803e3d6000fd5b50505050507fd45bf0460398ad3b27d2bd85144872898591943b81eca880e34fca0a229aa0dc600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633348686604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561132b578082015181840152602081019050611310565b50505050905090810190601f1680156113585780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611391578082015181840152602081019050611376565b50505050905090810190601f1680156113be5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a16001905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b6114ff8260006123e590919063ffffffff16565b5060019050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b6115e282600061241590919063ffffffff16565b9050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b60008090505b6116bc6000612445565b8110156117f95760006116d982600061245a90919063ffffffff16565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561175a57600080fd5b505afa15801561176e573d6000803e3d6000fd5b505050506040513d602081101561178457600080fd5b8101908080519060200190929190505050146117eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612dfb6025913960400191505060405180910390fd5b5080806001019150506116b2565b503373ffffffffffffffffffffffffffffffffffffffff16ff5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a0757600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119a357600080fd5b505af11580156119b7573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611a01573d6000803e3d6000fd5b50611a33565b611a3284838573ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b5b600190509392505050565b6000611a9f858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611ce9565b9050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff16611ac861252c565b73ffffffffffffffffffffffffffffffffffffffff1614611b51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f63616c6c6572206973206e6f7420746865206f776e657200000000000000000081525060200191505060405180910390fd5b6000611b5c82612556565b905060008111611bd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f61646d696e2077697464726177206e6f7420616c6c6f7765640000000000000081525060200191505060405180910390fd5b611bde8282612588565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ca5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611cff84600061229a90919063ffffffff16565b611d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180612e4e602b913960400191505060405180910390fd5b60008511611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612e796027913960400191505060405180910390fd5b611dda3330878773ffffffffffffffffffffffffffffffffffffffff1661269e909392919063ffffffff16565b7fd45bf0460398ad3b27d2bd85144872898591943b81eca880e34fca0a229aa0dc8433878686604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015611eae578082015181840152602081019050611e93565b50505050905090810190601f168015611edb5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f14578082015181840152602081019050611ef9565b50505050905090810190601f168015611f415780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a160019050949350505050565b6000611fbe83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050604051806020016040528060008152506110af565b905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b60008090505b6120996000612445565b8110156120d05760006120b682600061245a90919063ffffffff16565b90506120c283826122ca565b50808060010191505061208f565b5050565b60606120e06000612445565b60405190808252806020026020018201604052801561210e5781602001602082028038833980820191505090505b50905060008090505b6121216000612445565b81101561218f5761213c81600061245a90919063ffffffff16565b82828151811061214857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050612117565b5090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612256576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006122c2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61278b565b905092915050565b6122de81600061229a90919063ffffffff16565b156123e15760008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561236257600080fd5b505afa158015612376573d6000803e3d6000fd5b505050506040513d602081101561238c57600080fd5b810190808051906020019092919050505090506123ca83828473ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b6123de82600061241590919063ffffffff16565b50505b5050565b600061240d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6127ae565b905092915050565b600061243d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61281e565b905092915050565b600061245382600001612906565b9050919050565b60006124698360000183612917565b60001c905092915050565b6125278363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061299a565b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061256c82600061229a90919063ffffffff16565b61257e5761257982612a89565b612581565b60005b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612609573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612603573d6000803e3d6000fd5b50612635565b61263433828473ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b5b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f46ae78bc7b198b8b534ca0070d125569ac5f955976841c4343223079f3abf0de836040518082815260200191505060405180910390a35050565b612785846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061299a565b50505050565b600080836001016000848152602001908152602001600020541415905092915050565b60006127ba838361278b565b612813578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612818565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146128fa576000600182039050600060018660000180549050039050600086600001828154811061286957fe5b906000526020600020015490508087600001848154811061288657fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806128be57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612900565b60009150505b92915050565b600081600001805490509050919050565b600081836000018054905011612978576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612db66022913960400191505060405180910390fd5b82600001828154811061298757fe5b9060005260206000200154905092915050565b60606129fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b849092919063ffffffff16565b9050600081511115612a8457808060200190516020811015612a1d57600080fd5b8101908080519060200190929190505050612a83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612ec8602a913960400191505060405180910390fd5b5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b7b578173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b3b57600080fd5b505afa158015612b4f573d6000803e3d6000fd5b505050506040513d6020811015612b6557600080fd5b8101908080519060200190929190505050612b7d565b475b9050919050565b6060612b938484600085612b9c565b90509392505050565b6060612ba785612da2565b612c19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612c695780518252602082019150602081019050602083039250612c46565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612ccb576040519150601f19603f3d011682016040523d82523d6000602084013e612cd0565b606091505b50915091508115612ce5578092505050612d9a565b600081511115612cf85780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d5f578082015181840152602081019050612d44565b50505050905090810190601f168015612d8c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473546f6b656e207265636569766572206973206e6f74207468697320636f6e747261637442616c616e6365206f6620737570706f7274656420746f6b656e73206d7573742062652030496e76616c69642074616720666f72206175746f6d6174696320706567496e206f6e204552433737372073656e64546f6b656e20617420737570706c6965642061646472657373206973204e4f5420737570706f7274656421546f6b656e20616d6f756e74206d7573742062652067726561746572207468616e207a65726f2145746865727320616d6f756e74206d7573742062652067726561746572207468616e207a65726f215361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656463616c6c6572206973206e6f74206120737570706f727465642045524337373720746f6b656e21a2646970667358221220d55c3da80f6534edd75b8e8a15103b9d446c1c6c09c1cb2867b3735f6fcf199a64736f6c63430006020033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000089ab32156e46f46d02ade3fecbe5fc4243b9aaed
Deployed Bytecode
0x60806040526004361061010c5760003560e01c806383c09d4211610095578063c7e3af6b11610064578063c7e3af6b1461088f578063cc3ae6e614610a30578063ce5494bb14610ac1578063d3c7c2c714610b12578063e62ece3014610b7e5761016d565b806383c09d4214610692578063a0e8d7ca14610725578063a28835b6146107ed578063b8d1452f1461083e5761016d565b80632c99d4e2116100dc5780632c99d4e2146104fb5780633fc8cef3146105525780636d69fcaf146105a9578063763191901461061257806383197ef01461067b5761016d565b806223de29146101725780630a23b33b146102b75780631328ed3c146103205780631bc4da52146103915761016d565b3661016d57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461016b57600080fd5b005b600080fd5b34801561017e57600080fd5b506102b5600480360360c081101561019557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561021c57600080fd5b82018360208201111561022e57600080fd5b8035906020019184600183028401116401000000008311171561025057600080fd5b90919293919293908035906020019064010000000081111561027157600080fd5b82018360208201111561028357600080fd5b803590602001918460018302840111640100000000831117156102a557600080fd5b9091929391929390505050610bcf565b005b3480156102c357600080fd5b50610306600480360360208110156102da57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fc1565b604051808215151515815260200191505060405180910390f35b34801561032c57600080fd5b5061038f6004803603604081101561034357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fde565b005b6104e1600480360360408110156103a757600080fd5b81019080803590602001906401000000008111156103c457600080fd5b8201836020820111156103d657600080fd5b803590602001918460018302840111640100000000831117156103f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561045b57600080fd5b82018360208201111561046d57600080fd5b8035906020019184600183028401116401000000008311171561048f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506110af565b604051808215151515815260200191505060405180910390f35b34801561050757600080fd5b506105106113da565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561055e57600080fd5b50610567611400565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105b557600080fd5b506105f8600480360360208110156105cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611426565b604051808215151515815260200191505060405180910390f35b34801561061e57600080fd5b506106616004803603602081101561063557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611509565b604051808215151515815260200191505060405180910390f35b34801561068757600080fd5b506106906115e9565b005b34801561069e57600080fd5b5061070b600480360360608110156106b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611813565b604051808215151515815260200191505060405180910390f35b34801561073157600080fd5b506107d36004803603606081101561074857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561078f57600080fd5b8201836020820111156107a157600080fd5b803590602001918460018302840111640100000000831117156107c357600080fd5b9091929391929390505050611a3e565b604051808215151515815260200191505060405180910390f35b3480156107f957600080fd5b5061083c6004803603602081101561081057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa9565b005b34801561084a57600080fd5b5061088d6004803603602081101561086157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611be2565b005b34801561089b57600080fd5b50610a16600480360360808110156108b257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184600183028401116401000000008311171561092d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561099057600080fd5b8201836020820111156109a257600080fd5b803590602001918460018302840111640100000000831117156109c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ce9565b604051808215151515815260200191505060405180910390f35b610aa760048036036020811015610a4657600080fd5b8101908080359060200190640100000000811115610a6357600080fd5b820183602082011115610a7557600080fd5b80359060200191846001830284011164010000000083111715610a9757600080fd5b9091929391929390505050611f5f565b604051808215151515815260200191505060405180910390f35b348015610acd57600080fd5b50610b1060048036036020811015610ae457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc6565b005b348015610b1e57600080fd5b50610b276120d4565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b6a578082015181840152602081019050610b4f565b505050509050019250505060405180910390f35b348015610b8a57600080fd5b50610bcd60048036036020811015610ba157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612193565b005b6000339050610be881600061229a90919063ffffffff16565b610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612ef26027913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612dd86023913960400191505060405180910390fd5b6000858590501115610fb65760008611610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612e796027913960400191505060405180910390fd5b6000606086866040811015610d3a57600080fd5b810190808035906020019092919080359060200190640100000000811115610d6157600080fd5b820183602082011115610d7357600080fd5b80359060200191846001830284011164010000000083111715610d9557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050509150915060405180807f4552433737372d706567496e0000000000000000000000000000000000000000815250600c01905060405180910390208214610e73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612e20602e913960400191505060405180910390fd5b7fd45bf0460398ad3b27d2bd85144872898591943b81eca880e34fca0a229aa0dc838b8a848b8b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001838103835286818151815260200191508051906020019080838360005b83811015610f48578082015181840152602081019050610f2d565b50505050905090810190601f168015610f755780820380516001836020036101000a031916815260200191505b508381038252858582818152602001925080828437600081840152601f19601f8201169050808301925050509850505050505050505060405180910390a150505b505050505050505050565b6000610fd782600061229a90919063ffffffff16565b9050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b6110ab82826122ca565b5050565b60006110e7600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061229a90919063ffffffff16565b611159576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f57455448206973204e4f5420737570706f72746564210000000000000000000081525060200191505060405180910390fd5b600034116111b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612ea06028913960400191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561121c57600080fd5b505af1158015611230573d6000803e3d6000fd5b50505050507fd45bf0460398ad3b27d2bd85144872898591943b81eca880e34fca0a229aa0dc600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633348686604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561132b578082015181840152602081019050611310565b50505050905090810190601f1680156113585780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611391578082015181840152602081019050611376565b50505050905090810190601f1680156113be5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a16001905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b6114ff8260006123e590919063ffffffff16565b5060019050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b6115e282600061241590919063ffffffff16565b9050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b60008090505b6116bc6000612445565b8110156117f95760006116d982600061245a90919063ffffffff16565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561175a57600080fd5b505afa15801561176e573d6000803e3d6000fd5b505050506040513d602081101561178457600080fd5b8101908080519060200190929190505050146117eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612dfb6025913960400191505060405180910390fd5b5080806001019150506116b2565b503373ffffffffffffffffffffffffffffffffffffffff16ff5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a0757600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119a357600080fd5b505af11580156119b7573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611a01573d6000803e3d6000fd5b50611a33565b611a3284838573ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b5b600190509392505050565b6000611a9f858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611ce9565b9050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff16611ac861252c565b73ffffffffffffffffffffffffffffffffffffffff1614611b51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f63616c6c6572206973206e6f7420746865206f776e657200000000000000000081525060200191505060405180910390fd5b6000611b5c82612556565b905060008111611bd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f61646d696e2077697464726177206e6f7420616c6c6f7765640000000000000081525060200191505060405180910390fd5b611bde8282612588565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ca5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611cff84600061229a90919063ffffffff16565b611d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180612e4e602b913960400191505060405180910390fd5b60008511611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612e796027913960400191505060405180910390fd5b611dda3330878773ffffffffffffffffffffffffffffffffffffffff1661269e909392919063ffffffff16565b7fd45bf0460398ad3b27d2bd85144872898591943b81eca880e34fca0a229aa0dc8433878686604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015611eae578082015181840152602081019050611e93565b50505050905090810190601f168015611edb5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f14578082015181840152602081019050611ef9565b50505050905090810190601f168015611f415780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a160019050949350505050565b6000611fbe83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050604051806020016040528060008152506110af565b905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b60008090505b6120996000612445565b8110156120d05760006120b682600061245a90919063ffffffff16565b90506120c283826122ca565b50808060010191505061208f565b5050565b60606120e06000612445565b60405190808252806020026020018201604052801561210e5781602001602082028038833980820191505090505b50905060008090505b6121216000612445565b81101561218f5761213c81600061245a90919063ffffffff16565b82828151811061214857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050612117565b5090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612256576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616c6c6572206d75737420626520504e4554574f524b20616464726573732181525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006122c2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61278b565b905092915050565b6122de81600061229a90919063ffffffff16565b156123e15760008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561236257600080fd5b505afa158015612376573d6000803e3d6000fd5b505050506040513d602081101561238c57600080fd5b810190808051906020019092919050505090506123ca83828473ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b6123de82600061241590919063ffffffff16565b50505b5050565b600061240d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6127ae565b905092915050565b600061243d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61281e565b905092915050565b600061245382600001612906565b9050919050565b60006124698360000183612917565b60001c905092915050565b6125278363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061299a565b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061256c82600061229a90919063ffffffff16565b61257e5761257982612a89565b612581565b60005b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612609573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612603573d6000803e3d6000fd5b50612635565b61263433828473ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b5b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f46ae78bc7b198b8b534ca0070d125569ac5f955976841c4343223079f3abf0de836040518082815260200191505060405180910390a35050565b612785846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061299a565b50505050565b600080836001016000848152602001908152602001600020541415905092915050565b60006127ba838361278b565b612813578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612818565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146128fa576000600182039050600060018660000180549050039050600086600001828154811061286957fe5b906000526020600020015490508087600001848154811061288657fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806128be57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612900565b60009150505b92915050565b600081600001805490509050919050565b600081836000018054905011612978576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612db66022913960400191505060405180910390fd5b82600001828154811061298757fe5b9060005260206000200154905092915050565b60606129fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b849092919063ffffffff16565b9050600081511115612a8457808060200190516020811015612a1d57600080fd5b8101908080519060200190929190505050612a83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612ec8602a913960400191505060405180910390fd5b5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b7b578173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b3b57600080fd5b505afa158015612b4f573d6000803e3d6000fd5b505050506040513d6020811015612b6557600080fd5b8101908080519060200190929190505050612b7d565b475b9050919050565b6060612b938484600085612b9c565b90509392505050565b6060612ba785612da2565b612c19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612c695780518252602082019150602081019050602083039250612c46565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612ccb576040519150601f19603f3d011682016040523d82523d6000602084013e612cd0565b606091505b50915091508115612ce5578092505050612d9a565b600081511115612cf85780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d5f578082015181840152602081019050612d44565b50505050905090810190601f168015612d8c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473546f6b656e207265636569766572206973206e6f74207468697320636f6e747261637442616c616e6365206f6620737570706f7274656420746f6b656e73206d7573742062652030496e76616c69642074616720666f72206175746f6d6174696320706567496e206f6e204552433737372073656e64546f6b656e20617420737570706c6965642061646472657373206973204e4f5420737570706f7274656421546f6b656e20616d6f756e74206d7573742062652067726561746572207468616e207a65726f2145746865727320616d6f756e74206d7573742062652067726561746572207468616e207a65726f215361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656463616c6c6572206973206e6f74206120737570706f727465642045524337373720746f6b656e21a2646970667358221220d55c3da80f6534edd75b8e8a15103b9d446c1c6c09c1cb2867b3735f6fcf199a64736f6c63430006020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000089ab32156e46f46d02ade3fecbe5fc4243b9aaed
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _tokensToSupport (address[]): 0x89Ab32156e46F46D02ade3FEcbe5Fc4243B9AAeD
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000089ab32156e46f46d02ade3fecbe5fc4243b9aaed
Deployed Bytecode Sourcemap
34426:6895:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35705:4;;;;;;;;;;;35683:27;;:10;:27;;;35675:36;;;;;;34426:6895;;;;;38019:878;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38019:878:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;38019:878:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38019:878:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38019:878:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38019:878:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38019:878:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38019:878:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38019:878:0;;;;;;;;;;;;:::i;:::-;;35936:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35936:130:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35936:130:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40739:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40739:190:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40739:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39091:489;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39091:489:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;39091:489:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39091:489:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39091:489:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39091:489:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;39091:489:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39091:489:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39091:489:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39091:489:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34847:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34847:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34877:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34877:17:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36356:218;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36356:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36356:218:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36582:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36582:209:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36582:209:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40373:358;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40373:358:0;;;:::i;:::-;;39588:478;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39588:478:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39588:478:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37067:263;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37067:263:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37067:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;37067:263:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37067:263:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;37067:263:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33541:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33541:213:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33541:213:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;35727:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35727:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35727:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;37338:606;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37338:606:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;37338:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;37338:606:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37338:606:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;37338:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;37338:606:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;37338:606:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37338:606:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;37338:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;37338:606:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38905:178;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38905:178:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38905:178:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38905:178:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38905:178:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40074:291;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40074:291:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40074:291:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;36799:260;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36799:260:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36799:260:0;;;;;;;;;;;;;;;;;35827:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35827:101:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35827:101:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;38019:878;38255:21;38279:10;38255:34;;38308:39;38333:13;38308:15;:24;;:39;;;;:::i;:::-;38300:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38424:4;38410:19;;:2;:19;;;38402:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38502:1;38484:8;;:15;;:19;38480:410;;;38537:1;38528:6;:10;38520:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38598:11;38611:33;38659:8;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38648:39:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38648:39:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38648:39:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38648:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;38648:39:0;;;;;;;;;;;;;;38597:90;;;;38717:25;;;;;;;;;;;;;;;;;;;38710:3;:32;38702:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38813:65;38819:13;38834:4;38840:6;38848:19;38869:8;;38813:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;38813:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;38813:65:0;;;;;;;;;;;;;;;;;;;38480:410;;;38019:878;;;;;;;;;:::o;35936:130::-;36002:4;36026:32;36051:6;36026:15;:24;;:32;;;;:::i;:::-;36019:39;;35936:130;;;:::o;40739:190::-;35564:8;;;;;;;;;;;35550:22;;:10;:22;;;35542:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40887:34:::1;40902:3;40907:13;40887:14;:34::i;:::-;40739:190:::0;;:::o;39091:489::-;39244:4;39274:39;39307:4;;;;;;;;;;;39274:15;:24;;:39;;;;:::i;:::-;39266:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39371:1;39359:9;:13;39351:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39428:4;;;;;;;;;;;:12;;;39447:9;39428:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39428:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39428:31:0;;;;;39475:75;39489:4;;;;;;;;;;;39496:10;39508:9;39519:19;39540:9;39475:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;39475:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;39475:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39568:4;39561:11;;39091:489;;;;:::o;34847:23::-;;;;;;;;;;;;;:::o;34877:17::-;;;;;;;;;;;;;:::o;36356:218::-;36480:12;35564:8;;;;;;;;;;;35550:22;;:10;:22;;;35542:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36510:34:::1;36530:13;36510:15;:19;;:34;;;;:::i;:::-;;36562:4;36555:11;;36356:218:::0;;;:::o;36582:209::-;36709:12;35564:8;;;;;;;;;;;35550:22;;:10;:22;;;35542:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36746:37:::1;36769:13;36746:15;:22;;:37;;;;:::i;:::-;36739:44;;36582:209:::0;;;:::o;40373:358::-;35564:8;;;;;;;;;;;35550:22;;:10;:22;;;35542:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40453:9:::1;40465:1:::0;40453:13:::1;;40448:241;40472:24;:15;:22;:24::i;:::-;40468:1;:28;40448:241;;;40518:20;40541:21;40560:1;40541:15;:18;;:21;;;;:::i;:::-;40518:44;;40634:1;40592:12;40585:30;;;40624:4;40585:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;40585:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40585:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;40585:45:0;;;;;;;;;;;;;;;;:50;40577:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40448:241;40498:3;;;;;;;40448:241;;;;40712:10;40699:24;;;39588:478:::0;39774:4;35564:8;;;;;;;;;;;35550:22;;:10;:22;;;35542:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39825:4:::1;;;;;;;;;;;39800:30;;:13;:30;;;39796:241;;;39847:4;;;;;;;;;;;:13;;;39861:12;39847:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;39847:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39847:27:0;;;;39889:15;:24;;:38;39914:12;39889:38;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39889:38:0;39796:241;;;39960:65;39995:15;40012:12;39967:13;39960:34;;;;:65;;;;;:::i;:::-;39796:241;40054:4;40047:11;;39588:478:::0;;;;;:::o;37067:263::-;37234:4;37263:59;37269:12;37283:13;37298:19;;37263:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;37263:59:0;;;;;;;;;;;;;;;;;;:5;:59::i;:::-;37256:66;;37067:263;;;;;;:::o;33541:213::-;33028:10;33016:22;;:8;:6;:8::i;:::-;:22;;;33008:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33603:17:::1;33623:27;33644:5;33623:20;:27::i;:::-;33603:47;;33680:1;33665:12;:16;33657:54;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33718:30;33728:5;33735:12;33718:9;:30::i;:::-;33073:1;33541:213:::0;:::o;35727:92::-;35564:8;;;;;;;;;;;35550:22;;:10;:22;;;35542:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35805:5:::1;35792:4;;:19;;;;;;;;;;;;;;;;;;35727:92:::0;:::o;37338:606::-;37534:4;37564:39;37589:13;37564:15;:24;;:39;;;;:::i;:::-;37556:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37685:1;37670:12;:16;37662:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37741:79;37780:10;37800:4;37807:12;37748:13;37741:38;;;;:79;;;;;;:::i;:::-;37836:78;37842:13;37857:10;37869:12;37883:19;37904:9;37836:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37836:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37836:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37932:4;37925:11;;37338:606;;;;;;:::o;38905:178::-;39013:4;39042:33;39051:19;;39042:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39042:33:0;;;;;;;;;;;;;;;;;;:8;:33::i;:::-;39035:40;;38905:178;;;;:::o;40074:291::-;35564:8;;;;;;;;;;;35550:22;;:10;:22;;;35542:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40189:9:::1;40201:1:::0;40189:13:::1;;40184:174;40208:24;:15;:22;:24::i;:::-;40204:1;:28;40184:174;;;40254:20;40277:21;40296:1;40277:15;:18;;:21;;;;:::i;:::-;40254:44;;40313:33;40328:3;40333:12;40313:14;:33::i;:::-;40184:174;40234:3;;;;;;;40184:174;;;;40074:291:::0;:::o;36799:260::-;36851:20;36904:24;:15;:22;:24::i;:::-;36890:39;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36890:39:0;;;;36884:45;;36945:9;36957:1;36945:13;;36940:112;36964:24;:15;:22;:24::i;:::-;36960:1;:28;36940:112;;;37019:21;37038:1;37019:15;:18;;:21;;;;:::i;:::-;37010:3;37014:1;37010:6;;;;;;;;;;;;;:30;;;;;;;;;;;36990:3;;;;;;;36940:112;;;;36799:260;:::o;35827:101::-;35564:8;;;;;;;;;;;35550:22;;:10;:22;;;35542:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35911:9:::1;35900:8;;:20;;;;;;;;;;;;;;;;;;35827:101:::0;:::o;23714:158::-;23794:4;23818:46;23828:3;:10;;23856:5;23848:14;;23840:23;;23818:9;:46::i;:::-;23811:53;;23714:158;;;;:::o;40937:381::-;41067:39;41092:13;41067:15;:24;;:39;;;;:::i;:::-;41063:248;;;41123:12;41145:13;41138:31;;;41178:4;41138:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41138:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41138:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41138:46:0;;;;;;;;;;;;;;;;41123:61;;41199:48;41234:3;41239:7;41206:13;41199:34;;;;:48;;;;;:::i;:::-;41262:37;41285:13;41262:15;:22;;:37;;;;:::i;:::-;;41063:248;;40937:381;;:::o;23160:143::-;23230:4;23254:41;23259:3;:10;;23287:5;23279:14;;23271:23;;23254:4;:41::i;:::-;23247:48;;23160:143;;;;:::o;23479:149::-;23552:4;23576:44;23584:3;:10;;23612:5;23604:14;;23596:23;;23576:7;:44::i;:::-;23569:51;;23479:149;;;;:::o;23958:117::-;24021:7;24048:19;24056:3;:10;;24048:7;:19::i;:::-;24041:26;;23958:117;;;:::o;24419:149::-;24493:7;24536:22;24540:3;:10;;24552:5;24536:3;:22::i;:::-;24528:31;;24513:47;;24419:149;;;;:::o;15017:177::-;15100:86;15120:5;15150:23;;;15175:2;15179:5;15127:58;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15127:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;15127:58:0;15100:19;:86::i;:::-;15017:177;;;:::o;36074:87::-;36118:7;36145:8;;;;;;;;;;;36138:15;;36074:87;:::o;36169:179::-;36245:4;36269:31;36294:5;36269:15;:24;;:31;;;;:::i;:::-;:71;;36307:33;36334:5;36307:26;:33::i;:::-;36269:71;;;36303:1;36269:71;36262:78;;36169:179;;;:::o;33760:292::-;33340:1;33836:22;;:13;:22;;;33832:151;;;33869:10;:19;;:28;33889:7;33869:28;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33869:28:0;33832:151;;;33920:55;33955:10;33967:7;33927:13;33920:34;;;;:55;;;;;:::i;:::-;33832:151;34023:13;33994:52;;34011:10;33994:52;;;34038:7;33994:52;;;;;;;;;;;;;;;;;;33760:292;;:::o;15202:205::-;15303:96;15323:5;15353:27;;;15382:4;15388:2;15392:5;15330:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15330:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;15330:68:0;15303:19;:96::i;:::-;15202:205;;;;:::o;22034:129::-;22107:4;22154:1;22131:3;:12;;:19;22144:5;22131:19;;;;;;;;;;;;:24;;22124:31;;22034:129;;;;:::o;19814:414::-;19877:4;19899:21;19909:3;19914:5;19899:9;:21::i;:::-;19894:327;;19937:3;:11;;19954:5;19937:23;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;19937:23:0;;;;;;;;;;;;;;;;;;;20120:3;:11;;:18;;;;20098:3;:12;;:19;20111:5;20098:19;;;;;;;;;;;:40;;;;20160:4;20153:11;;;;19894:327;20204:5;20197:12;;19814:414;;;;;:::o;20404:1544::-;20470:4;20588:18;20609:3;:12;;:19;20622:5;20609:19;;;;;;;;;;;;20588:40;;20659:1;20645:10;:15;20641:1300;;21007:21;21044:1;21031:10;:14;21007:38;;21060:17;21101:1;21080:3;:11;;:18;;;;:22;21060:42;;21347:17;21367:3;:11;;21379:9;21367:22;;;;;;;;;;;;;;;;21347:42;;21513:9;21484:3;:11;;21496:13;21484:26;;;;;;;;;;;;;;;:38;;;;21632:1;21616:13;:17;21590:3;:12;;:23;21603:9;21590:23;;;;;;;;;;;:43;;;;21742:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;21837:3;:12;;:19;21850:5;21837:19;;;;;;;;;;;21830:26;;;21880:4;21873:11;;;;;;;;20641:1300;21924:5;21917:12;;;20404:1544;;;;;:::o;22249:109::-;22305:7;22332:3;:11;;:18;;;;22325:25;;22249:109;;;:::o;22702:204::-;22769:7;22818:5;22797:3;:11;;:18;;;;:26;22789:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22880:3;:11;;22892:5;22880:18;;;;;;;;;;;;;;;;22873:25;;22702:204;;;;:::o;17322:761::-;17746:23;17772:69;17800:4;17772:69;;;;;;;;;;;;;;;;;17780:5;17772:27;;;;:69;;;;;:::i;:::-;17746:95;;17876:1;17856:10;:17;:21;17852:224;;;17998:10;17987:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17987:30:0;;;;;;;;;;;;;;;;17979:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17852:224;17322:761;;;:::o;34118:217::-;34193:18;33340:1;34236:14;;:5;:14;;;:93;;34298:5;34291:23;;;34323:4;34291:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34291:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34291:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34291:38:0;;;;;;;;;;;;;;;;34236:93;;;34260:21;34236:93;34220:109;;34118:217;;;:::o;11965:196::-;12068:12;12100:53;12123:6;12131:4;12137:1;12140:12;12100:22;:53::i;:::-;12093:60;;11965:196;;;;;:::o;13342:979::-;13472:12;13505:18;13516:6;13505:10;:18::i;:::-;13497:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13631:12;13645:23;13672:6;:11;;13692:8;13703:4;13672:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;13672:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;13630:78:0;;;;13723:7;13719:595;;;13754:10;13747:17;;;;;;13719:595;13888:1;13868:10;:17;:21;13864:439;;;14131:10;14125:17;14192:15;14179:10;14175:2;14171:19;14164:44;14079:148;14274:12;14267:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14267:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13342:979;;;;;;;:::o;9047:422::-;9107:4;9315:12;9426:7;9414:20;9406:28;;9460:1;9453:4;:8;9446:15;;;9047:422;;;:::o
Swarm Source
ipfs://d55c3da80f6534edd75b8e8a15103b9d446c1c6c09c1cb2867b3735f6fcf199a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.