// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (proxy/transparent/TransparentUpgradeableProxy.sol)
pragma solidity ^0.8.20;
import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol";
import {ERC1967Proxy} from "../ERC1967/ERC1967Proxy.sol";
import {IERC1967} from "../../interfaces/IERC1967.sol";
import {ProxyAdmin} from "./ProxyAdmin.sol";
/**
* @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}
* does not implement this interface directly, and its upgradeability mechanism is 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 {
/// @dev See {UUPSUpgradeable-upgradeToAndCall}
function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;
}
/**
* @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.
*
* 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 the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.
* 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to
* the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating
* the proxy admin cannot fallback to the target implementation.
*
* These properties mean that the admin account can only be used for upgrading the proxy, 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. For this reason, the proxy deploys an instance of {ProxyAdmin} and
* allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative
* interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.
*
* NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not
* inherit from that interface, and instead `upgradeToAndCall` is 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.
*
* NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a
* meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.
*
* IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an
* immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be
* overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an
* undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot
* is generally fine if the implementation is trusted.
*
* 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 `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.
*/
contract TransparentUpgradeableProxy is ERC1967Proxy {
// An immutable address for the admin to avoid unnecessary SLOADs before each call
// at the expense of removing the ability to change the admin once it's set.
// This is acceptable if the admin is always a ProxyAdmin instance or similar contract
// with its own ability to transfer the permissions to another account.
address private immutable _admin;
/**
* @dev The proxy caller is the current admin, and can't fallback to the proxy target.
*/
error ProxyDeniedAdminAccess();
/**
* @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,
* backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in
* {ERC1967Proxy-constructor}.
*/
constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {
_admin = address(new ProxyAdmin(initialOwner));
// Set the storage value and emit an event for ERC-1967 compatibility
ERC1967Utils.changeAdmin(_proxyAdmin());
}
/**
* @dev Returns the admin of this proxy.
*/
function _proxyAdmin() internal view virtual returns (address) {
return _admin;
}
/**
* @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 == _proxyAdmin()) {
if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {
revert ProxyDeniedAdminAccess();
} else {
_dispatchUpgradeToAndCall();
}
} else {
super._fallback();
}
}
/**
* @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.
*
* Requirements:
*
* - If `data` is empty, `msg.value` must be zero.
*/
function _dispatchUpgradeToAndCall() private {
(address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));
ERC1967Utils.upgradeToAndCall(newImplementation, data);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_logic",
"type": "address",
"internalType": "address"
},
{
"name": "initialOwner",
"type": "address",
"internalType": "address"
},
{
"name": "_data",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "payable"
},
{
"name": "AddressEmptyCode",
"type": "error",
"inputs": [
{
"name": "target",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC1967InvalidAdmin",
"type": "error",
"inputs": [
{
"name": "admin",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC1967InvalidImplementation",
"type": "error",
"inputs": [
{
"name": "implementation",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC1967NonPayable",
"type": "error",
"inputs": []
},
{
"name": "FailedCall",
"type": "error",
"inputs": []
},
{
"name": "ProxyDeniedAdminAccess",
"type": "error",
"inputs": []
},
{
"name": "AdminChanged",
"type": "event",
"inputs": [
{
"name": "previousAdmin",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "newAdmin",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Upgraded",
"type": "event",
"inputs": [
{
"name": "implementation",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"type": "fallback",
"stateMutability": "payable"
}
]0x608060405261000c61000e565b005b610016610102565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036100f757634f1ef28660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146100ea576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100f261012a565b610100565b6100ff610160565b5b565b60007f000000000000000000000000fb68f2855ae095a8baafdb7d57b3209636042554905090565b6000806000366004908092610141939291906104f1565b81019061014e91906106da565b9150915061015c8282610172565b5050565b61017061016b6101e5565b6101f4565b565b61017b8261021a565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a26000815111156101d8576101d282826102e7565b506101e1565b6101e061036b565b5b5050565b60006101ef6103a8565b905090565b3660008037600080366000845af43d6000803e8060008114610215573d6000f35b3d6000fd5b60008173ffffffffffffffffffffffffffffffffffffffff163b0361027657806040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815260040161026d9190610757565b60405180910390fd5b806102a37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6103ff565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000808473ffffffffffffffffffffffffffffffffffffffff168460405161031191906107e3565b600060405180830381855af49150503d806000811461034c576040519150601f19603f3d011682016040523d82523d6000602084013e610351565b606091505b5091509150610361858383610409565b9250505092915050565b60003411156103a6576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60006103d67f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6103ff565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000819050919050565b60608261041e5761041982610498565b610490565b60008251148015610446575060008473ffffffffffffffffffffffffffffffffffffffff163b145b1561048857836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161047f9190610757565b60405180910390fd5b819050610491565b5b9392505050565b6000815111156104ab5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604051905090565b600080fd5b600080fd5b60008085851115610505576105046104e7565b5b83861115610516576105156104ec565b5b6001850283019150848603905094509492505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061056182610536565b9050919050565b61057181610556565b811461057c57600080fd5b50565b60008135905061058e81610568565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6105e78261059e565b810181811067ffffffffffffffff82111715610606576106056105af565b5b80604052505050565b60006106196104dd565b905061062582826105de565b919050565b600067ffffffffffffffff821115610645576106446105af565b5b61064e8261059e565b9050602081019050919050565b82818337600083830152505050565b600061067d6106788461062a565b61060f565b90508281526020810184848401111561069957610698610599565b5b6106a484828561065b565b509392505050565b600082601f8301126106c1576106c0610594565b5b81356106d184826020860161066a565b91505092915050565b600080604083850312156106f1576106f061052c565b5b60006106ff8582860161057f565b925050602083013567ffffffffffffffff8111156107205761071f610531565b5b61072c858286016106ac565b9150509250929050565b600061074182610536565b9050919050565b61075181610736565b82525050565b600060208201905061076c6000830184610748565b92915050565b600081519050919050565b600081905092915050565b60005b838110156107a657808201518184015260208101905061078b565b60008484015250505050565b60006107bd82610772565b6107c7818561077d565b93506107d7818560208601610788565b80840191505092915050565b60006107ef82846107b2565b91508190509291505056fea264697066735822122059e0079aa924d58e6fc55bc0a2cf0e8f28861f1f984c33a99264659a0399941164736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x4216e5…966c3b | 20 days agoSun, 26 Jul 2026 17:00:11 UTC | 0x25b428…dfff | [0] 0x000000000000…d816f589 data: 0x000000000000000000…00000000 |
| 0x4216e5…966c3b | 20 days agoSun, 26 Jul 2026 17:00:11 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…d816f589 [2] 0x000000000000…00000001 |
| 0xfc5555…2bb281 | 24 days agoWed, 22 Jul 2026 23:42:30 UTC | 0xc7f505…81d2 | data: 0x000000000000000000…00000001 |
| 0xfc5555…2bb281 | 24 days agoWed, 22 Jul 2026 23:42:30 UTC | 0x7e644d…798f | data: 0x000000000000000000…36042554 |
| 0xfc5555…2bb281 | 24 days agoWed, 22 Jul 2026 23:42:30 UTC | 0xbc7cd7…2d3b | [0] 0x000000000000…c95e5aa8 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x4216e5…966c3b | mint | 20,033,348 | 20 days agoSun, 26 Jul 2026 17:00:11 UTC | 0x8655…f589 | IN | iteatsiz | $0.190.0001 ETH | 0.00000784 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 20,033,348 | 20 days agoSun, 26 Jul 2026 17:00:11 UTC | 0x4216e5…966c3b | CALL | mint | 0x41bd…107b | OUT | 0xad4c…00fe | 0.0001 ETH |
| 20,033,348 | 20 days agoSun, 26 Jul 2026 17:00:11 UTC | 0x4216e5…966c3b | DELEGATECALL | mint | 0x41bd…107b | OUT | 0x6610…5aa8 | 0.0001 ETH |
| 16,829,116 | 24 days agoWed, 22 Jul 2026 23:42:30 UTC | 0xfc5555…2bb281 | CREATE | create | 0x41bd…107b | OUT | 0xfb68…2554 | 0 ETH |
| 16,829,116 | 24 days agoWed, 22 Jul 2026 23:42:30 UTC | 0xfc5555…2bb281 | CREATE | create | 0x7798…528e | IN | 0x41bd…107b | 0 ETH |