Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 139 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 2505243 | 5 days ago | IN | 0 ETH | 0.00140747 | ||||
Deposit | 1893380 | 98 days ago | IN | 0 ETH | 0.00000026 | ||||
Deposit | 1887456 | 99 days ago | IN | 0 ETH | 0 | ||||
Deposit | 1823117 | 109 days ago | IN | 0 ETH | 0.00028701 | ||||
Withdraw | 1805275 | 112 days ago | IN | 0 ETH | 0.00024665 | ||||
Deposit | 1804517 | 112 days ago | IN | 0 ETH | 0.00022142 | ||||
Deposit | 1767848 | 118 days ago | IN | 0 ETH | 0.0002107 | ||||
Deposit | 1767495 | 118 days ago | IN | 0 ETH | 0.00024123 | ||||
Deposit | 1760144 | 119 days ago | IN | 0 ETH | 0.00023066 | ||||
Deposit | 1727802 | 124 days ago | IN | 0 ETH | 0.00306551 | ||||
Deposit | 1727744 | 124 days ago | IN | 0 ETH | 0.00024618 | ||||
Withdraw | 1603510 | 144 days ago | IN | 0 ETH | 0.0005055 | ||||
Deposit | 1603494 | 144 days ago | IN | 0 ETH | 0.00072106 | ||||
Add Destination | 1602605 | 144 days ago | IN | 0 ETH | 0.00032337 | ||||
Add Destination | 1602604 | 144 days ago | IN | 0 ETH | 0.00033951 | ||||
Add Destination | 1592515 | 146 days ago | IN | 0 ETH | 0.00042062 | ||||
Add Bridge | 1592514 | 146 days ago | IN | 0 ETH | 0.00035757 | ||||
Withdraw | 1591447 | 146 days ago | IN | 0 ETH | 0.00100232 | ||||
Deposit | 1591426 | 146 days ago | IN | 0 ETH | 0.00130333 | ||||
Withdraw | 1591411 | 146 days ago | IN | 0 ETH | 0.00113841 | ||||
Deposit | 1591305 | 146 days ago | IN | 0 ETH | 0.00133359 | ||||
Withdraw | 1591127 | 146 days ago | IN | 0 ETH | 0.00261136 | ||||
Deposit | 1591091 | 146 days ago | IN | 0 ETH | 0.00171896 | ||||
Deposit | 1585523 | 147 days ago | IN | 0 ETH | 0.00217164 | ||||
Deposit | 1584465 | 147 days ago | IN | 0 ETH | 0.00076937 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
1312392 | 189 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
InitializableTransparentUpgradeableProxy
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "./InitializableERC1967Proxy.sol"; contract InceptionProxyAdmin is ProxyAdmin {} /// @dev The original OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol) /// with replacement constructor by initializer contract InitializableTransparentUpgradeableProxy is InitializableERC1967Proxy { /** * Contract initializer. * @param _logic address of the initial implementation. * @param admin_ Address of the proxy administrator. * @param _data Data to send as msg.data to the implementation to initialize the proxied contract */ function initialize( address _logic, address admin_, bytes memory _data ) external payable { require(_implementation() == address(0)); _upgradeToAndCall(_logic, _data, false); _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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface 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); }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol) pragma solidity ^0.8.0; import "../Proxy.sol"; import "./ERC1967Upgrade.sol"; /** * @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(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeacon.sol"; import "../../interfaces/IERC1967.sol"; import "../../interfaces/draft-IERC1822.sol"; import "../../utils/Address.sol"; import "../../utils/StorageSlot.sol"; /** * @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); } } }
// SPDX-License-Identifier: MIT // 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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.3) (proxy/transparent/ProxyAdmin.sol) pragma solidity ^0.8.0; import "./TransparentUpgradeableProxy.sol"; import "../../access/Ownable.sol"; /** * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}. */ contract ProxyAdmin is Ownable { /** * @dev Returns the current implementation of `proxy`. * * Requirements: * * - This contract must be the admin of `proxy`. */ function getProxyImplementation(ITransparentUpgradeableProxy proxy) public view virtual returns (address) { // We need to manually run the static call since the getter cannot be flagged as view // bytes4(keccak256("implementation()")) == 0x5c60da1b (bool success, bytes memory returndata) = address(proxy).staticcall(hex"5c60da1b"); require(success); return abi.decode(returndata, (address)); } /** * @dev Returns the current admin of `proxy`. * * Requirements: * * - This contract must be the admin of `proxy`. */ function getProxyAdmin(ITransparentUpgradeableProxy proxy) public view virtual returns (address) { // We need to manually run the static call since the getter cannot be flagged as view // bytes4(keccak256("admin()")) == 0xf851a440 (bool success, bytes memory returndata) = address(proxy).staticcall(hex"f851a440"); require(success); return abi.decode(returndata, (address)); } /** * @dev Changes the admin of `proxy` to `newAdmin`. * * Requirements: * * - This contract must be the current admin of `proxy`. */ function changeProxyAdmin(ITransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner { proxy.changeAdmin(newAdmin); } /** * @dev Upgrades `proxy` to `implementation`. See {TransparentUpgradeableProxy-upgradeTo}. * * Requirements: * * - This contract must be the admin of `proxy`. */ function upgrade(ITransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner { proxy.upgradeTo(implementation); } /** * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation. See * {TransparentUpgradeableProxy-upgradeToAndCall}. * * Requirements: * * - This contract must be the admin of `proxy`. */ function upgradeAndCall( ITransparentUpgradeableProxy proxy, address implementation, bytes memory data ) public payable virtual onlyOwner { proxy.upgradeToAndCall{value: msg.value}(implementation, data); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol) pragma solidity ^0.8.0; import "../ERC1967/ERC1967Proxy.sol"; /** * @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); } }
// SPDX-License-Identifier: MIT // 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); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // 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 } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/proxy/Proxy.sol"; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol"; /// @dev The original OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol), but /// constructor() was removed contract InitializableERC1967Proxy is Proxy, ERC1967Upgrade { /** * @dev Returns the current implementation address. */ function _implementation() internal view virtual override returns (address impl) { return ERC1967Upgrade._getImplementation(); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"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"},{"inputs":[{"internalType":"address","name":"_logic","type":"address"},{"internalType":"address","name":"admin_","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5061096f806100206000396000f3fe6080604052600436106100225760003560e01c8063cf7a1d771461003957610031565b366100315761002f61004c565b005b61002f61004c565b61002f6100473660046107a6565b61019e565b6100546101d5565b6001600160a01b031633036101945760606001600160e01b0319600035166364d3180d60e11b810161008f57610088610208565b915061018c565b63587086bd60e11b6001600160e01b03198216016100af5761008861025f565b63070d7c6960e41b6001600160e01b03198216016100cf576100886102a5565b621eb96f60e61b6001600160e01b03198216016100ee576100886102d6565b63a39f25e560e01b6001600160e01b031982160161010e57610088610316565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61019c61032a565b565b60006101a861033a565b6001600160a01b0316146101bb57600080fd5b6101c783826000610349565b6101d082610374565b505050565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606102126103cb565b60006102213660048184610808565b81019061022e9190610832565b905061024b81604051806020016040528060008152506000610349565b505060408051602081019091526000815290565b60606000806102713660048184610808565b81019061027e919061084f565b9150915061028e82826001610349565b604051806020016040528060008152509250505090565b60606102af6103cb565b60006102be3660048184610808565b8101906102cb9190610832565b905061024b81610374565b60606102e06103cb565b60006102ea6101d5565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606103206103cb565b60006102ea61033a565b61019c61033561033a565b6103d6565b60006103446103fa565b905090565b61035283610422565b60008251118061035f5750805b156101d05761036e8383610462565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61039d6101d5565b604080516001600160a01b03928316815291841660208301520160405180910390a16103c88161048e565b50565b341561019c57600080fd5b3660008037600080366000845af43d6000803e8080156103f5573d6000f35b3d6000fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101f9565b61042b81610537565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606104878383604051806060016040528060278152602001610913602791396105cb565b9392505050565b6001600160a01b0381166104f35760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610183565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6105a45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610183565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610516565b6060600080856001600160a01b0316856040516105e891906108c3565b600060405180830381855af49150503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b509150915061063986838387610643565b9695505050505050565b606083156106b25782516000036106ab576001600160a01b0385163b6106ab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610183565b50816106bc565b6106bc83836106c4565b949350505050565b8151156106d45781518083602001fd5b8060405162461bcd60e51b815260040161018391906108df565b6001600160a01b03811681146103c857600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f83011261072a57600080fd5b813567ffffffffffffffff8082111561074557610745610703565b604051601f8301601f19908116603f0116810190828211818310171561076d5761076d610703565b8160405283815286602085880101111561078657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156107bb57600080fd5b83356107c6816106ee565b925060208401356107d6816106ee565b9150604084013567ffffffffffffffff8111156107f257600080fd5b6107fe86828701610719565b9150509250925092565b6000808585111561081857600080fd5b8386111561082557600080fd5b5050820193919092039150565b60006020828403121561084457600080fd5b8135610487816106ee565b6000806040838503121561086257600080fd5b823561086d816106ee565b9150602083013567ffffffffffffffff81111561088957600080fd5b61089585828601610719565b9150509250929050565b60005b838110156108ba5781810151838201526020016108a2565b50506000910152565b600082516108d581846020870161089f565b9190910192915050565b60208152600082518060208401526108fe81604085016020870161089f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122060aab9dca18a58f986d25342dc90ec2ff757d0025930f24b0d4541d0a4494a1d64736f6c63430008140033
Deployed Bytecode
0x6080604052600436106100225760003560e01c8063cf7a1d771461003957610031565b366100315761002f61004c565b005b61002f61004c565b61002f6100473660046107a6565b61019e565b6100546101d5565b6001600160a01b031633036101945760606001600160e01b0319600035166364d3180d60e11b810161008f57610088610208565b915061018c565b63587086bd60e11b6001600160e01b03198216016100af5761008861025f565b63070d7c6960e41b6001600160e01b03198216016100cf576100886102a5565b621eb96f60e61b6001600160e01b03198216016100ee576100886102d6565b63a39f25e560e01b6001600160e01b031982160161010e57610088610316565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61019c61032a565b565b60006101a861033a565b6001600160a01b0316146101bb57600080fd5b6101c783826000610349565b6101d082610374565b505050565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606102126103cb565b60006102213660048184610808565b81019061022e9190610832565b905061024b81604051806020016040528060008152506000610349565b505060408051602081019091526000815290565b60606000806102713660048184610808565b81019061027e919061084f565b9150915061028e82826001610349565b604051806020016040528060008152509250505090565b60606102af6103cb565b60006102be3660048184610808565b8101906102cb9190610832565b905061024b81610374565b60606102e06103cb565b60006102ea6101d5565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606103206103cb565b60006102ea61033a565b61019c61033561033a565b6103d6565b60006103446103fa565b905090565b61035283610422565b60008251118061035f5750805b156101d05761036e8383610462565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61039d6101d5565b604080516001600160a01b03928316815291841660208301520160405180910390a16103c88161048e565b50565b341561019c57600080fd5b3660008037600080366000845af43d6000803e8080156103f5573d6000f35b3d6000fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101f9565b61042b81610537565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606104878383604051806060016040528060278152602001610913602791396105cb565b9392505050565b6001600160a01b0381166104f35760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610183565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6105a45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610183565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610516565b6060600080856001600160a01b0316856040516105e891906108c3565b600060405180830381855af49150503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b509150915061063986838387610643565b9695505050505050565b606083156106b25782516000036106ab576001600160a01b0385163b6106ab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610183565b50816106bc565b6106bc83836106c4565b949350505050565b8151156106d45781518083602001fd5b8060405162461bcd60e51b815260040161018391906108df565b6001600160a01b03811681146103c857600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f83011261072a57600080fd5b813567ffffffffffffffff8082111561074557610745610703565b604051601f8301601f19908116603f0116810190828211818310171561076d5761076d610703565b8160405283815286602085880101111561078657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156107bb57600080fd5b83356107c6816106ee565b925060208401356107d6816106ee565b9150604084013567ffffffffffffffff8111156107f257600080fd5b6107fe86828701610719565b9150509250925092565b6000808585111561081857600080fd5b8386111561082557600080fd5b5050820193919092039150565b60006020828403121561084457600080fd5b8135610487816106ee565b6000806040838503121561086257600080fd5b823561086d816106ee565b9150602083013567ffffffffffffffff81111561088957600080fd5b61089585828601610719565b9150509250929050565b60005b838110156108ba5781810151838201526020016108a2565b50506000910152565b600082516108d581846020870161089f565b9190910192915050565b60208152600082518060208401526108fe81604085016020870161089f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122060aab9dca18a58f986d25342dc90ec2ff757d0025930f24b0d4541d0a4494a1d64736f6c63430008140033
Deployed Bytecode Sourcemap
382:5352:13:-:0;;;;;;;;;;;;;;;;;;;;;;;2898:11:5;:9;:11::i;:::-;382:5352:13;;2675:11:5;:9;:11::i;731:255:13:-;;;;;;:::i;:::-;;:::i;1593:1276::-;1668:11;:9;:11::i;:::-;-1:-1:-1;;;;;1654:25:13;:10;:25;1650:1213;;1695:16;-1:-1:-1;;;;;;1725:15:13;1743:7;;-1:-1:-1;;;1768:59:13;;1764:953;;1853:20;:18;:20::i;:::-;1847:26;;1764:953;;;-1:-1:-1;;;;;;;;;1915:82:13;;;1894:823;;2036:27;:25;:27::i;1894:823::-;-1:-1:-1;;;;;;;;;2105:61:13;;;2084:633;;2205:22;:20;:22::i;2084:633::-;-1:-1:-1;;;;;;;;;2269:55:13;;;2248:469;;2363:16;:14;:16::i;2248:469::-;-1:-1:-1;;;;;;;;;2421:64:13;;;2400:317;;2524:25;:23;:25::i;2400:317::-;2588:114;;-1:-1:-1;;;2588:114:13;;1808:2:14;2588:114:13;;;1790:21:14;1847:2;1827:18;;;1820:30;1886:34;1866:18;;;1859:62;1957:34;1937:18;;;1930:62;-1:-1:-1;;;2008:19:14;;;2001:33;2051:19;;2588:114:13;;;;;;;;2400:317;2786:3;2780:10;2773:4;2768:3;2764:14;2757:34;1650:1213;2835:17;:15;:17::i;:::-;1593:1276::o;731:255::-;897:1;868:17;:15;:17::i;:::-;-1:-1:-1;;;;;868:31:13;;860:40;;;;;;910:39;928:6;936:5;943;910:17;:39::i;:::-;959:20;972:6;959:12;:20::i;:::-;731:255;;;:::o;3784:122:4:-;3828:7;3656:66;3854:39;:45;-1:-1:-1;;;;;3854:45:4;;3784:122;-1:-1:-1;3784:122:4:o;4345:255:13:-;4392:12;4416:19;:17;:19::i;:::-;4446:25;4485:12;:8;4494:1;4485:8;4446:25;4485:12;:::i;:::-;4474:35;;;;;;;:::i;:::-;4446:63;;4519:54;4537:17;4556:9;;;;;;;;;;;;4567:5;4519:17;:54::i;:::-;-1:-1:-1;;4584:9:13;;;;;;;;;-1:-1:-1;4584:9:13;;;4345:255::o;4884:288::-;4938:12;4963:25;;5035:12;:8;5044:1;5035:8;4963:25;5035:12;:::i;:::-;5011:76;;;;;;;:::i;:::-;4962:125;;;;5097:48;5115:17;5134:4;5140;5097:17;:48::i;:::-;5156:9;;;;;;;;;;;;;;;;4884:288;:::o;4054:216::-;4103:12;4127:19;:17;:19::i;:::-;4157:16;4187:12;:8;4196:1;4187:8;4157:16;4187:12;:::i;:::-;4176:35;;;;;;;:::i;:::-;4157:54;;4221:22;4234:8;4221:12;:22::i;3220:165::-;3263:12;3287:19;:17;:19::i;:::-;3317:13;3333:11;:9;:11::i;:::-;3361:17;;;-1:-1:-1;;;;;3309:32:14;;3361:17:13;;;3291:51:14;3317:27:13;;-1:-1:-1;3264:18:14;3361:17:13;;;;;;;;;;;;3354:24;;;3220:165;:::o;3745:198::-;3797:12;3821:19;:17;:19::i;:::-;3851:22;3876:17;:15;:17::i;2322:110:5:-;2397:28;2407:17;:15;:17::i;:::-;2397:9;:28::i;449:184:12:-;556:12;591:35;:33;:35::i;:::-;584:42;;449:184;:::o;2057:265:4:-;2165:29;2176:17;2165:10;:29::i;:::-;2222:1;2208:4;:11;:15;:28;;;;2227:9;2208:28;2204:112;;;2252:53;2281:17;2300:4;2252:28;:53::i;:::-;;2057:265;;;:::o;4300:135::-;4364:35;4377:11;:9;:11::i;:::-;4364:35;;;-1:-1:-1;;;;;3583:15:14;;;3565:34;;3635:15;;;3630:2;3615:18;;3608:43;3500:18;4364:35:4;;;;;;;4409:19;4419:8;4409:9;:19::i;:::-;4300:135;:::o;5655:77:13:-;5710:9;:14;5702:23;;;;;948:895:5;1286:14;1283:1;1280;1267:34;1500:1;1497;1481:14;1478:1;1462:14;1455:5;1442:60;1576:16;1573:1;1570;1555:38;1614:6;1681:66;;;;1796:16;1793:1;1786:27;1681:66;1716:16;1713:1;1706:27;1175:140:4;1228:7;1030:66;1254:48;1859:190:11;1771:152:4;1837:37;1856:17;1837:18;:37::i;:::-;1889:27;;-1:-1:-1;;;;;1889:27:4;;;;;;;;1771:152;:::o;6674:198:9:-;6757:12;6788:77;6809:6;6817:4;6788:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;6781:84;6674:198;-1:-1:-1;;;6674:198:9:o;3988:201:4:-;-1:-1:-1;;;;;4051:22:4;;4043:73;;;;-1:-1:-1;;;4043:73:4;;3864:2:14;4043:73:4;;;3846:21:14;3903:2;3883:18;;;3876:30;3942:34;3922:18;;;3915:62;-1:-1:-1;;;3993:18:14;;;3986:36;4039:19;;4043:73:4;3662:402:14;4043:73:4;4174:8;3656:66;4126:39;:56;;-1:-1:-1;;;;;;4126:56:4;-1:-1:-1;;;;;4126:56:4;;;;;;;;;;-1:-1:-1;3988:201:4:o;1406:259::-;-1:-1:-1;;;;;1702:19:9;;;1479:95:4;;;;-1:-1:-1;;;1479:95:4;;4271:2:14;1479:95:4;;;4253:21:14;4310:2;4290:18;;;4283:30;4349:34;4329:18;;;4322:62;-1:-1:-1;;;4400:18:14;;;4393:43;4453:19;;1479:95:4;4069:409:14;1479:95:4;1641:17;1030:66;1584:48;1859:190:11;7058:325:9;7199:12;7224;7238:23;7265:6;-1:-1:-1;;;;;7265:19:9;7285:4;7265:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7223:67;;;;7307:69;7334:6;7342:7;7351:10;7363:12;7307:26;:69::i;:::-;7300:76;7058:325;-1:-1:-1;;;;;;7058:325:9:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1702:19:9;;;8113:60;;;;-1:-1:-1;;;8113:60:9;;5232:2:14;8113:60:9;;;5214:21:14;5271:2;5251:18;;;5244:30;5310:31;5290:18;;;5283:59;5359:18;;8113:60:9;5030:353:14;8113:60:9;-1:-1:-1;8208:10:9;8201:17;;7875:418;8249:33;8257:10;8269:12;8249:7;:33::i;:::-;7671:628;;;;;;:::o;8821:540::-;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:9;;;;;;;;:::i;14:131:14:-;-1:-1:-1;;;;;89:31:14;;79:42;;69:70;;135:1;132;125:12;150:127;211:10;206:3;202:20;199:1;192:31;242:4;239:1;232:15;266:4;263:1;256:15;282:718;324:5;377:3;370:4;362:6;358:17;354:27;344:55;;395:1;392;385:12;344:55;431:6;418:20;457:18;494:2;490;487:10;484:36;;;500:18;;:::i;:::-;575:2;569:9;543:2;629:13;;-1:-1:-1;;625:22:14;;;649:2;621:31;617:40;605:53;;;673:18;;;693:22;;;670:46;667:72;;;719:18;;:::i;:::-;759:10;755:2;748:22;794:2;786:6;779:18;840:3;833:4;828:2;820:6;816:15;812:26;809:35;806:55;;;857:1;854;847:12;806:55;921:2;914:4;906:6;902:17;895:4;887:6;883:17;870:54;968:1;961:4;956:2;948:6;944:15;940:26;933:37;988:6;979:15;;;;;;282:718;;;;:::o;1005:596::-;1091:6;1099;1107;1160:2;1148:9;1139:7;1135:23;1131:32;1128:52;;;1176:1;1173;1166:12;1128:52;1215:9;1202:23;1234:31;1259:5;1234:31;:::i;:::-;1284:5;-1:-1:-1;1341:2:14;1326:18;;1313:32;1354:33;1313:32;1354:33;:::i;:::-;1406:7;-1:-1:-1;1464:2:14;1449:18;;1436:32;1491:18;1480:30;;1477:50;;;1523:1;1520;1513:12;1477:50;1546:49;1587:7;1578:6;1567:9;1563:22;1546:49;:::i;:::-;1536:59;;;1005:596;;;;;:::o;2081:331::-;2186:9;2197;2239:8;2227:10;2224:24;2221:44;;;2261:1;2258;2251:12;2221:44;2290:6;2280:8;2277:20;2274:40;;;2310:1;2307;2300:12;2274:40;-1:-1:-1;;2336:23:14;;;2381:25;;;;;-1:-1:-1;2081:331:14:o;2417:255::-;2484:6;2537:2;2525:9;2516:7;2512:23;2508:32;2505:52;;;2553:1;2550;2543:12;2505:52;2592:9;2579:23;2611:31;2636:5;2611:31;:::i;2677:463::-;2762:6;2770;2823:2;2811:9;2802:7;2798:23;2794:32;2791:52;;;2839:1;2836;2829:12;2791:52;2878:9;2865:23;2897:31;2922:5;2897:31;:::i;:::-;2947:5;-1:-1:-1;3003:2:14;2988:18;;2975:32;3030:18;3019:30;;3016:50;;;3062:1;3059;3052:12;3016:50;3085:49;3126:7;3117:6;3106:9;3102:22;3085:49;:::i;:::-;3075:59;;;2677:463;;;;;:::o;4483:250::-;4568:1;4578:113;4592:6;4589:1;4586:13;4578:113;;;4668:11;;;4662:18;4649:11;;;4642:39;4614:2;4607:10;4578:113;;;-1:-1:-1;;4725:1:14;4707:16;;4700:27;4483:250::o;4738:287::-;4867:3;4905:6;4899:13;4921:66;4980:6;4975:3;4968:4;4960:6;4956:17;4921:66;:::i;:::-;5003:16;;;;;4738:287;-1:-1:-1;;4738:287:14:o;5388:396::-;5537:2;5526:9;5519:21;5500:4;5569:6;5563:13;5612:6;5607:2;5596:9;5592:18;5585:34;5628:79;5700:6;5695:2;5684:9;5680:18;5675:2;5667:6;5663:15;5628:79;:::i;:::-;5768:2;5747:15;-1:-1:-1;;5743:29:14;5728:45;;;;5775:2;5724:54;;5388:396;-1:-1:-1;;5388:396:14:o
Swarm Source
ipfs://60aab9dca18a58f986d25342dc90ec2ff757d0025930f24b0d4541d0a4494a1d
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.