Transaction Hash:
Block:
24546518 at Feb-27-2026 06:37:23 AM +UTC
Transaction Fee:
0.000009371105188068 ETH
$0.02
Gas Used:
229,206 Gas / 0.040885078 Gwei
Emitted Events:
| 894 |
Proxy.0x9669059ff8192bd73967244701af9a0c300a34425358d6300a5e0f8f9724d9a7( 0x9669059ff8192bd73967244701af9a0c300a34425358d6300a5e0f8f9724d9a7, 0x0afa54103e7bad99e43457cfd9a787db6205db326d974f128d4841a803a0866a, 000000000000000000000000000000000000000000000000000000000000a8c0 )
|
| 895 |
0x8e132b3bd37f3f6e223cd23add390111e674c94e.0x9262d1d0a737d718e3befc723ca2b2e75b805f632947f99a2fb0af0e61fdd194( 0x9262d1d0a737d718e3befc723ca2b2e75b805f632947f99a2fb0af0e61fdd194, 00000000000000000000000000000000000000000000000000000000000020c9, 0000000000000000000000000000000000000000000000000000000000000000, 00000000000000000000000000000000000000000012d03c8585ef742f5d7c78, 16b242ccbb8c75cdf246e832c36baa10cbaa319dd3ee1f32d12950d0e57f1603 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x30c78967...19EA05C1D | |||||
|
0x39634336...6fb82Aa49
Miner
| (quasarbuilder) | 9.13005416850627473 Eth | 9.130054168521402326 Eth | 0.000000000015127596 | |
| 0x8E132B3b...1e674C94E | |||||
| 0xfdaD88aE...b8ACaec4a |
2.516780548506617894 Eth
Nonce: 8399
|
2.516771177401429826 Eth
Nonce: 8400
| 0.000009371105188068 |
Execution Trace
0x8e132b3bd37f3f6e223cd23add390111e674c94e.e38cc96e( )
0x9d6def8bb4d67ac2aabcc787767dc0b890f24980.e38cc96e( )0xa80f2401c8ae7d95c7995295dc2c0d651f25fd60.1070de84( )0x8ad2384aaf9525bd7b4d3f73e8cc07421af2046f.1070de84( )-
Null: 0x000...007.1c4a6cf1( ) -
Null: 0x000...006.1a16bcae( ) -
Null: 0x000...007.00000000( ) -
Null: 0x000...005.00000000( ) -
Null: 0x000...005.00000000( ) -
Null: 0x000...006.161b2484( ) -
Null: 0x000...008.038e9adc( )
-
Proxy.bd05743b( )-
0x0e874b9acd8d284b9bf6f6c6cc95bce6f66e5441.bd05743b( )
-
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
/**
* @title Proxy
* @notice Proxy is a transparent proxy that passes through the call if the caller is the owner or
* if the caller is address(0), meaning that the call originated from an off-chain
* simulation.
*/
contract Proxy {
/**
* @notice The storage slot that holds the address of the implementation.
* bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)
*/
bytes32 internal constant IMPLEMENTATION_KEY =
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @notice The storage slot that holds the address of the owner.
* bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)
*/
bytes32 internal constant OWNER_KEY =
0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @notice An event that is emitted each time the implementation is changed. This event is part
* of the EIP-1967 specification.
*
* @param implementation The address of the implementation contract
*/
event Upgraded(address indexed implementation);
/**
* @notice An event that is emitted each time the owner is upgraded. This event is part of the
* EIP-1967 specification.
*
* @param previousAdmin The previous owner of the contract
* @param newAdmin The new owner of the contract
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @notice A modifier that reverts if not called by the owner or by address(0) to allow
* eth_call to interact with this proxy without needing to use low-level storage
* inspection. We assume that nobody is able to trigger calls from address(0) during
* normal EVM execution.
*/
modifier proxyCallIfNotAdmin() {
if (msg.sender == _getAdmin() || msg.sender == address(0)) {
_;
} else {
// This WILL halt the call frame on completion.
_doProxyCall();
}
}
/**
* @notice Sets the initial admin during contract deployment. Admin address is stored at the
* EIP-1967 admin storage slot so that accidental storage collision with the
* implementation is not possible.
*
* @param _admin Address of the initial contract admin. Admin as the ability to access the
* transparent proxy interface.
*/
constructor(address _admin) {
_changeAdmin(_admin);
}
// slither-disable-next-line locked-ether
receive() external payable {
// Proxy call by default.
_doProxyCall();
}
// slither-disable-next-line locked-ether
fallback() external payable {
// Proxy call by default.
_doProxyCall();
}
/**
* @notice Set the implementation contract address. The code at the given address will execute
* when this contract is called.
*
* @param _implementation Address of the implementation contract.
*/
function upgradeTo(address _implementation) public virtual proxyCallIfNotAdmin {
_setImplementation(_implementation);
}
/**
* @notice Set the implementation and call a function in a single transaction. Useful to ensure
* atomic execution of initialization-based upgrades.
*
* @param _implementation Address of the implementation contract.
* @param _data Calldata to delegatecall the new implementation with.
*/
function upgradeToAndCall(address _implementation, bytes calldata _data)
public
payable
virtual
proxyCallIfNotAdmin
returns (bytes memory)
{
_setImplementation(_implementation);
(bool success, bytes memory returndata) = _implementation.delegatecall(_data);
require(success, "Proxy: delegatecall to new implementation contract failed");
return returndata;
}
/**
* @notice Changes the owner of the proxy contract. Only callable by the owner.
*
* @param _admin New owner of the proxy contract.
*/
function changeAdmin(address _admin) public virtual proxyCallIfNotAdmin {
_changeAdmin(_admin);
}
/**
* @notice Gets the owner of the proxy contract.
*
* @return Owner address.
*/
function admin() public virtual proxyCallIfNotAdmin returns (address) {
return _getAdmin();
}
/**
* @notice Queries the implementation address.
*
* @return Implementation address.
*/
function implementation() public virtual proxyCallIfNotAdmin returns (address) {
return _getImplementation();
}
/**
* @notice Sets the implementation address.
*
* @param _implementation New implementation address.
*/
function _setImplementation(address _implementation) internal {
assembly {
sstore(IMPLEMENTATION_KEY, _implementation)
}
emit Upgraded(_implementation);
}
/**
* @notice Changes the owner of the proxy contract.
*
* @param _admin New owner of the proxy contract.
*/
function _changeAdmin(address _admin) internal {
address previous = _getAdmin();
assembly {
sstore(OWNER_KEY, _admin)
}
emit AdminChanged(previous, _admin);
}
/**
* @notice Performs the proxy call via a delegatecall.
*/
function _doProxyCall() internal {
address impl = _getImplementation();
require(impl != address(0), "Proxy: implementation not initialized");
assembly {
// Copy calldata into memory at 0x0....calldatasize.
calldatacopy(0x0, 0x0, calldatasize())
// Perform the delegatecall, make sure to pass all available gas.
let success := delegatecall(gas(), impl, 0x0, calldatasize(), 0x0, 0x0)
// Copy returndata into memory at 0x0....returndatasize. Note that this *will*
// overwrite the calldata that we just copied into memory but that doesn't really
// matter because we'll be returning in a second anyway.
returndatacopy(0x0, 0x0, returndatasize())
// Success == 0 means a revert. We'll revert too and pass the data up.
if iszero(success) {
revert(0x0, returndatasize())
}
// Otherwise we'll just return and pass the data up.
return(0x0, returndatasize())
}
}
/**
* @notice Queries the implementation address.
*
* @return Implementation address.
*/
function _getImplementation() internal view returns (address) {
address impl;
assembly {
impl := sload(IMPLEMENTATION_KEY)
}
return impl;
}
/**
* @notice Queries the owner of the proxy contract.
*
* @return Owner address.
*/
function _getAdmin() internal view returns (address) {
address owner;
assembly {
owner := sload(OWNER_KEY)
}
return owner;
}
}