{"status":"1","message":"","result":{"address":"0x1a64F3296aE427CaF760A493F82Dc6D786d99005","balance":"0","nonce":"1","codeHash":"0x273a8f3900b146260c8dae1c39fdb82cdbd5bbe2cb4de5c02a174ab046d22703","stakingBalance":"0","collateralForStorage":"0","accumulatedInterestReturn":"0","admin":"0x0000000000000000000000000000000000000000","cfxTransferTab":0,"erc20TransferTab":0,"erc721TransferTab":0,"erc1155TransferTab":0,"nftAssetTab":0,"minedBlockTab":0,"authorizationsTab":0,"sponsor":{"sponsorForGas":"0x0000000000000000000000000000000000000000","sponsorForCollateral":"0x0000000000000000000000000000000000000000","sponsorGasBound":"0","sponsorBalanceForGas":"0","sponsorBalanceForCollateral":"0","availableStoragePoints":null,"usedStoragePoints":null},"epochNumber":33222151,"transactionHash":"0x31018574167cb21ab12e2844138f00e0277bc5697cd2146e9fb72dcdcdded5c1","from":"0xD24e06f0DBadA268314DbcB97F48f87b85b6Dd30","contractFactory":"","timestamp":1778759105,"hex40id":213992,"name":null,"website":null,"abi":"[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"brain_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialFeeWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"name\":\"InsufficientFee\",\"type\":\"error\",\"inputs\":[]},{\"name\":\"OwnableInvalidOwner\",\"type\":\"error\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"TransferFailed\",\"type\":\"error\",\"inputs\":[]},{\"name\":\"ZeroAddress\",\"type\":\"error\",\"inputs\":[]},{\"name\":\"FeesSwept\",\"type\":\"event\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"name\":\"MintFeeUpdated\",\"type\":\"event\",\"inputs\":[{\"name\":\"newFeeWei\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"name\":\"Minted\",\"type\":\"event\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"storageRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"metadataHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"name\":\"OwnershipTransferStarted\",\"type\":\"event\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"name\":\"OwnershipTransferred\",\"type\":\"event\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"name\":\"BRAIN\",\"type\":\"function\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contract IBrainMintable\"}],\"stateMutability\":\"view\"},{\"name\":\"acceptOwnership\",\"type\":\"function\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"claimBrainOwnership\",\"type\":\"function\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"mintFeeWei\",\"type\":\"function\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"name\":\"mintToSender\",\"type\":\"function\",\"inputs\":[{\"name\":\"initialStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"encryptedURI\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"metadataHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sealedKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"payable\"},{\"name\":\"owner\",\"type\":\"function\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"name\":\"pendingOwner\",\"type\":\"function\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"name\":\"renounceOwnership\",\"type\":\"function\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"setMintFee\",\"type\":\"function\",\"inputs\":[{\"name\":\"newFeeWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"sweepFees\",\"type\":\"function\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address payable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"transferBrainOwnership\",\"type\":\"function\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"transferOwnership\",\"type\":\"function\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]","sourceCode":"{\"sources\":{\"src/lib/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\n// forgefmt: disable-start\\n//\\n//        ██████╗ ██████╗  █████╗ ██╗███╗   ██╗██████╗ ███████╗██████╗ ██╗ █████╗\\n//        ██╔══██╗██╔══██╗██╔══██╗██║████╗  ██║██╔══██╗██╔════╝██╔══██╗██║██╔══██╗\\n//        ██████╔╝██████╔╝███████║██║██╔██╗ ██║██████╔╝█████╗  ██║  ██║██║███████║\\n//        ██╔══██╗██╔══██╗██╔══██║██║██║╚██╗██║██╔═══╝ ██╔══╝  ██║  ██║██║██╔══██║\\n//        ██████╔╝██║  ██║██║  ██║██║██║ ╚████║██║     ███████╗██████╔╝██║██║  ██║\\n//        ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝╚═╝     ╚══════╝╚═════╝ ╚═╝╚═╝  ╚═╝\\n//\\n//        Specialty AI Brains as iNFTs · Agent-paid knowledge marketplace\\n//\\n// forgefmt: disable-end\\n\\n/// @title  Errors\\n/// @author Brainpedia Team\\n/// @notice Custom errors used across the Brainpedia contract suite.\\n/// @dev    Library of error declarations. Replaces every `require(cond, \\\"string\\\")`\\n///         in Brain, BrainOracle, BrainMinter, RoyaltyDistributor, SubnameRegistrar,\\n///         and AccessTokenRegistrar. Custom errors are gas-efficient and fully\\n///         typed for off-chain decoding.\\nlibrary Errors {\\n    // ----- Generic input validation -----\\n\\n    /// @notice Thrown when an address parameter is the zero address.\\n    error ZeroAddress();\\n\\n    /// @notice Thrown when an amount parameter is zero.\\n    error ZeroAmount();\\n\\n    /// @notice Thrown when two arrays that must be the same length are not.\\n    error LengthMismatch();\\n\\n    /// @notice Thrown when a native ETH transfer fails.\\n    error EthTransferFailed();\\n\\n    /// @notice Thrown when ECDSA recovery does not return the configured signer.\\n    error InvalidSignature();\\n\\n    // ----- Brain (ERC-7857 iNFT) -----\\n\\n    /// @notice Thrown when `msg.sender` is not the owner of the targeted tokenId.\\n    error NotBrainOwner();\\n\\n    /// @notice Thrown when authorizeUsage is called with msg.value below the\\n    ///         Brain's configured per-query minimum payment.\\n    error InsufficientPayment();\\n\\n    /// @notice Thrown when the per-query payment forward from the Brain contract\\n    ///         to the Brain owner fails (e.g., recipient is a contract that reverts\\n    ///         on receive).\\n    error PaymentForwardFailed();\\n\\n    /// @notice Thrown when a view function is called on a tokenId that has no\\n    ///         IntelligentData records yet (i.e., was never minted or was burned).\\n    error NoIntelligence();\\n\\n    // ----- ERC-7857 canonical transfer path -----\\n\\n    /// @notice Thrown when a caller invokes `transferFrom` or `safeTransferFrom`\\n    ///         directly. ERC-7857 mandates the oracle-attested `secureTransfer`\\n    ///         path so that the per-Brain symmetric key can be re-sealed for the\\n    ///         new owner. Standard ERC-721 transfers would leave the recipient\\n    ///         with an undecryptable Brain.\\n    error UseSecureTransfer();\\n\\n    /// @notice Thrown when secureTransfer is called before an oracle is set.\\n    error OracleNotSet();\\n\\n    /// @notice Thrown when the configured oracle rejects the supplied proof.\\n    error InvalidOracleProof();\\n\\n    // ----- BrainOracle attestation -----\\n\\n    /// @notice Thrown when verifyProof is called while the attestor is unset.\\n    error AttestorNotSet();\\n\\n    /// @notice Thrown when the EIP-712 TransferAttestation deadline has passed.\\n    error AttestationExpired();\\n\\n    /// @notice Thrown when the supplied oracle proof is malformed (e.g., too\\n    ///         short to ABI-decode as a TransferAttestation).\\n    error InvalidProofFormat();\\n\\n    // ----- BrainMinter anti-spam -----\\n\\n    /// @notice Thrown when mintToSender is called with msg.value below the\\n    ///         currently-configured anti-spam mint fee.\\n    error InsufficientFee();\\n\\n    /// @notice Thrown when an internal native-token transfer fails (fee sweep,\\n    ///         payment forward, refund).\\n    error TransferFailed();\\n\\n    // ----- RoyaltyDistributor -----\\n\\n    /// @notice Thrown when distribute() is called with msg.value below the\\n    ///         sum of per-Brain payment amounts.\\n    error InsufficientValue();\\n\\n    // ----- ENS subname + access-token registrars -----\\n\\n    /// @notice Thrown when a registrar tries to issue a subname whose label\\n    ///         hash is already registered.\\n    error LabelAlreadyTaken();\\n\\n    /// @notice Thrown when a subname text-record write is attempted by an\\n    ///         account that does not own the label.\\n    error NotLabelOwner();\\n\\n    /// @notice Thrown when a non-issuer account calls a function gated by\\n    ///         the issuer allow-list on AccessTokenRegistrar.\\n    error NotIssuer();\\n\\n    /// @notice Thrown when an AccessTokenRegistrar operation references a\\n    ///         label that has never been issued.\\n    error TokenNotFound();\\n\\n    /// @notice Thrown when an AccessTokenRegistrar operation references a\\n    ///         label whose TTL has elapsed.\\n    error TokenExpired();\\n}\\n\"},\"src/BrainMinter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\n// forgefmt: disable-start\\n//\\n//        ██████╗ ██████╗  █████╗ ██╗███╗   ██╗██████╗ ███████╗██████╗ ██╗ █████╗\\n//        ██╔══██╗██╔══██╗██╔══██╗██║████╗  ██║██╔══██╗██╔════╝██╔══██╗██║██╔══██╗\\n//        ██████╔╝██████╔╝███████║██║██╔██╗ ██║██████╔╝█████╗  ██║  ██║██║███████║\\n//        ██╔══██╗██╔══██╗██╔══██║██║██║╚██╗██║██╔═══╝ ██╔══╝  ██║  ██║██║██╔══██║\\n//        ██████╔╝██║  ██║██║  ██║██║██║ ╚████║██║     ███████╗██████╔╝██║██║  ██║\\n//        ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝╚═╝     ╚══════╝╚═════╝ ╚═╝╚═╝  ╚═╝\\n//\\n//        Specialty AI Brains as iNFTs · Agent-paid knowledge marketplace\\n//\\n// forgefmt: disable-end\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { Ownable2Step } from \\\"@openzeppelin/contracts/access/Ownable2Step.sol\\\";\\n\\nimport { Errors } from \\\"./lib/Errors.sol\\\";\\n\\ninterface IBrainMintable {\\n    function mint(\\n        address to,\\n        bytes32 initialStorageRoot,\\n        bytes calldata encryptedURI,\\n        bytes32 metadataHash,\\n        string calldata description,\\n        bytes calldata sealedKey\\n    ) external returns (uint256 tokenId);\\n\\n    function transferOwnership(address newOwner) external;\\n    function acceptOwnership() external;\\n}\\n\\n/// @title  BrainMinter\\n/// @author Brainpedia Team\\n/// @notice Owns Brain.sol (after Brain.transferOwnership(BrainMinter)) and\\n///         exposes a permissionless mint so anyone can self-onboard a Brain\\n///         from their own Obsidian vault. They call mintToSender() and the\\n///         minted iNFT is owned by msg.sender. No owner gating.\\n/// @dev    Brain.sol carries canonical ERC-7857 metadata: an encrypted URI\\n///         (private manifest on 0G Storage, sealed for the owner), a\\n///         metadata commit hash, and a sealed symmetric key emitted in the\\n///         KeySealed event for the new owner to decrypt off chain.\\n///\\n///         Optional anti-spam fee can be set by the wrapper's admin. Default\\n///         is 0 wei, so anyone can mint for gas only.\\n///\\n///         If we ever need to migrate again, this contract has its own\\n///         `transferBrainOwnership(newOwner)` which forwards the call to\\n///         Brain.transferOwnership. Escape hatch if BrainMinter v2 ships.\\ncontract BrainMinter is Ownable2Step {\\n    // ============ Immutables ============\\n\\n    IBrainMintable public immutable BRAIN;\\n\\n    // ============ Storage ============\\n\\n    /// @notice Anti-spam fee in wei. 0 = free.\\n    uint256 public mintFeeWei;\\n\\n    // ============ Events ============\\n\\n    event Minted(\\n        uint256 indexed tokenId,\\n        address indexed minter,\\n        bytes32 storageRoot,\\n        bytes32 metadataHash\\n    );\\n    event MintFeeUpdated(uint256 newFeeWei);\\n    event FeesSwept(address indexed to, uint256 amount);\\n\\n    // ============ Constructor ============\\n\\n    constructor(address brain_, uint256 initialFeeWei, address initialOwner)\\n        Ownable(initialOwner)\\n    {\\n        if (brain_ == address(0)) revert Errors.ZeroAddress();\\n        BRAIN = IBrainMintable(brain_);\\n        mintFeeWei = initialFeeWei;\\n    }\\n\\n    // ============ External: mint ============\\n\\n    /// @notice Mint a fresh Brain iNFT to msg.sender. Permissionless.\\n    /// @param  initialStorageRoot 0G Storage merkle root of the public snapshot\\n    /// @param  encryptedURI       encrypted ref to private metadata on 0G Storage\\n    ///                            (empty for public-only Brains)\\n    /// @param  metadataHash       keccak256 commit of the canonical plaintext\\n    ///                            metadata (zero hash for public-only Brains)\\n    /// @param  description        free-form (specialty / brief / etc.)\\n    /// @param  sealedKey          symmetric key sealed for msg.sender's pubkey\\n    ///                            (empty for public-only Brains)\\n    /// @return tokenId            the new token id (assigned by Brain.sol)\\n    function mintToSender(\\n        bytes32 initialStorageRoot,\\n        bytes calldata encryptedURI,\\n        bytes32 metadataHash,\\n        string calldata description,\\n        bytes calldata sealedKey\\n    ) external payable returns (uint256 tokenId) {\\n        require(msg.value >= mintFeeWei, Errors.InsufficientFee());\\n        tokenId = BRAIN.mint(\\n            msg.sender, initialStorageRoot, encryptedURI, metadataHash, description, sealedKey\\n        );\\n        emit Minted(tokenId, msg.sender, initialStorageRoot, metadataHash);\\n    }\\n\\n    // ============ External: admin ============\\n\\n    /// @notice Update anti-spam fee. Owner-only.\\n    function setMintFee(uint256 newFeeWei) external onlyOwner {\\n        mintFeeWei = newFeeWei;\\n        emit MintFeeUpdated(newFeeWei);\\n    }\\n\\n    /// @notice Sweep accumulated mint fees to a recipient. Owner-only.\\n    function sweepFees(address payable to) external onlyOwner {\\n        if (to == address(0)) revert Errors.ZeroAddress();\\n        uint256 bal = address(this).balance;\\n        (bool ok,) = to.call{ value: bal }(\\\"\\\");\\n        require(ok, Errors.TransferFailed());\\n        emit FeesSwept(to, bal);\\n    }\\n\\n    /// @notice Escape hatch. Hand Brain.sol ownership to a new minter\\n    ///         contract if we ever ship v2. Owner-only, irreversible.\\n    function transferBrainOwnership(address newOwner) external onlyOwner {\\n        if (newOwner == address(0)) revert Errors.ZeroAddress();\\n        BRAIN.transferOwnership(newOwner);\\n    }\\n\\n    /// @notice Accept pending ownership of Brain.sol. Permissionless because\\n    ///         Ownable2Step's acceptOwnership() reverts unless this contract\\n    ///         is already the pending owner. Used by the deploy script right\\n    ///         after Brain.transferOwnership(this) to complete the 2-step.\\n    function claimBrainOwnership() external {\\n        BRAIN.acceptOwnership();\\n    }\\n}\\n\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n\\n    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\"},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Context} from \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initial owner is set to the address provided by the deployer. This can\\n * later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    /**\\n     * @dev The caller account is not authorized to perform an operation.\\n     */\\n    error OwnableUnauthorizedAccount(address account);\\n\\n    /**\\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\\n     */\\n    error OwnableInvalidOwner(address owner);\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\\n     */\\n    constructor(address initialOwner) {\\n        if (initialOwner == address(0)) {\\n            revert OwnableInvalidOwner(address(0));\\n        }\\n        _transferOwnership(initialOwner);\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        _checkOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if the sender is not the owner.\\n     */\\n    function _checkOwner() internal view virtual {\\n        if (owner() != _msgSender()) {\\n            revert OwnableUnauthorizedAccount(_msgSender());\\n        }\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby disabling any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        if (newOwner == address(0)) {\\n            revert OwnableInvalidOwner(address(0));\\n        }\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\"},\"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Ownable} from \\\"./Ownable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * This extension of the {Ownable} contract includes a two-step mechanism to transfer\\n * ownership, where the new owner must call {acceptOwnership} in order to replace the\\n * old one. This can help prevent common mistakes, such as transfers of ownership to\\n * incorrect accounts, or to contracts that are unable to interact with the\\n * permission system.\\n *\\n * The initial owner is specified at deployment time in the constructor for `Ownable`. This\\n * can later be changed with {transferOwnership} and {acceptOwnership}.\\n *\\n * This module is used through inheritance. It will make available all functions\\n * from parent (Ownable).\\n */\\nabstract contract Ownable2Step is Ownable {\\n    address private _pendingOwner;\\n\\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Returns the address of the pending owner.\\n     */\\n    function pendingOwner() public view virtual returns (address) {\\n        return _pendingOwner;\\n    }\\n\\n    /**\\n     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\\n     * Can only be called by the current owner.\\n     *\\n     * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.\\n     */\\n    function transferOwnership(address newOwner) public virtual override onlyOwner {\\n        _pendingOwner = newOwner;\\n        emit OwnershipTransferStarted(owner(), newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual override {\\n        delete _pendingOwner;\\n        super._transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev The new owner accepts the ownership transfer.\\n     */\\n    function acceptOwnership() public virtual {\\n        address sender = _msgSender();\\n        if (pendingOwner() != sender) {\\n            revert OwnableUnauthorizedAccount(sender);\\n        }\\n        _transferOwnership(sender);\\n    }\\n}\\n\"}},\"language\":\"Solidity\",\"settings\":{\"viaIR\":true,\"metadata\":{\"appendCBOR\":true,\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":false},\"libraries\":{},\"optimizer\":{\"runs\":200,\"enabled\":true},\"evmVersion\":\"cancun\",\"remappings\":[\"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\"ens-contracts/=lib/ens-contracts/contracts/\",\"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/\"]}}","verify":{"address":"net16661:aargk63krnwctw11pcwkh8br25n2r0puayjttx83f6","name":"src/BrainMinter.sol:BrainMinter","language":"solidity","sourceCode":"{\"sources\":{\"src/lib/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\n// forgefmt: disable-start\\n//\\n//        ██████╗ ██████╗  █████╗ ██╗███╗   ██╗██████╗ ███████╗██████╗ ██╗ █████╗\\n//        ██╔══██╗██╔══██╗██╔══██╗██║████╗  ██║██╔══██╗██╔════╝██╔══██╗██║██╔══██╗\\n//        ██████╔╝██████╔╝███████║██║██╔██╗ ██║██████╔╝█████╗  ██║  ██║██║███████║\\n//        ██╔══██╗██╔══██╗██╔══██║██║██║╚██╗██║██╔═══╝ ██╔══╝  ██║  ██║██║██╔══██║\\n//        ██████╔╝██║  ██║██║  ██║██║██║ ╚████║██║     ███████╗██████╔╝██║██║  ██║\\n//        ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝╚═╝     ╚══════╝╚═════╝ ╚═╝╚═╝  ╚═╝\\n//\\n//        Specialty AI Brains as iNFTs · Agent-paid knowledge marketplace\\n//\\n// forgefmt: disable-end\\n\\n/// @title  Errors\\n/// @author Brainpedia Team\\n/// @notice Custom errors used across the Brainpedia contract suite.\\n/// @dev    Library of error declarations. Replaces every `require(cond, \\\"string\\\")`\\n///         in Brain, BrainOracle, BrainMinter, RoyaltyDistributor, SubnameRegistrar,\\n///         and AccessTokenRegistrar. Custom errors are gas-efficient and fully\\n///         typed for off-chain decoding.\\nlibrary Errors {\\n    // ----- Generic input validation -----\\n\\n    /// @notice Thrown when an address parameter is the zero address.\\n    error ZeroAddress();\\n\\n    /// @notice Thrown when an amount parameter is zero.\\n    error ZeroAmount();\\n\\n    /// @notice Thrown when two arrays that must be the same length are not.\\n    error LengthMismatch();\\n\\n    /// @notice Thrown when a native ETH transfer fails.\\n    error EthTransferFailed();\\n\\n    /// @notice Thrown when ECDSA recovery does not return the configured signer.\\n    error InvalidSignature();\\n\\n    // ----- Brain (ERC-7857 iNFT) -----\\n\\n    /// @notice Thrown when `msg.sender` is not the owner of the targeted tokenId.\\n    error NotBrainOwner();\\n\\n    /// @notice Thrown when authorizeUsage is called with msg.value below the\\n    ///         Brain's configured per-query minimum payment.\\n    error InsufficientPayment();\\n\\n    /// @notice Thrown when the per-query payment forward from the Brain contract\\n    ///         to the Brain owner fails (e.g., recipient is a contract that reverts\\n    ///         on receive).\\n    error PaymentForwardFailed();\\n\\n    /// @notice Thrown when a view function is called on a tokenId that has no\\n    ///         IntelligentData records yet (i.e., was never minted or was burned).\\n    error NoIntelligence();\\n\\n    // ----- ERC-7857 canonical transfer path -----\\n\\n    /// @notice Thrown when a caller invokes `transferFrom` or `safeTransferFrom`\\n    ///         directly. ERC-7857 mandates the oracle-attested `secureTransfer`\\n    ///         path so that the per-Brain symmetric key can be re-sealed for the\\n    ///         new owner. Standard ERC-721 transfers would leave the recipient\\n    ///         with an undecryptable Brain.\\n    error UseSecureTransfer();\\n\\n    /// @notice Thrown when secureTransfer is called before an oracle is set.\\n    error OracleNotSet();\\n\\n    /// @notice Thrown when the configured oracle rejects the supplied proof.\\n    error InvalidOracleProof();\\n\\n    // ----- BrainOracle attestation -----\\n\\n    /// @notice Thrown when verifyProof is called while the attestor is unset.\\n    error AttestorNotSet();\\n\\n    /// @notice Thrown when the EIP-712 TransferAttestation deadline has passed.\\n    error AttestationExpired();\\n\\n    /// @notice Thrown when the supplied oracle proof is malformed (e.g., too\\n    ///         short to ABI-decode as a TransferAttestation).\\n    error InvalidProofFormat();\\n\\n    // ----- BrainMinter anti-spam -----\\n\\n    /// @notice Thrown when mintToSender is called with msg.value below the\\n    ///         currently-configured anti-spam mint fee.\\n    error InsufficientFee();\\n\\n    /// @notice Thrown when an internal native-token transfer fails (fee sweep,\\n    ///         payment forward, refund).\\n    error TransferFailed();\\n\\n    // ----- RoyaltyDistributor -----\\n\\n    /// @notice Thrown when distribute() is called with msg.value below the\\n    ///         sum of per-Brain payment amounts.\\n    error InsufficientValue();\\n\\n    // ----- ENS subname + access-token registrars -----\\n\\n    /// @notice Thrown when a registrar tries to issue a subname whose label\\n    ///         hash is already registered.\\n    error LabelAlreadyTaken();\\n\\n    /// @notice Thrown when a subname text-record write is attempted by an\\n    ///         account that does not own the label.\\n    error NotLabelOwner();\\n\\n    /// @notice Thrown when a non-issuer account calls a function gated by\\n    ///         the issuer allow-list on AccessTokenRegistrar.\\n    error NotIssuer();\\n\\n    /// @notice Thrown when an AccessTokenRegistrar operation references a\\n    ///         label that has never been issued.\\n    error TokenNotFound();\\n\\n    /// @notice Thrown when an AccessTokenRegistrar operation references a\\n    ///         label whose TTL has elapsed.\\n    error TokenExpired();\\n}\\n\"},\"src/BrainMinter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\n// forgefmt: disable-start\\n//\\n//        ██████╗ ██████╗  █████╗ ██╗███╗   ██╗██████╗ ███████╗██████╗ ██╗ █████╗\\n//        ██╔══██╗██╔══██╗██╔══██╗██║████╗  ██║██╔══██╗██╔════╝██╔══██╗██║██╔══██╗\\n//        ██████╔╝██████╔╝███████║██║██╔██╗ ██║██████╔╝█████╗  ██║  ██║██║███████║\\n//        ██╔══██╗██╔══██╗██╔══██║██║██║╚██╗██║██╔═══╝ ██╔══╝  ██║  ██║██║██╔══██║\\n//        ██████╔╝██║  ██║██║  ██║██║██║ ╚████║██║     ███████╗██████╔╝██║██║  ██║\\n//        ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝╚═╝     ╚══════╝╚═════╝ ╚═╝╚═╝  ╚═╝\\n//\\n//        Specialty AI Brains as iNFTs · Agent-paid knowledge marketplace\\n//\\n// forgefmt: disable-end\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { Ownable2Step } from \\\"@openzeppelin/contracts/access/Ownable2Step.sol\\\";\\n\\nimport { Errors } from \\\"./lib/Errors.sol\\\";\\n\\ninterface IBrainMintable {\\n    function mint(\\n        address to,\\n        bytes32 initialStorageRoot,\\n        bytes calldata encryptedURI,\\n        bytes32 metadataHash,\\n        string calldata description,\\n        bytes calldata sealedKey\\n    ) external returns (uint256 tokenId);\\n\\n    function transferOwnership(address newOwner) external;\\n    function acceptOwnership() external;\\n}\\n\\n/// @title  BrainMinter\\n/// @author Brainpedia Team\\n/// @notice Owns Brain.sol (after Brain.transferOwnership(BrainMinter)) and\\n///         exposes a permissionless mint so anyone can self-onboard a Brain\\n///         from their own Obsidian vault. They call mintToSender() and the\\n///         minted iNFT is owned by msg.sender. No owner gating.\\n/// @dev    Brain.sol carries canonical ERC-7857 metadata: an encrypted URI\\n///         (private manifest on 0G Storage, sealed for the owner), a\\n///         metadata commit hash, and a sealed symmetric key emitted in the\\n///         KeySealed event for the new owner to decrypt off chain.\\n///\\n///         Optional anti-spam fee can be set by the wrapper's admin. Default\\n///         is 0 wei, so anyone can mint for gas only.\\n///\\n///         If we ever need to migrate again, this contract has its own\\n///         `transferBrainOwnership(newOwner)` which forwards the call to\\n///         Brain.transferOwnership. Escape hatch if BrainMinter v2 ships.\\ncontract BrainMinter is Ownable2Step {\\n    // ============ Immutables ============\\n\\n    IBrainMintable public immutable BRAIN;\\n\\n    // ============ Storage ============\\n\\n    /// @notice Anti-spam fee in wei. 0 = free.\\n    uint256 public mintFeeWei;\\n\\n    // ============ Events ============\\n\\n    event Minted(\\n        uint256 indexed tokenId,\\n        address indexed minter,\\n        bytes32 storageRoot,\\n        bytes32 metadataHash\\n    );\\n    event MintFeeUpdated(uint256 newFeeWei);\\n    event FeesSwept(address indexed to, uint256 amount);\\n\\n    // ============ Constructor ============\\n\\n    constructor(address brain_, uint256 initialFeeWei, address initialOwner)\\n        Ownable(initialOwner)\\n    {\\n        if (brain_ == address(0)) revert Errors.ZeroAddress();\\n        BRAIN = IBrainMintable(brain_);\\n        mintFeeWei = initialFeeWei;\\n    }\\n\\n    // ============ External: mint ============\\n\\n    /// @notice Mint a fresh Brain iNFT to msg.sender. Permissionless.\\n    /// @param  initialStorageRoot 0G Storage merkle root of the public snapshot\\n    /// @param  encryptedURI       encrypted ref to private metadata on 0G Storage\\n    ///                            (empty for public-only Brains)\\n    /// @param  metadataHash       keccak256 commit of the canonical plaintext\\n    ///                            metadata (zero hash for public-only Brains)\\n    /// @param  description        free-form (specialty / brief / etc.)\\n    /// @param  sealedKey          symmetric key sealed for msg.sender's pubkey\\n    ///                            (empty for public-only Brains)\\n    /// @return tokenId            the new token id (assigned by Brain.sol)\\n    function mintToSender(\\n        bytes32 initialStorageRoot,\\n        bytes calldata encryptedURI,\\n        bytes32 metadataHash,\\n        string calldata description,\\n        bytes calldata sealedKey\\n    ) external payable returns (uint256 tokenId) {\\n        require(msg.value >= mintFeeWei, Errors.InsufficientFee());\\n        tokenId = BRAIN.mint(\\n            msg.sender, initialStorageRoot, encryptedURI, metadataHash, description, sealedKey\\n        );\\n        emit Minted(tokenId, msg.sender, initialStorageRoot, metadataHash);\\n    }\\n\\n    // ============ External: admin ============\\n\\n    /// @notice Update anti-spam fee. Owner-only.\\n    function setMintFee(uint256 newFeeWei) external onlyOwner {\\n        mintFeeWei = newFeeWei;\\n        emit MintFeeUpdated(newFeeWei);\\n    }\\n\\n    /// @notice Sweep accumulated mint fees to a recipient. Owner-only.\\n    function sweepFees(address payable to) external onlyOwner {\\n        if (to == address(0)) revert Errors.ZeroAddress();\\n        uint256 bal = address(this).balance;\\n        (bool ok,) = to.call{ value: bal }(\\\"\\\");\\n        require(ok, Errors.TransferFailed());\\n        emit FeesSwept(to, bal);\\n    }\\n\\n    /// @notice Escape hatch. Hand Brain.sol ownership to a new minter\\n    ///         contract if we ever ship v2. Owner-only, irreversible.\\n    function transferBrainOwnership(address newOwner) external onlyOwner {\\n        if (newOwner == address(0)) revert Errors.ZeroAddress();\\n        BRAIN.transferOwnership(newOwner);\\n    }\\n\\n    /// @notice Accept pending ownership of Brain.sol. Permissionless because\\n    ///         Ownable2Step's acceptOwnership() reverts unless this contract\\n    ///         is already the pending owner. Used by the deploy script right\\n    ///         after Brain.transferOwnership(this) to complete the 2-step.\\n    function claimBrainOwnership() external {\\n        BRAIN.acceptOwnership();\\n    }\\n}\\n\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n\\n    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\"},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Context} from \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initial owner is set to the address provided by the deployer. This can\\n * later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    /**\\n     * @dev The caller account is not authorized to perform an operation.\\n     */\\n    error OwnableUnauthorizedAccount(address account);\\n\\n    /**\\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\\n     */\\n    error OwnableInvalidOwner(address owner);\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\\n     */\\n    constructor(address initialOwner) {\\n        if (initialOwner == address(0)) {\\n            revert OwnableInvalidOwner(address(0));\\n        }\\n        _transferOwnership(initialOwner);\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        _checkOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if the sender is not the owner.\\n     */\\n    function _checkOwner() internal view virtual {\\n        if (owner() != _msgSender()) {\\n            revert OwnableUnauthorizedAccount(_msgSender());\\n        }\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby disabling any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        if (newOwner == address(0)) {\\n            revert OwnableInvalidOwner(address(0));\\n        }\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\"},\"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Ownable} from \\\"./Ownable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * This extension of the {Ownable} contract includes a two-step mechanism to transfer\\n * ownership, where the new owner must call {acceptOwnership} in order to replace the\\n * old one. This can help prevent common mistakes, such as transfers of ownership to\\n * incorrect accounts, or to contracts that are unable to interact with the\\n * permission system.\\n *\\n * The initial owner is specified at deployment time in the constructor for `Ownable`. This\\n * can later be changed with {transferOwnership} and {acceptOwnership}.\\n *\\n * This module is used through inheritance. It will make available all functions\\n * from parent (Ownable).\\n */\\nabstract contract Ownable2Step is Ownable {\\n    address private _pendingOwner;\\n\\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Returns the address of the pending owner.\\n     */\\n    function pendingOwner() public view virtual returns (address) {\\n        return _pendingOwner;\\n    }\\n\\n    /**\\n     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\\n     * Can only be called by the current owner.\\n     *\\n     * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.\\n     */\\n    function transferOwnership(address newOwner) public virtual override onlyOwner {\\n        _pendingOwner = newOwner;\\n        emit OwnershipTransferStarted(owner(), newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual override {\\n        delete _pendingOwner;\\n        super._transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev The new owner accepts the ownership transfer.\\n     */\\n    function acceptOwnership() public virtual {\\n        address sender = _msgSender();\\n        if (pendingOwner() != sender) {\\n            revert OwnableUnauthorizedAccount(sender);\\n        }\\n        _transferOwnership(sender);\\n    }\\n}\\n\"}},\"language\":\"Solidity\",\"settings\":{\"viaIR\":true,\"metadata\":{\"appendCBOR\":true,\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":false},\"libraries\":{},\"optimizer\":{\"runs\":200,\"enabled\":true},\"evmVersion\":\"cancun\",\"remappings\":[\"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\"ens-contracts/=lib/ens-contracts/contracts/\",\"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/\"]}}","abi":"[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"brain_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialFeeWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"name\":\"InsufficientFee\",\"type\":\"error\",\"inputs\":[]},{\"name\":\"OwnableInvalidOwner\",\"type\":\"error\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"TransferFailed\",\"type\":\"error\",\"inputs\":[]},{\"name\":\"ZeroAddress\",\"type\":\"error\",\"inputs\":[]},{\"name\":\"FeesSwept\",\"type\":\"event\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"name\":\"MintFeeUpdated\",\"type\":\"event\",\"inputs\":[{\"name\":\"newFeeWei\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"name\":\"Minted\",\"type\":\"event\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"storageRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"metadataHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"name\":\"OwnershipTransferStarted\",\"type\":\"event\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"name\":\"OwnershipTransferred\",\"type\":\"event\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"name\":\"BRAIN\",\"type\":\"function\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contract IBrainMintable\"}],\"stateMutability\":\"view\"},{\"name\":\"acceptOwnership\",\"type\":\"function\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"claimBrainOwnership\",\"type\":\"function\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"mintFeeWei\",\"type\":\"function\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"name\":\"mintToSender\",\"type\":\"function\",\"inputs\":[{\"name\":\"initialStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"encryptedURI\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"metadataHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sealedKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"payable\"},{\"name\":\"owner\",\"type\":\"function\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"name\":\"pendingOwner\",\"type\":\"function\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"name\":\"renounceOwnership\",\"type\":\"function\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"setMintFee\",\"type\":\"function\",\"inputs\":[{\"name\":\"newFeeWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"sweepFees\",\"type\":\"function\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address payable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"transferBrainOwnership\",\"type\":\"function\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"name\":\"transferOwnership\",\"type\":\"function\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]","version":"0.8.30+commit.73712a01","evmVersion":"cancun","optimization":1,"runs":200,"libraries":[],"license":"None","constructorArgs":"0x0000000000000000000000008c2be2d73876ec7bd8a190f3317f3c6ca91d66d60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d24e06f0dbada268314dbcb97f48f87b85b6dd30","similarMatchAddress":null,"exactMatch":true,"similarMatchNetworkId":null,"crossSpace":false},"proxy":{},"beacon":{"verify":{}},"implementation":{"verify":{}},"destroy":{"status":0,"message":"deployed"},"isRegistered":true,"accountInfo":{"total":0,"map":{}}}}