ETH Price: $2,003.12 (-5.57%)
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer244289092026-02-10 20:59:1148 mins ago1770757151IN
Fee Recipient: 0xcc20...d7b
0.03174036 ETH0.000002780.06787447
Transfer244287812026-02-10 20:33:231 hr ago1770755603IN
Fee Recipient: 0xcc20...d7b
0.03913123 ETH0.00000340.08319688
Transfer244283172026-02-10 18:59:232 hrs ago1770749963IN
Fee Recipient: 0xcc20...d7b
0.05352356 ETH0.000004910.11997398
Transfer244282372026-02-10 18:43:233 hrs ago1770749003IN
Fee Recipient: 0xcc20...d7b
0.00680659 ETH0.000005540.13541018
Transfer244277632026-02-10 17:07:594 hrs ago1770743279IN
Fee Recipient: 0xcc20...d7b
0.02917216 ETH0.000006430.15704948
Transfer244277272026-02-10 17:00:234 hrs ago1770742823IN
Fee Recipient: 0xcc20...d7b
0.01130086 ETH0.000005790.14153697
Transfer244271692026-02-10 15:07:596 hrs ago1770736079IN
Fee Recipient: 0xcc20...d7b
0.03001104 ETH0.000008210.20047831
Transfer244268062026-02-10 13:55:117 hrs ago1770731711IN
Fee Recipient: 0xcc20...d7b
0.01435277 ETH0.000003050.07459107
Transfer244266672026-02-10 13:27:238 hrs ago1770730043IN
Fee Recipient: 0xcc20...d7b
0.00700874 ETH0.000003990.09741009
Transfer244266132026-02-10 13:16:358 hrs ago1770729395IN
Fee Recipient: 0xcc20...d7b
0.01116585 ETH0.000004820.11774308
Transfer244265482026-02-10 13:03:238 hrs ago1770728603IN
Fee Recipient: 0xcc20...d7b
0.00982459 ETH0.000004390.10738732
Transfer244260242026-02-10 11:17:5910 hrs ago1770722279IN
Fee Recipient: 0xcc20...d7b
0.0083668 ETH0.000003320.08125571
Transfer244258832026-02-10 10:49:4710 hrs ago1770720587IN
Fee Recipient: 0xcc20...d7b
0.00805623 ETH0.000002920.07129932
Transfer244250472026-02-10 8:01:3513 hrs ago1770710495IN
Fee Recipient: 0xcc20...d7b
0.00835 ETH0.000002640.06450502
Transfer244248582026-02-10 7:23:4714 hrs ago1770708227IN
Fee Recipient: 0xcc20...d7b
0.01066573 ETH0.000005550.13558147
Transfer244248262026-02-10 7:17:2314 hrs ago1770707843IN
Fee Recipient: 0xcc20...d7b
0.01106703 ETH0.000006380.15588798
Transfer244247672026-02-10 7:05:3514 hrs ago1770707135IN
Fee Recipient: 0xcc20...d7b
0.01421718 ETH0.000008210.20045912
Transfer244247452026-02-10 7:01:1114 hrs ago1770706871IN
Fee Recipient: 0xcc20...d7b
0.03247736 ETH0.000005910.14443455
Transfer244236652026-02-10 3:23:5918 hrs ago1770693839IN
Fee Recipient: 0xcc20...d7b
0.0091125 ETH0.000001890.0462364
Transfer244236252026-02-10 3:15:5918 hrs ago1770693359IN
Fee Recipient: 0xcc20...d7b
0.0060726 ETH0.000001860.04555595
Transfer244236052026-02-10 3:11:5918 hrs ago1770693119IN
Fee Recipient: 0xcc20...d7b
0.00741772 ETH0.000001810.0443153
Transfer244235782026-02-10 3:06:3518 hrs ago1770692795IN
Fee Recipient: 0xcc20...d7b
0.01179189 ETH0.000002020.04948832
Transfer244232432026-02-10 1:59:2319 hrs ago1770688763IN
Fee Recipient: 0xcc20...d7b
0.06267323 ETH0.000001950.04764896
Transfer244231382026-02-10 1:37:2320 hrs ago1770687443IN
Fee Recipient: 0xcc20...d7b
0.00853545 ETH0.000001460.03573241
Transfer244227612026-02-10 0:21:3521 hrs ago1770682895IN
Fee Recipient: 0xcc20...d7b
0.01791848 ETH0.000001820.04453992
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Inject Ether244264172026-02-10 12:36:599 hrs ago1770727019
Fee Recipient: 0xcc20...d7b
0.46127318 ETH
Inject Ether244192382026-02-09 12:34:3533 hrs ago1770640475
Fee Recipient: 0xcc20...d7b
0.78029746 ETH
Inject Ether244120942026-02-08 12:34:112 days ago1770554051
Fee Recipient: 0xcc20...d7b
0.93609584 ETH
Inject Ether244049812026-02-07 12:35:473 days ago1770467747
Fee Recipient: 0xcc20...d7b
1.31340365 ETH
Inject Ether243978212026-02-06 12:35:354 days ago1770381335
Fee Recipient: 0xcc20...d7b
21.08912936 ETH
Inject Ether243906672026-02-05 12:35:475 days ago1770294947
Fee Recipient: 0xcc20...d7b
1.08357873 ETH
Inject Ether243835262026-02-04 12:35:476 days ago1770208547
Fee Recipient: 0xcc20...d7b
1.30208058 ETH
Inject Ether243763572026-02-03 12:34:117 days ago1770122051
Fee Recipient: 0xcc20...d7b
1.76569635 ETH
Inject Ether243692102026-02-02 12:35:478 days ago1770035747
Fee Recipient: 0xcc20...d7b
1.80413025 ETH
Inject Ether243620532026-02-01 12:35:599 days ago1769949359
Fee Recipient: 0xcc20...d7b
1.1805653 ETH
Inject Ether243548942026-01-31 12:35:5910 days ago1769862959
Fee Recipient: 0xcc20...d7b
1.36399262 ETH
Inject Ether243477232026-01-30 12:36:1111 days ago1769776571
Fee Recipient: 0xcc20...d7b
0.97441013 ETH
Inject Ether243405452026-01-29 12:35:4712 days ago1769690147
Fee Recipient: 0xcc20...d7b
0.55741776 ETH
Inject Ether243334462026-01-28 12:50:1113 days ago1769604611
Fee Recipient: 0xcc20...d7b
0.52500935 ETH
Inject Ether243262052026-01-27 12:35:3514 days ago1769517335
Fee Recipient: 0xcc20...d7b
0.77641477 ETH
Inject Ether243190992026-01-26 12:47:2315 days ago1769431643
Fee Recipient: 0xcc20...d7b
0.7197024 ETH
Inject Ether243118642026-01-25 12:35:5916 days ago1769344559
Fee Recipient: 0xcc20...d7b
0.57693006 ETH
Inject Ether243046942026-01-24 12:35:5917 days ago1769258159
Fee Recipient: 0xcc20...d7b
0.35585668 ETH
Inject Ether242975852026-01-23 12:48:1118 days ago1769172491
Fee Recipient: 0xcc20...d7b
0.31848309 ETH
Inject Ether242903572026-01-22 12:35:2319 days ago1769085323
Fee Recipient: 0xcc20...d7b
0.42531453 ETH
Inject Ether242832002026-01-21 12:35:3520 days ago1768998935
Fee Recipient: 0xcc20...d7b
0.69462156 ETH
Inject Ether242760232026-01-20 12:35:2321 days ago1768912523
Fee Recipient: 0xcc20...d7b
0.96538508 ETH
Transfer242755022026-01-20 10:50:5921 days ago1768906259
Fee Recipient: 0xcc20...d7b
0.11275498 ETH
Inject Ether242688592026-01-19 12:36:1122 days ago1768826171
Fee Recipient: 0xcc20...d7b
0.4816937 ETH
Inject Ether242616712026-01-18 12:34:3523 days ago1768739675
Fee Recipient: 0xcc20...d7b
0.39041474 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Produced Blocks

 Latest 25 blocks (From a total of 411 blocks with 18.52 Ether produced)

Block Transaction Difficulty Gas Used Reward
242004532026-01-09 23:36:2331 days ago17680017831400.00 TH19,933,411 (33.25%)
0.002952175027373423 ETH
240337712025-12-17 17:17:4755 days ago17659918671620.00 TH14,262,484 (23.84%)
0.00446213530924447 ETH
239373212025-12-04 3:43:2368 days ago17648198031640.00 TH10,013,702 (16.72%)
0.003038425886091712 ETH
232763012025-09-02 15:25:23161 days ago17568267231530.00 TH11,099,522 (24.67%)
0.003520588693043469 ETH
232691532025-09-01 15:23:11162 days ago17567401911480.00 TH9,894,614 (21.99%)
0.007963782703175195 ETH
229968652025-07-25 14:50:59200 days ago1753455059870.00 TH4,426,569 (9.88%)
0.003397881525012414 ETH
228876892025-07-10 8:48:59215 days ago1752137339930.00 TH5,511,271 (15.37%)
0.004272306231746213 ETH
228713032025-07-08 1:50:59217 days ago17519394591940.00 TH12,011,298 (33.36%)
0.004067316740289306 ETH
228495602025-07-05 0:52:59220 days ago17516767791080.00 TH23,025,592 (63.96%)
0.003320173390566597 ETH
228487742025-07-04 22:14:47220 days ago1751667287900.00 TH4,846,641 (13.46%)
0.003262465797674168 ETH
227027822025-06-14 12:26:23241 days ago17499039831340.00 TH9,602,096 (26.67%)
0.005145315101416774 ETH
226162082025-06-02 9:49:23253 days ago17488577631410.00 TH8,488,719 (23.58%)
0.012158260221117775 ETH
226084092025-06-01 7:37:47254 days ago1748763467720.00 TH5,099,176 (14.16%)
0.003148760366492923 ETH
224896492025-05-15 16:17:35271 days ago1747325855860.00 TH4,832,796 (13.46%)
0.006989006644684758 ETH
224809642025-05-14 10:58:47272 days ago17472203271300.00 TH7,929,753 (22.03%)
0.00674946624948954 ETH
223752452025-04-29 14:14:47287 days ago17459360871860.00 TH10,727,040 (29.83%)
0.008362080880774194 ETH
221467992025-03-28 17:07:35319 days ago17431816551420.00 TH8,745,477 (24.29%)
0.005483209594097607 ETH
221452862025-03-28 12:03:35319 days ago17431634151320.00 TH9,428,831 (26.19%)
0.009765877878680116 ETH
221441872025-03-28 8:21:59319 days ago17431501191180.00 TH8,272,822 (22.98%)
0.003281006607313332 ETH
221440092025-03-28 7:46:11319 days ago17431479711130.00 TH8,674,639 (24.10%)
0.004854037365977743 ETH
221438852025-03-28 7:21:11319 days ago17431464711650.00 TH31,307,852 (87.22%)
0.006624140923621813 ETH
221437572025-03-28 6:55:23319 days ago17431449231670.00 TH18,155,721 (50.43%)
0.009686076938705456 ETH
221436352025-03-28 6:30:47319 days ago1743143447770.00 TH11,638,759 (32.33%)
0.006725626091483568 ETH
221436052025-03-28 6:24:47319 days ago1743143087990.00 TH6,198,354 (17.22%)
0.002273131083209911 ETH
221436042025-03-28 6:24:35319 days ago1743143075630.00 TH6,066,300 (16.85%)
0.001745784618496388 ETH
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x00a0BE1B...93c1e3bB9
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Cub

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-License-Identifier: BUSL-1.1
// SPDX-FileCopyrightText: 2023 Kiln <[email protected]>
//
// ██╗  ██╗██╗██╗     ███╗   ██╗
// ██║ ██╔╝██║██║     ████╗  ██║
// █████╔╝ ██║██║     ██╔██╗ ██║
// ██╔═██╗ ██║██║     ██║╚██╗██║
// ██║  ██╗██║███████╗██║ ╚████║
// ╚═╝  ╚═╝╚═╝╚══════╝╚═╝  ╚═══╝
//
pragma solidity >=0.8.17;

import "openzeppelin-contracts/proxy/beacon/BeaconProxy.sol";
import "./interfaces/IFixer.sol";
import "./interfaces/IHatcher.sol";
import "./interfaces/ICub.sol";

/// @title Cub
/// @author mortimr @ Kiln
/// @dev Unstructured Storage Friendly
/// @notice The cub is controlled by a Hatcher in charge of providing its status details and implementation address.
contract Cub is Proxy, ERC1967Upgrade, ICub {
    /// @notice Initializer to not rely on the constructor.
    /// @param beacon The address of the beacon to pull its info from
    /// @param data The calldata to add to the initial call, if any
    // slither-disable-next-line naming-convention
    function ___initializeCub(address beacon, bytes memory data) external {
        if (_getBeacon() != address(0)) {
            revert CubAlreadyInitialized();
        }
        _upgradeBeaconToAndCall(beacon, data, false);
    }

    /// @dev Internal utility to retrieve the implementation from the beacon.
    /// @return The implementation address
    // slither-disable-next-line dead-code
    function _implementation() internal view virtual override returns (address) {
        return IBeacon(_getBeacon()).implementation();
    }

    /// @dev Prevents unauthorized calls.
    /// @dev This will make the method transparent, forcing unauthorized callers into the fallback.
    modifier onlyBeacon() {
        if (msg.sender != _getBeacon()) {
            _fallback();
        } else {
            _;
        }
    }

    /// @dev Prevents unauthorized calls.
    /// @dev This will make the method transparent, forcing unauthorized callers into the fallback.
    modifier onlyMe() {
        if (msg.sender != address(this)) {
            _fallback();
        } else {
            _;
        }
    }

    /// @inheritdoc ICub
    // slither-disable-next-line reentrancy-events
    function appliedFixes(address[] memory fixers) public onlyMe {
        emit AppliedFixes(fixers);
    }

    /// @inheritdoc ICub
    function applyFix(address fixer) external onlyBeacon {
        _applyFix(fixer);
    }

    /// @dev Retrieve the list of fixes for this cub from the hatcher.
    /// @param beacon Address of the hatcher acting as a beacon
    /// @return List of fixes to apply
    function _fixes(address beacon) internal view returns (address[] memory) {
        return IHatcher(beacon).fixes(address(this));
    }

    /// @dev Retrieve the status for this cub from the hatcher.
    /// @param beacon Address of the hatcher acting as a beacon
    /// @return First value is true if fixes are pending, second value is true if cub is paused
    function _status(address beacon) internal view returns (address, bool, bool) {
        return IHatcher(beacon).status(address(this));
    }

    /// @dev Commits fixes to the hatcher.
    /// @param beacon Address of the hatcher acting as a beacon
    function _commit(address beacon) internal {
        IHatcher(beacon).commitFixes();
    }

    /// @dev Fetches the current cub status and acts accordingly.
    /// @param beacon Address of the hatcher acting as a beacon
    function _fix(address beacon) internal returns (address) {
        (address implementation, bool hasFixes, bool isPaused) = _status(beacon);
        if (isPaused && msg.sender != address(0)) {
            revert CalledWhenPaused(msg.sender);
        }
        if (hasFixes) {
            bool isStaticCall = false;
            address[] memory fixes = _fixes(beacon);
            // This is a trick to check if the current execution context
            // allows state modifications
            try this.appliedFixes(fixes) {}
            catch {
                isStaticCall = true;
            }
            // if we properly emitted AppliedFixes, we are not in a view or pure call
            // we can then apply fixes
            if (!isStaticCall) {
                for (uint256 idx = 0; idx < fixes.length;) {
                    if (fixes[idx] != address(0)) {
                        _applyFix(fixes[idx]);
                    }

                    unchecked {
                        ++idx;
                    }
                }
                _commit(beacon);
            }
        }
        return implementation;
    }

    /// @dev Applies the given fix, and reverts in case of error.
    /// @param fixer Address that implements the fix
    // slither-disable-next-line controlled-delegatecall,delegatecall-loop,low-level-calls
    function _applyFix(address fixer) internal {
        (bool success, bytes memory rdata) = fixer.delegatecall(abi.encodeCall(IFixer.fix, ()));
        if (!success) {
            revert FixDelegateCallError(fixer, rdata);
        }
        (success) = abi.decode(rdata, (bool));
        if (!success) {
            revert FixCallError(fixer);
        }
    }

    /// @dev Fallback method that ends up forwarding calls as delegatecalls to the implementation.
    function _fallback() internal override(Proxy) {
        _beforeFallback();
        address beacon = _getBeacon();
        address implementation = _fix(beacon);
        _delegate(implementation);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol)

pragma solidity ^0.8.0;

import "./IBeacon.sol";
import "../Proxy.sol";
import "../ERC1967/ERC1967Upgrade.sol";

/**
 * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}.
 *
 * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't
 * conflict with the storage layout of the implementation behind the proxy.
 *
 * _Available since v3.4._
 */
contract BeaconProxy is Proxy, ERC1967Upgrade {
    /**
     * @dev Initializes the proxy with `beacon`.
     *
     * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This
     * will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity
     * constructor.
     *
     * Requirements:
     *
     * - `beacon` must be a contract with the interface {IBeacon}.
     */
    constructor(address beacon, bytes memory data) payable {
        _upgradeBeaconToAndCall(beacon, data, false);
    }

    /**
     * @dev Returns the current beacon address.
     */
    function _beacon() internal view virtual returns (address) {
        return _getBeacon();
    }

    /**
     * @dev Returns the current implementation address of the associated beacon.
     */
    function _implementation() internal view virtual override returns (address) {
        return IBeacon(_getBeacon()).implementation();
    }

    /**
     * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.
     *
     * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.
     *
     * Requirements:
     *
     * - `beacon` must be a contract.
     * - The implementation returned by `beacon` must be a contract.
     */
    function _setBeacon(address beacon, bytes memory data) internal virtual {
        _upgradeBeaconToAndCall(beacon, data, false);
    }
}

File 3 of 11 : IFixer.sol
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2023 Kiln <[email protected]>
//
// ██╗  ██╗██╗██╗     ███╗   ██╗
// ██║ ██╔╝██║██║     ████╗  ██║
// █████╔╝ ██║██║     ██╔██╗ ██║
// ██╔═██╗ ██║██║     ██║╚██╗██║
// ██║  ██╗██║███████╗██║ ╚████║
// ╚═╝  ╚═╝╚═╝╚══════╝╚═╝  ╚═══╝
//
pragma solidity >=0.8.17;

/// @title Fixer
/// @author mortimr @ Kiln
/// @dev Unstructured Storage Friendly
/// @notice The Hatcher can deploy, upgrade, fix and pause a set of instances called cubs.
///         All cubs point to the same common implementation.
interface IFixer {
    /// @notice Interface to implement on a Fixer contract.
    /// @return isFixed True if fix was properly applied
    function fix() external returns (bool isFixed);
}

// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2023 Kiln <[email protected]>
//
// ██╗  ██╗██╗██╗     ███╗   ██╗
// ██║ ██╔╝██║██║     ████╗  ██║
// █████╔╝ ██║██║     ██╔██╗ ██║
// ██╔═██╗ ██║██║     ██║╚██╗██║
// ██║  ██╗██║███████╗██║ ╚████║
// ╚═╝  ╚═╝╚═╝╚══════╝╚═╝  ╚═══╝
//
pragma solidity >=0.8.17;

import "openzeppelin-contracts/proxy/beacon/IBeacon.sol";

/// @title Hatcher Interface
/// @author mortimr @ Kiln
/// @dev Unstructured Storage Friendly
/// @notice The Hatcher can deploy, upgrade, fix and pause a set of instances called cubs.
///         All cubs point to the same coomon implementation.
interface IHatcher is IBeacon {
    /// @notice Emitted when the system is globally paused.
    event GlobalPause();

    /// @notice Emitted when the system is globally unpaused.
    event GlobalUnpause();

    /// @notice Emitted when a specific cub is paused.
    /// @param cub Address of the cub being paused
    event Pause(address cub);

    /// @notice Emitted when a specific cub is unpaused.
    /// @param cub Address of the cub being unpaused
    event Unpause(address cub);

    /// @notice Emitted when a global fix is removed.
    /// @param index Index of the global fix being removed
    event DeletedGlobalFix(uint256 index);

    /// @notice Emitted when a cub has properly applied a fix.
    /// @param cub Address of the cub that applied the fix
    /// @param fix Address of the fix was applied
    event AppliedFix(address cub, address fix);

    /// @notice Emitted the common implementation is updated.
    /// @param implementation New common implementation address
    event Upgraded(address indexed implementation);

    /// @notice Emitted a new cub is hatched.
    /// @param cub Address of the new instance
    /// @param cdata Calldata used to perform the atomic first call
    event Hatched(address indexed cub, bytes cdata);

    /// @notice Emitted a the initial progress has been changed.
    /// @param initialProgress New initial progress value
    event SetInitialProgress(uint256 initialProgress);

    /// @notice Emitted a new pauser is set.
    /// @param pauser Address of the new pauser
    event SetPauser(address pauser);

    /// @notice Emitted a cub committed some global fixes.
    /// @param cub Address of the cub that applied the global fixes
    /// @param progress New cub progress
    event CommittedFixes(address cub, uint256 progress);

    /// @notice Emitted a global fix is registered.
    /// @param fix Address of the new global fix
    /// @param index Index of the new global fix in the global fix array
    event RegisteredGlobalFix(address fix, uint256 index);

    /// @notice The provided implementation is not a smart contract.
    /// @param implementation The provided implementation
    error ImplementationNotAContract(address implementation);

    /// @notice Retrieve the common implementation.
    /// @return implementationAddress Address of the common implementation
    function implementation() external view returns (address implementationAddress);

    /// @notice Retrieve cub status details.
    /// @param cub The address of the cub to fetch the status of
    /// @return implementationAddress The current implementation address to use
    /// @return hasFixes True if there are fixes to apply
    /// @return isPaused True if the system is paused globally or the calling cub is paused
    function status(address cub) external view returns (address implementationAddress, bool hasFixes, bool isPaused);

    /// @notice Retrieve the initial progress.
    /// @dev This value is the starting progress value for all new cubs
    /// @return currentInitialProgress The initial progress
    function initialProgress() external view returns (uint256 currentInitialProgress);

    /// @notice Retrieve the current progress of a specific cub.
    /// @param cub Address of the cub
    /// @return currentProgress The current progress of the cub
    function progress(address cub) external view returns (uint256 currentProgress);

    /// @notice Retrieve the global pause status.
    /// @return isGlobalPaused True if globally paused
    function globalPaused() external view returns (bool isGlobalPaused);

    /// @notice Retrieve a cub pause status.
    /// @param cub Address of the cub
    /// @return isPaused True if paused
    function paused(address cub) external view returns (bool isPaused);

    /// @notice Retrieve the address of the pauser.
    function pauser() external view returns (address);

    /// @notice Retrieve a cub's global fixes that need to be applied, taking its progress into account.
    /// @param cub Address of the cub
    /// @return fixesAddresses An array of addresses that implement fixes
    function fixes(address cub) external view returns (address[] memory fixesAddresses);

    /// @notice Retrieve the raw list of global fixes.
    /// @return globalFixesAddresses An array of addresses that implement the global fixes
    function globalFixes() external view returns (address[] memory globalFixesAddresses);

    /// @notice Retrieve the address of the next hatched cub.
    /// @return nextHatchedCub The address of the next cub
    function nextHatch() external view returns (address nextHatchedCub);

    /// @notice Retrieve the freeze status.
    /// @return True if frozen
    function frozen() external view returns (bool);

    /// @notice Retrieve the timestamp when the freeze happens.
    /// @return The freeze timestamp
    function freezeTime() external view returns (uint256);

    /// @notice Creates a new cub.
    /// @param cdata The calldata to use for the initial atomic call
    /// @return cubAddress The address of the new cub
    function hatch(bytes calldata cdata) external returns (address cubAddress);

    /// @notice Creates a new cub, without calldata.
    /// @return cubAddress The address of the new cub
    function hatch() external returns (address cubAddress);

    /// @notice Sets the progress of the caller to the current global fixes array length.
    function commitFixes() external;

    /// @notice Sets the address of the pauser.
    /// @param newPauser Address of the new pauser
    function setPauser(address newPauser) external;

    /// @notice Apply a fix to several cubs.
    /// @param fixer Fixer contract implementing the fix
    /// @param cubs List of cubs to apply the fix on
    function applyFixToCubs(address fixer, address[] calldata cubs) external;

    /// @notice Apply several fixes to one cub.
    /// @param cub The cub to apply the fixes on
    /// @param fixers List of fixer contracts implementing the fixes
    function applyFixesToCub(address cub, address[] calldata fixers) external;

    /// @notice Register a new global fix for cubs to call asynchronously.
    /// @param fixer Address of the fixer implementing the fix
    function registerGlobalFix(address fixer) external;

    /// @notice Deletes a global fix from the array.
    /// @param index Index of the global fix to remove
    function deleteGlobalFix(uint256 index) external;

    /// @notice Upgrades the common implementation address.
    /// @param newImplementation Address of the new common implementation
    function upgradeTo(address newImplementation) external;

    /// @notice Upgrades the common implementation address and the initial progress value.
    /// @param newImplementation Address of the new common implementation
    /// @param initialProgress_ The new initial progress value
    function upgradeToAndChangeInitialProgress(address newImplementation, uint256 initialProgress_) external;

    /// @notice Sets the initial progress value.
    /// @param initialProgress_ The new initial progress value
    function setInitialProgress(uint256 initialProgress_) external;

    /// @notice Sets the progress of a cub.
    /// @param cub Address of the cub
    /// @param newProgress New progress value
    function setCubProgress(address cub, uint256 newProgress) external;

    /// @notice Pauses a set of cubs.
    /// @param cubs List of cubs to pause
    function pauseCubs(address[] calldata cubs) external;

    /// @notice Unpauses a set of cubs.
    /// @param cubs List of cubs to unpause
    function unpauseCubs(address[] calldata cubs) external;

    /// @notice Pauses all the cubs of the system.
    function globalPause() external;

    /// @notice Unpauses all the cubs of the system.
    /// @dev If a cub was specifically paused, this method won't unpause it
    function globalUnpause() external;

    /// @notice Sets the freeze timestamp.
    /// @param freezeTimeout The timeout to add to current timestamp before freeze happens
    function freeze(uint256 freezeTimeout) external;

    /// @notice Cancels the freezing procedure.
    function cancelFreeze() external;
}

// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2023 Kiln <[email protected]>
//
// ██╗  ██╗██╗██╗     ███╗   ██╗
// ██║ ██╔╝██║██║     ████╗  ██║
// █████╔╝ ██║██║     ██╔██╗ ██║
// ██╔═██╗ ██║██║     ██║╚██╗██║
// ██║  ██╗██║███████╗██║ ╚████║
// ╚═╝  ╚═╝╚═╝╚══════╝╚═╝  ╚═══╝
//
pragma solidity >=0.8.17;

/// @title Cub
/// @author mortimr @ Kiln
/// @dev Unstructured Storage Friendly
/// @notice The cub is controlled by a Hatcher in charge of providing its status details and implementation address.
interface ICub {
    /// @notice An error occured when performing the delegatecall to the fix.
    /// @param fixer Address implementing the fix
    /// @param err The return data from the call error
    error FixDelegateCallError(address fixer, bytes err);

    /// @notice The fix method failed by returning false.
    /// @param fixer Added implementing the fix
    error FixCallError(address fixer);

    /// @notice A call was made while the cub was paused.
    /// @param caller The address that performed the call
    error CalledWhenPaused(address caller);

    error CubAlreadyInitialized();

    /// @notice Emitted when several fixes have been applied.
    /// @param fixes List of fixes to apply
    event AppliedFixes(address[] fixes);

    /// @notice Public method that emits the AppliedFixes event.
    /// @dev Transparent to all callers except the cub itself
    /// @dev Only callable by the cub itself as a regular call
    /// @dev This method is used to detect the execution context (view/non-view)
    /// @param _fixers List of applied fixes
    function appliedFixes(address[] memory _fixers) external;

    /// @notice Applies the provided fix.
    /// @dev Transparent to all callers except the hatcher
    /// @param _fixer The address of the contract implementing the fix to apply
    function applyFix(address _fixer) external;
}

// 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.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.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)

pragma solidity ^0.8.2;

import "../beacon/IBeacon.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 {
    // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;

    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /**
     * @dev Emitted when the implementation is upgraded.
     */
    event Upgraded(address indexed implementation);

    /**
     * @dev Returns the current implementation address.
     */
    function _getImplementation() internal view returns (address) {
        return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    }

    /**
     * @dev Stores a new address in the EIP1967 implementation slot.
     */
    function _setImplementation(address newImplementation) private {
        require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
    }

    /**
     * @dev Perform implementation upgrade
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeTo(address newImplementation) internal {
        _setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    /**
     * @dev Perform implementation upgrade with additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {
        _upgradeTo(newImplementation);
        if (data.length > 0 || forceCall) {
            Address.functionDelegateCall(newImplementation, data);
        }
    }

    /**
     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _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 Emitted when the admin account has changed.
     */
    event AdminChanged(address previousAdmin, address newAdmin);

    /**
     * @dev Returns the current admin.
     */
    function _getAdmin() internal view returns (address) {
        return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
    }

    /**
     * @dev Stores a new address in the EIP1967 admin slot.
     */
    function _setAdmin(address newAdmin) private {
        require(newAdmin != address(0), "ERC1967: new admin is the zero address");
        StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
    }

    /**
     * @dev Changes the admin of the proxy.
     *
     * Emits an {AdminChanged} event.
     */
    function _changeAdmin(address newAdmin) internal {
        emit AdminChanged(_getAdmin(), newAdmin);
        _setAdmin(newAdmin);
    }

    /**
     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
     */
    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;

    /**
     * @dev Emitted when the beacon is upgraded.
     */
    event BeaconUpgraded(address indexed beacon);

    /**
     * @dev Returns the current beacon.
     */
    function _getBeacon() internal view returns (address) {
        return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
    }

    /**
     * @dev Stores a new beacon in the EIP1967 beacon slot.
     */
    function _setBeacon(address newBeacon) private {
        require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
        require(
            Address.isContract(IBeacon(newBeacon).implementation()),
            "ERC1967: beacon implementation is not a contract"
        );
        StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
    }

    /**
     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
     *
     * Emits a {BeaconUpgraded} event.
     */
    function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {
        _setBeacon(newBeacon);
        emit BeaconUpgraded(newBeacon);
        if (data.length > 0 || forceCall) {
            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
        }
    }
}

// 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.8.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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return 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.7.0) (utils/StorageSlot.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```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`, and `uint256`._
 */
library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @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
        }
    }
}

Settings
{
  "remappings": [
    "deploy.sol/=lib/deploy.sol/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-gas-snapshot/=lib/forge-gas-snapshot/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "prb-math/=lib/utils.sol/lib/prb-math/contracts/",
    "solmate/=lib/deploy.sol/lib/solmate/src/",
    "utils.sol.test/=lib/utils.sol/test/",
    "utils.sol/=lib/utils.sol/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "vulcan/=lib/vulcan/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"CalledWhenPaused","type":"error"},{"inputs":[],"name":"CubAlreadyInitialized","type":"error"},{"inputs":[{"internalType":"address","name":"fixer","type":"address"}],"name":"FixCallError","type":"error"},{"inputs":[{"internalType":"address","name":"fixer","type":"address"},{"internalType":"bytes","name":"err","type":"bytes"}],"name":"FixDelegateCallError","type":"error"},{"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":false,"internalType":"address[]","name":"fixes","type":"address[]"}],"name":"AppliedFixes","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":"beacon","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"___initializeCub","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"fixers","type":"address[]"}],"name":"appliedFixes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fixer","type":"address"}],"name":"applyFix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

0x608060405234801561001057600080fd5b50610d42806100206000396000f3fe6080604052600436106100385760003560e01c80630fc5bd3b1461004f5780638f3006241461006f578063f5194bcc1461008f57610047565b36610047576100456100af565b005b6100456100af565b34801561005b57600080fd5b5061004561006a3660046108ef565b6100d5565b34801561007b57600080fd5b5061004561008a366004610977565b610109565b34801561009b57600080fd5b506100456100aa366004610a16565b610152565b60006100b961018f565b905060006100c6826101bd565b90506100d1816102f3565b5050565b6100dd61018f565b6001600160a01b0316336001600160a01b031614610100576100fd6100af565b50565b6100fd8161031c565b333014610118576100fd6100af565b7f068f5763814dd924221a093a33c8516e9b05b882bb7e5fa1534d9e454db87402816040516101479190610abe565b60405180910390a150565b600061015c61018f565b6001600160a01b03161461018357604051633bfe06fb60e01b815260040160405180910390fd5b6100d182826000610405565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6000806000806101cc856104c5565b9250925092508080156101de57503315155b156102035760405163beab20b960e01b81523360048201526024015b60405180910390fd5b81156102ea5760008061021587610541565b6040516323cc018960e21b81529091503090638f3006249061023b908490600401610abe565b600060405180830381600087803b15801561025557600080fd5b505af1925050508015610266575060015b61026f57600191505b816102e75760005b81518110156102dd5760006001600160a01b031682828151811061029d5761029d610b0b565b60200260200101516001600160a01b0316146102d5576102d58282815181106102c8576102c8610b0b565b602002602001015161031c565b600101610277565b506102e7876105b6565b50505b50909392505050565b3660008037600080366000845af43d6000803e808015610312573d6000f35b3d6000fd5b505050565b60408051600481526024810182526020810180516001600160e01b03166352a8c3c760e11b179052905160009182916001600160a01b0385169161035f91610b45565b600060405180830381855af49150503d806000811461039a576040519150601f19603f3d011682016040523d82523d6000602084013e61039f565b606091505b5091509150816103c6578281604051636b45476360e01b81526004016101fa929190610b8d565b808060200190518101906103da9190610bc6565b9150816103175760405163f930393360e01b81526001600160a01b03841660048201526024016101fa565b61040e8361060c565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061044f5750805b15610317576104bf836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b99190610be1565b8361078b565b50505050565b60405163645b8b1b60e01b8152306004820152600090819081906001600160a01b0385169063645b8b1b90602401606060405180830381865afa158015610510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105349190610bfe565b9250925092509193909250565b604051630162910360e11b81523060048201526060906001600160a01b038316906302c5220690602401600060405180830381865afa158015610588573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105b09190810190610c43565b92915050565b806001600160a01b03166365413a4d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b5050505050565b6001600160a01b0381163b6106715760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084016101fa565b6106e5816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190610be1565b6001600160a01b03163b151590565b61074a5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101fa565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b60606107b08383604051806060016040528060278152602001610ce6602791396107b7565b9392505050565b6060600080856001600160a01b0316856040516107d49190610b45565b600060405180830381855af49150503d806000811461080f576040519150601f19603f3d011682016040523d82523d6000602084013e610814565b606091505b50915091506108258683838761082f565b9695505050505050565b6060831561089e578251600003610897576001600160a01b0385163b6108975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101fa565b50816108a8565b6108a883836108b0565b949350505050565b8151156108c05781518083602001fd5b8060405162461bcd60e51b81526004016101fa9190610cd2565b6001600160a01b03811681146100fd57600080fd5b60006020828403121561090157600080fd5b81356107b0816108da565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561094b5761094b61090c565b604052919050565b600067ffffffffffffffff82111561096d5761096d61090c565b5060051b60200190565b6000602080838503121561098a57600080fd5b823567ffffffffffffffff8111156109a157600080fd5b8301601f810185136109b257600080fd5b80356109c56109c082610953565b610922565b81815260059190911b820183019083810190878311156109e457600080fd5b928401925b82841015610a0b5783356109fc816108da565b825292840192908401906109e9565b979650505050505050565b60008060408385031215610a2957600080fd5b8235610a34816108da565b915060208381013567ffffffffffffffff80821115610a5257600080fd5b818601915086601f830112610a6657600080fd5b813581811115610a7857610a7861090c565b610a8a601f8201601f19168501610922565b91508082528784828501011115610aa057600080fd5b80848401858401376000848284010152508093505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015610aff5783516001600160a01b031683529284019291840191600101610ada565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60005b83811015610b3c578181015183820152602001610b24565b50506000910152565b60008251610b57818460208701610b21565b9190910192915050565b60008151808452610b79816020860160208601610b21565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906108a890830184610b61565b80518015158114610bc157600080fd5b919050565b600060208284031215610bd857600080fd5b6107b082610bb1565b600060208284031215610bf357600080fd5b81516107b0816108da565b600080600060608486031215610c1357600080fd5b8351610c1e816108da565b9250610c2c60208501610bb1565b9150610c3a60408501610bb1565b90509250925092565b60006020808385031215610c5657600080fd5b825167ffffffffffffffff811115610c6d57600080fd5b8301601f81018513610c7e57600080fd5b8051610c8c6109c082610953565b81815260059190911b82018301908381019087831115610cab57600080fd5b928401925b82841015610a0b578351610cc3816108da565b82529284019290840190610cb0565b6020815260006107b06020830184610b6156fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202dfd1c538b20e58fb6e36306c60db90fc84bfe0acde5b4a2f0ad93bca1b0e36564736f6c63430008110033

Deployed Bytecode

0x6080604052600436106100385760003560e01c80630fc5bd3b1461004f5780638f3006241461006f578063f5194bcc1461008f57610047565b36610047576100456100af565b005b6100456100af565b34801561005b57600080fd5b5061004561006a3660046108ef565b6100d5565b34801561007b57600080fd5b5061004561008a366004610977565b610109565b34801561009b57600080fd5b506100456100aa366004610a16565b610152565b60006100b961018f565b905060006100c6826101bd565b90506100d1816102f3565b5050565b6100dd61018f565b6001600160a01b0316336001600160a01b031614610100576100fd6100af565b50565b6100fd8161031c565b333014610118576100fd6100af565b7f068f5763814dd924221a093a33c8516e9b05b882bb7e5fa1534d9e454db87402816040516101479190610abe565b60405180910390a150565b600061015c61018f565b6001600160a01b03161461018357604051633bfe06fb60e01b815260040160405180910390fd5b6100d182826000610405565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6000806000806101cc856104c5565b9250925092508080156101de57503315155b156102035760405163beab20b960e01b81523360048201526024015b60405180910390fd5b81156102ea5760008061021587610541565b6040516323cc018960e21b81529091503090638f3006249061023b908490600401610abe565b600060405180830381600087803b15801561025557600080fd5b505af1925050508015610266575060015b61026f57600191505b816102e75760005b81518110156102dd5760006001600160a01b031682828151811061029d5761029d610b0b565b60200260200101516001600160a01b0316146102d5576102d58282815181106102c8576102c8610b0b565b602002602001015161031c565b600101610277565b506102e7876105b6565b50505b50909392505050565b3660008037600080366000845af43d6000803e808015610312573d6000f35b3d6000fd5b505050565b60408051600481526024810182526020810180516001600160e01b03166352a8c3c760e11b179052905160009182916001600160a01b0385169161035f91610b45565b600060405180830381855af49150503d806000811461039a576040519150601f19603f3d011682016040523d82523d6000602084013e61039f565b606091505b5091509150816103c6578281604051636b45476360e01b81526004016101fa929190610b8d565b808060200190518101906103da9190610bc6565b9150816103175760405163f930393360e01b81526001600160a01b03841660048201526024016101fa565b61040e8361060c565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061044f5750805b15610317576104bf836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b99190610be1565b8361078b565b50505050565b60405163645b8b1b60e01b8152306004820152600090819081906001600160a01b0385169063645b8b1b90602401606060405180830381865afa158015610510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105349190610bfe565b9250925092509193909250565b604051630162910360e11b81523060048201526060906001600160a01b038316906302c5220690602401600060405180830381865afa158015610588573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105b09190810190610c43565b92915050565b806001600160a01b03166365413a4d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b5050505050565b6001600160a01b0381163b6106715760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084016101fa565b6106e5816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190610be1565b6001600160a01b03163b151590565b61074a5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101fa565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b60606107b08383604051806060016040528060278152602001610ce6602791396107b7565b9392505050565b6060600080856001600160a01b0316856040516107d49190610b45565b600060405180830381855af49150503d806000811461080f576040519150601f19603f3d011682016040523d82523d6000602084013e610814565b606091505b50915091506108258683838761082f565b9695505050505050565b6060831561089e578251600003610897576001600160a01b0385163b6108975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101fa565b50816108a8565b6108a883836108b0565b949350505050565b8151156108c05781518083602001fd5b8060405162461bcd60e51b81526004016101fa9190610cd2565b6001600160a01b03811681146100fd57600080fd5b60006020828403121561090157600080fd5b81356107b0816108da565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561094b5761094b61090c565b604052919050565b600067ffffffffffffffff82111561096d5761096d61090c565b5060051b60200190565b6000602080838503121561098a57600080fd5b823567ffffffffffffffff8111156109a157600080fd5b8301601f810185136109b257600080fd5b80356109c56109c082610953565b610922565b81815260059190911b820183019083810190878311156109e457600080fd5b928401925b82841015610a0b5783356109fc816108da565b825292840192908401906109e9565b979650505050505050565b60008060408385031215610a2957600080fd5b8235610a34816108da565b915060208381013567ffffffffffffffff80821115610a5257600080fd5b818601915086601f830112610a6657600080fd5b813581811115610a7857610a7861090c565b610a8a601f8201601f19168501610922565b91508082528784828501011115610aa057600080fd5b80848401858401376000848284010152508093505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015610aff5783516001600160a01b031683529284019291840191600101610ada565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60005b83811015610b3c578181015183820152602001610b24565b50506000910152565b60008251610b57818460208701610b21565b9190910192915050565b60008151808452610b79816020860160208601610b21565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906108a890830184610b61565b80518015158114610bc157600080fd5b919050565b600060208284031215610bd857600080fd5b6107b082610bb1565b600060208284031215610bf357600080fd5b81516107b0816108da565b600080600060608486031215610c1357600080fd5b8351610c1e816108da565b9250610c2c60208501610bb1565b9150610c3a60408501610bb1565b90509250925092565b60006020808385031215610c5657600080fd5b825167ffffffffffffffff811115610c6d57600080fd5b8301601f81018513610c7e57600080fd5b8051610c8c6109c082610953565b81815260059190911b82018301908381019087831115610cab57600080fd5b928401925b82841015610a0b578351610cc3816108da565b82529284019290840190610cb0565b6020815260006107b06020830184610b6156fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202dfd1c538b20e58fb6e36306c60db90fc84bfe0acde5b4a2f0ad93bca1b0e36564736f6c63430008110033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.