ETH Price: $2,980.96 (+0.25%)
Gas: 0.03 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Append Chunk Dat...240679812025-12-22 11:54:239 days ago1766404463IN
0xB9c4a850...49F9A8f2a
0 ETH0.00011330.03471703
Append Chunk Dat...240679802025-12-22 11:54:119 days ago1766404451IN
0xB9c4a850...49F9A8f2a
0 ETH0.000180150.0341153
Append Chunk Dat...240679792025-12-22 11:53:599 days ago1766404439IN
0xB9c4a850...49F9A8f2a
0 ETH0.000187320.03547242
Append Chunk Dat...240679782025-12-22 11:53:479 days ago1766404427IN
0xB9c4a850...49F9A8f2a
0 ETH0.000184680.03497407
Append Chunk Dat...240679772025-12-22 11:53:359 days ago1766404415IN
0xB9c4a850...49F9A8f2a
0 ETH0.000190220.03602671
Append Chunk Dat...240679762025-12-22 11:53:239 days ago1766404403IN
0xB9c4a850...49F9A8f2a
0 ETH0.000190540.03608645
Append Chunk Dat...240679752025-12-22 11:53:119 days ago1766404391IN
0xB9c4a850...49F9A8f2a
0 ETH0.000181250.03432598
Append Chunk Dat...240679742025-12-22 11:52:599 days ago1766404379IN
0xB9c4a850...49F9A8f2a
0 ETH0.000179040.03390781
Append Chunk Dat...240679732025-12-22 11:52:479 days ago1766404367IN
0xB9c4a850...49F9A8f2a
0 ETH0.000171680.03253143
Append Chunk Dat...240679712025-12-22 11:52:239 days ago1766404343IN
0xB9c4a850...49F9A8f2a
0 ETH0.000189040.03585071
Append Chunk Dat...240679702025-12-22 11:52:119 days ago1766404331IN
0xB9c4a850...49F9A8f2a
0 ETH0.00018460.03495699
Append Chunk Dat...240679692025-12-22 11:51:599 days ago1766404319IN
0xB9c4a850...49F9A8f2a
0 ETH0.000185060.03504452
Append Chunk Dat...240679682025-12-22 11:51:479 days ago1766404307IN
0xB9c4a850...49F9A8f2a
0 ETH0.00018130.03433471
Append Chunk Dat...240679672025-12-22 11:51:359 days ago1766404295IN
0xB9c4a850...49F9A8f2a
0 ETH0.000177020.03352732
Append Chunk Dat...240679662025-12-22 11:51:239 days ago1766404283IN
0xB9c4a850...49F9A8f2a
0 ETH0.000178880.03387828
Append Chunk Dat...240679652025-12-22 11:51:119 days ago1766404271IN
0xB9c4a850...49F9A8f2a
0 ETH0.00017810.03372891
Append Chunk Dat...240679642025-12-22 11:50:599 days ago1766404259IN
0xB9c4a850...49F9A8f2a
0 ETH0.000169440.03208836
Create File240679632025-12-22 11:50:479 days ago1766404247IN
0xB9c4a850...49F9A8f2a
0 ETH0.00017160.03242901
Append Chunk Dat...240679622025-12-22 11:50:359 days ago1766404235IN
0xB9c4a850...49F9A8f2a
0 ETH0.00007240.03102378
Append Chunk Dat...240679612025-12-22 11:50:239 days ago1766404223IN
0xB9c4a850...49F9A8f2a
0 ETH0.000172180.03260505
Append Chunk Dat...240679602025-12-22 11:50:119 days ago1766404211IN
0xB9c4a850...49F9A8f2a
0 ETH0.000162280.03073267
Append Chunk Dat...240679592025-12-22 11:49:599 days ago1766404199IN
0xB9c4a850...49F9A8f2a
0 ETH0.000157580.02984057
Append Chunk Dat...240679582025-12-22 11:49:479 days ago1766404187IN
0xB9c4a850...49F9A8f2a
0 ETH0.000159830.03032811
Append Chunk Dat...240679572025-12-22 11:49:359 days ago1766404175IN
0xB9c4a850...49F9A8f2a
0 ETH0.000144640.02739108
Append Chunk Dat...240679482025-12-22 11:47:479 days ago1766404067IN
0xB9c4a850...49F9A8f2a
0 ETH0.000151760.02874051
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x61395a80240679812025-12-22 11:54:239 days ago1766404463
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679802025-12-22 11:54:119 days ago1766404451
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679792025-12-22 11:53:599 days ago1766404439
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679782025-12-22 11:53:479 days ago1766404427
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679772025-12-22 11:53:359 days ago1766404415
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679762025-12-22 11:53:239 days ago1766404403
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679752025-12-22 11:53:119 days ago1766404391
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679742025-12-22 11:52:599 days ago1766404379
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679732025-12-22 11:52:479 days ago1766404367
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679712025-12-22 11:52:239 days ago1766404343
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679702025-12-22 11:52:119 days ago1766404331
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679692025-12-22 11:51:599 days ago1766404319
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679682025-12-22 11:51:479 days ago1766404307
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679672025-12-22 11:51:359 days ago1766404295
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679662025-12-22 11:51:239 days ago1766404283
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679652025-12-22 11:51:119 days ago1766404271
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679642025-12-22 11:50:599 days ago1766404259
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679632025-12-22 11:50:479 days ago1766404247
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x61289280240679622025-12-22 11:50:359 days ago1766404235
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679612025-12-22 11:50:239 days ago1766404223
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679602025-12-22 11:50:119 days ago1766404211
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679592025-12-22 11:49:599 days ago1766404199
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679582025-12-22 11:49:479 days ago1766404187
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679572025-12-22 11:49:359 days ago1766404175
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
0x615dc180240679482025-12-22 11:47:479 days ago1766404067
0xB9c4a850...49F9A8f2a
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
BeaconStorage

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 200 runs

Other Settings:
prague EvmVersion
File 1 of 5 : BeaconStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {EthDrive} from "./EthDrive.sol";

/// @title BeaconStorage
/// @author nahiko
/// @notice Standalone file storage contract for Beacon assets
contract BeaconStorage is Ownable, EthDrive {
    constructor() Ownable(msg.sender) {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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
pragma solidity ^0.8.27;

import "@openzeppelin/contracts/access/Ownable.sol";
import "./SSTORE2.sol";

/// @author nahiko
abstract contract EthDrive is Ownable {
    mapping(string => address[]) public fileChunks;

    uint256 public constant MAX_CHUNKS = 100;

    constructor() {}

    // =============================================================
    //                      FILE MANAGEMENT
    // =============================================================

    function createFile(string memory fileName, bytes[] calldata chunks) public onlyOwner {
        require(fileChunks[fileName].length == 0, "File already exists");
        require(chunks.length > 0 && chunks.length <= MAX_CHUNKS, "Invalid chunk count");

        for (uint256 i = 0; i < chunks.length; i++) {
            require(chunks[i].length > 0, "Empty chunk");
            address pointer = SSTORE2.write(chunks[i]);
            fileChunks[fileName].push(pointer);
        }
    }

    /// @notice Create multiple files in a single transaction (gas-efficient batching)
    /// @param fileNames Array of file names to create
    /// @param allChunks Array of chunk arrays, one per file
    function createFiles(string[] calldata fileNames, bytes[][] calldata allChunks) public onlyOwner {
        require(fileNames.length == allChunks.length, "Array length mismatch");

        for (uint256 f = 0; f < fileNames.length; f++) {
            string calldata fileName = fileNames[f];
            bytes[] calldata chunks = allChunks[f];

            require(fileChunks[fileName].length == 0, "File already exists");
            require(chunks.length > 0 && chunks.length <= MAX_CHUNKS, "Invalid chunk count");

            for (uint256 i = 0; i < chunks.length; i++) {
                require(chunks[i].length > 0, "Empty chunk");
                address pointer = SSTORE2.write(chunks[i]);
                fileChunks[fileName].push(pointer);
            }
        }
    }

    /// @notice Delete multiple files in a single transaction
    /// @param fileNames Array of file names to delete
    function deleteFiles(string[] calldata fileNames) public onlyOwner {
        for (uint256 i = 0; i < fileNames.length; i++) {
            if (fileChunks[fileNames[i]].length > 0) {
                delete fileChunks[fileNames[i]];
            }
        }
    }

    function renameFile(string memory oldName, string memory newName) public onlyOwner {
        require(fileChunks[oldName].length > 0, "File not found");
        require(fileChunks[newName].length == 0, "New name already exists");

        fileChunks[newName] = fileChunks[oldName];
        delete fileChunks[oldName];
    }

    function deleteFile(string memory fileName) public onlyOwner {
        require(fileChunks[fileName].length > 0, "File not found");
        delete fileChunks[fileName];
    }

    function getFile(string memory fileName) public view returns (bytes memory) {
        address[] memory chunks = fileChunks[fileName];

        // Return empty bytes if file doesn't exist (instead of reverting)
        if (chunks.length == 0) {
            return "";
        }

        bytes memory totalFile;

        for (uint256 i = 0; i < chunks.length; i++) {
            if (chunks[i] != address(0)) {
                totalFile = bytes.concat(totalFile, SSTORE2.read(chunks[i]));
            }
        }
        return totalFile;
    }

    // =============================================================
    //                   CHUNK DATA MANAGEMENT
    //           (Handles raw bytes -> SSTORE2 -> Pointer)
    // =============================================================

    function appendChunkData(string memory fileName, bytes[] calldata chunks) public onlyOwner {
        require(fileChunks[fileName].length > 0, "File not found");
        require(fileChunks[fileName].length + chunks.length <= MAX_CHUNKS, "Max chunks exceeded");

        for (uint256 i = 0; i < chunks.length; i++) {
            require(chunks[i].length > 0, "Empty chunk");
            address pointer = SSTORE2.write(chunks[i]);
            fileChunks[fileName].push(pointer);
        }
    }

    function updateChunkData(string memory fileName, uint256 chunkIndex, bytes calldata newChunkData)
        public
        onlyOwner
    {
        require(fileChunks[fileName].length > 0, "File not found");
        require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");
        require(newChunkData.length > 0, "Empty chunk");

        address newPointer = SSTORE2.write(newChunkData);
        fileChunks[fileName][chunkIndex] = newPointer;
    }

    function getChunkData(string memory fileName, uint256 chunkIndex) public view returns (bytes memory) {
        require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");
        address chunkPointer = fileChunks[fileName][chunkIndex];
        require(chunkPointer != address(0), "Chunk deleted");
        return SSTORE2.read(chunkPointer);
    }

    // =============================================================
    //                 CHUNK POINTER MANAGEMENT
    //            (Handles direct address references)
    // =============================================================

    function appendChunkPointer(string memory fileName, address pointer) public onlyOwner {
        require(fileChunks[fileName].length > 0, "File not found");
        require(fileChunks[fileName].length + 1 <= MAX_CHUNKS, "Max chunks exceeded");
        require(pointer != address(0), "Invalid pointer");

        fileChunks[fileName].push(pointer);
    }

    function updateChunkPointer(string memory fileName, uint256 chunkIndex, address newPointer) public onlyOwner {
        require(fileChunks[fileName].length > 0, "File not found");
        require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");
        require(newPointer != address(0), "Invalid pointer");

        fileChunks[fileName][chunkIndex] = newPointer;
    }

    function deleteChunkPointer(string memory fileName, uint256 chunkIndex) public onlyOwner {
        require(fileChunks[fileName].length > 0, "File not found");
        require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");

        delete fileChunks[fileName][chunkIndex];
    }

    function getChunkPointer(string memory fileName, uint256 chunkIndex) public view returns (address) {
        require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");
        return fileChunks[fileName][chunkIndex];
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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
pragma solidity ^0.8.4;

/// @notice Read and write to persistent storage at a fraction of the cost.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SSTORE2.sol)
/// @author Saw-mon-and-Natalie (https://github.com/Saw-mon-and-Natalie)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SSTORE2.sol)
/// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol)
/// @author Modified from SSTORE3 (https://github.com/Philogy/sstore3)
library SSTORE2 {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The proxy initialization code.
    uint256 private constant _CREATE3_PROXY_INITCODE = 0x67363d3d37363d34f03d5260086018f3;

    /// @dev Hash of the `_CREATE3_PROXY_INITCODE`.
    /// Equivalent to `keccak256(abi.encodePacked(hex"67363d3d37363d34f03d5260086018f3"))`.
    bytes32 internal constant CREATE3_PROXY_INITCODE_HASH =
        0x21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                        CUSTOM ERRORS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Unable to deploy the storage contract.
    error DeploymentFailed();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         WRITE LOGIC                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Writes `data` into the bytecode of a storage contract and returns its address.
    function write(bytes memory data) internal returns (address pointer) {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data) // Let `l` be `n + 1`. +1 as we prefix a STOP opcode.
            /**
             * ---------------------------------------------------+
             * Opcode | Mnemonic       | Stack     | Memory       |
             * ---------------------------------------------------|
             * 61 l   | PUSH2 l        | l         |              |
             * 80     | DUP1           | l l       |              |
             * 60 0xa | PUSH1 0xa      | 0xa l l   |              |
             * 3D     | RETURNDATASIZE | 0 0xa l l |              |
             * 39     | CODECOPY       | l         | [0..l): code |
             * 3D     | RETURNDATASIZE | 0 l       | [0..l): code |
             * F3     | RETURN         |           | [0..l): code |
             * 00     | STOP           |           |              |
             * ---------------------------------------------------+
             * @dev Prefix the bytecode with a STOP opcode to ensure it cannot be called.
             * Also PUSH2 is used since max contract size cap is 24,576 bytes which is less than 2 ** 16.
             */
            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
            // Deploy a new contract with the generated creation code.
            pointer := create(0, add(data, 0x15), add(n, 0xb))
            if iszero(pointer) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /// @dev Writes `data` into the bytecode of a storage contract with `salt`
    /// and returns its normal CREATE2 deterministic address.
    function writeCounterfactual(bytes memory data, bytes32 salt)
        internal
        returns (address pointer)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data)
            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
            // Deploy a new contract with the generated creation code.
            pointer := create2(0, add(data, 0x15), add(n, 0xb), salt)
            if iszero(pointer) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /// @dev Writes `data` into the bytecode of a storage contract and returns its address.
    /// This uses the so-called "CREATE3" workflow,
    /// which means that `pointer` is agnostic to `data, and only depends on `salt`.
    function writeDeterministic(bytes memory data, bytes32 salt)
        internal
        returns (address pointer)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data)
            mstore(0x00, _CREATE3_PROXY_INITCODE) // Store the `_PROXY_INITCODE`.
            let proxy := create2(0, 0x10, 0x10, salt)
            if iszero(proxy) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x14, proxy) // Store the proxy's address.
            // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01).
            // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex).
            mstore(0x00, 0xd694)
            mstore8(0x34, 0x01) // Nonce of the proxy contract (1).
            pointer := keccak256(0x1e, 0x17)

            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
            if iszero(
                mul( // The arguments of `mul` are evaluated last to first.
                    extcodesize(pointer),
                    call(gas(), proxy, 0, add(data, 0x15), add(n, 0xb), codesize(), 0x00)
                )
            ) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                    ADDRESS CALCULATIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the initialization code hash of the storage contract for `data`.
    /// Used for mining vanity addresses with create2crunch.
    function initCodeHash(bytes memory data) internal pure returns (bytes32 hash) {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data)
            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            returndatacopy(returndatasize(), returndatasize(), gt(n, 0xfffe))
            mstore(data, add(0x61000180600a3d393df300, shl(0x40, n)))
            hash := keccak256(add(data, 0x15), add(n, 0xb))
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /// @dev Equivalent to `predictCounterfactualAddress(data, salt, address(this))`
    function predictCounterfactualAddress(bytes memory data, bytes32 salt)
        internal
        view
        returns (address pointer)
    {
        pointer = predictCounterfactualAddress(data, salt, address(this));
    }

    /// @dev Returns the CREATE2 address of the storage contract for `data`
    /// deployed with `salt` by `deployer`.
    /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.
    function predictCounterfactualAddress(bytes memory data, bytes32 salt, address deployer)
        internal
        pure
        returns (address predicted)
    {
        bytes32 hash = initCodeHash(data);
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and store the bytecode hash.
            mstore8(0x00, 0xff) // Write the prefix.
            mstore(0x35, hash)
            mstore(0x01, shl(96, deployer))
            mstore(0x15, salt)
            predicted := keccak256(0x00, 0x55)
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x35, 0)
        }
    }

    /// @dev Equivalent to `predictDeterministicAddress(salt, address(this))`.
    function predictDeterministicAddress(bytes32 salt) internal view returns (address pointer) {
        pointer = predictDeterministicAddress(salt, address(this));
    }

    /// @dev Returns the "CREATE3" deterministic address for `salt` with `deployer`.
    function predictDeterministicAddress(bytes32 salt, address deployer)
        internal
        pure
        returns (address pointer)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x00, deployer) // Store `deployer`.
            mstore8(0x0b, 0xff) // Store the prefix.
            mstore(0x20, salt) // Store the salt.
            mstore(0x40, CREATE3_PROXY_INITCODE_HASH) // Store the bytecode hash.

            mstore(0x14, keccak256(0x0b, 0x55)) // Store the proxy's address.
            mstore(0x40, m) // Restore the free memory pointer.
            // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01).
            // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex).
            mstore(0x00, 0xd694)
            mstore8(0x34, 0x01) // Nonce of the proxy contract (1).
            pointer := keccak256(0x1e, 0x17)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         READ LOGIC                         */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Equivalent to `read(pointer, 0, 2 ** 256 - 1)`.
    function read(address pointer) internal view returns (bytes memory data) {
        /// @solidity memory-safe-assembly
        assembly {
            data := mload(0x40)
            let n := and(0xffffffffff, sub(extcodesize(pointer), 0x01))
            extcodecopy(pointer, add(data, 0x1f), 0x00, add(n, 0x21))
            mstore(data, n) // Store the length.
            mstore(0x40, add(n, add(data, 0x40))) // Allocate memory.
        }
    }

    /// @dev Equivalent to `read(pointer, start, 2 ** 256 - 1)`.
    function read(address pointer, uint256 start) internal view returns (bytes memory data) {
        /// @solidity memory-safe-assembly
        assembly {
            data := mload(0x40)
            let n := and(0xffffffffff, sub(extcodesize(pointer), 0x01))
            let l := sub(n, and(0xffffff, mul(lt(start, n), start)))
            extcodecopy(pointer, add(data, 0x1f), start, add(l, 0x21))
            mstore(data, mul(sub(n, start), lt(start, n))) // Store the length.
            mstore(0x40, add(data, add(0x40, mload(data)))) // Allocate memory.
        }
    }

    /// @dev Returns a slice of the data on `pointer` from `start` to `end`.
    /// `start` and `end` will be clamped to the range `[0, args.length]`.
    /// The `pointer` MUST be deployed via the SSTORE2 write functions.
    /// Otherwise, the behavior is undefined.
    /// Out-of-gas reverts if `pointer` does not have any code.
    function read(address pointer, uint256 start, uint256 end)
        internal
        view
        returns (bytes memory data)
    {
        /// @solidity memory-safe-assembly
        assembly {
            data := mload(0x40)
            if iszero(lt(end, 0xffff)) { end := 0xffff }
            let d := mul(sub(end, start), lt(start, end))
            extcodecopy(pointer, add(data, 0x1f), start, add(d, 0x01))
            if iszero(and(0xff, mload(add(data, d)))) {
                let n := sub(extcodesize(pointer), 0x01)
                returndatacopy(returndatasize(), returndatasize(), shr(40, n))
                d := mul(gt(n, start), sub(d, mul(gt(end, n), sub(end, n))))
            }
            mstore(data, d) // Store the length.
            mstore(add(add(data, 0x20), d), 0) // Zeroize the slot after the bytes.
            mstore(0x40, add(add(data, 0x40), d)) // Allocate memory.
        }
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "solady/=lib/solady/src/",
    "forge-std/=lib/forge-std/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "prague",
  "viaIR": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MAX_CHUNKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"bytes[]","name":"chunks","type":"bytes[]"}],"name":"appendChunkData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"address","name":"pointer","type":"address"}],"name":"appendChunkPointer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"bytes[]","name":"chunks","type":"bytes[]"}],"name":"createFile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"fileNames","type":"string[]"},{"internalType":"bytes[][]","name":"allChunks","type":"bytes[][]"}],"name":"createFiles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"}],"name":"deleteChunkPointer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"}],"name":"deleteFile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"fileNames","type":"string[]"}],"name":"deleteFiles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fileChunks","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"}],"name":"getChunkData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"}],"name":"getChunkPointer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"}],"name":"getFile","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"oldName","type":"string"},{"internalType":"string","name":"newName","type":"string"}],"name":"renameFile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"},{"internalType":"bytes","name":"newChunkData","type":"bytes"}],"name":"updateChunkData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"},{"internalType":"address","name":"newPointer","type":"address"}],"name":"updateChunkPointer","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052348015600e575f5ffd5b503380603357604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b603a81603f565b50608e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61199d8061009b5f395ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c806388a6d29b1161009e578063ae1bbacb1161006e578063ae1bbacb14610231578063bf66dfc014610244578063e0876aa814610257578063f2fde38b1461026a578063f56b78b81461027d575f5ffd5b806388a6d29b146101e85780638da5cb5b146101fb5780638f4ddb411461020b578063a99100541461021e575f5ffd5b80635d3c4290116100e45780635d3c4290146101795780635ed253461461018c5780636ba6b6fb146101a2578063715018a6146101b557806377595926146101bd575f5ffd5b806303c7f8e71461011557806313d4a0441461013e5780632f5156b81461015357806353b274d814610166575b5f5ffd5b61012861012336600461140b565b610290565b604051610135919061144c565b60405180910390f35b61015161014c366004611481565b61036f565b005b61015161016136600461152b565b610499565b6101516101743660046115b0565b61071f565b610151610187366004611602565b61084b565b610194606481565b604051908152602001610135565b6101516101b0366004611640565b610902565b610151610a46565b6101d06101cb36600461140b565b610a59565b6040516001600160a01b039091168152602001610135565b6101516101f63660046116da565b610ae2565b5f546001600160a01b03166101d0565b610151610219366004611741565b610c62565b61015161022c36600461178b565b610db2565b61015161023f36600461140b565b610e24565b6101d061025236600461140b565b610ef3565b61012861026536600461178b565b610f38565b6101516102783660046117bc565b61105e565b61015161028b3660046116da565b611098565b60606001836040516102a291906117f3565b9081526040519081900360200190205482106102d95760405162461bcd60e51b81526004016102d0906117fe565b60405180910390fd5b5f6001846040516102ea91906117f3565b9081526020016040518091039020838154811061030957610309611835565b5f918252602090912001546001600160a01b031690508061035c5760405162461bcd60e51b815260206004820152600d60248201526c10da1d5b9ac819195b195d1959609a1b60448201526064016102d0565b6103658161120f565b9150505b92915050565b61037761123b565b5f60018360405161038891906117f3565b90815260405190819003602001902054116103b55760405162461bcd60e51b81526004016102d090611849565b6001816040516103c591906117f3565b90815260405190819003602001902054156104225760405162461bcd60e51b815260206004820152601760248201527f4e6577206e616d6520616c72656164792065786973747300000000000000000060448201526064016102d0565b60018260405161043291906117f3565b908152602001604051809103902060018260405161045091906117f3565b908152604051908190036020019020815461046b92906112f7565b5060018260405161047c91906117f3565b90815260200160405180910390205f6104959190611343565b5050565b6104a161123b565b8281146104e85760405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b60448201526064016102d0565b5f5b8381101561071857365f86868481811061050657610506611835565b90506020028101906105189190611871565b91509150365f86868681811061053057610530611835565b905060200281019061054291906118b3565b91509150600184846040516105589291906118f8565b90815260405190819003602001902054156105ab5760405162461bcd60e51b815260206004820152601360248201527246696c6520616c72656164792065786973747360681b60448201526064016102d0565b80158015906105bb575060648111155b6105fd5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a590818da1d5b9ac818dbdd5b9d606a1b60448201526064016102d0565b5f5b81811015610707575f83838381811061061a5761061a611835565b905060200281019061062c9190611871565b90501161064b5760405162461bcd60e51b81526004016102d090611907565b5f6106ac84848481811061066157610661611835565b90506020028101906106739190611871565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061126792505050565b9050600186866040516106c09291906118f8565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b039390931692909217909155016105ff565b5050600190930192506104ea915050565b5050505050565b61072761123b565b5f60018460405161073891906117f3565b90815260405190819003602001902054116107655760405162461bcd60e51b81526004016102d090611849565b60018360405161077591906117f3565b9081526040519081900360200190205482106107a35760405162461bcd60e51b81526004016102d0906117fe565b6001600160a01b0381166107eb5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103837b4b73a32b960891b60448201526064016102d0565b806001846040516107fc91906117f3565b9081526020016040518091039020838154811061081b5761081b611835565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b61085361123b565b5f5b818110156108fd575f600184848481811061087257610872611835565b90506020028101906108849190611871565b6040516108929291906118f8565b9081526040519081900360200190205411156108f55760018383838181106108bc576108bc611835565b90506020028101906108ce9190611871565b6040516108dc9291906118f8565b90815260200160405180910390205f6108f59190611343565b600101610855565b505050565b61090a61123b565b5f60018560405161091b91906117f3565b90815260405190819003602001902054116109485760405162461bcd60e51b81526004016102d090611849565b60018460405161095891906117f3565b9081526040519081900360200190205483106109865760405162461bcd60e51b81526004016102d0906117fe565b806109a35760405162461bcd60e51b81526004016102d090611907565b5f6109e283838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061126792505050565b9050806001866040516109f591906117f3565b90815260200160405180910390208581548110610a1457610a14611835565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050565b610a4e61123b565b610a575f6112a8565b565b5f600183604051610a6a91906117f3565b908152604051908190036020019020548210610a985760405162461bcd60e51b81526004016102d0906117fe565b600183604051610aa891906117f3565b90815260200160405180910390208281548110610ac757610ac7611835565b5f918252602090912001546001600160a01b03169392505050565b610aea61123b565b600183604051610afa91906117f3565b9081526040519081900360200190205415610b4d5760405162461bcd60e51b815260206004820152601360248201527246696c6520616c72656164792065786973747360681b60448201526064016102d0565b8015801590610b5d575060648111155b610b9f5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a590818da1d5b9ac818dbdd5b9d606a1b60448201526064016102d0565b5f5b81811015610c5c575f838383818110610bbc57610bbc611835565b9050602002810190610bce9190611871565b905011610bed5760405162461bcd60e51b81526004016102d090611907565b5f610c0384848481811061066157610661611835565b9050600185604051610c1591906117f3565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b03939093169290921790915501610ba1565b50505050565b610c6a61123b565b5f600183604051610c7b91906117f3565b9081526040519081900360200190205411610ca85760405162461bcd60e51b81526004016102d090611849565b6064600183604051610cba91906117f3565b90815260405190819003602001902054610cd590600161192c565b1115610d195760405162461bcd60e51b815260206004820152601360248201527213585e0818da1d5b9adcc8195e18d959591959606a1b60448201526064016102d0565b6001600160a01b038116610d615760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103837b4b73a32b960891b60448201526064016102d0565b600182604051610d7191906117f3565b9081526040516020918190038201902080546001810182555f9182529190200180546001600160a01b0319166001600160a01b039290921691909117905550565b610dba61123b565b5f600182604051610dcb91906117f3565b9081526040519081900360200190205411610df85760405162461bcd60e51b81526004016102d090611849565b600181604051610e0891906117f3565b90815260200160405180910390205f610e219190611343565b50565b610e2c61123b565b5f600183604051610e3d91906117f3565b9081526040519081900360200190205411610e6a5760405162461bcd60e51b81526004016102d090611849565b600182604051610e7a91906117f3565b908152604051908190036020019020548110610ea85760405162461bcd60e51b81526004016102d0906117fe565b600182604051610eb891906117f3565b90815260200160405180910390208181548110610ed757610ed7611835565b5f91825260209091200180546001600160a01b03191690555050565b81516020818401810180516001825292820191850191909120919052805482908110610f1d575f80fd5b5f918252602090912001546001600160a01b03169150829050565b60605f600183604051610f4b91906117f3565b9081526040805191829003602090810183208054808302850183019093528284529190830182828015610fa557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f87575b5050505050905080515f03610fc957505060408051602081019091525f8152919050565b60605f5b8251811015611056575f6001600160a01b0316838281518110610ff257610ff2611835565b60200260200101516001600160a01b03161461104e578161102b84838151811061101e5761101e611835565b602002602001015161120f565b60405160200161103c92919061194b565b60405160208183030381529060405291505b600101610fcd565b509392505050565b61106661123b565b6001600160a01b03811661108f57604051631e4fbdf760e01b81525f60048201526024016102d0565b610e21816112a8565b6110a061123b565b5f6001846040516110b191906117f3565b90815260405190819003602001902054116110de5760405162461bcd60e51b81526004016102d090611849565b6064828290506001856040516110f491906117f3565b9081526040519081900360200190205461110e919061192c565b11156111525760405162461bcd60e51b815260206004820152601360248201527213585e0818da1d5b9adcc8195e18d959591959606a1b60448201526064016102d0565b5f5b81811015610c5c575f83838381811061116f5761116f611835565b90506020028101906111819190611871565b9050116111a05760405162461bcd60e51b81526004016102d090611907565b5f6111b684848481811061066157610661611835565b90506001856040516111c891906117f3565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b03939093169290921790915501611154565b60405164ffffffffff5f19833b0116602181015f601f8401853c80825260408201810160405250919050565b5f546001600160a01b03163314610a575760405163118cdaa760e01b81523360048201526024016102d0565b5f81518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584015ff09150816112a25763301164255f526004601cfd5b90915290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255905f5260205f20908101928215611333575f5260205f209182015b82811115611333578254825591600101919060010190611318565b5061133f92915061135a565b5090565b5080545f8255905f5260205f2090810190610e2191905b5b8082111561133f575f815560010161135b565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611391575f5ffd5b81356001600160401b038111156113aa576113aa61136e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156113d8576113d861136e565b6040528181528382016020018510156113ef575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f6040838503121561141c575f5ffd5b82356001600160401b03811115611431575f5ffd5b61143d85828601611382565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611492575f5ffd5b82356001600160401b038111156114a7575f5ffd5b6114b385828601611382565b92505060208301356001600160401b038111156114ce575f5ffd5b6114da85828601611382565b9150509250929050565b5f5f83601f8401126114f4575f5ffd5b5081356001600160401b0381111561150a575f5ffd5b6020830191508360208260051b8501011115611524575f5ffd5b9250929050565b5f5f5f5f6040858703121561153e575f5ffd5b84356001600160401b03811115611553575f5ffd5b61155f878288016114e4565b90955093505060208501356001600160401b0381111561157d575f5ffd5b611589878288016114e4565b95989497509550505050565b80356001600160a01b03811681146115ab575f5ffd5b919050565b5f5f5f606084860312156115c2575f5ffd5b83356001600160401b038111156115d7575f5ffd5b6115e386828701611382565b935050602084013591506115f960408501611595565b90509250925092565b5f5f60208385031215611613575f5ffd5b82356001600160401b03811115611628575f5ffd5b611634858286016114e4565b90969095509350505050565b5f5f5f5f60608587031215611653575f5ffd5b84356001600160401b03811115611668575f5ffd5b61167487828801611382565b9450506020850135925060408501356001600160401b03811115611696575f5ffd5b8501601f810187136116a6575f5ffd5b80356001600160401b038111156116bb575f5ffd5b8760208284010111156116cc575f5ffd5b949793965060200194505050565b5f5f5f604084860312156116ec575f5ffd5b83356001600160401b03811115611701575f5ffd5b61170d86828701611382565b93505060208401356001600160401b03811115611728575f5ffd5b611734868287016114e4565b9497909650939450505050565b5f5f60408385031215611752575f5ffd5b82356001600160401b03811115611767575f5ffd5b61177385828601611382565b92505061178260208401611595565b90509250929050565b5f6020828403121561179b575f5ffd5b81356001600160401b038111156117b0575f5ffd5b61036584828501611382565b5f602082840312156117cc575f5ffd5b6117d582611595565b9392505050565b5f81518060208401855e5f93019283525090919050565b5f6117d582846117dc565b60208082526019908201527f4368756e6b20696e646578206f7574206f6620626f756e647300000000000000604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b6020808252600e908201526d119a5b19481b9bdd08199bdd5b9960921b604082015260600190565b5f5f8335601e19843603018112611886575f5ffd5b8301803591506001600160401b0382111561189f575f5ffd5b602001915036819003821315611524575f5ffd5b5f5f8335601e198436030181126118c8575f5ffd5b8301803591506001600160401b038211156118e1575f5ffd5b6020019150600581901b3603821315611524575f5ffd5b818382375f9101908152919050565b6020808252600b908201526a456d707479206368756e6b60a81b604082015260600190565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b5f61195f61195983866117dc565b846117dc565b94935050505056fea2646970667358221220d5af3e101fe34144edff97e55231ca35cb90ccdc36e1c8bc6d66a705d14397ce64736f6c634300081b0033

Deployed Bytecode

0x608060405234801561000f575f5ffd5b5060043610610111575f3560e01c806388a6d29b1161009e578063ae1bbacb1161006e578063ae1bbacb14610231578063bf66dfc014610244578063e0876aa814610257578063f2fde38b1461026a578063f56b78b81461027d575f5ffd5b806388a6d29b146101e85780638da5cb5b146101fb5780638f4ddb411461020b578063a99100541461021e575f5ffd5b80635d3c4290116100e45780635d3c4290146101795780635ed253461461018c5780636ba6b6fb146101a2578063715018a6146101b557806377595926146101bd575f5ffd5b806303c7f8e71461011557806313d4a0441461013e5780632f5156b81461015357806353b274d814610166575b5f5ffd5b61012861012336600461140b565b610290565b604051610135919061144c565b60405180910390f35b61015161014c366004611481565b61036f565b005b61015161016136600461152b565b610499565b6101516101743660046115b0565b61071f565b610151610187366004611602565b61084b565b610194606481565b604051908152602001610135565b6101516101b0366004611640565b610902565b610151610a46565b6101d06101cb36600461140b565b610a59565b6040516001600160a01b039091168152602001610135565b6101516101f63660046116da565b610ae2565b5f546001600160a01b03166101d0565b610151610219366004611741565b610c62565b61015161022c36600461178b565b610db2565b61015161023f36600461140b565b610e24565b6101d061025236600461140b565b610ef3565b61012861026536600461178b565b610f38565b6101516102783660046117bc565b61105e565b61015161028b3660046116da565b611098565b60606001836040516102a291906117f3565b9081526040519081900360200190205482106102d95760405162461bcd60e51b81526004016102d0906117fe565b60405180910390fd5b5f6001846040516102ea91906117f3565b9081526020016040518091039020838154811061030957610309611835565b5f918252602090912001546001600160a01b031690508061035c5760405162461bcd60e51b815260206004820152600d60248201526c10da1d5b9ac819195b195d1959609a1b60448201526064016102d0565b6103658161120f565b9150505b92915050565b61037761123b565b5f60018360405161038891906117f3565b90815260405190819003602001902054116103b55760405162461bcd60e51b81526004016102d090611849565b6001816040516103c591906117f3565b90815260405190819003602001902054156104225760405162461bcd60e51b815260206004820152601760248201527f4e6577206e616d6520616c72656164792065786973747300000000000000000060448201526064016102d0565b60018260405161043291906117f3565b908152602001604051809103902060018260405161045091906117f3565b908152604051908190036020019020815461046b92906112f7565b5060018260405161047c91906117f3565b90815260200160405180910390205f6104959190611343565b5050565b6104a161123b565b8281146104e85760405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b60448201526064016102d0565b5f5b8381101561071857365f86868481811061050657610506611835565b90506020028101906105189190611871565b91509150365f86868681811061053057610530611835565b905060200281019061054291906118b3565b91509150600184846040516105589291906118f8565b90815260405190819003602001902054156105ab5760405162461bcd60e51b815260206004820152601360248201527246696c6520616c72656164792065786973747360681b60448201526064016102d0565b80158015906105bb575060648111155b6105fd5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a590818da1d5b9ac818dbdd5b9d606a1b60448201526064016102d0565b5f5b81811015610707575f83838381811061061a5761061a611835565b905060200281019061062c9190611871565b90501161064b5760405162461bcd60e51b81526004016102d090611907565b5f6106ac84848481811061066157610661611835565b90506020028101906106739190611871565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061126792505050565b9050600186866040516106c09291906118f8565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b039390931692909217909155016105ff565b5050600190930192506104ea915050565b5050505050565b61072761123b565b5f60018460405161073891906117f3565b90815260405190819003602001902054116107655760405162461bcd60e51b81526004016102d090611849565b60018360405161077591906117f3565b9081526040519081900360200190205482106107a35760405162461bcd60e51b81526004016102d0906117fe565b6001600160a01b0381166107eb5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103837b4b73a32b960891b60448201526064016102d0565b806001846040516107fc91906117f3565b9081526020016040518091039020838154811061081b5761081b611835565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b61085361123b565b5f5b818110156108fd575f600184848481811061087257610872611835565b90506020028101906108849190611871565b6040516108929291906118f8565b9081526040519081900360200190205411156108f55760018383838181106108bc576108bc611835565b90506020028101906108ce9190611871565b6040516108dc9291906118f8565b90815260200160405180910390205f6108f59190611343565b600101610855565b505050565b61090a61123b565b5f60018560405161091b91906117f3565b90815260405190819003602001902054116109485760405162461bcd60e51b81526004016102d090611849565b60018460405161095891906117f3565b9081526040519081900360200190205483106109865760405162461bcd60e51b81526004016102d0906117fe565b806109a35760405162461bcd60e51b81526004016102d090611907565b5f6109e283838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061126792505050565b9050806001866040516109f591906117f3565b90815260200160405180910390208581548110610a1457610a14611835565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050565b610a4e61123b565b610a575f6112a8565b565b5f600183604051610a6a91906117f3565b908152604051908190036020019020548210610a985760405162461bcd60e51b81526004016102d0906117fe565b600183604051610aa891906117f3565b90815260200160405180910390208281548110610ac757610ac7611835565b5f918252602090912001546001600160a01b03169392505050565b610aea61123b565b600183604051610afa91906117f3565b9081526040519081900360200190205415610b4d5760405162461bcd60e51b815260206004820152601360248201527246696c6520616c72656164792065786973747360681b60448201526064016102d0565b8015801590610b5d575060648111155b610b9f5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a590818da1d5b9ac818dbdd5b9d606a1b60448201526064016102d0565b5f5b81811015610c5c575f838383818110610bbc57610bbc611835565b9050602002810190610bce9190611871565b905011610bed5760405162461bcd60e51b81526004016102d090611907565b5f610c0384848481811061066157610661611835565b9050600185604051610c1591906117f3565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b03939093169290921790915501610ba1565b50505050565b610c6a61123b565b5f600183604051610c7b91906117f3565b9081526040519081900360200190205411610ca85760405162461bcd60e51b81526004016102d090611849565b6064600183604051610cba91906117f3565b90815260405190819003602001902054610cd590600161192c565b1115610d195760405162461bcd60e51b815260206004820152601360248201527213585e0818da1d5b9adcc8195e18d959591959606a1b60448201526064016102d0565b6001600160a01b038116610d615760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103837b4b73a32b960891b60448201526064016102d0565b600182604051610d7191906117f3565b9081526040516020918190038201902080546001810182555f9182529190200180546001600160a01b0319166001600160a01b039290921691909117905550565b610dba61123b565b5f600182604051610dcb91906117f3565b9081526040519081900360200190205411610df85760405162461bcd60e51b81526004016102d090611849565b600181604051610e0891906117f3565b90815260200160405180910390205f610e219190611343565b50565b610e2c61123b565b5f600183604051610e3d91906117f3565b9081526040519081900360200190205411610e6a5760405162461bcd60e51b81526004016102d090611849565b600182604051610e7a91906117f3565b908152604051908190036020019020548110610ea85760405162461bcd60e51b81526004016102d0906117fe565b600182604051610eb891906117f3565b90815260200160405180910390208181548110610ed757610ed7611835565b5f91825260209091200180546001600160a01b03191690555050565b81516020818401810180516001825292820191850191909120919052805482908110610f1d575f80fd5b5f918252602090912001546001600160a01b03169150829050565b60605f600183604051610f4b91906117f3565b9081526040805191829003602090810183208054808302850183019093528284529190830182828015610fa557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f87575b5050505050905080515f03610fc957505060408051602081019091525f8152919050565b60605f5b8251811015611056575f6001600160a01b0316838281518110610ff257610ff2611835565b60200260200101516001600160a01b03161461104e578161102b84838151811061101e5761101e611835565b602002602001015161120f565b60405160200161103c92919061194b565b60405160208183030381529060405291505b600101610fcd565b509392505050565b61106661123b565b6001600160a01b03811661108f57604051631e4fbdf760e01b81525f60048201526024016102d0565b610e21816112a8565b6110a061123b565b5f6001846040516110b191906117f3565b90815260405190819003602001902054116110de5760405162461bcd60e51b81526004016102d090611849565b6064828290506001856040516110f491906117f3565b9081526040519081900360200190205461110e919061192c565b11156111525760405162461bcd60e51b815260206004820152601360248201527213585e0818da1d5b9adcc8195e18d959591959606a1b60448201526064016102d0565b5f5b81811015610c5c575f83838381811061116f5761116f611835565b90506020028101906111819190611871565b9050116111a05760405162461bcd60e51b81526004016102d090611907565b5f6111b684848481811061066157610661611835565b90506001856040516111c891906117f3565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b03939093169290921790915501611154565b60405164ffffffffff5f19833b0116602181015f601f8401853c80825260408201810160405250919050565b5f546001600160a01b03163314610a575760405163118cdaa760e01b81523360048201526024016102d0565b5f81518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584015ff09150816112a25763301164255f526004601cfd5b90915290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255905f5260205f20908101928215611333575f5260205f209182015b82811115611333578254825591600101919060010190611318565b5061133f92915061135a565b5090565b5080545f8255905f5260205f2090810190610e2191905b5b8082111561133f575f815560010161135b565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611391575f5ffd5b81356001600160401b038111156113aa576113aa61136e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156113d8576113d861136e565b6040528181528382016020018510156113ef575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f6040838503121561141c575f5ffd5b82356001600160401b03811115611431575f5ffd5b61143d85828601611382565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611492575f5ffd5b82356001600160401b038111156114a7575f5ffd5b6114b385828601611382565b92505060208301356001600160401b038111156114ce575f5ffd5b6114da85828601611382565b9150509250929050565b5f5f83601f8401126114f4575f5ffd5b5081356001600160401b0381111561150a575f5ffd5b6020830191508360208260051b8501011115611524575f5ffd5b9250929050565b5f5f5f5f6040858703121561153e575f5ffd5b84356001600160401b03811115611553575f5ffd5b61155f878288016114e4565b90955093505060208501356001600160401b0381111561157d575f5ffd5b611589878288016114e4565b95989497509550505050565b80356001600160a01b03811681146115ab575f5ffd5b919050565b5f5f5f606084860312156115c2575f5ffd5b83356001600160401b038111156115d7575f5ffd5b6115e386828701611382565b935050602084013591506115f960408501611595565b90509250925092565b5f5f60208385031215611613575f5ffd5b82356001600160401b03811115611628575f5ffd5b611634858286016114e4565b90969095509350505050565b5f5f5f5f60608587031215611653575f5ffd5b84356001600160401b03811115611668575f5ffd5b61167487828801611382565b9450506020850135925060408501356001600160401b03811115611696575f5ffd5b8501601f810187136116a6575f5ffd5b80356001600160401b038111156116bb575f5ffd5b8760208284010111156116cc575f5ffd5b949793965060200194505050565b5f5f5f604084860312156116ec575f5ffd5b83356001600160401b03811115611701575f5ffd5b61170d86828701611382565b93505060208401356001600160401b03811115611728575f5ffd5b611734868287016114e4565b9497909650939450505050565b5f5f60408385031215611752575f5ffd5b82356001600160401b03811115611767575f5ffd5b61177385828601611382565b92505061178260208401611595565b90509250929050565b5f6020828403121561179b575f5ffd5b81356001600160401b038111156117b0575f5ffd5b61036584828501611382565b5f602082840312156117cc575f5ffd5b6117d582611595565b9392505050565b5f81518060208401855e5f93019283525090919050565b5f6117d582846117dc565b60208082526019908201527f4368756e6b20696e646578206f7574206f6620626f756e647300000000000000604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b6020808252600e908201526d119a5b19481b9bdd08199bdd5b9960921b604082015260600190565b5f5f8335601e19843603018112611886575f5ffd5b8301803591506001600160401b0382111561189f575f5ffd5b602001915036819003821315611524575f5ffd5b5f5f8335601e198436030181126118c8575f5ffd5b8301803591506001600160401b038211156118e1575f5ffd5b6020019150600581901b3603821315611524575f5ffd5b818382375f9101908152919050565b6020808252600b908201526a456d707479206368756e6b60a81b604082015260600190565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b5f61195f61195983866117dc565b846117dc565b94935050505056fea2646970667358221220d5af3e101fe34144edff97e55231ca35cb90ccdc36e1c8bc6d66a705d14397ce64736f6c634300081b0033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.