Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Tesseract
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-20 */ // Sources flattened with hardhat v2.9.3 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // License: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // License: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/proxy/beacon/[email protected] // License: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // License: MIT // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly { r.slot := slot } } } // File @openzeppelin/contracts-upgradeable/proxy/ERC1967/[email protected] // License: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // License: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate that the this implementation remains valid after an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // License: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // License: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // License: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File contracts/interfaces/IWormholeBridge.sol // License: MIT pragma solidity 0.8.11; // Authors: Francesco Sullo <[email protected]> // to be used by Tesseract.sol interface IWormholeBridge { function wormholeTransfer( uint256 payload, uint16 recipientChain, bytes32 recipient, uint32 nonce ) external payable returns (uint64 sequence); function wormholeCompleteTransfer(bytes memory encodedVm) external; } // File contracts/interfaces/ITesseract.sol // License: MIT pragma solidity 0.8.11; // Author: Francesco Sullo <[email protected]> // (c) 2022+ SuperPower Labs Inc. interface ITesseract { event BridgeSet(uint16 bridgeType, address bridge); event ImplementationUpgraded(address newImplementation); function setBridge(uint16 bridgeType, address bridge_) external; function supportedBridgeById(uint256 id) external view returns (string memory); function crossChainTransfer( uint8 bridgeType, uint256 payload, uint16 recipientChain, uint32 nonce ) external payable returns (uint64 sequence); function completeCrossChainTransfer(uint16 bridgeType, bytes memory encodedVm) external; } // File contracts/utils/Versionable.sol // License: MIT pragma solidity 0.8.11; // Author: Francesco Sullo <[email protected]> // (c) 2022+ SuperPower Labs Inc. contract Versionable { function version() external pure virtual returns (uint256) { return 1; } } // File contracts/Tesseract.sol // License: MIT pragma solidity 0.8.11; // Author: Francesco Sullo <[email protected]> // (c) 2022+ SuperPower Labs Inc. //import "hardhat/console.sol"; contract Tesseract is ITesseract, Versionable, Initializable, OwnableUpgradeable, UUPSUpgradeable { using AddressUpgradeable for address; using SafeMathUpgradeable for uint256; mapping(uint16 => address) public bridges; // bridges[1] is WormholeBridge /// @custom:oz-upgrades-unsafe-allow constructor constructor() initializer {} // solhint-disable-next-line function initialize() public initializer { __Ownable_init(); } function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} function setBridge(uint16 bridgeType, address bridge_) external override onlyOwner { require(bridge_.isContract(), "Tesseract: bridge_ not a contract"); bridges[bridgeType] = bridge_; emit BridgeSet(bridgeType, bridge_); } function supportedBridgeById(uint256 id) external view virtual override returns (string memory) { if (id == 1) { return "Wormhole"; } else { revert("Tesseract: unsupported bridge"); } } function crossChainTransfer( uint8 bridgeType, uint256 payload, uint16 recipientChain, uint32 nonce ) external payable virtual override returns (uint64 sequence) { if (bridgeType == 1) { return IWormholeBridge(bridges[1]).wormholeTransfer(payload, recipientChain, bytes32(uint256(uint160(_msgSender()))), nonce); } else { revert("Tesseract: unsupported bridge"); } } function completeCrossChainTransfer(uint16 bridgeType, bytes memory encodedVm) external override { if (bridgeType == 1) { IWormholeBridge(bridges[1]).wormholeCompleteTransfer(encodedVm); } else { revert("Tesseract: unsupported bridge"); } } function withdrawProceeds(address payable to) public onlyOwner { to.transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"bridgeType","type":"uint16"},{"indexed":false,"internalType":"address","name":"bridge","type":"address"}],"name":"BridgeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newImplementation","type":"address"}],"name":"ImplementationUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"bridges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"bridgeType","type":"uint16"},{"internalType":"bytes","name":"encodedVm","type":"bytes"}],"name":"completeCrossChainTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"bridgeType","type":"uint8"},{"internalType":"uint256","name":"payload","type":"uint256"},{"internalType":"uint16","name":"recipientChain","type":"uint16"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"crossChainTransfer","outputs":[{"internalType":"uint64","name":"sequence","type":"uint64"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bridgeType","type":"uint16"},{"internalType":"address","name":"bridge_","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"supportedBridgeById","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdrawProceeds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523060805234801561001457600080fd5b50600054610100900460ff166100305760005460ff1615610038565b6100386100d9565b61009f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff161580156100c1576000805461ffff19166101011790555b80156100d3576000805461ff00191690555b50610103565b60006100ee306100f460201b610a011760201c565b15905090565b6001600160a01b03163b151590565b6080516113056200013b6000396000818161034e0152818161038e0152818161042e0152818161046e015261050101526113056000f3fe6080604052600436106100dd5760003560e01c80638129fc1c1161007f57806395ce2f5f1161005957806395ce2f5f1461022c578063ae6365af1461024c578063bfc938a21461026c578063f2fde38b146102a257600080fd5b80638129fc1c146101b95780638c43fb77146101ce5780638da5cb5b146101fa57600080fd5b806352d1902d116100bb57806352d1902d1461014d57806354fd4d501461017057806362810c8114610184578063715018a6146101a457600080fd5b80630902585c146100e25780633659cfe6146101185780634f1ef2861461013a575b600080fd5b3480156100ee57600080fd5b506101026100fd366004610e88565b6102c2565b60405161010f9190610ef9565b60405180910390f35b34801561012457600080fd5b50610138610133366004610f21565b610343565b005b610138610148366004610fe1565b610423565b34801561015957600080fd5b506101626104f4565b60405190815260200161010f565b34801561017c57600080fd5b506001610162565b34801561019057600080fd5b5061013861019f366004610f21565b6105a7565b3480156101b057600080fd5b50610138610606565b3480156101c557600080fd5b5061013861063c565b6101e16101dc366004611043565b6106fc565b60405167ffffffffffffffff909116815260200161010f565b34801561020657600080fd5b506033546001600160a01b03165b6040516001600160a01b03909116815260200161010f565b34801561023857600080fd5b506101386102473660046110a3565b6107d7565b34801561025857600080fd5b506101386102673660046110da565b6108cd565b34801561027857600080fd5b506102146102873660046110f6565b60c9602052600090815260409020546001600160a01b031681565b3480156102ae57600080fd5b506101386102bd366004610f21565b610969565b606081600114156102f1575050604080518082019091526008815267576f726d686f6c6560c01b602082015290565b60405162461bcd60e51b815260206004820152601d60248201527f5465737365726163743a20756e737570706f727465642062726964676500000060448201526064015b60405180910390fd5b919050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561038c5760405162461bcd60e51b815260040161033590611111565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166103d5600080516020611289833981519152546001600160a01b031690565b6001600160a01b0316146103fb5760405162461bcd60e51b81526004016103359061115d565b61040481610a10565b6040805160008082526020820190925261042091839190610a3a565b50565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561046c5760405162461bcd60e51b815260040161033590611111565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166104b5600080516020611289833981519152546001600160a01b031690565b6001600160a01b0316146104db5760405162461bcd60e51b81526004016103359061115d565b6104e482610a10565b6104f082826001610a3a565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105945760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610335565b5060008051602061128983398151915290565b6033546001600160a01b031633146105d15760405162461bcd60e51b8152600401610335906111a9565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156104f0573d6000803e3d6000fd5b6033546001600160a01b031633146106305760405162461bcd60e51b8152600401610335906111a9565b61063a6000610baa565b565b600054610100900460ff166106575760005460ff161561065b565b303b155b6106be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610335565b600054610100900460ff161580156106e0576000805461ffff19166101011790555b6106e8610bfc565b8015610420576000805461ff001916905550565b60008460ff16600114156102f157600160005260c96020527fec506dfa273b51989632259ed9c63e160e61bff5202e6a55d2c8927ffef177ed546001600160a01b0316633b8c0e9c85853360405160e085901b6001600160e01b0319168152600481019390935261ffff90911660248301526001600160a01b0316604482015263ffffffff851660648201526084016020604051808303816000875af11580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce91906111de565b95945050505050565b6033546001600160a01b031633146108015760405162461bcd60e51b8152600401610335906111a9565b6001600160a01b0381163b6108625760405162461bcd60e51b815260206004820152602160248201527f5465737365726163743a206272696467655f206e6f74206120636f6e747261636044820152601d60fa1b6064820152608401610335565b61ffff8216600081815260c9602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f5e87ac5cff71a88cfe65efba503005d55bec682b17e679fb33398b9e3ddd0d8d910160405180910390a15050565b8161ffff16600114156102f157600160005260c96020527fec506dfa273b51989632259ed9c63e160e61bff5202e6a55d2c8927ffef177ed5460405163354a3f0960e11b81526001600160a01b0390911690636a947e1290610933908490600401610ef9565b600060405180830381600087803b15801561094d57600080fd5b505af1158015610961573d6000803e3d6000fd5b505050505050565b6033546001600160a01b031633146109935760405162461bcd60e51b8152600401610335906111a9565b6001600160a01b0381166109f85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610335565b61042081610baa565b6001600160a01b03163b151590565b6033546001600160a01b031633146104205760405162461bcd60e51b8152600401610335906111a9565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610a7257610a6d83610c2b565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610acc575060408051601f3d908101601f19168201909252610ac991810190611208565b60015b610b2f5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610335565b6000805160206112898339815191528114610b9e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610335565b50610a6d838383610cc7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610c235760405162461bcd60e51b815260040161033590611221565b61063a610cf2565b6001600160a01b0381163b610c985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610335565b60008051602061128983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610cd083610d22565b600082511180610cdd5750805b15610a6d57610cec8383610d62565b50505050565b600054610100900460ff16610d195760405162461bcd60e51b815260040161033590611221565b61063a33610baa565b610d2b81610c2b565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b610dca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610335565b600080846001600160a01b031684604051610de5919061126c565b600060405180830381855af49150503d8060008114610e20576040519150601f19603f3d011682016040523d82523d6000602084013e610e25565b606091505b50915091506107ce82826040518060600160405280602781526020016112a96027913960608315610e57575081610e81565b825115610e675782518084602001fd5b8160405162461bcd60e51b81526004016103359190610ef9565b9392505050565b600060208284031215610e9a57600080fd5b5035919050565b60005b83811015610ebc578181015183820152602001610ea4565b83811115610cec5750506000910152565b60008151808452610ee5816020860160208601610ea1565b601f01601f19169290920160200192915050565b602081526000610e816020830184610ecd565b6001600160a01b038116811461042057600080fd5b600060208284031215610f3357600080fd5b8135610e8181610f0c565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610f6557600080fd5b813567ffffffffffffffff80821115610f8057610f80610f3e565b604051601f8301601f19908116603f01168101908282118183101715610fa857610fa8610f3e565b81604052838152866020858801011115610fc157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215610ff457600080fd5b8235610fff81610f0c565b9150602083013567ffffffffffffffff81111561101b57600080fd5b61102785828601610f54565b9150509250929050565b803561ffff8116811461033e57600080fd5b6000806000806080858703121561105957600080fd5b843560ff8116811461106a57600080fd5b93506020850135925061107f60408601611031565b9150606085013563ffffffff8116811461109857600080fd5b939692955090935050565b600080604083850312156110b657600080fd5b6110bf83611031565b915060208301356110cf81610f0c565b809150509250929050565b600080604083850312156110ed57600080fd5b610fff83611031565b60006020828403121561110857600080fd5b610e8182611031565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156111f057600080fd5b815167ffffffffffffffff81168114610e8157600080fd5b60006020828403121561121a57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000825161127e818460208701610ea1565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220821af9d6917faa99a3be555797e3c3f0eecb60eb6ad590202f8732db8371ea3164736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106100dd5760003560e01c80638129fc1c1161007f57806395ce2f5f1161005957806395ce2f5f1461022c578063ae6365af1461024c578063bfc938a21461026c578063f2fde38b146102a257600080fd5b80638129fc1c146101b95780638c43fb77146101ce5780638da5cb5b146101fa57600080fd5b806352d1902d116100bb57806352d1902d1461014d57806354fd4d501461017057806362810c8114610184578063715018a6146101a457600080fd5b80630902585c146100e25780633659cfe6146101185780634f1ef2861461013a575b600080fd5b3480156100ee57600080fd5b506101026100fd366004610e88565b6102c2565b60405161010f9190610ef9565b60405180910390f35b34801561012457600080fd5b50610138610133366004610f21565b610343565b005b610138610148366004610fe1565b610423565b34801561015957600080fd5b506101626104f4565b60405190815260200161010f565b34801561017c57600080fd5b506001610162565b34801561019057600080fd5b5061013861019f366004610f21565b6105a7565b3480156101b057600080fd5b50610138610606565b3480156101c557600080fd5b5061013861063c565b6101e16101dc366004611043565b6106fc565b60405167ffffffffffffffff909116815260200161010f565b34801561020657600080fd5b506033546001600160a01b03165b6040516001600160a01b03909116815260200161010f565b34801561023857600080fd5b506101386102473660046110a3565b6107d7565b34801561025857600080fd5b506101386102673660046110da565b6108cd565b34801561027857600080fd5b506102146102873660046110f6565b60c9602052600090815260409020546001600160a01b031681565b3480156102ae57600080fd5b506101386102bd366004610f21565b610969565b606081600114156102f1575050604080518082019091526008815267576f726d686f6c6560c01b602082015290565b60405162461bcd60e51b815260206004820152601d60248201527f5465737365726163743a20756e737570706f727465642062726964676500000060448201526064015b60405180910390fd5b919050565b306001600160a01b037f0000000000000000000000000f1c734e9e1168d64b53f3f8a0695f1b76f14f5916141561038c5760405162461bcd60e51b815260040161033590611111565b7f0000000000000000000000000f1c734e9e1168d64b53f3f8a0695f1b76f14f596001600160a01b03166103d5600080516020611289833981519152546001600160a01b031690565b6001600160a01b0316146103fb5760405162461bcd60e51b81526004016103359061115d565b61040481610a10565b6040805160008082526020820190925261042091839190610a3a565b50565b306001600160a01b037f0000000000000000000000000f1c734e9e1168d64b53f3f8a0695f1b76f14f5916141561046c5760405162461bcd60e51b815260040161033590611111565b7f0000000000000000000000000f1c734e9e1168d64b53f3f8a0695f1b76f14f596001600160a01b03166104b5600080516020611289833981519152546001600160a01b031690565b6001600160a01b0316146104db5760405162461bcd60e51b81526004016103359061115d565b6104e482610a10565b6104f082826001610a3a565b5050565b6000306001600160a01b037f0000000000000000000000000f1c734e9e1168d64b53f3f8a0695f1b76f14f5916146105945760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610335565b5060008051602061128983398151915290565b6033546001600160a01b031633146105d15760405162461bcd60e51b8152600401610335906111a9565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156104f0573d6000803e3d6000fd5b6033546001600160a01b031633146106305760405162461bcd60e51b8152600401610335906111a9565b61063a6000610baa565b565b600054610100900460ff166106575760005460ff161561065b565b303b155b6106be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610335565b600054610100900460ff161580156106e0576000805461ffff19166101011790555b6106e8610bfc565b8015610420576000805461ff001916905550565b60008460ff16600114156102f157600160005260c96020527fec506dfa273b51989632259ed9c63e160e61bff5202e6a55d2c8927ffef177ed546001600160a01b0316633b8c0e9c85853360405160e085901b6001600160e01b0319168152600481019390935261ffff90911660248301526001600160a01b0316604482015263ffffffff851660648201526084016020604051808303816000875af11580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce91906111de565b95945050505050565b6033546001600160a01b031633146108015760405162461bcd60e51b8152600401610335906111a9565b6001600160a01b0381163b6108625760405162461bcd60e51b815260206004820152602160248201527f5465737365726163743a206272696467655f206e6f74206120636f6e747261636044820152601d60fa1b6064820152608401610335565b61ffff8216600081815260c9602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f5e87ac5cff71a88cfe65efba503005d55bec682b17e679fb33398b9e3ddd0d8d910160405180910390a15050565b8161ffff16600114156102f157600160005260c96020527fec506dfa273b51989632259ed9c63e160e61bff5202e6a55d2c8927ffef177ed5460405163354a3f0960e11b81526001600160a01b0390911690636a947e1290610933908490600401610ef9565b600060405180830381600087803b15801561094d57600080fd5b505af1158015610961573d6000803e3d6000fd5b505050505050565b6033546001600160a01b031633146109935760405162461bcd60e51b8152600401610335906111a9565b6001600160a01b0381166109f85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610335565b61042081610baa565b6001600160a01b03163b151590565b6033546001600160a01b031633146104205760405162461bcd60e51b8152600401610335906111a9565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610a7257610a6d83610c2b565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610acc575060408051601f3d908101601f19168201909252610ac991810190611208565b60015b610b2f5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610335565b6000805160206112898339815191528114610b9e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610335565b50610a6d838383610cc7565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610c235760405162461bcd60e51b815260040161033590611221565b61063a610cf2565b6001600160a01b0381163b610c985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610335565b60008051602061128983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610cd083610d22565b600082511180610cdd5750805b15610a6d57610cec8383610d62565b50505050565b600054610100900460ff16610d195760405162461bcd60e51b815260040161033590611221565b61063a33610baa565b610d2b81610c2b565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b610dca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610335565b600080846001600160a01b031684604051610de5919061126c565b600060405180830381855af49150503d8060008114610e20576040519150601f19603f3d011682016040523d82523d6000602084013e610e25565b606091505b50915091506107ce82826040518060600160405280602781526020016112a96027913960608315610e57575081610e81565b825115610e675782518084602001fd5b8160405162461bcd60e51b81526004016103359190610ef9565b9392505050565b600060208284031215610e9a57600080fd5b5035919050565b60005b83811015610ebc578181015183820152602001610ea4565b83811115610cec5750506000910152565b60008151808452610ee5816020860160208601610ea1565b601f01601f19169290920160200192915050565b602081526000610e816020830184610ecd565b6001600160a01b038116811461042057600080fd5b600060208284031215610f3357600080fd5b8135610e8181610f0c565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610f6557600080fd5b813567ffffffffffffffff80821115610f8057610f80610f3e565b604051601f8301601f19908116603f01168101908282118183101715610fa857610fa8610f3e565b81604052838152866020858801011115610fc157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215610ff457600080fd5b8235610fff81610f0c565b9150602083013567ffffffffffffffff81111561101b57600080fd5b61102785828601610f54565b9150509250929050565b803561ffff8116811461033e57600080fd5b6000806000806080858703121561105957600080fd5b843560ff8116811461106a57600080fd5b93506020850135925061107f60408601611031565b9150606085013563ffffffff8116811461109857600080fd5b939692955090935050565b600080604083850312156110b657600080fd5b6110bf83611031565b915060208301356110cf81610f0c565b809150509250929050565b600080604083850312156110ed57600080fd5b610fff83611031565b60006020828403121561110857600080fd5b610e8182611031565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156111f057600080fd5b815167ffffffffffffffff81168114610e8157600080fd5b60006020828403121561121a57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000825161127e818460208701610ea1565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220821af9d6917faa99a3be555797e3c3f0eecb60eb6ad590202f8732db8371ea3164736f6c634300080b0033
Deployed Bytecode Sourcemap
41097:1861:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41908:217;;;;;;;;;;-1:-1:-1;41908:217:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26354:200;;;;;;;;;;-1:-1:-1;26354:200:0;;;;;:::i;:::-;;:::i;:::-;;26813:225;;;;;;:::i;:::-;;:::i;26032:133::-;;;;;;;;;;;;;:::i;:::-;;;2799:25:1;;;2787:2;2772:18;26032:133:0;2653:177:1;40798:80:0;;;;;;;;;;-1:-1:-1;40871:1:0;40798:80;;42845:110;;;;;;;;;;-1:-1:-1;42845:110:0;;;;;:::i;:::-;;:::i;38276:103::-;;;;;;;;;;;;;:::i;41488:70::-;;;;;;;;;;;;;:::i;42131:430::-;;;;;;:::i;:::-;;:::i;:::-;;;4202:18:1;4190:31;;;4172:50;;4160:2;4145:18;42131:430:0;4028:200:1;37625:87:0;;;;;;;;;;-1:-1:-1;37698:6:0;;-1:-1:-1;;;;;37698:6:0;37625:87;;;-1:-1:-1;;;;;4397:32:1;;;4379:51;;4367:2;4352:18;37625:87:0;4233:203:1;41662:240:0;;;;;;;;;;-1:-1:-1;41662:240:0;;;;;:::i;:::-;;:::i;42567:272::-;;;;;;;;;;-1:-1:-1;42567:272:0;;;;;:::i;:::-;;:::i;41285:41::-;;;;;;;;;;-1:-1:-1;41285:41:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;41285:41:0;;;38534:201;;;;;;;;;;-1:-1:-1;38534:201:0;;;;;:::i;:::-;;:::i;41908:217::-;41989:13;42015:2;42021:1;42015:7;42011:109;;;-1:-1:-1;;42033:17:0;;;;;;;;;;;;-1:-1:-1;;;42033:17:0;;;;;41908:217::o;42011:109::-;42073:39;;-1:-1:-1;;;42073:39:0;;5553:2:1;42073:39:0;;;5535:21:1;5592:2;5572:18;;;5565:30;5631:31;5611:18;;;5604:59;5680:18;;42073:39:0;;;;;;;;42011:109;41908:217;;;:::o;26354:200::-;24895:4;-1:-1:-1;;;;;24904:6:0;24887:23;;;24879:80;;;;-1:-1:-1;;;24879:80:0;;;;;;;:::i;:::-;25002:6;-1:-1:-1;;;;;24978:30:0;:20;-1:-1:-1;;;;;;;;;;;16670:65:0;-1:-1:-1;;;;;16670:65:0;;16590:153;24978:20;-1:-1:-1;;;;;24978:30:0;;24970:87;;;;-1:-1:-1;;;24970:87:0;;;;;;;:::i;:::-;26438:36:::1;26456:17;26438;:36::i;:::-;26526:12;::::0;;26536:1:::1;26526:12:::0;;;::::1;::::0;::::1;::::0;;;26485:61:::1;::::0;26507:17;;26526:12;26485:21:::1;:61::i;:::-;26354:200:::0;:::o;26813:225::-;24895:4;-1:-1:-1;;;;;24904:6:0;24887:23;;;24879:80;;;;-1:-1:-1;;;24879:80:0;;;;;;;:::i;:::-;25002:6;-1:-1:-1;;;;;24978:30:0;:20;-1:-1:-1;;;;;;;;;;;16670:65:0;-1:-1:-1;;;;;16670:65:0;;16590:153;24978:20;-1:-1:-1;;;;;24978:30:0;;24970:87;;;;-1:-1:-1;;;24970:87:0;;;;;;;:::i;:::-;26931:36:::1;26949:17;26931;:36::i;:::-;26978:52;27000:17;27019:4;27025;26978:21;:52::i;:::-;26813:225:::0;;:::o;26032:133::-;26110:7;25340:4;-1:-1:-1;;;;;25349:6:0;25332:23;;25324:92;;;;-1:-1:-1;;;25324:92:0;;6737:2:1;25324:92:0;;;6719:21:1;6776:2;6756:18;;;6749:30;6815:34;6795:18;;;6788:62;6886:26;6866:18;;;6859:54;6930:19;;25324:92:0;6535:420:1;25324:92:0;-1:-1:-1;;;;;;;;;;;;26032:133:0;:::o;42845:110::-;37698:6;;-1:-1:-1;;;;;37698:6:0;35895:10;37845:23;37837:68;;;;-1:-1:-1;;;37837:68:0;;;;;;;:::i;:::-;42915:34:::1;::::0;-1:-1:-1;;;;;42915:11:0;::::1;::::0;42927:21:::1;42915:34:::0;::::1;;;::::0;::::1;::::0;;;42927:21;42915:11;:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;38276:103:::0;37698:6;;-1:-1:-1;;;;;37698:6:0;35895:10;37845:23;37837:68;;;;-1:-1:-1;;;37837:68:0;;;;;;;:::i;:::-;38341:30:::1;38368:1;38341:18;:30::i;:::-;38276:103::o:0;41488:70::-;10104:13;;;;;;;:48;;10140:12;;;;10139:13;10104:48;;;10907:4;1663:19;:23;10120:16;10096:107;;;;-1:-1:-1;;;10096:107:0;;7523:2:1;10096:107:0;;;7505:21:1;7562:2;7542:18;;;7535:30;7601:34;7581:18;;;7574:62;-1:-1:-1;;;7652:18:1;;;7645:44;7706:19;;10096:107:0;7321:410:1;10096:107:0;10216:19;10239:13;;;;;;10238:14;10263:101;;;;10298:13;:20;;-1:-1:-1;;10333:19:0;;;;;10263:101;41536:16:::1;:14;:16::i;:::-;10394:14:::0;10390:68;;;10441:5;10425:21;;-1:-1:-1;;10425:21:0;;;9811:654;41488:70::o;42131:430::-;42299:15;42327:10;:15;;42341:1;42327:15;42323:233;;;42393:1;42385:10;;:7;:10;;;;-1:-1:-1;;;;;42385:10:0;42369:44;42414:7;42423:14;35895:10;42369:117;;;;;;-1:-1:-1;;;;;;42369:117:0;;;;;;7963:25:1;;;;8036:6;8024:19;;;8004:18;;;7997:47;-1:-1:-1;;;;;42447:30:0;8060:18:1;;;8053:34;8135:10;8123:23;;8103:18;;;8096:51;7935:19;;42369:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42353:133;42131:430;-1:-1:-1;;;;;42131:430:0:o;41662:240::-;37698:6;;-1:-1:-1;;;;;37698:6:0;35895:10;37845:23;37837:68;;;;-1:-1:-1;;;37837:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41760:18:0;::::1;1663:19:::0;41752:66:::1;;;::::0;-1:-1:-1;;;41752:66:0;;8653:2:1;41752:66:0::1;::::0;::::1;8635:21:1::0;8692:2;8672:18;;;8665:30;8731:34;8711:18;;;8704:62;-1:-1:-1;;;8782:18:1;;;8775:31;8823:19;;41752:66:0::1;8451:397:1::0;41752:66:0::1;41825:19;::::0;::::1;;::::0;;;:7:::1;:19;::::0;;;;;;;;:29;;-1:-1:-1;;;;;;41825:29:0::1;-1:-1:-1::0;;;;;41825:29:0;::::1;::::0;;::::1;::::0;;;41866:30;;9025:38:1;;;9079:18;;;9072:60;41866:30:0::1;::::0;8998:18:1;41866:30:0::1;;;;;;;41662:240:::0;;:::o;42567:272::-;42675:10;:15;;42689:1;42675:15;42671:163;;;42725:1;42717:10;;:7;:10;;;;;42701:63;-1:-1:-1;;;42701:63:0;;-1:-1:-1;;;;;42717:10:0;;;;42701:52;;:63;;42754:9;;42701:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26813:225;;:::o;38534:201::-;37698:6;;-1:-1:-1;;;;;37698:6:0;35895:10;37845:23;37837:68;;;;-1:-1:-1;;;37837:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38623:22:0;::::1;38615:73;;;::::0;-1:-1:-1;;;38615:73:0;;9568:2:1;38615:73:0::1;::::0;::::1;9550:21:1::0;9607:2;9587:18;;;9580:30;9646:34;9626:18;;;9619:62;-1:-1:-1;;;9697:18:1;;;9690:36;9743:19;;38615:73:0::1;9366:402:1::0;38615:73:0::1;38699:28;38718:8;38699:18;:28::i;1368:326::-:0;-1:-1:-1;;;;;1663:19:0;;:23;;;1368:326::o;41564:92::-;37698:6;;-1:-1:-1;;;;;37698:6:0;35895:10;37845:23;37837:68;;;;-1:-1:-1;;;37837:68:0;;;;;;;:::i;18008:992::-;15961:66;18462:59;;;18458:535;;;18538:37;18557:17;18538:18;:37::i;:::-;18008:992;;;:::o;18458:535::-;18641:17;-1:-1:-1;;;;;18612:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18612:63:0;;;;;;;;-1:-1:-1;;18612:63:0;;;;;;;;;;;;:::i;:::-;;;18608:306;;18842:56;;-1:-1:-1;;;18842:56:0;;10164:2:1;18842:56:0;;;10146:21:1;10203:2;10183:18;;;10176:30;10242:34;10222:18;;;10215:62;-1:-1:-1;;;10293:18:1;;;10286:44;10347:19;;18842:56:0;9962:410:1;18608:306:0;-1:-1:-1;;;;;;;;;;;18726:28:0;;18718:82;;;;-1:-1:-1;;;18718:82:0;;10579:2:1;18718:82:0;;;10561:21:1;10618:2;10598:18;;;10591:30;10657:34;10637:18;;;10630:62;-1:-1:-1;;;10708:18:1;;;10701:39;10757:19;;18718:82:0;10377:405:1;18718:82:0;18676:140;18928:53;18946:17;18965:4;18971:9;18928:17;:53::i;38895:191::-;38988:6;;;-1:-1:-1;;;;;39005:17:0;;;-1:-1:-1;;;;;;39005:17:0;;;;;;;39038:40;;38988:6;;;39005:17;38988:6;;39038:40;;38969:16;;39038:40;38958:128;38895:191;:::o;37326:97::-;10707:13;;;;;;;10699:69;;;;-1:-1:-1;;;10699:69:0;;;;;;;:::i;:::-;37389:26:::1;:24;:26::i;16839:284::-:0;-1:-1:-1;;;;;1663:19:0;;;16913:106;;;;-1:-1:-1;;;16913:106:0;;11401:2:1;16913:106:0;;;11383:21:1;11440:2;11420:18;;;11413:30;11479:34;11459:18;;;11452:62;-1:-1:-1;;;11530:18:1;;;11523:43;11583:19;;16913:106:0;11199:409:1;16913:106:0;-1:-1:-1;;;;;;;;;;;17030:85:0;;-1:-1:-1;;;;;;17030:85:0;-1:-1:-1;;;;;17030:85:0;;;;;;;;;;16839:284::o;17532:297::-;17675:29;17686:17;17675:10;:29::i;:::-;17733:1;17719:4;:11;:15;:28;;;;17738:9;17719:28;17715:107;;;17764:46;17786:17;17805:4;17764:21;:46::i;:::-;;17532:297;;;:::o;37431:113::-;10707:13;;;;;;;10699:69;;;;-1:-1:-1;;;10699:69:0;;;;;;;:::i;:::-;37504:32:::1;35895:10:::0;37504:18:::1;:32::i;17236:155::-:0;17303:37;17322:17;17303:18;:37::i;:::-;17356:27;;-1:-1:-1;;;;;17356:27:0;;;;;;;;17236:155;:::o;22269:461::-;22352:12;-1:-1:-1;;;;;1663:19:0;;;22377:88;;;;-1:-1:-1;;;22377:88:0;;11815:2:1;22377:88:0;;;11797:21:1;11854:2;11834:18;;;11827:30;11893:34;11873:18;;;11866:62;-1:-1:-1;;;11944:18:1;;;11937:36;11990:19;;22377:88:0;11613:402:1;22377:88:0;22539:12;22553:23;22580:6;-1:-1:-1;;;;;22580:19:0;22600:4;22580:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22538:67;;;;22623:99;22659:7;22668:10;22623:99;;;;;;;;;;;;;;;;;7092:12;7121:7;7117:530;;;-1:-1:-1;7152:10:0;7145:17;;7117:530;7266:17;;:21;7262:374;;7464:10;7458:17;7525:15;7512:10;7508:2;7504:19;7497:44;7262:374;7607:12;7600:20;;-1:-1:-1;;;7600:20:0;;;;;;;;:::i;7262:374::-;6942:712;;;;;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:258::-;271:1;281:113;295:6;292:1;289:13;281:113;;;371:11;;;365:18;352:11;;;345:39;317:2;310:10;281:113;;;412:6;409:1;406:13;403:48;;;-1:-1:-1;;447:1:1;429:16;;422:27;199:258::o;462:::-;504:3;542:5;536:12;569:6;564:3;557:19;585:63;641:6;634:4;629:3;625:14;618:4;611:5;607:16;585:63;:::i;:::-;702:2;681:15;-1:-1:-1;;677:29:1;668:39;;;;709:4;664:50;;462:258;-1:-1:-1;;462:258:1:o;725:220::-;874:2;863:9;856:21;837:4;894:45;935:2;924:9;920:18;912:6;894:45;:::i;950:131::-;-1:-1:-1;;;;;1025:31:1;;1015:42;;1005:70;;1071:1;1068;1061:12;1086:247;1145:6;1198:2;1186:9;1177:7;1173:23;1169:32;1166:52;;;1214:1;1211;1204:12;1166:52;1253:9;1240:23;1272:31;1297:5;1272:31;:::i;1338:127::-;1399:10;1394:3;1390:20;1387:1;1380:31;1430:4;1427:1;1420:15;1454:4;1451:1;1444:15;1470:718;1512:5;1565:3;1558:4;1550:6;1546:17;1542:27;1532:55;;1583:1;1580;1573:12;1532:55;1619:6;1606:20;1645:18;1682:2;1678;1675:10;1672:36;;;1688:18;;:::i;:::-;1763:2;1757:9;1731:2;1817:13;;-1:-1:-1;;1813:22:1;;;1837:2;1809:31;1805:40;1793:53;;;1861:18;;;1881:22;;;1858:46;1855:72;;;1907:18;;:::i;:::-;1947:10;1943:2;1936:22;1982:2;1974:6;1967:18;2028:3;2021:4;2016:2;2008:6;2004:15;2000:26;1997:35;1994:55;;;2045:1;2042;2035:12;1994:55;2109:2;2102:4;2094:6;2090:17;2083:4;2075:6;2071:17;2058:54;2156:1;2149:4;2144:2;2136:6;2132:15;2128:26;2121:37;2176:6;2167:15;;;;;;1470:718;;;;:::o;2193:455::-;2270:6;2278;2331:2;2319:9;2310:7;2306:23;2302:32;2299:52;;;2347:1;2344;2337:12;2299:52;2386:9;2373:23;2405:31;2430:5;2405:31;:::i;:::-;2455:5;-1:-1:-1;2511:2:1;2496:18;;2483:32;2538:18;2527:30;;2524:50;;;2570:1;2567;2560:12;2524:50;2593:49;2634:7;2625:6;2614:9;2610:22;2593:49;:::i;:::-;2583:59;;;2193:455;;;;;:::o;3277:159::-;3344:20;;3404:6;3393:18;;3383:29;;3373:57;;3426:1;3423;3416:12;3441:582;3523:6;3531;3539;3547;3600:3;3588:9;3579:7;3575:23;3571:33;3568:53;;;3617:1;3614;3607:12;3568:53;3656:9;3643:23;3706:4;3699:5;3695:16;3688:5;3685:27;3675:55;;3726:1;3723;3716:12;3675:55;3749:5;-1:-1:-1;3801:2:1;3786:18;;3773:32;;-1:-1:-1;3824:37:1;3857:2;3842:18;;3824:37;:::i;:::-;3814:47;;3913:2;3902:9;3898:18;3885:32;3961:10;3952:7;3948:24;3939:7;3936:37;3926:65;;3987:1;3984;3977:12;3926:65;3441:582;;;;-1:-1:-1;3441:582:1;;-1:-1:-1;;3441:582:1:o;4441:319::-;4508:6;4516;4569:2;4557:9;4548:7;4544:23;4540:32;4537:52;;;4585:1;4582;4575:12;4537:52;4608:28;4626:9;4608:28;:::i;:::-;4598:38;;4686:2;4675:9;4671:18;4658:32;4699:31;4724:5;4699:31;:::i;:::-;4749:5;4739:15;;;4441:319;;;;;:::o;4765:392::-;4841:6;4849;4902:2;4890:9;4881:7;4877:23;4873:32;4870:52;;;4918:1;4915;4908:12;4870:52;4941:28;4959:9;4941:28;:::i;5162:184::-;5220:6;5273:2;5261:9;5252:7;5248:23;5244:32;5241:52;;;5289:1;5286;5279:12;5241:52;5312:28;5330:9;5312:28;:::i;5709:408::-;5911:2;5893:21;;;5950:2;5930:18;;;5923:30;5989:34;5984:2;5969:18;;5962:62;-1:-1:-1;;;6055:2:1;6040:18;;6033:42;6107:3;6092:19;;5709:408::o;6122:::-;6324:2;6306:21;;;6363:2;6343:18;;;6336:30;6402:34;6397:2;6382:18;;6375:62;-1:-1:-1;;;6468:2:1;6453:18;;6446:42;6520:3;6505:19;;6122:408::o;6960:356::-;7162:2;7144:21;;;7181:18;;;7174:30;7240:34;7235:2;7220:18;;7213:62;7307:2;7292:18;;6960:356::o;8158:288::-;8227:6;8280:2;8268:9;8259:7;8255:23;8251:32;8248:52;;;8296:1;8293;8286:12;8248:52;8328:9;8322:16;8378:18;8371:5;8367:30;8360:5;8357:41;8347:69;;8412:1;8409;8402:12;9773:184;9843:6;9896:2;9884:9;9875:7;9871:23;9867:32;9864:52;;;9912:1;9909;9902:12;9864:52;-1:-1:-1;9935:16:1;;9773:184;-1:-1:-1;9773:184:1:o;10787:407::-;10989:2;10971:21;;;11028:2;11008:18;;;11001:30;11067:34;11062:2;11047:18;;11040:62;-1:-1:-1;;;11133:2:1;11118:18;;11111:41;11184:3;11169:19;;10787:407::o;12020:274::-;12149:3;12187:6;12181:13;12203:53;12249:6;12244:3;12237:4;12229:6;12225:17;12203:53;:::i;:::-;12272:16;;;;;12020:274;-1:-1:-1;;12020:274:1:o
Swarm Source
ipfs://821af9d6917faa99a3be555797e3c3f0eecb60eb6ad590202f8732db8371ea31
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.