ETH Price: $1,975.65 (-5.20%)

Contract

0x1F06e7B8cd9137b21B697ac278127d19972eA80E
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Batch246021252026-03-07 0:54:111 hr ago1772844851IN
0x1F06e7B8...9972eA80E
0 ETH0.000003910.03486632
Claim Batch245994312026-03-06 15:52:2310 hrs ago1772812343IN
0x1F06e7B8...9972eA80E
0 ETH0.000398563.5459481
Claim Batch245993312026-03-06 15:31:5911 hrs ago1772811119IN
0x1F06e7B8...9972eA80E
0 ETH0.00039333.49916025
Claim Batch245987912026-03-06 13:43:4713 hrs ago1772804627IN
0x1F06e7B8...9972eA80E
0 ETH0.000357873.1839824
Claim Batch245981962026-03-06 11:43:5915 hrs ago1772797439IN
0x1F06e7B8...9972eA80E
0 ETH0.000229992.04621344
Claim Batch245974632026-03-06 9:16:3517 hrs ago1772788595IN
0x1F06e7B8...9972eA80E
0 ETH0.000235522.09544718
Claim Batch245963372026-03-06 5:28:2321 hrs ago1772774903IN
0x1F06e7B8...9972eA80E
0 ETH0.0003413.03388548
Claim Batch245962372026-03-06 5:08:1121 hrs ago1772773691IN
0x1F06e7B8...9972eA80E
0 ETH0.000340773.03184351
Claim Batch245946582026-03-05 23:49:4726 hrs ago1772754587IN
0x1F06e7B8...9972eA80E
0 ETH0.000139670.04344162
Claim Batch245933812026-03-05 19:32:1131 hrs ago1772739131IN
0x1F06e7B8...9972eA80E
0 ETH0.000320982.08742713
Claim Batch245878872026-03-05 1:10:112 days ago1772673011IN
0x1F06e7B8...9972eA80E
0 ETH0.000315322.0506426
Claim Batch245851622026-03-04 16:02:472 days ago1772640167IN
0x1F06e7B8...9972eA80E
0 ETH0.000844383.57012713
Claim Batch245795822026-03-03 21:21:233 days ago1772572883IN
0x1F06e7B8...9972eA80E
0 ETH0.000261072.32275575
Claim Batch245783112026-03-03 17:06:233 days ago1772557583IN
0x1F06e7B8...9972eA80E
0 ETH0.000263062.34047008
Claim Batch245776822026-03-03 15:00:113 days ago1772550011IN
0x1F06e7B8...9972eA80E
0 ETH0.000159071.41526371
Claim Batch245635412026-03-01 15:38:595 days ago1772379539IN
0x1F06e7B8...9972eA80E
0 ETH0.000229792.0444761
Claim Batch245549662026-02-28 10:54:356 days ago1772276075IN
0x1F06e7B8...9972eA80E
0 ETH0.000229772.04424767
Claim Batch245514312026-02-27 23:03:597 days ago1772233439IN
0x1F06e7B8...9972eA80E
0 ETH0.000318362.07037811
Claim Batch245508452026-02-27 21:06:357 days ago1772226395IN
0x1F06e7B8...9972eA80E
0 ETH0.000230432.05017114
Claim Batch245492322026-02-27 15:42:237 days ago1772206943IN
0x1F06e7B8...9972eA80E
0 ETH0.000044850.39910373
Claim Batch245469042026-02-27 7:55:117 days ago1772178911IN
0x1F06e7B8...9972eA80E
0 ETH0.000229122.03844528
Claim Batch245464592026-02-27 6:25:357 days ago1772173535IN
0x1F06e7B8...9972eA80E
0 ETH0.000229112.03842605
Claim Batch245368032026-02-25 22:07:239 days ago1772057243IN
0x1F06e7B8...9972eA80E
0 ETH0.000251162.23456255
Claim Batch245366052026-02-25 21:27:359 days ago1772054855IN
0x1F06e7B8...9972eA80E
0 ETH0.000235112.0918123
Claim Batch245361372026-02-25 19:53:119 days ago1772049191IN
0x1F06e7B8...9972eA80E
0 ETH0.000012490.1112084
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
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:
ChimpersMigration

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
prague EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

import {Ownable} from "solady/auth/Ownable.sol";
import {IERC721} from "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";

interface IChimpers {
    function mint(address to, uint256 tokenId) external;
}

/// @title ChimpersMigration
/// @notice Migration contract for moving Chimpers from old to new collection
contract ChimpersMigration is Ownable {
    /// @notice Error when claims are closed
    error ClaimsClosed();

    /// @notice Error when batch size exceeds maximum
    error BatchTooLarge();

    /// @notice Error when claims are still open
    error ClaimsNotClosed();

    /// @notice The old Chimpers contract
    IERC721 public immutable oldChimpers;

    /// @notice The new Chimpers contract
    IChimpers public immutable newChimpers;

    /// @notice Whether claims are closed
    bool public claimsClosed;

    /// @param oldChimpers_ The old Chimpers contract address
    /// @param newChimpers_ The new Chimpers contract address
    constructor(address oldChimpers_, address newChimpers_) {
        oldChimpers = IERC721(oldChimpers_);
        newChimpers = IChimpers(newChimpers_);
        _initializeOwner(msg.sender);
    }

    /// @notice Claims a single token, transferring old and minting new
    /// @param tokenId The token ID to claim
    function claim(uint256 tokenId) external {
        if (claimsClosed) revert ClaimsClosed();
        oldChimpers.transferFrom(msg.sender, address(this), tokenId);
        newChimpers.mint(msg.sender, tokenId);
    }

    /// @notice Claims multiple tokens in a batch
    /// @param tokenIds The token IDs to claim
    function claimBatch(uint256[] calldata tokenIds) external {
        if (claimsClosed) revert ClaimsClosed();
        if (tokenIds.length > 100) revert BatchTooLarge();

        for (uint256 i; i < tokenIds.length; ++i) {
            oldChimpers.transferFrom(msg.sender, address(this), tokenIds[i]);
            newChimpers.mint(msg.sender, tokenIds[i]);
        }
    }

    /// @notice Closes claims permanently
    function closeClaims() external onlyOwner {
        claimsClosed = true;
    }

    /// @notice Mints unclaimed tokens to treasury after claims are closed
    /// @param tokenIds The token IDs to mint
    /// @param treasury The address to receive the tokens
    function claimUnclaimed(uint256[] calldata tokenIds, address treasury) external onlyOwner {
        if (!claimsClosed) revert ClaimsNotClosed();

        for (uint256 i; i < tokenIds.length; ++i) {
            newChimpers.mint(treasury, tokenIds[i]);
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The caller is not authorized to call the function.
    error Unauthorized();

    /// @dev The `newOwner` cannot be the zero address.
    error NewOwnerIsZeroAddress();

    /// @dev The `pendingOwner` does not have a valid handover request.
    error NoHandoverRequest();

    /// @dev Cannot double-initialize.
    error AlreadyInitialized();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ownership is transferred from `oldOwner` to `newOwner`.
    /// This event is intentionally kept the same as OpenZeppelin's Ownable to be
    /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
    /// despite it not being as lightweight as a single argument event.
    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);

    /// @dev An ownership handover to `pendingOwner` has been requested.
    event OwnershipHandoverRequested(address indexed pendingOwner);

    /// @dev The ownership handover to `pendingOwner` has been canceled.
    event OwnershipHandoverCanceled(address indexed pendingOwner);

    /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
    uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
        0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;

    /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
        0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;

    /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
        0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The owner slot is given by:
    /// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
    /// It is intentionally chosen to be a high value
    /// to avoid collision with lower slots.
    /// The choice of manual storage layout is to enable compatibility
    /// with both regular and upgradeable contracts.
    bytes32 internal constant _OWNER_SLOT =
        0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;

    /// The ownership handover slot of `newOwner` is given by:
    /// ```
    ///     mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
    ///     let handoverSlot := keccak256(0x00, 0x20)
    /// ```
    /// It stores the expiry timestamp of the two-step ownership handover.
    uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     INTERNAL FUNCTIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
    function _guardInitializeOwner() internal pure virtual returns (bool guard) {}

    /// @dev Initializes the owner directly without authorization guard.
    /// This function must be called upon initialization,
    /// regardless of whether the contract is upgradeable or not.
    /// This is to enable generalization to both regular and upgradeable contracts,
    /// and to save gas in case the initial owner is not the caller.
    /// For performance reasons, this function will not check if there
    /// is an existing owner.
    function _initializeOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                if sload(ownerSlot) {
                    mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
                    revert(0x1c, 0x04)
                }
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(_OWNER_SLOT, newOwner)
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        }
    }

    /// @dev Sets the owner directly without authorization guard.
    function _setOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, newOwner)
            }
        }
    }

    /// @dev Throws if the sender is not the owner.
    function _checkOwner() internal view virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // If the caller is not the stored owner, revert.
            if iszero(eq(caller(), sload(_OWNER_SLOT))) {
                mstore(0x00, 0x82b42900) // `Unauthorized()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Returns how long a two-step ownership handover is valid for in seconds.
    /// Override to return a different value if needed.
    /// Made internal to conserve bytecode. Wrap it in a public function if needed.
    function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
        return 48 * 3600;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  PUBLIC UPDATE FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Allows the owner to transfer the ownership to `newOwner`.
    function transferOwnership(address newOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(shl(96, newOwner)) {
                mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
                revert(0x1c, 0x04)
            }
        }
        _setOwner(newOwner);
    }

    /// @dev Allows the owner to renounce their ownership.
    function renounceOwnership() public payable virtual onlyOwner {
        _setOwner(address(0));
    }

    /// @dev Request a two-step ownership handover to the caller.
    /// The request will automatically expire in 48 hours (172800 seconds) by default.
    function requestOwnershipHandover() public payable virtual {
        unchecked {
            uint256 expires = block.timestamp + _ownershipHandoverValidFor();
            /// @solidity memory-safe-assembly
            assembly {
                // Compute and set the handover slot to `expires`.
                mstore(0x0c, _HANDOVER_SLOT_SEED)
                mstore(0x00, caller())
                sstore(keccak256(0x0c, 0x20), expires)
                // Emit the {OwnershipHandoverRequested} event.
                log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
            }
        }
    }

    /// @dev Cancels the two-step ownership handover to the caller, if any.
    function cancelOwnershipHandover() public payable virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x20), 0)
            // Emit the {OwnershipHandoverCanceled} event.
            log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
        }
    }

    /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
    /// Reverts if there is no existing ownership handover requested by `pendingOwner`.
    function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            let handoverSlot := keccak256(0x0c, 0x20)
            // If the handover does not exist, or has expired.
            if gt(timestamp(), sload(handoverSlot)) {
                mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
                revert(0x1c, 0x04)
            }
            // Set the handover slot to 0.
            sstore(handoverSlot, 0)
        }
        _setOwner(pendingOwner);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   PUBLIC READ FUNCTIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the owner of the contract.
    function owner() public view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_OWNER_SLOT)
        }
    }

    /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
    function ownershipHandoverExpiresAt(address pendingOwner)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the handover slot.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            // Load the handover slot.
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         MODIFIERS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Marks a function as only callable by the owner.
    modifier onlyOwner() virtual {
        _checkOwner();
        _;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "remappings": [
    "@limitbreak/permit-c/=lib/creator-token-standards/lib/PermitC/src/",
    "@opensea/tstorish/=lib/creator-token-standards/lib/tstorish/src/",
    "@openzeppelin/=lib/creator-token-standards/lib/openzeppelin-contracts/",
    "@rari-capital/solmate/=lib/creator-token-standards/lib/PermitC/lib/solmate/",
    "ERC721A/=lib/creator-token-standards/lib/ERC721A/contracts/",
    "PermitC/=lib/creator-token-standards/lib/PermitC/",
    "creator-token-standards/=lib/creator-token-standards/",
    "ds-test/=lib/creator-token-standards/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/creator-token-standards/lib/PermitC/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "erc721a/=lib/creator-token-standards/lib/ERC721A/",
    "forge-gas-metering/=lib/creator-token-standards/lib/PermitC/lib/forge-gas-metering/",
    "forge-std/=lib/forge-std/src/",
    "murky/=lib/creator-token-standards/lib/murky/",
    "openzeppelin-contracts/=lib/creator-token-standards/lib/openzeppelin-contracts/",
    "openzeppelin/=lib/creator-token-standards/lib/PermitC/lib/openzeppelin-contracts/contracts/",
    "solady/=lib/solady/src/",
    "solmate/=lib/creator-token-standards/lib/PermitC/lib/solmate/src/",
    "tstorish/=lib/creator-token-standards/lib/tstorish/src/"
  ],
  "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":[{"internalType":"address","name":"oldChimpers_","type":"address"},{"internalType":"address","name":"newChimpers_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"BatchTooLarge","type":"error"},{"inputs":[],"name":"ClaimsClosed","type":"error"},{"inputs":[],"name":"ClaimsNotClosed","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"treasury","type":"address"}],"name":"claimUnclaimed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimsClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"newChimpers","outputs":[{"internalType":"contract IChimpers","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldChimpers","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"}]

60c060405234801561000f575f5ffd5b50604051610a43380380610a4383398101604081905261002e916100a7565b6001600160a01b03808316608052811660a05261004a33610051565b50506100d8565b6001600160a01b0316638b78c6d819819055805f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b80516001600160a01b03811681146100a2575f5ffd5b919050565b5f5f604083850312156100b8575f5ffd5b6100c18361008c565b91506100cf6020840161008c565b90509250929050565b60805160a05161092761011c5f395f81816101170152818161039b01528181610536015261063101525f81816101f501528181610322015261048901526109275ff3fe6080604052600436106100d9575f3560e01c80638da5cb5b1161007c578063cfee88db11610057578063cfee88db14610217578063f04e283e1461022b578063f2fde38b1461023e578063fee81cf414610251575f5ffd5b80638da5cb5b146101a45780638ea0bee6146101bc578063b0d38dd3146101e4575f5ffd5b806354d1f13d116100b757806354d1f13d1461015657806362abebce1461015e578063715018a61461017d57806387249a1114610185575f5ffd5b806325692962146100dd578063379607f5146100e757806350c69d1c14610106575b5f5ffd5b6100e5610290565b005b3480156100f2575f5ffd5b506100e56101013660046107b4565b6102dd565b348015610111575f5ffd5b506101397f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100e56103ff565b348015610169575f5ffd5b506100e5610178366004610813565b610438565b6100e56105e8565b348015610190575f5ffd5b506100e561019f36600461086d565b6105fb565b3480156101af575f5ffd5b50638b78c6d81954610139565b3480156101c7575f5ffd5b505f546101d49060ff1681565b604051901515815260200161014d565b3480156101ef575f5ffd5b506101397f000000000000000000000000000000000000000000000000000000000000000081565b348015610222575f5ffd5b506100e56106e4565b6100e56102393660046108bd565b6106fa565b6100e561024c3660046108bd565b610737565b34801561025c575f5ffd5b5061028261026b3660046108bd565b63389a75e1600c9081525f91909152602090205490565b60405190815260200161014d565b5f6202a30067ffffffffffffffff164201905063389a75e1600c52335f52806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f5fa250565b5f5460ff161561030057604051637087773560e11b815260040160405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064015f604051808303815f87803b15801561036b575f5ffd5b505af115801561037d573d5f5f3e3d5ffd5b50506040516340c10f1960e01b8152336004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506340c10f1991506044015f604051808303815f87803b1580156103e6575f5ffd5b505af11580156103f8573d5f5f3e3d5ffd5b5050505050565b63389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f5fa2565b5f5460ff161561045b57604051637087773560e11b815260040160405180910390fd5b606481111561047d576040516305beb17160e11b815260040160405180910390fd5b5f5b818110156105e3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd33308686868181106104ca576104ca6108dd565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b15801561051e575f5ffd5b505af1158015610530573d5f5f3e3d5ffd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1933858585818110610576576105766108dd565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044015f604051808303815f87803b1580156105c2575f5ffd5b505af11580156105d4573d5f5f3e3d5ffd5b5050505080600101905061047f565b505050565b6105f061075d565b6105f95f610777565b565b61060361075d565b5f5460ff166106255760405163731c543360e01b815260040160405180910390fd5b5f5b828110156106de577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1983868685818110610671576106716108dd565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044015f604051808303815f87803b1580156106bd575f5ffd5b505af11580156106cf573d5f5f3e3d5ffd5b50505050806001019050610627565b50505050565b6106ec61075d565b5f805460ff19166001179055565b61070261075d565b63389a75e1600c52805f526020600c20805442111561072857636f5e88185f526004601cfd5b5f905561073481610777565b50565b61073f61075d565b8060601b61075457637448fbae5f526004601cfd5b61073481610777565b638b78c6d8195433146105f9576382b429005f526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a355565b5f602082840312156107c4575f5ffd5b5035919050565b5f5f83601f8401126107db575f5ffd5b50813567ffffffffffffffff8111156107f2575f5ffd5b6020830191508360208260051b850101111561080c575f5ffd5b9250929050565b5f5f60208385031215610824575f5ffd5b823567ffffffffffffffff81111561083a575f5ffd5b610846858286016107cb565b90969095509350505050565b80356001600160a01b0381168114610868575f5ffd5b919050565b5f5f5f6040848603121561087f575f5ffd5b833567ffffffffffffffff811115610895575f5ffd5b6108a1868287016107cb565b90945092506108b4905060208501610852565b90509250925092565b5f602082840312156108cd575f5ffd5b6108d682610852565b9392505050565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220447ee7f2b09e289200af3645557631015f5d4176b91d37499bb4b88a7401547c64736f6c634300081c003300000000000000000000000080336ad7a747236ef41f47ed2c7641828a480baa000000000000000000000000307af7d28afee82092aa95d35644898311ca5360

Deployed Bytecode

0x6080604052600436106100d9575f3560e01c80638da5cb5b1161007c578063cfee88db11610057578063cfee88db14610217578063f04e283e1461022b578063f2fde38b1461023e578063fee81cf414610251575f5ffd5b80638da5cb5b146101a45780638ea0bee6146101bc578063b0d38dd3146101e4575f5ffd5b806354d1f13d116100b757806354d1f13d1461015657806362abebce1461015e578063715018a61461017d57806387249a1114610185575f5ffd5b806325692962146100dd578063379607f5146100e757806350c69d1c14610106575b5f5ffd5b6100e5610290565b005b3480156100f2575f5ffd5b506100e56101013660046107b4565b6102dd565b348015610111575f5ffd5b506101397f000000000000000000000000307af7d28afee82092aa95d35644898311ca536081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100e56103ff565b348015610169575f5ffd5b506100e5610178366004610813565b610438565b6100e56105e8565b348015610190575f5ffd5b506100e561019f36600461086d565b6105fb565b3480156101af575f5ffd5b50638b78c6d81954610139565b3480156101c7575f5ffd5b505f546101d49060ff1681565b604051901515815260200161014d565b3480156101ef575f5ffd5b506101397f00000000000000000000000080336ad7a747236ef41f47ed2c7641828a480baa81565b348015610222575f5ffd5b506100e56106e4565b6100e56102393660046108bd565b6106fa565b6100e561024c3660046108bd565b610737565b34801561025c575f5ffd5b5061028261026b3660046108bd565b63389a75e1600c9081525f91909152602090205490565b60405190815260200161014d565b5f6202a30067ffffffffffffffff164201905063389a75e1600c52335f52806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f5fa250565b5f5460ff161561030057604051637087773560e11b815260040160405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000080336ad7a747236ef41f47ed2c7641828a480baa6001600160a01b0316906323b872dd906064015f604051808303815f87803b15801561036b575f5ffd5b505af115801561037d573d5f5f3e3d5ffd5b50506040516340c10f1960e01b8152336004820152602481018490527f000000000000000000000000307af7d28afee82092aa95d35644898311ca53606001600160a01b031692506340c10f1991506044015f604051808303815f87803b1580156103e6575f5ffd5b505af11580156103f8573d5f5f3e3d5ffd5b5050505050565b63389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f5fa2565b5f5460ff161561045b57604051637087773560e11b815260040160405180910390fd5b606481111561047d576040516305beb17160e11b815260040160405180910390fd5b5f5b818110156105e3577f00000000000000000000000080336ad7a747236ef41f47ed2c7641828a480baa6001600160a01b03166323b872dd33308686868181106104ca576104ca6108dd565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b15801561051e575f5ffd5b505af1158015610530573d5f5f3e3d5ffd5b505050507f000000000000000000000000307af7d28afee82092aa95d35644898311ca53606001600160a01b03166340c10f1933858585818110610576576105766108dd565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044015f604051808303815f87803b1580156105c2575f5ffd5b505af11580156105d4573d5f5f3e3d5ffd5b5050505080600101905061047f565b505050565b6105f061075d565b6105f95f610777565b565b61060361075d565b5f5460ff166106255760405163731c543360e01b815260040160405180910390fd5b5f5b828110156106de577f000000000000000000000000307af7d28afee82092aa95d35644898311ca53606001600160a01b03166340c10f1983868685818110610671576106716108dd565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044015f604051808303815f87803b1580156106bd575f5ffd5b505af11580156106cf573d5f5f3e3d5ffd5b50505050806001019050610627565b50505050565b6106ec61075d565b5f805460ff19166001179055565b61070261075d565b63389a75e1600c52805f526020600c20805442111561072857636f5e88185f526004601cfd5b5f905561073481610777565b50565b61073f61075d565b8060601b61075457637448fbae5f526004601cfd5b61073481610777565b638b78c6d8195433146105f9576382b429005f526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a355565b5f602082840312156107c4575f5ffd5b5035919050565b5f5f83601f8401126107db575f5ffd5b50813567ffffffffffffffff8111156107f2575f5ffd5b6020830191508360208260051b850101111561080c575f5ffd5b9250929050565b5f5f60208385031215610824575f5ffd5b823567ffffffffffffffff81111561083a575f5ffd5b610846858286016107cb565b90969095509350505050565b80356001600160a01b0381168114610868575f5ffd5b919050565b5f5f5f6040848603121561087f575f5ffd5b833567ffffffffffffffff811115610895575f5ffd5b6108a1868287016107cb565b90945092506108b4905060208501610852565b90509250925092565b5f602082840312156108cd575f5ffd5b6108d682610852565b9392505050565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220447ee7f2b09e289200af3645557631015f5d4176b91d37499bb4b88a7401547c64736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000080336ad7a747236ef41f47ed2c7641828a480baa000000000000000000000000307af7d28afee82092aa95d35644898311ca5360

-----Decoded View---------------
Arg [0] : oldChimpers_ (address): 0x80336Ad7A747236ef41F47ed2C7641828a480BAA
Arg [1] : newChimpers_ (address): 0x307AF7d28AfEE82092aA95D35644898311CA5360

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000080336ad7a747236ef41f47ed2c7641828a480baa
Arg [1] : 000000000000000000000000307af7d28afee82092aa95d35644898311ca5360


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