Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 15569178 | 795 days ago | IN | 0 ETH | 0.0238722 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TokenImplementation
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-24 */ // SPDX-License-Identifier: Apache 2 // File: @openzeppelin/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: contracts/bridge/token/TokenState.sol // contracts/State.sol pragma solidity ^0.8.0; contract TokenStorage { struct State { string name; string symbol; uint64 metaLastUpdatedSequence; uint256 totalSupply; uint8 decimals; mapping(address => uint256) balances; mapping(address => mapping(address => uint256)) allowances; address owner; bool initialized; uint16 chainId; bytes32 nativeContract; // EIP712 // Cache the domain separator and salt, but also store the chain id that // it corresponds to, in order to invalidate the cached domain separator // if the chain id changes. bytes32 cachedDomainSeparator; uint256 cachedChainId; address cachedThis; bytes32 cachedSalt; bytes32 cachedHashedName; // ERC20Permit draft mapping(address => Counters.Counter) nonces; } } contract TokenState { using Counters for Counters.Counter; TokenStorage.State _state; /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner_) public view returns (uint256) { return _state.nonces[owner_].current(); } /** * @dev "Consume a nonce": return the current value and increment. */ function _useNonce(address owner_) internal returns (uint256 current) { Counters.Counter storage nonce = _state.nonces[owner_]; current = nonce.current(); nonce.increment(); } } // File: @openzeppelin/contracts/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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/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 Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/proxy/beacon/IBeacon.sol pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @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/proxy/Proxy.sol pragma solidity ^0.8.0; /** * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to * be specified by overriding the virtual {_implementation} function. * * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a * different contract through the {_delegate} function. * * The success and return data of the delegated call will be returned back to the caller of the proxy. */ abstract contract Proxy { /** * @dev Delegates the current call to `implementation`. * * This function does not return to its internall call site, it will return directly to the external caller. */ function _delegate(address implementation) internal virtual { assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } /** * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function * and {_fallback} should delegate. */ function _implementation() internal view virtual returns (address); /** * @dev Delegates the current call to the address returned by `_implementation()`. * * This function does not return to its internall call site, it will return directly to the external caller. */ function _fallback() internal virtual { _beforeFallback(); _delegate(_implementation()); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other * function in the contract matches the call data. */ fallback() external payable virtual { _fallback(); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data * is empty. */ receive() external payable virtual { _fallback(); } /** * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback` * call, or as part of the Solidity `fallback` or `receive` functions. * * If overriden should call `super._beforeFallback()`. */ function _beforeFallback() internal virtual {} } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/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 StorageSlot { 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/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 ERC1967Upgrade { // 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 StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlot.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) { Address.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallSecure( address newImplementation, bytes memory data, bool forceCall ) internal { address oldImplementation = _getImplementation(); // Initial upgrade and setup call _setImplementation(newImplementation); if (data.length > 0 || forceCall) { Address.functionDelegateCall(newImplementation, data); } // Perform rollback test if not already in progress StorageSlot.BooleanSlot storage rollbackTesting = StorageSlot.getBooleanSlot(_ROLLBACK_SLOT); if (!rollbackTesting.value) { // Trigger rollback using upgradeTo from the new implementation rollbackTesting.value = true; Address.functionDelegateCall( newImplementation, abi.encodeWithSignature("upgradeTo(address)", oldImplementation) ); rollbackTesting.value = false; // Check rollback was effective require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades"); // Finally reset to the new implementation and log the upgrade _upgradeTo(newImplementation); } } /** * @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 StorageSlot.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"); StorageSlot.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 StorageSlot.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( Address.isContract(IBeacon(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlot.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) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } } } // File: @openzeppelin/contracts/proxy/beacon/BeaconProxy.sol pragma solidity ^0.8.0; /** * @dev This contract implements a proxy that gets the implementation address for each call from a {UpgradeableBeacon}. * * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't * conflict with the storage layout of the implementation behind the proxy. * * _Available since v3.4._ */ contract BeaconProxy is Proxy, ERC1967Upgrade { /** * @dev Initializes the proxy with `beacon`. * * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This * will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity * constructor. * * Requirements: * * - `beacon` must be a contract with the interface {IBeacon}. */ constructor(address beacon, bytes memory data) payable { assert(_BEACON_SLOT == bytes32(uint256(keccak256("eip1967.proxy.beacon")) - 1)); _upgradeBeaconToAndCall(beacon, data, false); } /** * @dev Returns the current beacon address. */ function _beacon() internal view virtual returns (address) { return _getBeacon(); } /** * @dev Returns the current implementation address of the associated beacon. */ function _implementation() internal view virtual override returns (address) { return IBeacon(_getBeacon()).implementation(); } /** * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}. * * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. * * Requirements: * * - `beacon` must be a contract. * - The implementation returned by `beacon` must be a contract. */ function _setBeacon(address beacon, bytes memory data) internal virtual { _upgradeBeaconToAndCall(beacon, data, false); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: contracts/bridge/token/TokenImplementation.sol // contracts/TokenImplementation.sol pragma solidity ^0.8.0; // Based on the OpenZepplin ERC20 implementation, licensed under MIT contract TokenImplementation is TokenState, Context { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function initialize( string memory name_, string memory symbol_, uint8 decimals_, uint64 sequence_, address owner_, uint16 chainId_, bytes32 nativeContract_ ) initializer public { _initializeNativeToken( name_, symbol_, decimals_, sequence_, owner_, chainId_, nativeContract_ ); // initialize w/ EIP712 state variables for domain separator _initializePermitStateIfNeeded(); } function _initializeNativeToken( string memory name_, string memory symbol_, uint8 decimals_, uint64 sequence_, address owner_, uint16 chainId_, bytes32 nativeContract_ ) internal { _state.name = name_; _state.symbol = symbol_; _state.decimals = decimals_; _state.metaLastUpdatedSequence = sequence_; _state.owner = owner_; _state.chainId = chainId_; _state.nativeContract = nativeContract_; } function _initializePermitStateIfNeeded() internal { // If someone were to change the implementation of name(), we // need to make sure we recache. bytes32 hashedName = _eip712DomainNameHashed(); // If for some reason the salt generation changes with newer // token implementations, we need to make sure the state reflects // the new salt. bytes32 salt = _eip712DomainSalt(); // check cached values if (_state.cachedHashedName != hashedName || _state.cachedSalt != salt) { _state.cachedChainId = block.chainid; _state.cachedThis = address(this); _state.cachedDomainSeparator = _buildDomainSeparator(hashedName, salt); _state.cachedSalt = salt; _state.cachedHashedName = hashedName; } } function name() public view returns (string memory) { return _state.name; } function symbol() public view returns (string memory) { return _state.symbol; } function owner() public view returns (address) { return _state.owner; } function decimals() public view returns (uint8) { return _state.decimals; } function totalSupply() public view returns (uint256) { return _state.totalSupply; } function chainId() public view returns (uint16) { return _state.chainId; } function nativeContract() public view returns (bytes32) { return _state.nativeContract; } function balanceOf(address account_) public view returns (uint256) { return _state.balances[account_]; } function transfer(address recipient_, uint256 amount_) public returns (bool) { _transfer(_msgSender(), recipient_, amount_); return true; } function allowance(address owner_, address spender_) public view returns (uint256) { return _state.allowances[owner_][spender_]; } function approve(address spender_, uint256 amount_) public returns (bool) { _approve(_msgSender(), spender_, amount_); return true; } function transferFrom(address sender_, address recipient_, uint256 amount_) public returns (bool) { _transfer(sender_, recipient_, amount_); uint256 currentAllowance = _state.allowances[sender_][_msgSender()]; require(currentAllowance >= amount_, "ERC20: transfer amount exceeds allowance"); _approve(sender_, _msgSender(), currentAllowance - amount_); return true; } function increaseAllowance(address spender_, uint256 addedValue_) public returns (bool) { _approve(_msgSender(), spender_, _state.allowances[_msgSender()][spender_] + addedValue_); return true; } function decreaseAllowance(address spender_, uint256 subtractedValue_) public returns (bool) { uint256 currentAllowance = _state.allowances[_msgSender()][spender_]; require(currentAllowance >= subtractedValue_, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender_, currentAllowance - subtractedValue_); return true; } function _transfer(address sender_, address recipient_, uint256 amount_) internal { require(sender_ != address(0), "ERC20: transfer from the zero address"); require(recipient_ != address(0), "ERC20: transfer to the zero address"); uint256 senderBalance = _state.balances[sender_]; require(senderBalance >= amount_, "ERC20: transfer amount exceeds balance"); _state.balances[sender_] = senderBalance - amount_; _state.balances[recipient_] += amount_; emit Transfer(sender_, recipient_, amount_); } function mint(address account_, uint256 amount_) public onlyOwner { _mint(account_, amount_); } function _mint(address account_, uint256 amount_) internal { require(account_ != address(0), "ERC20: mint to the zero address"); _state.totalSupply += amount_; _state.balances[account_] += amount_; emit Transfer(address(0), account_, amount_); } function burn(address account_, uint256 amount_) public onlyOwner { _burn(account_, amount_); } function _burn(address account_, uint256 amount_) internal { require(account_ != address(0), "ERC20: burn from the zero address"); uint256 accountBalance = _state.balances[account_]; require(accountBalance >= amount_, "ERC20: burn amount exceeds balance"); _state.balances[account_] = accountBalance - amount_; _state.totalSupply -= amount_; emit Transfer(account_, address(0), amount_); } function _approve(address owner_, address spender_, uint256 amount_) internal virtual { require(owner_ != address(0), "ERC20: approve from the zero address"); require(spender_ != address(0), "ERC20: approve to the zero address"); _state.allowances[owner_][spender_] = amount_; emit Approval(owner_, spender_, amount_); } function updateDetails(string memory name_, string memory symbol_, uint64 sequence_) public onlyOwner { require(_state.metaLastUpdatedSequence < sequence_, "current metadata is up to date"); _state.name = name_; _state.symbol = symbol_; _state.metaLastUpdatedSequence = sequence_; // Because the name is updated, we need to recache the domain separator. // For old implementations, none of the caches may have been written to yet. _initializePermitStateIfNeeded(); } modifier onlyOwner() { require(owner() == _msgSender(), "caller is not the owner"); _; } modifier initializer() { require( !_state.initialized, "Already initialized" ); _state.initialized = true; _; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _state.cachedThis && block.chainid == _state.cachedChainId) { return _state.cachedDomainSeparator; } else { return _buildDomainSeparator( _eip712DomainNameHashed(), _eip712DomainSalt() ); } } function _buildDomainSeparator(bytes32 hashedName, bytes32 salt) internal view returns (bytes32) { return keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)" ), hashedName, keccak256(abi.encodePacked(_eip712DomainVersion())), block.chainid, address(this), salt ) ); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev See {IERC20Permit-permit}. */ function permit( address owner_, address spender_, uint256 value_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_ ) public { // for those tokens that have been initialized before permit, we need to set // the permit state variables if they have not been set before _initializePermitStateIfNeeded(); // permit is only allowed before the signature's deadline require(block.timestamp <= deadline_, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner_, spender_, value_, _useNonce(owner_), deadline_ ) ); bytes32 message = _hashTypedDataV4(structHash); address signer = ECDSA.recover(message, v_, r_, s_); // if we cannot recover the token owner, signature is invalid require(signer == owner_, "ERC20Permit: invalid signature"); _approve(owner_, spender_, value_); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() public view returns (bytes32) { return _domainSeparatorV4(); } function eip712Domain() public view returns ( bytes1 domainFields, string memory domainName, string memory domainVersion, uint256 domainChainId, address domainVerifyingContract, bytes32 domainSalt, uint256[] memory domainExtensions ) { return ( hex"1F", // 11111 name(), _eip712DomainVersion(), block.chainid, address(this), _eip712DomainSalt(), new uint256[](0) ); } function _eip712DomainVersion() internal pure returns (string memory) { return "1"; } function _eip712DomainNameHashed() internal view returns (bytes32) { return keccak256(abi.encodePacked(name())); } function _eip712DomainSalt() internal view returns (bytes32) { return keccak256(abi.encodePacked(_state.chainId, _state.nativeContract)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender_","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"subtractedValue_","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"domainFields","type":"bytes1"},{"internalType":"string","name":"domainName","type":"string"},{"internalType":"string","name":"domainVersion","type":"string"},{"internalType":"uint256","name":"domainChainId","type":"uint256"},{"internalType":"address","name":"domainVerifyingContract","type":"address"},{"internalType":"bytes32","name":"domainSalt","type":"bytes32"},{"internalType":"uint256[]","name":"domainExtensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"addedValue_","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint64","name":"sequence_","type":"uint64"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint16","name":"chainId_","type":"uint16"},{"internalType":"bytes32","name":"nativeContract_","type":"bytes32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeContract","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"value_","type":"uint256"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender_","type":"address"},{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint64","name":"sequence_","type":"uint64"}],"name":"updateDetails","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611a18806100206000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806384b0196e116100b8578063a18cd7c61161007c578063a18cd7c6146102a8578063a457c2d7146102bb578063a9059cbb146102ce578063c71f4615146102e1578063d505accf146102f4578063dd62ed3e1461030757600080fd5b806384b0196e146102365780638da5cb5b1461025157806395d89b411461026c5780639a8a0592146102745780639dc29fac1461029557600080fd5b80633644e5151161010a5780633644e515146101c257806339509351146101ca5780633d6c043b146101dd57806340c10f19146101e557806370a08231146101fa5780637ecebe001461022357600080fd5b806306fdde0314610147578063095ea7b31461016557806318160ddd1461018857806323b872dd1461019a578063313ce567146101ad575b600080fd5b61014f610340565b60405161015c91906118d8565b60405180910390f35b6101786101733660046116aa565b6103d4565b604051901515815260200161015c565b6003545b60405190815260200161015c565b6101786101a8366004611606565b6103ea565b60045460405160ff909116815260200161015c565b61018c6104a0565b6101786101d83660046116aa565b6104af565b60085461018c565b6101f86101f33660046116aa565b6104e6565b005b61018c6102083660046115b3565b6001600160a01b031660009081526005602052604090205490565b61018c6102313660046115b3565b61051e565b61023e61053e565b60405161015c9796959493929190611843565b6007546040516001600160a01b03909116815260200161015c565b61014f61059c565b600754600160a81b900461ffff1660405161ffff909116815260200161015c565b6101f86102a33660046116aa565b6105ae565b6101f86102b63660046116d3565b6105e2565b6101786102c93660046116aa565b6106bc565b6101786102dc3660046116aa565b610757565b6101f86102ef366004611744565b610764565b6101f8610302366004611641565b6107e7565b61018c6103153660046115d4565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b606060008001805461035190611981565b80601f016020809104026020016040519081016040528092919081815260200182805461037d90611981565b80156103ca5780601f1061039f576101008083540402835291602001916103ca565b820191906000526020600020905b8154815290600101906020018083116103ad57829003601f168201915b5050505050905090565b60006103e1338484610953565b50600192915050565b60006103f7848484610a78565b6001600160a01b0384166000908152600660209081526040808320338452909152902054828110156104815760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104958533610490868561193a565b610953565b506001949350505050565b60006104aa610c50565b905090565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916103e1918590610490908690611922565b6007546001600160a01b031633146105105760405162461bcd60e51b8152600401610478906118eb565b61051a8282610c92565b5050565b6001600160a01b0381166000908152600e60205260408120545b92915050565b600060608060008060006060610552610340565b6040805180820190915260018152603160f81b60208201524630610574610d74565b604080516000815260208101909152601f60f81b9d959c50939a509198509650945092509050565b60606000600101805461035190611981565b6007546001600160a01b031633146105d85760405162461bcd60e51b8152600401610478906118eb565b61051a8282610dbe565b6007546001600160a01b0316331461060c5760405162461bcd60e51b8152600401610478906118eb565b60025467ffffffffffffffff80831691161061066a5760405162461bcd60e51b815260206004820152601e60248201527f63757272656e74206d6574616461746120697320757020746f206461746500006044820152606401610478565b825161067d90600090602086019061144e565b50815161069190600190602085019061144e565b506002805467ffffffffffffffff191667ffffffffffffffff83161790556106b7610f0d565b505050565b3360009081526006602090815260408083206001600160a01b03861684529091528120548281101561073e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610478565b61074d3385610490868561193a565b5060019392505050565b60006103e1338484610a78565b600754600160a01b900460ff16156107b45760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610478565b6007805460ff60a01b1916600160a01b1790556107d687878787878787610f69565b6107de610f0d565b50505050505050565b6107ef610f0d565b8342111561083f5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610478565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861086e8c611005565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006108c98261102d565b905060006108d982878787611040565b9050896001600160a01b0316816001600160a01b03161461093c5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610478565b6109478a8a8a610953565b50505050505050505050565b6001600160a01b0383166109b55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610478565b6001600160a01b038216610a165760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610478565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610adc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610478565b6001600160a01b038216610b3e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610478565b6001600160a01b03831660009081526005602052604090205481811015610bb65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610478565b610bc0828261193a565b6001600160a01b038086166000908152600560205260408082209390935590851681529081208054849290610bf6908490611922565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c4291815260200190565b60405180910390a350505050565b600b546000906001600160a01b031630148015610c6e5750600a5446145b15610c7a575060095490565b6104aa610c85611068565b610c8d610d74565b611082565b6001600160a01b038216610ce85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610478565b8060006003016000828254610cfd9190611922565b90915550506001600160a01b03821660009081526005602052604081208054839290610d2a908490611922565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600754600854604051600160a81b90920460f01b6001600160f01b031916602083015260228201526000906042015b60405160208183030381529060405280519060200120905090565b6001600160a01b038216610e1e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610478565b6001600160a01b03821660009081526005602052604090205481811015610e925760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610478565b610e9c828261193a565b6001600160a01b03841660009081526005602052604081209190915560038054849290610eca90849061193a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610a6b565b6000610f17611068565b90506000610f23610d74565b600d5490915082141580610f395750600c548114155b1561051a5746600a55600b80546001600160a01b03191630179055610f5e8282611082565b600955600c55600d55565b8651610f7c9060009060208a019061144e565b508551610f9090600190602089019061144e565b506004805460ff90961660ff19909616959095179094556002805467ffffffffffffffff90941667ffffffffffffffff19909416939093179092556007805461ffff909316600160a81b02600162ffff0160a01b03199093166001600160a01b03909216919091179190911790556008555050565b6001600160a01b0381166000908152600e602052604090208054600181018255905b50919050565b600061053861103a610c50565b83611136565b60008060006110518787878761115d565b9150915061105e8161124a565b5095945050505050565b6000611072610340565b604051602001610da39190611827565b60007fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472836110c46040805180820190915260018152603160f81b602082015290565b6040516020016110d49190611827565b60408051601f1981840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c0810183905260e0015b60405160208183030381529060405280519060200120905092915050565b60405161190160f01b60208201526022810183905260428101829052600090606201611118565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156111945750600090506003611241565b8460ff16601b141580156111ac57508460ff16601c14155b156111bd5750600090506004611241565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611211573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661123a57600060019250925050611241565b9150600090505b94509492505050565b600081600481111561126c57634e487b7160e01b600052602160045260246000fd5b14156112755750565b600181600481111561129757634e487b7160e01b600052602160045260246000fd5b14156112e55760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610478565b600281600481111561130757634e487b7160e01b600052602160045260246000fd5b14156113555760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610478565b600381600481111561137757634e487b7160e01b600052602160045260246000fd5b14156113d05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610478565b60048160048111156113f257634e487b7160e01b600052602160045260246000fd5b141561144b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610478565b50565b82805461145a90611981565b90600052602060002090601f01602090048101928261147c57600085556114c2565b82601f1061149557805160ff19168380011785556114c2565b828001600101855582156114c2579182015b828111156114c25782518255916020019190600101906114a7565b506114ce9291506114d2565b5090565b5b808211156114ce57600081556001016114d3565b80356001600160a01b03811681146114fe57600080fd5b919050565b600082601f830112611513578081fd5b813567ffffffffffffffff8082111561152e5761152e6119cc565b604051601f8301601f19908116603f01168101908282118183101715611556576115566119cc565b8160405283815286602085880101111561156e578485fd5b8360208701602083013792830160200193909352509392505050565b803567ffffffffffffffff811681146114fe57600080fd5b803560ff811681146114fe57600080fd5b6000602082840312156115c4578081fd5b6115cd826114e7565b9392505050565b600080604083850312156115e6578081fd5b6115ef836114e7565b91506115fd602084016114e7565b90509250929050565b60008060006060848603121561161a578081fd5b611623846114e7565b9250611631602085016114e7565b9150604084013590509250925092565b600080600080600080600060e0888a03121561165b578283fd5b611664886114e7565b9650611672602089016114e7565b9550604088013594506060880135935061168e608089016115a2565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156116bc578182fd5b6116c5836114e7565b946020939093013593505050565b6000806000606084860312156116e7578283fd5b833567ffffffffffffffff808211156116fe578485fd5b61170a87838801611503565b9450602086013591508082111561171f578384fd5b5061172c86828701611503565b92505061173b6040850161158a565b90509250925092565b600080600080600080600060e0888a03121561175e578283fd5b873567ffffffffffffffff80821115611775578485fd5b6117818b838c01611503565b985060208a0135915080821115611796578485fd5b506117a38a828b01611503565b9650506117b2604089016115a2565b94506117c06060890161158a565b93506117ce608089016114e7565b925060a088013561ffff811681146117e4578283fd5b8092505060c0880135905092959891949750929550565b60008151808452611813816020860160208601611951565b601f01601f19169290920160200192915050565b60008251611839818460208701611951565b9190910192915050565b60ff60f81b881681526000602060e08184015261186360e084018a6117fb565b8381036040850152611875818a6117fb565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252838701925090830190845b818110156118c6578351835292840192918401916001016118aa565b50909c9b505050505050505050505050565b6020815260006115cd60208301846117fb565b60208082526017908201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60008219821115611935576119356119b6565b500190565b60008282101561194c5761194c6119b6565b500390565b60005b8381101561196c578181015183820152602001611954565b8381111561197b576000848401525b50505050565b600181811c9082168061199557607f821691505b6020821081141561102757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212203de9d8f3af673eec4b7def57fea7c44ddaacb566240ed7be1ee0e924bc2e586264736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c806384b0196e116100b8578063a18cd7c61161007c578063a18cd7c6146102a8578063a457c2d7146102bb578063a9059cbb146102ce578063c71f4615146102e1578063d505accf146102f4578063dd62ed3e1461030757600080fd5b806384b0196e146102365780638da5cb5b1461025157806395d89b411461026c5780639a8a0592146102745780639dc29fac1461029557600080fd5b80633644e5151161010a5780633644e515146101c257806339509351146101ca5780633d6c043b146101dd57806340c10f19146101e557806370a08231146101fa5780637ecebe001461022357600080fd5b806306fdde0314610147578063095ea7b31461016557806318160ddd1461018857806323b872dd1461019a578063313ce567146101ad575b600080fd5b61014f610340565b60405161015c91906118d8565b60405180910390f35b6101786101733660046116aa565b6103d4565b604051901515815260200161015c565b6003545b60405190815260200161015c565b6101786101a8366004611606565b6103ea565b60045460405160ff909116815260200161015c565b61018c6104a0565b6101786101d83660046116aa565b6104af565b60085461018c565b6101f86101f33660046116aa565b6104e6565b005b61018c6102083660046115b3565b6001600160a01b031660009081526005602052604090205490565b61018c6102313660046115b3565b61051e565b61023e61053e565b60405161015c9796959493929190611843565b6007546040516001600160a01b03909116815260200161015c565b61014f61059c565b600754600160a81b900461ffff1660405161ffff909116815260200161015c565b6101f86102a33660046116aa565b6105ae565b6101f86102b63660046116d3565b6105e2565b6101786102c93660046116aa565b6106bc565b6101786102dc3660046116aa565b610757565b6101f86102ef366004611744565b610764565b6101f8610302366004611641565b6107e7565b61018c6103153660046115d4565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b606060008001805461035190611981565b80601f016020809104026020016040519081016040528092919081815260200182805461037d90611981565b80156103ca5780601f1061039f576101008083540402835291602001916103ca565b820191906000526020600020905b8154815290600101906020018083116103ad57829003601f168201915b5050505050905090565b60006103e1338484610953565b50600192915050565b60006103f7848484610a78565b6001600160a01b0384166000908152600660209081526040808320338452909152902054828110156104815760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104958533610490868561193a565b610953565b506001949350505050565b60006104aa610c50565b905090565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916103e1918590610490908690611922565b6007546001600160a01b031633146105105760405162461bcd60e51b8152600401610478906118eb565b61051a8282610c92565b5050565b6001600160a01b0381166000908152600e60205260408120545b92915050565b600060608060008060006060610552610340565b6040805180820190915260018152603160f81b60208201524630610574610d74565b604080516000815260208101909152601f60f81b9d959c50939a509198509650945092509050565b60606000600101805461035190611981565b6007546001600160a01b031633146105d85760405162461bcd60e51b8152600401610478906118eb565b61051a8282610dbe565b6007546001600160a01b0316331461060c5760405162461bcd60e51b8152600401610478906118eb565b60025467ffffffffffffffff80831691161061066a5760405162461bcd60e51b815260206004820152601e60248201527f63757272656e74206d6574616461746120697320757020746f206461746500006044820152606401610478565b825161067d90600090602086019061144e565b50815161069190600190602085019061144e565b506002805467ffffffffffffffff191667ffffffffffffffff83161790556106b7610f0d565b505050565b3360009081526006602090815260408083206001600160a01b03861684529091528120548281101561073e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610478565b61074d3385610490868561193a565b5060019392505050565b60006103e1338484610a78565b600754600160a01b900460ff16156107b45760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610478565b6007805460ff60a01b1916600160a01b1790556107d687878787878787610f69565b6107de610f0d565b50505050505050565b6107ef610f0d565b8342111561083f5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610478565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861086e8c611005565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006108c98261102d565b905060006108d982878787611040565b9050896001600160a01b0316816001600160a01b03161461093c5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610478565b6109478a8a8a610953565b50505050505050505050565b6001600160a01b0383166109b55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610478565b6001600160a01b038216610a165760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610478565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610adc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610478565b6001600160a01b038216610b3e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610478565b6001600160a01b03831660009081526005602052604090205481811015610bb65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610478565b610bc0828261193a565b6001600160a01b038086166000908152600560205260408082209390935590851681529081208054849290610bf6908490611922565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c4291815260200190565b60405180910390a350505050565b600b546000906001600160a01b031630148015610c6e5750600a5446145b15610c7a575060095490565b6104aa610c85611068565b610c8d610d74565b611082565b6001600160a01b038216610ce85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610478565b8060006003016000828254610cfd9190611922565b90915550506001600160a01b03821660009081526005602052604081208054839290610d2a908490611922565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600754600854604051600160a81b90920460f01b6001600160f01b031916602083015260228201526000906042015b60405160208183030381529060405280519060200120905090565b6001600160a01b038216610e1e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610478565b6001600160a01b03821660009081526005602052604090205481811015610e925760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610478565b610e9c828261193a565b6001600160a01b03841660009081526005602052604081209190915560038054849290610eca90849061193a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610a6b565b6000610f17611068565b90506000610f23610d74565b600d5490915082141580610f395750600c548114155b1561051a5746600a55600b80546001600160a01b03191630179055610f5e8282611082565b600955600c55600d55565b8651610f7c9060009060208a019061144e565b508551610f9090600190602089019061144e565b506004805460ff90961660ff19909616959095179094556002805467ffffffffffffffff90941667ffffffffffffffff19909416939093179092556007805461ffff909316600160a81b02600162ffff0160a01b03199093166001600160a01b03909216919091179190911790556008555050565b6001600160a01b0381166000908152600e602052604090208054600181018255905b50919050565b600061053861103a610c50565b83611136565b60008060006110518787878761115d565b9150915061105e8161124a565b5095945050505050565b6000611072610340565b604051602001610da39190611827565b60007fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472836110c46040805180820190915260018152603160f81b602082015290565b6040516020016110d49190611827565b60408051601f1981840301815282825280516020918201209083019490945281019190915260608101919091524660808201523060a082015260c0810183905260e0015b60405160208183030381529060405280519060200120905092915050565b60405161190160f01b60208201526022810183905260428101829052600090606201611118565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156111945750600090506003611241565b8460ff16601b141580156111ac57508460ff16601c14155b156111bd5750600090506004611241565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611211573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661123a57600060019250925050611241565b9150600090505b94509492505050565b600081600481111561126c57634e487b7160e01b600052602160045260246000fd5b14156112755750565b600181600481111561129757634e487b7160e01b600052602160045260246000fd5b14156112e55760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610478565b600281600481111561130757634e487b7160e01b600052602160045260246000fd5b14156113555760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610478565b600381600481111561137757634e487b7160e01b600052602160045260246000fd5b14156113d05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610478565b60048160048111156113f257634e487b7160e01b600052602160045260246000fd5b141561144b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610478565b50565b82805461145a90611981565b90600052602060002090601f01602090048101928261147c57600085556114c2565b82601f1061149557805160ff19168380011785556114c2565b828001600101855582156114c2579182015b828111156114c25782518255916020019190600101906114a7565b506114ce9291506114d2565b5090565b5b808211156114ce57600081556001016114d3565b80356001600160a01b03811681146114fe57600080fd5b919050565b600082601f830112611513578081fd5b813567ffffffffffffffff8082111561152e5761152e6119cc565b604051601f8301601f19908116603f01168101908282118183101715611556576115566119cc565b8160405283815286602085880101111561156e578485fd5b8360208701602083013792830160200193909352509392505050565b803567ffffffffffffffff811681146114fe57600080fd5b803560ff811681146114fe57600080fd5b6000602082840312156115c4578081fd5b6115cd826114e7565b9392505050565b600080604083850312156115e6578081fd5b6115ef836114e7565b91506115fd602084016114e7565b90509250929050565b60008060006060848603121561161a578081fd5b611623846114e7565b9250611631602085016114e7565b9150604084013590509250925092565b600080600080600080600060e0888a03121561165b578283fd5b611664886114e7565b9650611672602089016114e7565b9550604088013594506060880135935061168e608089016115a2565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156116bc578182fd5b6116c5836114e7565b946020939093013593505050565b6000806000606084860312156116e7578283fd5b833567ffffffffffffffff808211156116fe578485fd5b61170a87838801611503565b9450602086013591508082111561171f578384fd5b5061172c86828701611503565b92505061173b6040850161158a565b90509250925092565b600080600080600080600060e0888a03121561175e578283fd5b873567ffffffffffffffff80821115611775578485fd5b6117818b838c01611503565b985060208a0135915080821115611796578485fd5b506117a38a828b01611503565b9650506117b2604089016115a2565b94506117c06060890161158a565b93506117ce608089016114e7565b925060a088013561ffff811681146117e4578283fd5b8092505060c0880135905092959891949750929550565b60008151808452611813816020860160208601611951565b601f01601f19169290920160200192915050565b60008251611839818460208701611951565b9190910192915050565b60ff60f81b881681526000602060e08184015261186360e084018a6117fb565b8381036040850152611875818a6117fb565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252838701925090830190845b818110156118c6578351835292840192918401916001016118aa565b50909c9b505050505050505050505050565b6020815260006115cd60208301846117fb565b60208082526017908201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60008219821115611935576119356119b6565b500190565b60008282101561194c5761194c6119b6565b500390565b60005b8381101561196c578181015183820152602001611954565b8381111561197b576000848401525b50505050565b600181811c9082168061199557607f821691505b6020821081141561102757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212203de9d8f3af673eec4b7def57fea7c44ddaacb566240ed7be1ee0e924bc2e586264736f6c63430008040033
Deployed Bytecode Sourcemap
38633:11665:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40839:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41987:156;;;;;;:::i;:::-;;:::i;:::-;;;6263:14:1;;6256:22;6238:41;;6226:2;6211:18;41987:156:0;6193:92:1;41227:97:0;41298:18;;41227:97;;;7703:25:1;;;7691:2;7676:18;41227:97:0;7658:76:1;42151:421:0;;;;;;:::i;:::-;;:::i;41130:89::-;41196:15;;41130:89;;41196:15;;;;17346:36:1;;17334:2;17319:18;41130:89:0;17301:87:1;49230:104:0;;;:::i;42580:218::-;;;;;;:::i;:::-;;:::i;41428:103::-;41502:21;;41428:103;;43771:109;;;;;;:::i;:::-;;:::i;:::-;;41539:118;;;;;;:::i;:::-;-1:-1:-1;;;;;41624:25:0;41597:7;41624:25;;;:15;:25;;;;;;;41539:118;2624:119;;;;;;:::i;:::-;;:::i;49342:549::-;;;:::i;:::-;;;;;;;;;;;;;:::i;41037:85::-;41102:12;;41037:85;;-1:-1:-1;;;;;41102:12:0;;;6036:51:1;;6024:2;6009:18;41037:85:0;5991:102:1;40936:93:0;;;:::i;41332:88::-;41398:14;;-1:-1:-1;;;41398:14:0;;;;41332:88;;17003:6:1;16991:19;;;16973:38;;16961:2;16946:18;41332:88:0;16928:89:1;44184:109:0;;;;;;:::i;:::-;;:::i;45132:538::-;;;;;;:::i;:::-;;:::i;42806:381::-;;;;;;:::i;:::-;;:::i;41665:162::-;;;;;;:::i;:::-;;:::i;38856:577::-;;;;;;:::i;:::-;;:::i;47845:1255::-;;;;;;:::i;:::-;;:::i;41835:144::-;;;;;;:::i;:::-;-1:-1:-1;;;;;41936:25:0;;;41909:7;41936:25;;;:17;:25;;;;;;;;:35;;;;;;;;;;;;;41835:144;40839:89;40876:13;40909:6;:11;;40902:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40839:89;:::o;41987:156::-;42055:4;42072:41;3758:10;42095:8;42105:7;42072:8;:41::i;:::-;-1:-1:-1;42131:4:0;41987:156;;;;:::o;42151:421::-;42243:4;42260:39;42270:7;42279:10;42291:7;42260:9;:39::i;:::-;-1:-1:-1;;;;;42339:26:0;;42312:24;42339:26;;;:17;:26;;;;;;;;3758:10;42339:40;;;;;;;;42398:27;;;;42390:80;;;;-1:-1:-1;;;42390:80:0;;13584:2:1;42390:80:0;;;13566:21:1;13623:2;13603:18;;;13596:30;13662:34;13642:18;;;13635:62;-1:-1:-1;;;13713:18:1;;;13706:38;13761:19;;42390:80:0;;;;;;;;;42481:59;42490:7;3758:10;42513:26;42532:7;42513:16;:26;:::i;:::-;42481:8;:59::i;:::-;-1:-1:-1;42560:4:0;;42151:421;-1:-1:-1;;;;42151:421:0:o;49230:104::-;49279:7;49306:20;:18;:20::i;:::-;49299:27;;49230:104;:::o;42580:218::-;3758:10;42662:4;42712:31;;;:17;:31;;;;;;;;-1:-1:-1;;;;;42712:41:0;;;;;;;;;;42662:4;;42679:89;;42702:8;;42712:55;;42756:11;;42712:55;:::i;43771:109::-;41102:12;;-1:-1:-1;;;;;41102:12:0;3758:10;45718:23;45710:59;;;;-1:-1:-1;;;45710:59:0;;;;;;;:::i;:::-;43848:24:::1;43854:8;43864:7;43848:5;:24::i;:::-;43771:109:::0;;:::o;2624:119::-;-1:-1:-1;;;;;2704:21:0;;2677:7;2704:21;;;:13;:21;;;;;945:14;2704:31;2697:38;2624:119;-1:-1:-1;;2624:119:0:o;49342:549::-;49397:19;49427:24;49462:27;49500:21;49532:31;49574:18;49603:33;49708:6;:4;:6::i;:::-;49980:10;;;;;;;;;;;;-1:-1:-1;;;49980:10:0;;;;49766:13;49802:4;49822:19;:17;:19::i;:::-;49856:16;;;49870:1;49856:16;;;;;;;;-1:-1:-1;;;49655:228:0;;;-1:-1:-1;49655:228:0;;-1:-1:-1;49655:228:0;;-1:-1:-1;49655:228:0;-1:-1:-1;49655:228:0;-1:-1:-1;49856:16:0;-1:-1:-1;49655:228:0;-1:-1:-1;49342:549:0:o;40936:93::-;40975:13;41008:6;:13;;41001:20;;;;;:::i;44184:109::-;41102:12;;-1:-1:-1;;;;;41102:12:0;3758:10;45718:23;45710:59;;;;-1:-1:-1;;;45710:59:0;;;;;;;:::i;:::-;44261:24:::1;44267:8;44277:7;44261:5;:24::i;45132:538::-:0;41102:12;;-1:-1:-1;;;;;41102:12:0;3758:10;45718:23;45710:59;;;;-1:-1:-1;;;45710:59:0;;;;;;;:::i;:::-;45253:30:::1;::::0;:42:::1;::::0;;::::1;:30:::0;::::1;:42;45245:85;;;::::0;-1:-1:-1;;;45245:85:0;;15153:2:1;45245:85:0::1;::::0;::::1;15135:21:1::0;15192:2;15172:18;;;15165:30;15231:32;15211:18;;;15204:60;15281:18;;45245:85:0::1;15125:180:1::0;45245:85:0::1;45343:19:::0;;::::1;::::0;:6:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;45373:23:0;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;45407:30:0::1;:42:::0;;-1:-1:-1;;45407:42:0::1;;::::0;::::1;;::::0;;45630:32:::1;:30;:32::i;:::-;45132:538:::0;;;:::o;42806:381::-;3758:10;42893:4;42937:31;;;:17;:31;;;;;;;;-1:-1:-1;;;;;42937:41:0;;;;;;;;;;42997:36;;;;42989:86;;;;-1:-1:-1;;;42989:86:0;;16265:2:1;42989:86:0;;;16247:21:1;16304:2;16284:18;;;16277:30;16343:34;16323:18;;;16316:62;-1:-1:-1;;;16394:18:1;;;16387:35;16439:19;;42989:86:0;16237:227:1;42989:86:0;43086:69;3758:10;43109:8;43119:35;43138:16;43119;:35;:::i;43086:69::-;-1:-1:-1;43175:4:0;;42806:381;-1:-1:-1;;;42806:381:0:o;41665:162::-;41736:4;41753:44;3758:10;41777;41789:7;41753:9;:44::i;38856:577::-;45854:18;;-1:-1:-1;;;45854:18:0;;;;45853:19;45831:88;;;;-1:-1:-1;;;45831:88:0;;15917:2:1;45831:88:0;;;15899:21:1;15956:2;15936:18;;;15929:30;-1:-1:-1;;;15975:18:1;;;15968:49;16034:18;;45831:88:0;15889:169:1;45831:88:0;45932:18;:25;;-1:-1:-1;;;;45932:25:0;-1:-1:-1;;;45932:25:0;;;39113:197:::1;39150:5:::0;39170:7;39192:9;39216;39240:6;39261:8;39284:15;39113:22:::1;:197::i;:::-;39393:32;:30;:32::i;:::-;38856:577:::0;;;;;;;:::o;47845:1255::-;48210:32;:30;:32::i;:::-;48349:9;48330:15;:28;;48322:70;;;;-1:-1:-1;;;48322:70:0;;11654:2:1;48322:70:0;;;11636:21:1;11693:2;11673:18;;;11666:30;11732:31;11712:18;;;11705:59;11781:18;;48322:70:0;11626:179:1;48322:70:0;48405:18;48479:135;48633:6;48658:8;48685:6;48710:17;48720:6;48710:9;:17::i;:::-;48450:320;;;;;;8026:25:1;;;;-1:-1:-1;;;;;8125:15:1;;;8105:18;;;8098:43;8177:15;;;;8157:18;;;8150:43;8209:18;;;8202:34;8252:19;;;8245:35;8296:19;;;8289:35;;;7998:19;;48450:320:0;;;;;;;;;;;;48426:355;;;;;;48405:376;;48794:15;48812:28;48829:10;48812:16;:28::i;:::-;48794:46;;48851:14;48868:34;48882:7;48891:2;48895;48899;48868:13;:34::i;:::-;48851:51;;49004:6;-1:-1:-1;;;;;48994:16:0;:6;-1:-1:-1;;;;;48994:16:0;;48986:59;;;;-1:-1:-1;;;48986:59:0;;13225:2:1;48986:59:0;;;13207:21:1;13264:2;13244:18;;;13237:30;13303:32;13283:18;;;13276:60;13353:18;;48986:59:0;13197:180:1;48986:59:0;49058:34;49067:6;49075:8;49085:6;49058:8;:34::i;:::-;47845:1255;;;;;;;;;;:::o;44761:363::-;-1:-1:-1;;;;;44866:20:0;;44858:69;;;;-1:-1:-1;;;44858:69:0;;15512:2:1;44858:69:0;;;15494:21:1;15551:2;15531:18;;;15524:30;15590:34;15570:18;;;15563:62;-1:-1:-1;;;15641:18:1;;;15634:34;15685:19;;44858:69:0;15484:226:1;44858:69:0;-1:-1:-1;;;;;44946:22:0;;44938:69;;;;-1:-1:-1;;;44938:69:0;;11251:2:1;44938:69:0;;;11233:21:1;11290:2;11270:18;;;11263:30;11329:34;11309:18;;;11302:62;-1:-1:-1;;;11380:18:1;;;11373:32;11422:19;;44938:69:0;11223:224:1;44938:69:0;-1:-1:-1;;;;;45020:25:0;;;:6;:25;;;:17;:25;;;;;;;;:35;;;;;;;;;;;;;:45;;;45081:35;;7703:25:1;;;45081:35:0;;7676:18:1;45081:35:0;;;;;;;;44761:363;;;:::o;43195:568::-;-1:-1:-1;;;;;43296:21:0;;43288:71;;;;-1:-1:-1;;;43288:71:0;;14747:2:1;43288:71:0;;;14729:21:1;14786:2;14766:18;;;14759:30;14825:34;14805:18;;;14798:62;-1:-1:-1;;;14876:18:1;;;14869:35;14921:19;;43288:71:0;14719:227:1;43288:71:0;-1:-1:-1;;;;;43378:24:0;;43370:72;;;;-1:-1:-1;;;43370:72:0;;10084:2:1;43370:72:0;;;10066:21:1;10123:2;10103:18;;;10096:30;10162:34;10142:18;;;10135:62;-1:-1:-1;;;10213:18:1;;;10206:33;10256:19;;43370:72:0;10056:225:1;43370:72:0;-1:-1:-1;;;;;43479:24:0;;43455:21;43479:24;;;:15;:24;;;;;;43522;;;;43514:75;;;;-1:-1:-1;;;43514:75:0;;12012:2:1;43514:75:0;;;11994:21:1;12051:2;12031:18;;;12024:30;12090:34;12070:18;;;12063:62;-1:-1:-1;;;12141:18:1;;;12134:36;12187:19;;43514:75:0;11984:228:1;43514:75:0;43627:23;43643:7;43627:13;:23;:::i;:::-;-1:-1:-1;;;;;43600:24:0;;;:6;:24;;;:15;:24;;;;;;:50;;;;43661:27;;;;;;;;:38;;43692:7;;43600:6;43661:38;;43692:7;;43661:38;:::i;:::-;;;;;;;;43735:10;-1:-1:-1;;;;;43717:38:0;43726:7;-1:-1:-1;;;;;43717:38:0;;43747:7;43717:38;;;;7703:25:1;;7691:2;7676:18;;7658:76;43717:38:0;;;;;;;;43195:568;;;;:::o;46070:364::-;46164:17;;46123:7;;-1:-1:-1;;;;;46164:17:0;46155:4;46147:34;:75;;;;-1:-1:-1;46202:20:0;;46185:13;:37;46147:75;46143:284;;;-1:-1:-1;46246:28:0;;;46070:364::o;46143:284::-;46314:101;46354:25;:23;:25::i;:::-;46381:19;:17;:19::i;:::-;46314:21;:101::i;43888:288::-;-1:-1:-1;;;;;43966:22:0;;43958:66;;;;-1:-1:-1;;;43958:66:0;;16671:2:1;43958:66:0;;;16653:21:1;16710:2;16690:18;;;16683:30;16749:33;16729:18;;;16722:61;16800:18;;43958:66:0;16643:181:1;43958:66:0;44059:7;44037:6;:18;;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;44077:25:0;;:6;:25;;;:15;:25;;;;;:36;;44106:7;;44077:6;:36;;44106:7;;44077:36;:::i;:::-;;;;-1:-1:-1;;44129:39:0;;7703:25:1;;;-1:-1:-1;;;;;44129:39:0;;;44146:1;;44129:39;;7691:2:1;7676:18;44129:39:0;;;;;;;43888:288;;:::o;50142:153::-;50248:14;;50264:21;;50231:55;;-1:-1:-1;;;50248:14:0;;;5802:3:1;5780:16;-1:-1:-1;;;;;;5780:16:1;50231:55:0;;;5764:51:1;5831:11;;;5824:27;-1:-1:-1;;5867:12:1;;50231:55:0;;;;;;;;;;;;;50221:66;;;;;;50214:73;;50142:153;:::o;44301:452::-;-1:-1:-1;;;;;44379:22:0;;44371:68;;;;-1:-1:-1;;;44371:68:0;;14345:2:1;44371:68:0;;;14327:21:1;14384:2;14364:18;;;14357:30;14423:34;14403:18;;;14396:62;-1:-1:-1;;;14474:18:1;;;14467:31;14515:19;;44371:68:0;14317:223:1;44371:68:0;-1:-1:-1;;;;;44477:25:0;;44452:22;44477:25;;;:15;:25;;;;;;44521;;;;44513:72;;;;-1:-1:-1;;;44513:72:0;;10488:2:1;44513:72:0;;;10470:21:1;10527:2;10507:18;;;10500:30;10566:34;10546:18;;;10539:62;-1:-1:-1;;;10617:18:1;;;10610:32;10659:19;;44513:72:0;10460:224:1;44513:72:0;44624:24;44641:7;44624:14;:24;:::i;:::-;-1:-1:-1;;;;;44596:25:0;;:6;:25;;;:15;:25;;;;;:52;;;;44659:18;:29;;44681:7;;44596:6;44659:29;;44681:7;;44659:29;:::i;:::-;;;;-1:-1:-1;;44706:39:0;;7703:25:1;;;44733:1:0;;-1:-1:-1;;;;;44706:39:0;;;;;7691:2:1;7676:18;44706:39:0;7658:76:1;39982:849:0;40157:18;40178:25;:23;:25::i;:::-;40157:46;;40387:12;40402:19;:17;:19::i;:::-;40470:23;;40387:34;;-1:-1:-1;40470:37:0;;;;:66;;-1:-1:-1;40511:17:0;;:25;;;40470:66;40466:358;;;40576:13;40553:20;:36;40604:17;:33;;-1:-1:-1;;;;;;40604:33:0;40632:4;40604:33;;;40683:39;40705:10;40717:4;40683:21;:39::i;:::-;40652:28;:70;40737:17;:24;40776:23;:36;39982:849::o;39441:533::-;39700:19;;;;:6;;:19;;;;;:::i;:::-;-1:-1:-1;39730:23:0;;;;:13;;:23;;;;;:::i;:::-;-1:-1:-1;39764:15:0;:27;;;;;;-1:-1:-1;;39764:27:0;;;;;;;;;;39802:30;:42;;;;;;-1:-1:-1;;39802:42:0;;;;;;;;;;39857:12;:21;;39891:25;;;;-1:-1:-1;;;39891:25:0;-1:-1:-1;;;;;;39891:25:0;;;-1:-1:-1;;;;;39857:21:0;;;39891:25;;;;;;;;;;39927:21;:39;-1:-1:-1;;39441:533:0:o;2841:207::-;-1:-1:-1;;;;;2955:21:0;;2894:15;2955:21;;;:13;:21;;;;;945:14;;1082:1;1064:19;;;;945:14;3023:17;2841:207;;;;:::o;47620:159::-;47689:7;47716:55;47738:20;:18;:20::i;:::-;47760:10;47716:21;:55::i;37028:279::-;37156:7;37177:17;37196:18;37218:25;37229:4;37235:1;37238;37241;37218:10;:25::i;:::-;37176:67;;;;37254:18;37266:5;37254:11;:18::i;:::-;-1:-1:-1;37290:9:0;37028:279;-1:-1:-1;;;;;37028:279:0:o;50006:128::-;50064:7;50118:6;:4;:6::i;:::-;50101:24;;;;;;;;:::i;46442:536::-;46530:7;46610:148;46777:10;46833:22;49980:10;;;;;;;;;;;;-1:-1:-1;;;49980:10:0;;;;;49899:99;46833:22;46816:40;;;;;;;;:::i;:::-;;;;-1:-1:-1;;46816:40:0;;;;;;;;;46806:51;;46816:40;46806:51;;;;46581:378;;;8622:25:1;;;;8663:18;;8656:34;;;;8706:18;;;8699:34;;;;46876:13:0;8749:18:1;;;8742:34;46916:4:0;8792:19:1;;;8785:61;8862:19;;;8855:35;;;8594:19;;46581:378:0;;;;;;;;;;;;;46557:413;;;;;;46550:420;;46442:536;;;;:::o;38226:196::-;38356:57;;-1:-1:-1;;;38356:57:0;;;5470:27:1;5513:11;;;5506:27;;;5549:12;;;5542:28;;;38319:7:0;;5586:12:1;;38356:57:0;5460:144:1;35257:1632:0;35388:7;;36322:66;36309:79;;36305:163;;;-1:-1:-1;36421:1:0;;-1:-1:-1;36425:30:0;36405:51;;36305:163;36482:1;:7;;36487:2;36482:7;;:18;;;;;36493:1;:7;;36498:2;36493:7;;36482:18;36478:102;;;-1:-1:-1;36533:1:0;;-1:-1:-1;36537:30:0;36517:51;;36478:102;36694:24;;;36677:14;36694:24;;;;;;;;;9128:25:1;;;9201:4;9189:17;;9169:18;;;9162:45;;;;9223:18;;;9216:34;;;9266:18;;;9259:34;;;36694:24:0;;9100:19:1;;36694:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36694:24:0;;-1:-1:-1;;36694:24:0;;;-1:-1:-1;;;;;;;36733:20:0;;36729:103;;36786:1;36790:29;36770:50;;;;;;;36729:103;36852:6;-1:-1:-1;36860:20:0;;-1:-1:-1;35257:1632:0;;;;;;;;:::o;29919:643::-;29997:20;29988:5;:29;;;;;;-1:-1:-1;;;29988:29:0;;;;;;;;;;29984:571;;;29919:643;:::o;29984:571::-;30095:29;30086:5;:38;;;;;;-1:-1:-1;;;30086:38:0;;;;;;;;;;30082:473;;;30141:34;;-1:-1:-1;;;30141:34:0;;9731:2:1;30141:34:0;;;9713:21:1;9770:2;9750:18;;;9743:30;9809:26;9789:18;;;9782:54;9853:18;;30141:34:0;9703:174:1;30082:473:0;30206:35;30197:5;:44;;;;;;-1:-1:-1;;;30197:44:0;;;;;;;;;;30193:362;;;30258:41;;-1:-1:-1;;;30258:41:0;;10891:2:1;30258:41:0;;;10873:21:1;10930:2;10910:18;;;10903:30;10969:33;10949:18;;;10942:61;11020:18;;30258:41:0;10863:181:1;30193:362:0;30330:30;30321:5;:39;;;;;;-1:-1:-1;;;30321:39:0;;;;;;;;;;30317:238;;;30377:44;;-1:-1:-1;;;30377:44:0;;12419:2:1;30377:44:0;;;12401:21:1;12458:2;12438:18;;;12431:30;12497:34;12477:18;;;12470:62;-1:-1:-1;;;12548:18:1;;;12541:32;12590:19;;30377:44:0;12391:224:1;30317:238:0;30452:30;30443:5;:39;;;;;;-1:-1:-1;;;30443:39:0;;;;;;;;;;30439:116;;;30499:44;;-1:-1:-1;;;30499:44:0;;12822:2:1;30499:44:0;;;12804:21:1;12861:2;12841:18;;;12834:30;12900:34;12880:18;;;12873:62;-1:-1:-1;;;12951:18:1;;;12944:32;12993:19;;30499:44:0;12794:224:1;30439:116:0;29919:643;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:739::-;235:5;288:3;281:4;273:6;269:17;265:27;255:2;;310:5;303;296:20;255:2;350:6;337:20;376:18;413:2;409;406:10;403:2;;;419:18;;:::i;:::-;494:2;488:9;462:2;548:13;;-1:-1:-1;;544:22:1;;;568:2;540:31;536:40;524:53;;;592:18;;;612:22;;;589:46;586:2;;;638:18;;:::i;:::-;678:10;674:2;667:22;713:2;705:6;698:18;759:3;752:4;747:2;739:6;735:15;731:26;728:35;725:2;;;780:5;773;766:20;725:2;848;841:4;833:6;829:17;822:4;814:6;810:17;797:54;871:15;;;888:4;867:26;860:41;;;;-1:-1:-1;875:6:1;245:686;-1:-1:-1;;;245:686:1:o;936:171::-;1003:20;;1063:18;1052:30;;1042:41;;1032:2;;1097:1;1094;1087:12;1112:156;1178:20;;1238:4;1227:16;;1217:27;;1207:2;;1258:1;1255;1248:12;1273:196;1332:6;1385:2;1373:9;1364:7;1360:23;1356:32;1353:2;;;1406:6;1398;1391:22;1353:2;1434:29;1453:9;1434:29;:::i;:::-;1424:39;1343:126;-1:-1:-1;;;1343:126:1:o;1474:270::-;1542:6;1550;1603:2;1591:9;1582:7;1578:23;1574:32;1571:2;;;1624:6;1616;1609:22;1571:2;1652:29;1671:9;1652:29;:::i;:::-;1642:39;;1700:38;1734:2;1723:9;1719:18;1700:38;:::i;:::-;1690:48;;1561:183;;;;;:::o;1749:338::-;1826:6;1834;1842;1895:2;1883:9;1874:7;1870:23;1866:32;1863:2;;;1916:6;1908;1901:22;1863:2;1944:29;1963:9;1944:29;:::i;:::-;1934:39;;1992:38;2026:2;2015:9;2011:18;1992:38;:::i;:::-;1982:48;;2077:2;2066:9;2062:18;2049:32;2039:42;;1853:234;;;;;:::o;2092:616::-;2203:6;2211;2219;2227;2235;2243;2251;2304:3;2292:9;2283:7;2279:23;2275:33;2272:2;;;2326:6;2318;2311:22;2272:2;2354:29;2373:9;2354:29;:::i;:::-;2344:39;;2402:38;2436:2;2425:9;2421:18;2402:38;:::i;:::-;2392:48;;2487:2;2476:9;2472:18;2459:32;2449:42;;2538:2;2527:9;2523:18;2510:32;2500:42;;2561:37;2593:3;2582:9;2578:19;2561:37;:::i;:::-;2551:47;;2645:3;2634:9;2630:19;2617:33;2607:43;;2697:3;2686:9;2682:19;2669:33;2659:43;;2262:446;;;;;;;;;;:::o;2713:264::-;2781:6;2789;2842:2;2830:9;2821:7;2817:23;2813:32;2810:2;;;2863:6;2855;2848:22;2810:2;2891:29;2910:9;2891:29;:::i;:::-;2881:39;2967:2;2952:18;;;;2939:32;;-1:-1:-1;;;2800:177:1:o;2982:645::-;3078:6;3086;3094;3147:2;3135:9;3126:7;3122:23;3118:32;3115:2;;;3168:6;3160;3153:22;3115:2;3213:9;3200:23;3242:18;3283:2;3275:6;3272:14;3269:2;;;3304:6;3296;3289:22;3269:2;3332:50;3374:7;3365:6;3354:9;3350:22;3332:50;:::i;:::-;3322:60;;3435:2;3424:9;3420:18;3407:32;3391:48;;3464:2;3454:8;3451:16;3448:2;;;3485:6;3477;3470:22;3448:2;;3513:52;3557:7;3546:8;3535:9;3531:24;3513:52;:::i;:::-;3503:62;;;3584:37;3617:2;3606:9;3602:18;3584:37;:::i;:::-;3574:47;;3105:522;;;;;:::o;3632:1031::-;3761:6;3769;3777;3785;3793;3801;3809;3862:3;3850:9;3841:7;3837:23;3833:33;3830:2;;;3884:6;3876;3869:22;3830:2;3929:9;3916:23;3958:18;3999:2;3991:6;3988:14;3985:2;;;4020:6;4012;4005:22;3985:2;4048:50;4090:7;4081:6;4070:9;4066:22;4048:50;:::i;:::-;4038:60;;4151:2;4140:9;4136:18;4123:32;4107:48;;4180:2;4170:8;4167:16;4164:2;;;4201:6;4193;4186:22;4164:2;;4229:52;4273:7;4262:8;4251:9;4247:24;4229:52;:::i;:::-;4219:62;;;4300:36;4332:2;4321:9;4317:18;4300:36;:::i;:::-;4290:46;;4355:37;4388:2;4377:9;4373:18;4355:37;:::i;:::-;4345:47;;4411:39;4445:3;4434:9;4430:19;4411:39;:::i;:::-;4401:49;;4500:3;4489:9;4485:19;4472:33;4545:6;4538:5;4534:18;4527:5;4524:29;4514:2;;4572:6;4564;4557:22;4514:2;4600:5;4590:15;;;4652:3;4641:9;4637:19;4624:33;4614:43;;3820:843;;;;;;;;;;:::o;4668:258::-;4710:3;4748:5;4742:12;4775:6;4770:3;4763:19;4791:63;4847:6;4840:4;4835:3;4831:14;4824:4;4817:5;4813:16;4791:63;:::i;:::-;4908:2;4887:15;-1:-1:-1;;4883:29:1;4874:39;;;;4915:4;4870:50;;4718:208;-1:-1:-1;;4718:208:1:o;4931:276::-;5062:3;5100:6;5094:13;5116:53;5162:6;5157:3;5150:4;5142:6;5138:17;5116:53;:::i;:::-;5185:16;;;;;5070:137;-1:-1:-1;;5070:137:1:o;6290:1262::-;6696:3;6691;6687:13;6679:6;6675:26;6664:9;6657:45;6638:4;6721:2;6759:3;6754:2;6743:9;6739:18;6732:31;6786:46;6827:3;6816:9;6812:19;6804:6;6786:46;:::i;:::-;6880:9;6872:6;6868:22;6863:2;6852:9;6848:18;6841:50;6914:33;6940:6;6932;6914:33;:::i;:::-;6978:2;6963:18;;6956:34;;;-1:-1:-1;;;;;7027:32:1;;7021:3;7006:19;;6999:61;7047:3;7076:19;;7069:35;;;7141:22;;;7135:3;7120:19;;7113:51;7213:13;;7235:22;;;7311:15;;;;-1:-1:-1;7273:15:1;;;;7344:4;7357:169;7371:6;7368:1;7365:13;7357:169;;;7432:13;;7420:26;;7501:15;;;;7466:12;;;;7393:1;7386:9;7357:169;;;-1:-1:-1;7543:3:1;;6647:905;-1:-1:-1;;;;;;;;;;;;6647:905:1:o;9304:220::-;9453:2;9442:9;9435:21;9416:4;9473:45;9514:2;9503:9;9499:18;9491:6;9473:45;:::i;13791:347::-;13993:2;13975:21;;;14032:2;14012:18;;;14005:30;14071:25;14066:2;14051:18;;14044:53;14129:2;14114:18;;13965:173::o;17393:128::-;17433:3;17464:1;17460:6;17457:1;17454:13;17451:2;;;17470:18;;:::i;:::-;-1:-1:-1;17506:9:1;;17441:80::o;17526:125::-;17566:4;17594:1;17591;17588:8;17585:2;;;17599:18;;:::i;:::-;-1:-1:-1;17636:9:1;;17575:76::o;17656:258::-;17728:1;17738:113;17752:6;17749:1;17746:13;17738:113;;;17828:11;;;17822:18;17809:11;;;17802:39;17774:2;17767:10;17738:113;;;17869:6;17866:1;17863:13;17860:2;;;17904:1;17895:6;17890:3;17886:16;17879:27;17860:2;;17709:205;;;:::o;17919:380::-;17998:1;17994:12;;;;18041;;;18062:2;;18116:4;18108:6;18104:17;18094:27;;18062:2;18169;18161:6;18158:14;18138:18;18135:38;18132:2;;;18215:10;18210:3;18206:20;18203:1;18196:31;18250:4;18247:1;18240:15;18278:4;18275:1;18268:15;18304:127;18365:10;18360:3;18356:20;18353:1;18346:31;18396:4;18393:1;18386:15;18420:4;18417:1;18410:15;18436:127;18497:10;18492:3;18488:20;18485:1;18478:31;18528:4;18525:1;18518:15;18552:4;18549:1;18542:15
Swarm Source
ipfs://3de9d8f3af673eec4b7def57fea7c44ddaacb566240ed7be1ee0e924bc2e5862
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.