More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 10,095 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21494453 | 14 hrs ago | IN | 0 ETH | 0.00049365 | ||||
Set Approval For... | 21382819 | 16 days ago | IN | 0 ETH | 0.00118686 | ||||
Set Approval For... | 21327831 | 23 days ago | IN | 0 ETH | 0.00102526 | ||||
Set Approval For... | 21101930 | 55 days ago | IN | 0 ETH | 0.00023757 | ||||
Set Approval For... | 20958036 | 75 days ago | IN | 0 ETH | 0.00067651 | ||||
Set Approval For... | 20727117 | 107 days ago | IN | 0 ETH | 0.00014361 | ||||
Set Approval For... | 20602982 | 125 days ago | IN | 0 ETH | 0.00006197 | ||||
Set Approval For... | 19843893 | 231 days ago | IN | 0 ETH | 0.00032003 | ||||
Set Approval For... | 19746434 | 244 days ago | IN | 0 ETH | 0.00034161 | ||||
Safe Transfer Fr... | 19744982 | 244 days ago | IN | 0 ETH | 0.0004998 | ||||
Set Approval For... | 19153461 | 327 days ago | IN | 0 ETH | 0.00076609 | ||||
Set Approval For... | 19108793 | 334 days ago | IN | 0 ETH | 0.00029248 | ||||
Set Approval For... | 19108790 | 334 days ago | IN | 0 ETH | 0.00030531 | ||||
Set Approval For... | 19105216 | 334 days ago | IN | 0 ETH | 0.00062239 | ||||
Transfer From | 18989827 | 350 days ago | IN | 0 ETH | 0.00145615 | ||||
Set Approval For... | 18964543 | 354 days ago | IN | 0 ETH | 0.00168384 | ||||
Set Approval For... | 18963200 | 354 days ago | IN | 0 ETH | 0.00140897 | ||||
Set Approval For... | 18850308 | 370 days ago | IN | 0 ETH | 0.00076642 | ||||
Safe Transfer Fr... | 18775795 | 380 days ago | IN | 0 ETH | 0.00232854 | ||||
Withdraw | 18620513 | 402 days ago | IN | 0 ETH | 0.00104208 | ||||
Withdraw | 18620508 | 402 days ago | IN | 0 ETH | 0.00119745 | ||||
Set Approval For... | 18595418 | 406 days ago | IN | 0 ETH | 0.00106464 | ||||
Set Approval For... | 18505083 | 418 days ago | IN | 0 ETH | 0.00090635 | ||||
Set Approval For... | 18471927 | 423 days ago | IN | 0 ETH | 0.00156212 | ||||
Set Approval For... | 18460536 | 425 days ago | IN | 0 ETH | 0.00059452 |
Loading...
Loading
Contract Name:
TransparentUpgradeableProxy
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-16 */ // File: .deps/npm/@openzeppelin/contracts/utils/StorageSlot.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. 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: * ```solidity * 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`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // File: .deps/npm/@openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: .deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File: .deps/npm/@openzeppelin/contracts/interfaces/IERC1967.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967 { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // File: .deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon.sol // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface 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: .deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967Upgrade is IERC1967 { // 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 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 _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev 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 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: .deps/npm/@openzeppelin/contracts/proxy/Proxy.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 internal 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 overridden 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 internal 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 overridden should call `super._beforeFallback()`. */ function _beforeFallback() internal virtual {} } // File: .deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol // OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol) pragma solidity ^0.8.0; /** * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an * implementation address that can be changed. This address is stored in storage in the location specified by * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the * implementation behind the proxy. */ contract ERC1967Proxy is Proxy, ERC1967Upgrade { /** * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`. * * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded * function call, and allows initializing the storage of the proxy like a Solidity constructor. */ constructor(address _logic, bytes memory _data) payable { _upgradeToAndCall(_logic, _data, false); } /** * @dev Returns the current implementation address. */ function _implementation() internal view virtual override returns (address impl) { return ERC1967Upgrade._getImplementation(); } } // File: .deps/npm/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol) pragma solidity ^0.8.0; /** * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy} * does not implement this interface directly, and some of its functions are implemented by an internal dispatch * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not * include them in the ABI so this interface must be used to interact with it. */ interface ITransparentUpgradeableProxy is IERC1967 { function admin() external view returns (address); function implementation() external view returns (address); function changeAdmin(address) external; function upgradeTo(address) external; function upgradeToAndCall(address, bytes memory) external payable; } /** * @dev This contract implements a proxy that is upgradeable by an admin. * * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector * clashing], which can potentially be used in an attack, this contract uses the * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two * things that go hand in hand: * * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if * that call matches one of the admin functions exposed by the proxy itself. * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the * implementation. If the admin tries to call a function on the implementation it will fail with an error that says * "admin cannot fallback to proxy target". * * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due * to sudden errors when trying to call a function from the proxy implementation. * * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy. * * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the * implementation. * * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised. */ contract TransparentUpgradeableProxy is ERC1967Proxy { /** * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}. */ constructor(address _logic, address admin_, bytes memory _data) payable ERC1967Proxy(_logic, _data) { _changeAdmin(admin_); } /** * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin. * * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the * implementation provides a function with the same selector. */ modifier ifAdmin() { if (msg.sender == _getAdmin()) { _; } else { _fallback(); } } /** * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior */ function _fallback() internal virtual override { if (msg.sender == _getAdmin()) { bytes memory ret; bytes4 selector = msg.sig; if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) { ret = _dispatchUpgradeTo(); } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) { ret = _dispatchUpgradeToAndCall(); } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) { ret = _dispatchChangeAdmin(); } else if (selector == ITransparentUpgradeableProxy.admin.selector) { ret = _dispatchAdmin(); } else if (selector == ITransparentUpgradeableProxy.implementation.selector) { ret = _dispatchImplementation(); } else { revert("TransparentUpgradeableProxy: admin cannot fallback to proxy target"); } assembly { return(add(ret, 0x20), mload(ret)) } } else { super._fallback(); } } /** * @dev Returns the current admin. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function _dispatchAdmin() private returns (bytes memory) { _requireZeroValue(); address admin = _getAdmin(); return abi.encode(admin); } /** * @dev Returns the current implementation. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` */ function _dispatchImplementation() private returns (bytes memory) { _requireZeroValue(); address implementation = _implementation(); return abi.encode(implementation); } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _dispatchChangeAdmin() private returns (bytes memory) { _requireZeroValue(); address newAdmin = abi.decode(msg.data[4:], (address)); _changeAdmin(newAdmin); return ""; } /** * @dev Upgrade the implementation of the proxy. */ function _dispatchUpgradeTo() private returns (bytes memory) { _requireZeroValue(); address newImplementation = abi.decode(msg.data[4:], (address)); _upgradeToAndCall(newImplementation, bytes(""), false); return ""; } /** * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the * proxied contract. */ function _dispatchUpgradeToAndCall() private returns (bytes memory) { (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes)); _upgradeToAndCall(newImplementation, data, true); return ""; } /** * @dev Returns the current admin. * * CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead. */ function _admin() internal view virtual returns (address) { return _getAdmin(); } /** * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to * emulate some proxy functions being non-payable while still allowing value to pass through. */ function _requireZeroValue() private { require(msg.value == 0); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_logic","type":"address"},{"internalType":"address","name":"admin_","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260405162001a6d38038062001a6d833981810160405281019062000029919062000748565b82816200003f828260006200005b60201b60201c565b505062000052826200009e60201b60201c565b50505062000a8a565b6200006c83620000fc60201b60201c565b6000825111806200007a5750805b1562000099576200009783836200015360201b620002991760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000cf6200018960201b60201c565b82604051620000e0929190620007d4565b60405180910390a1620000f981620001ed60201b60201c565b50565b6200010d81620002dd60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b606062000181838360405180606001604052806027815260200162001a4660279139620003b360201b60201c565b905092915050565b6000620001c47fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6200044560201b620002c61760201c565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200025f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002569062000888565b60405180910390fd5b80620002997fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6200044560201b620002c61760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620002f3816200044f60201b620002d01760201c565b62000335576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200032c9062000920565b60405180910390fd5b806200036f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200044560201b620002c61760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051620003df91906200098f565b600060405180830381855af49150503d80600081146200041c576040519150601f19603f3d011682016040523d82523d6000602084013e62000421565b606091505b50915091506200043a868383876200047260201b60201c565b925050509392505050565b6000819050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315620004e2576000835103620004d95762000496856200044f60201b60201c565b620004d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004cf90620009f8565b60405180910390fd5b5b829050620004f5565b620004f48383620004fd60201b60201c565b5b949350505050565b600082511115620005115781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000547919062000a66565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005918262000564565b9050919050565b620005a38162000584565b8114620005af57600080fd5b50565b600081519050620005c38162000598565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061e82620005d3565b810181811067ffffffffffffffff8211171562000640576200063f620005e4565b5b80604052505050565b60006200065562000550565b905062000663828262000613565b919050565b600067ffffffffffffffff821115620006865762000685620005e4565b5b6200069182620005d3565b9050602081019050919050565b60005b83811015620006be578082015181840152602081019050620006a1565b60008484015250505050565b6000620006e1620006db8462000668565b62000649565b9050828152602081018484840111156200070057620006ff620005ce565b5b6200070d8482856200069e565b509392505050565b600082601f8301126200072d576200072c620005c9565b5b81516200073f848260208601620006ca565b91505092915050565b6000806000606084860312156200076457620007636200055a565b5b60006200077486828701620005b2565b93505060206200078786828701620005b2565b925050604084015167ffffffffffffffff811115620007ab57620007aa6200055f565b5b620007b98682870162000715565b9150509250925092565b620007ce8162000584565b82525050565b6000604082019050620007eb6000830185620007c3565b620007fa6020830184620007c3565b9392505050565b600082825260208201905092915050565b7f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200087060268362000801565b91506200087d8262000812565b604082019050919050565b60006020820190508181036000830152620008a38162000861565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b600062000908602d8362000801565b91506200091582620008aa565b604082019050919050565b600060208201905081810360008301526200093b81620008f9565b9050919050565b600081519050919050565b600081905092915050565b6000620009658262000942565b6200097181856200094d565b9350620009838185602086016200069e565b80840191505092915050565b60006200099d828462000958565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000620009e0601d8362000801565b9150620009ed82620009a8565b602082019050919050565b6000602082019050818103600083015262000a1381620009d1565b9050919050565b600081519050919050565b600062000a328262000a1a565b62000a3e818562000801565b935062000a508185602086016200069e565b62000a5b81620005d3565b840191505092915050565b6000602082019050818103600083015262000a82818462000a25565b905092915050565b610fac8062000a9a6000396000f3fe6080604052366100135761001161001d565b005b61001b61001d565b005b6100256102f3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361028f576060600080357fffffffff00000000000000000000000000000000000000000000000000000000169050633659cfe660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036100dc576100d561034a565b9150610287565b634f1ef28660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610137576101306103a9565b9150610286565b638f28397060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101925761018b6103f6565b9150610285565b63f851a44060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101ed576101e6610443565b9150610284565b635c60da1b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036102485761024161047f565b9150610283565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027a906109c6565b60405180910390fd5b5b5b5b5b815160208301f35b6102976104bb565b565b60606102be8383604051806060016040528060278152602001610f50602791396104d5565b905092915050565b6000819050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006103217fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6102c6565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606061035461055b565b600080366004908092610369939291906109fa565b8101906103769190610a9d565b90506103938160405180602001604052806000815250600061056a565b6040518060200160405280600081525091505090565b606060008060003660049080926103c2939291906109fa565b8101906103cf9190610c10565b915091506103df8282600161056a565b604051806020016040528060008152509250505090565b606061040061055b565b600080366004908092610415939291906109fa565b8101906104229190610a9d565b905061042d81610596565b6040518060200160405280600081525091505090565b606061044d61055b565b60006104576102f3565b90508060405160200161046a9190610c8d565b60405160208183030381529060405291505090565b606061048961055b565b60006104936105e2565b9050806040516020016104a69190610c8d565b60405160208183030381529060405291505090565b6104c36105f1565b6104d36104ce6105e2565b6105f3565b565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104ff9190610d19565b600060405180830381855af49150503d806000811461053a576040519150601f19603f3d011682016040523d82523d6000602084013e61053f565b606091505b509150915061055086838387610619565b925050509392505050565b6000341461056857600080fd5b565b6105738361068e565b6000825111806105805750805b156105915761058f8383610299565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6105bf6102f3565b826040516105ce929190610d30565b60405180910390a16105df816106dd565b50565b60006105ec6107bd565b905090565b565b3660008037600080366000845af43d6000803e8060008114610614573d6000f35b3d6000fd5b6060831561067b57600083510361067357610633856102d0565b610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066990610da5565b60405180910390fd5b5b829050610686565b6106858383610814565b5b949350505050565b61069781610864565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361074c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074390610e37565b60405180910390fd5b806107797fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6102c6565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006107eb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6102c6565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000825111156108275781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b9190610e9b565b60405180910390fd5b61086d816102d0565b6108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390610f2f565b60405180910390fd5b806108d97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6102c6565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082825260208201905092915050565b7f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60008201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760208201527f6574000000000000000000000000000000000000000000000000000000000000604082015250565b60006109b060428361091d565b91506109bb8261092e565b606082019050919050565b600060208201905081810360008301526109df816109a3565b9050919050565b6000604051905090565b600080fd5b600080fd5b60008085851115610a0e57610a0d6109f0565b5b83861115610a1f57610a1e6109f5565b5b6001850283019150848603905094509492505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a6a82610a3f565b9050919050565b610a7a81610a5f565b8114610a8557600080fd5b50565b600081359050610a9781610a71565b92915050565b600060208284031215610ab357610ab2610a35565b5b6000610ac184828501610a88565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610b1d82610ad4565b810181811067ffffffffffffffff82111715610b3c57610b3b610ae5565b5b80604052505050565b6000610b4f6109e6565b9050610b5b8282610b14565b919050565b600067ffffffffffffffff821115610b7b57610b7a610ae5565b5b610b8482610ad4565b9050602081019050919050565b82818337600083830152505050565b6000610bb3610bae84610b60565b610b45565b905082815260208101848484011115610bcf57610bce610acf565b5b610bda848285610b91565b509392505050565b600082601f830112610bf757610bf6610aca565b5b8135610c07848260208601610ba0565b91505092915050565b60008060408385031215610c2757610c26610a35565b5b6000610c3585828601610a88565b925050602083013567ffffffffffffffff811115610c5657610c55610a3a565b5b610c6285828601610be2565b9150509250929050565b6000610c7782610a3f565b9050919050565b610c8781610c6c565b82525050565b6000602082019050610ca26000830184610c7e565b92915050565b600081519050919050565b600081905092915050565b60005b83811015610cdc578082015181840152602081019050610cc1565b60008484015250505050565b6000610cf382610ca8565b610cfd8185610cb3565b9350610d0d818560208601610cbe565b80840191505092915050565b6000610d258284610ce8565b915081905092915050565b6000604082019050610d456000830185610c7e565b610d526020830184610c7e565b9392505050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000610d8f601d8361091d565b9150610d9a82610d59565b602082019050919050565b60006020820190508181036000830152610dbe81610d82565b9050919050565b7f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610e2160268361091d565b9150610e2c82610dc5565b604082019050919050565b60006020820190508181036000830152610e5081610e14565b9050919050565b600081519050919050565b6000610e6d82610e57565b610e77818561091d565b9350610e87818560208601610cbe565b610e9081610ad4565b840191505092915050565b60006020820190508181036000830152610eb58184610e62565b905092915050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b6000610f19602d8361091d565b9150610f2482610ebd565b604082019050919050565b60006020820190508181036000830152610f4881610f0c565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201dfdf1b6881f67ea42bcc0a7957649b028a5e891bed1ccb5bbbdff541e24833d64736f6c63430008120033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65640000000000000000000000005a2abf65647dd952cd5d5c42f1513c5dbd7a4eb3000000000000000000000000c99f5c87ebcf56f28abcda90ddcfcae8ca4db89d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052366100135761001161001d565b005b61001b61001d565b005b6100256102f3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361028f576060600080357fffffffff00000000000000000000000000000000000000000000000000000000169050633659cfe660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036100dc576100d561034a565b9150610287565b634f1ef28660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610137576101306103a9565b9150610286565b638f28397060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101925761018b6103f6565b9150610285565b63f851a44060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101ed576101e6610443565b9150610284565b635c60da1b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036102485761024161047f565b9150610283565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027a906109c6565b60405180910390fd5b5b5b5b5b815160208301f35b6102976104bb565b565b60606102be8383604051806060016040528060278152602001610f50602791396104d5565b905092915050565b6000819050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006103217fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6102c6565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606061035461055b565b600080366004908092610369939291906109fa565b8101906103769190610a9d565b90506103938160405180602001604052806000815250600061056a565b6040518060200160405280600081525091505090565b606060008060003660049080926103c2939291906109fa565b8101906103cf9190610c10565b915091506103df8282600161056a565b604051806020016040528060008152509250505090565b606061040061055b565b600080366004908092610415939291906109fa565b8101906104229190610a9d565b905061042d81610596565b6040518060200160405280600081525091505090565b606061044d61055b565b60006104576102f3565b90508060405160200161046a9190610c8d565b60405160208183030381529060405291505090565b606061048961055b565b60006104936105e2565b9050806040516020016104a69190610c8d565b60405160208183030381529060405291505090565b6104c36105f1565b6104d36104ce6105e2565b6105f3565b565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104ff9190610d19565b600060405180830381855af49150503d806000811461053a576040519150601f19603f3d011682016040523d82523d6000602084013e61053f565b606091505b509150915061055086838387610619565b925050509392505050565b6000341461056857600080fd5b565b6105738361068e565b6000825111806105805750805b156105915761058f8383610299565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6105bf6102f3565b826040516105ce929190610d30565b60405180910390a16105df816106dd565b50565b60006105ec6107bd565b905090565b565b3660008037600080366000845af43d6000803e8060008114610614573d6000f35b3d6000fd5b6060831561067b57600083510361067357610633856102d0565b610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066990610da5565b60405180910390fd5b5b829050610686565b6106858383610814565b5b949350505050565b61069781610864565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361074c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074390610e37565b60405180910390fd5b806107797fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6102c6565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006107eb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6102c6565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000825111156108275781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b9190610e9b565b60405180910390fd5b61086d816102d0565b6108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390610f2f565b60405180910390fd5b806108d97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6102c6565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082825260208201905092915050565b7f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60008201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760208201527f6574000000000000000000000000000000000000000000000000000000000000604082015250565b60006109b060428361091d565b91506109bb8261092e565b606082019050919050565b600060208201905081810360008301526109df816109a3565b9050919050565b6000604051905090565b600080fd5b600080fd5b60008085851115610a0e57610a0d6109f0565b5b83861115610a1f57610a1e6109f5565b5b6001850283019150848603905094509492505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a6a82610a3f565b9050919050565b610a7a81610a5f565b8114610a8557600080fd5b50565b600081359050610a9781610a71565b92915050565b600060208284031215610ab357610ab2610a35565b5b6000610ac184828501610a88565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610b1d82610ad4565b810181811067ffffffffffffffff82111715610b3c57610b3b610ae5565b5b80604052505050565b6000610b4f6109e6565b9050610b5b8282610b14565b919050565b600067ffffffffffffffff821115610b7b57610b7a610ae5565b5b610b8482610ad4565b9050602081019050919050565b82818337600083830152505050565b6000610bb3610bae84610b60565b610b45565b905082815260208101848484011115610bcf57610bce610acf565b5b610bda848285610b91565b509392505050565b600082601f830112610bf757610bf6610aca565b5b8135610c07848260208601610ba0565b91505092915050565b60008060408385031215610c2757610c26610a35565b5b6000610c3585828601610a88565b925050602083013567ffffffffffffffff811115610c5657610c55610a3a565b5b610c6285828601610be2565b9150509250929050565b6000610c7782610a3f565b9050919050565b610c8781610c6c565b82525050565b6000602082019050610ca26000830184610c7e565b92915050565b600081519050919050565b600081905092915050565b60005b83811015610cdc578082015181840152602081019050610cc1565b60008484015250505050565b6000610cf382610ca8565b610cfd8185610cb3565b9350610d0d818560208601610cbe565b80840191505092915050565b6000610d258284610ce8565b915081905092915050565b6000604082019050610d456000830185610c7e565b610d526020830184610c7e565b9392505050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000610d8f601d8361091d565b9150610d9a82610d59565b602082019050919050565b60006020820190508181036000830152610dbe81610d82565b9050919050565b7f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610e2160268361091d565b9150610e2c82610dc5565b604082019050919050565b60006020820190508181036000830152610e5081610e14565b9050919050565b600081519050919050565b6000610e6d82610e57565b610e77818561091d565b9350610e87818560208601610cbe565b610e9081610ad4565b840191505092915050565b60006020820190508181036000830152610eb58184610e62565b905092915050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b6000610f19602d8361091d565b9150610f2482610ebd565b604082019050919050565b60006020820190508181036000830152610f4881610f0c565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201dfdf1b6881f67ea42bcc0a7957649b028a5e891bed1ccb5bbbdff541e24833d64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005a2abf65647dd952cd5d5c42f1513c5dbd7a4eb3000000000000000000000000c99f5c87ebcf56f28abcda90ddcfcae8ca4db89d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _logic (address): 0x5a2abf65647Dd952cd5d5C42F1513C5dBd7A4eb3
Arg [1] : admin_ (address): 0xc99F5C87EBCf56f28aBCDA90DdCfcae8ca4dB89D
Arg [2] : _data (bytes): 0x
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a2abf65647dd952cd5d5c42f1513c5dbd7a4eb3
Arg [1] : 000000000000000000000000c99f5c87ebcf56f28abcda90ddcfcae8ca4db89d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
30333:5084:0:-:0;;;;;;25182:11;:9;:11::i;:::-;30333:5084;;24951:11;:9;:11::i;:::-;30333:5084;31377:1125;31453:11;:9;:11::i;:::-;31439:25;;:10;:25;;;31435:1060;;31481:16;31512:15;31530:7;;;;31512:25;;31568:47;;;31556:59;;;:8;:59;;;;31552:791;;31642:20;:18;:20::i;:::-;31636:26;;31552:791;;;31700:54;;;31688:66;;;:8;:66;;;;31684:659;;31781:27;:25;:27::i;:::-;31775:33;;31684:659;;;31846:49;;;31834:61;;;:8;:61;;;;31830:513;;31922:22;:20;:22::i;:::-;31916:28;;31830:513;;;31982:43;;;31970:55;;;:8;:55;;;;31966:377;;32052:16;:14;:16::i;:::-;32046:22;;31966:377;;;32106:52;;;32094:64;;;:8;:64;;;;32090:253;;32185:25;:23;:25::i;:::-;32179:31;;32090:253;;;32251:76;;;;;;;;;;:::i;:::-;;;;;;;;32090:253;31966:377;31830:513;31684:659;31552:791;32414:3;32408:10;32401:4;32396:3;32392:14;32385:34;31435:1060;32466:17;:15;:17::i;:::-;31377:1125::o;11159:200::-;11242:12;11274:77;11295:6;11303:4;11274:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;11267:84;;11159:200;;;;:::o;1957:195::-;2018:21;2130:4;2120:14;;1957:195;;;:::o;5767:326::-;5827:4;6084:1;6062:7;:19;;;:23;6055:30;;5767:326;;;:::o;19855:124::-;19899:7;19926:39;19722:66;19953:11;;19926:26;:39::i;:::-;:45;;;;;;;;;;;;19919:52;;19855:124;:::o;34025:262::-;34072:12;34097:19;:17;:19::i;:::-;34129:25;34168:8;;34177:1;34168:12;;;;;;;;;:::i;:::-;34157:35;;;;;;;:::i;:::-;34129:63;;34203:54;34221:17;34240:9;;;;;;;;;;;;34251:5;34203:17;:54::i;:::-;34270:9;;;;;;;;;;;;;;;34025:262;:::o;34578:259::-;34632:12;34658:25;34685:17;34717:8;;34726:1;34717:12;;;;;;;;;:::i;:::-;34706:42;;;;;;;:::i;:::-;34657:91;;;;34759:48;34777:17;34796:4;34802;34759:17;:48::i;:::-;34820:9;;;;;;;;;;;;;;;;34578:259;:::o;33722:223::-;33771:12;33796:19;:17;:19::i;:::-;33828:16;33858:8;;33867:1;33858:12;;;;;;;;;:::i;:::-;33847:35;;;;;;;:::i;:::-;33828:54;;33893:22;33906:8;33893:12;:22::i;:::-;33928:9;;;;;;;;;;;;;;;33722:223;:::o;32862:170::-;32905:12;32930:19;:17;:19::i;:::-;32962:13;32978:11;:9;:11::i;:::-;32962:27;;33018:5;33007:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;33000:24;;;32862:170;:::o;33401:203::-;33453:12;33478:19;:17;:19::i;:::-;33510:22;33535:17;:15;:17::i;:::-;33510:42;;33581:14;33570:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;33563:33;;;33401:203;:::o;24588:113::-;24637:17;:15;:17::i;:::-;24665:28;24675:17;:15;:17::i;:::-;24665:9;:28::i;:::-;24588:113::o;11553:332::-;11698:12;11724;11738:23;11765:6;:19;;11785:4;11765:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11723:67;;;;11808:69;11835:6;11843:7;11852:10;11864:12;11808:26;:69::i;:::-;11801:76;;;;11553:332;;;;;:::o;35335:79::-;35404:1;35391:9;:14;35383:23;;;;;;35335:79::o;18090:270::-;18199:29;18210:17;18199:10;:29::i;:::-;18257:1;18243:4;:11;:15;:28;;;;18262:9;18243:28;18239:114;;;18288:53;18317:17;18336:4;18288:28;:53::i;:::-;;18239:114;18090:270;;;:::o;20388:138::-;20453:35;20466:11;:9;:11::i;:::-;20479:8;20453:35;;;;;;;:::i;:::-;;;;;;;;20499:19;20509:8;20499:9;:19::i;:::-;20388:138;:::o;26712:142::-;26779:12;26811:35;:33;:35::i;:::-;26804:42;;26712:142;:::o;25491:46::-;:::o;23178:918::-;23521:14;23518:1;23515;23502:34;23739:1;23736;23720:14;23717:1;23701:14;23694:5;23681:60;23818:16;23815:1;23812;23797:38;23858:6;23932:1;23927:68;;;;24046:16;24043:1;24036:27;23927:68;23963:16;23960:1;23953:27;12181:644;12366:12;12395:7;12391:427;;;12444:1;12423:10;:17;:22;12419:290;;12641:18;12652:6;12641:10;:18::i;:::-;12633:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;12419:290;12730:10;12723:17;;;;12391:427;12773:33;12781:10;12793:12;12773:7;:33::i;:::-;12181:644;;;;;;;:::o;17794:155::-;17861:37;17880:17;17861:18;:37::i;:::-;17923:17;17914:27;;;;;;;;;;;;17794:155;:::o;20066:204::-;20150:1;20130:22;;:8;:22;;;20122:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20254:8;20206:39;19722:66;20233:11;;20206:26;:39::i;:::-;:45;;;:56;;;;;;;;;;;;;;;;;;20066:204;:::o;17181:142::-;17234:7;17261:48;17031:66;17288:20;;17261:26;:48::i;:::-;:54;;;;;;;;;;;;17254:61;;17181:142;:::o;13367:552::-;13548:1;13528:10;:17;:21;13524:388;;;13760:10;13754:17;13817:15;13804:10;13800:2;13796:19;13789:44;13524:388;13887:12;13880:20;;;;;;;;;;;:::i;:::-;;;;;;;;17419:262;17501:37;17520:17;17501:18;:37::i;:::-;17493:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;17656:17;17599:48;17031:66;17626:20;;17599:26;:48::i;:::-;:54;;;:74;;;;;;;;;;;;;;;;;;17419:262;:::o;7:169:1:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:290::-;322:34;318:1;310:6;306:14;299:58;391:34;386:2;378:6;374:15;367:59;460:4;455:2;447:6;443:15;436:29;182:290;:::o;478:366::-;620:3;641:67;705:2;700:3;641:67;:::i;:::-;634:74;;717:93;806:3;717:93;:::i;:::-;835:2;830:3;826:12;819:19;;478:366;;;:::o;850:419::-;1016:4;1054:2;1043:9;1039:18;1031:26;;1103:9;1097:4;1093:20;1089:1;1078:9;1074:17;1067:47;1131:131;1257:4;1131:131;:::i;:::-;1123:139;;850:419;;;:::o;1275:75::-;1308:6;1341:2;1335:9;1325:19;;1275:75;:::o;1356:117::-;1465:1;1462;1455:12;1479:117;1588:1;1585;1578:12;1602:469;1707:9;1718;1756:8;1744:10;1741:24;1738:111;;;1768:79;;:::i;:::-;1738:111;1874:6;1864:8;1861:20;1858:107;;;1884:79;;:::i;:::-;1858:107;2015:1;2003:10;1999:18;1991:6;1987:31;1974:44;;2054:10;2044:8;2040:25;2027:38;;1602:469;;;;;;;:::o;2077:117::-;2186:1;2183;2176:12;2200:117;2309:1;2306;2299:12;2323:126;2360:7;2400:42;2393:5;2389:54;2378:65;;2323:126;;;:::o;2455:104::-;2500:7;2529:24;2547:5;2529:24;:::i;:::-;2518:35;;2455:104;;;:::o;2565:138::-;2646:32;2672:5;2646:32;:::i;:::-;2639:5;2636:43;2626:71;;2693:1;2690;2683:12;2626:71;2565:138;:::o;2709:155::-;2763:5;2801:6;2788:20;2779:29;;2817:41;2852:5;2817:41;:::i;:::-;2709:155;;;;:::o;2870:345::-;2937:6;2986:2;2974:9;2965:7;2961:23;2957:32;2954:119;;;2992:79;;:::i;:::-;2954:119;3112:1;3137:61;3190:7;3181:6;3170:9;3166:22;3137:61;:::i;:::-;3127:71;;3083:125;2870:345;;;;:::o;3221:117::-;3330:1;3327;3320:12;3344:117;3453:1;3450;3443:12;3467:102;3508:6;3559:2;3555:7;3550:2;3543:5;3539:14;3535:28;3525:38;;3467:102;;;:::o;3575:180::-;3623:77;3620:1;3613:88;3720:4;3717:1;3710:15;3744:4;3741:1;3734:15;3761:281;3844:27;3866:4;3844:27;:::i;:::-;3836:6;3832:40;3974:6;3962:10;3959:22;3938:18;3926:10;3923:34;3920:62;3917:88;;;3985:18;;:::i;:::-;3917:88;4025:10;4021:2;4014:22;3804:238;3761:281;;:::o;4048:129::-;4082:6;4109:20;;:::i;:::-;4099:30;;4138:33;4166:4;4158:6;4138:33;:::i;:::-;4048:129;;;:::o;4183:307::-;4244:4;4334:18;4326:6;4323:30;4320:56;;;4356:18;;:::i;:::-;4320:56;4394:29;4416:6;4394:29;:::i;:::-;4386:37;;4478:4;4472;4468:15;4460:23;;4183:307;;;:::o;4496:146::-;4593:6;4588:3;4583;4570:30;4634:1;4625:6;4620:3;4616:16;4609:27;4496:146;;;:::o;4648:423::-;4725:5;4750:65;4766:48;4807:6;4766:48;:::i;:::-;4750:65;:::i;:::-;4741:74;;4838:6;4831:5;4824:21;4876:4;4869:5;4865:16;4914:3;4905:6;4900:3;4896:16;4893:25;4890:112;;;4921:79;;:::i;:::-;4890:112;5011:54;5058:6;5053:3;5048;5011:54;:::i;:::-;4731:340;4648:423;;;;;:::o;5090:338::-;5145:5;5194:3;5187:4;5179:6;5175:17;5171:27;5161:122;;5202:79;;:::i;:::-;5161:122;5319:6;5306:20;5344:78;5418:3;5410:6;5403:4;5395:6;5391:17;5344:78;:::i;:::-;5335:87;;5151:277;5090:338;;;;:::o;5434:668::-;5519:6;5527;5576:2;5564:9;5555:7;5551:23;5547:32;5544:119;;;5582:79;;:::i;:::-;5544:119;5702:1;5727:61;5780:7;5771:6;5760:9;5756:22;5727:61;:::i;:::-;5717:71;;5673:125;5865:2;5854:9;5850:18;5837:32;5896:18;5888:6;5885:30;5882:117;;;5918:79;;:::i;:::-;5882:117;6023:62;6077:7;6068:6;6057:9;6053:22;6023:62;:::i;:::-;6013:72;;5808:287;5434:668;;;;;:::o;6108:96::-;6145:7;6174:24;6192:5;6174:24;:::i;:::-;6163:35;;6108:96;;;:::o;6210:118::-;6297:24;6315:5;6297:24;:::i;:::-;6292:3;6285:37;6210:118;;:::o;6334:222::-;6427:4;6465:2;6454:9;6450:18;6442:26;;6478:71;6546:1;6535:9;6531:17;6522:6;6478:71;:::i;:::-;6334:222;;;;:::o;6562:98::-;6613:6;6647:5;6641:12;6631:22;;6562:98;;;:::o;6666:147::-;6767:11;6804:3;6789:18;;6666:147;;;;:::o;6819:246::-;6900:1;6910:113;6924:6;6921:1;6918:13;6910:113;;;7009:1;7004:3;7000:11;6994:18;6990:1;6985:3;6981:11;6974:39;6946:2;6943:1;6939:10;6934:15;;6910:113;;;7057:1;7048:6;7043:3;7039:16;7032:27;6881:184;6819:246;;;:::o;7071:386::-;7175:3;7203:38;7235:5;7203:38;:::i;:::-;7257:88;7338:6;7333:3;7257:88;:::i;:::-;7250:95;;7354:65;7412:6;7407:3;7400:4;7393:5;7389:16;7354:65;:::i;:::-;7444:6;7439:3;7435:16;7428:23;;7179:278;7071:386;;;;:::o;7463:271::-;7593:3;7615:93;7704:3;7695:6;7615:93;:::i;:::-;7608:100;;7725:3;7718:10;;7463:271;;;;:::o;7740:332::-;7861:4;7899:2;7888:9;7884:18;7876:26;;7912:71;7980:1;7969:9;7965:17;7956:6;7912:71;:::i;:::-;7993:72;8061:2;8050:9;8046:18;8037:6;7993:72;:::i;:::-;7740:332;;;;;:::o;8078:179::-;8218:31;8214:1;8206:6;8202:14;8195:55;8078:179;:::o;8263:366::-;8405:3;8426:67;8490:2;8485:3;8426:67;:::i;:::-;8419:74;;8502:93;8591:3;8502:93;:::i;:::-;8620:2;8615:3;8611:12;8604:19;;8263:366;;;:::o;8635:419::-;8801:4;8839:2;8828:9;8824:18;8816:26;;8888:9;8882:4;8878:20;8874:1;8863:9;8859:17;8852:47;8916:131;9042:4;8916:131;:::i;:::-;8908:139;;8635:419;;;:::o;9060:225::-;9200:34;9196:1;9188:6;9184:14;9177:58;9269:8;9264:2;9256:6;9252:15;9245:33;9060:225;:::o;9291:366::-;9433:3;9454:67;9518:2;9513:3;9454:67;:::i;:::-;9447:74;;9530:93;9619:3;9530:93;:::i;:::-;9648:2;9643:3;9639:12;9632:19;;9291:366;;;:::o;9663:419::-;9829:4;9867:2;9856:9;9852:18;9844:26;;9916:9;9910:4;9906:20;9902:1;9891:9;9887:17;9880:47;9944:131;10070:4;9944:131;:::i;:::-;9936:139;;9663:419;;;:::o;10088:99::-;10140:6;10174:5;10168:12;10158:22;;10088:99;;;:::o;10193:377::-;10281:3;10309:39;10342:5;10309:39;:::i;:::-;10364:71;10428:6;10423:3;10364:71;:::i;:::-;10357:78;;10444:65;10502:6;10497:3;10490:4;10483:5;10479:16;10444:65;:::i;:::-;10534:29;10556:6;10534:29;:::i;:::-;10529:3;10525:39;10518:46;;10285:285;10193:377;;;;:::o;10576:313::-;10689:4;10727:2;10716:9;10712:18;10704:26;;10776:9;10770:4;10766:20;10762:1;10751:9;10747:17;10740:47;10804:78;10877:4;10868:6;10804:78;:::i;:::-;10796:86;;10576:313;;;;:::o;10895:232::-;11035:34;11031:1;11023:6;11019:14;11012:58;11104:15;11099:2;11091:6;11087:15;11080:40;10895:232;:::o;11133:366::-;11275:3;11296:67;11360:2;11355:3;11296:67;:::i;:::-;11289:74;;11372:93;11461:3;11372:93;:::i;:::-;11490:2;11485:3;11481:12;11474:19;;11133:366;;;:::o;11505:419::-;11671:4;11709:2;11698:9;11694:18;11686:26;;11758:9;11752:4;11748:20;11744:1;11733:9;11729:17;11722:47;11786:131;11912:4;11786:131;:::i;:::-;11778:139;;11505:419;;;:::o
Swarm Source
ipfs://1dfdf1b6881f67ea42bcc0a7957649b028a5e891bed1ccb5bbbdff541e24833d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.