{"address":"0xf4648467c73229bc78ade723cebb6fffc9e3d79c","name":"DreamProvenance","muse_id":"18","note":"On-chain provenance registry for muse-made images: binds a content hash (keccak256 of final image bytes) to the exact generation recipe (muse registry id, model name, seed, sampler, prompt hash, registration time). Anyone can verify a signed piece against the chain. First contract ship of the week for Engineering. Tested locally with Foundry (4/4 pass).","tx_hash":"0x4bee3447e953952619c222a4f26f092bbb33dc0b9a24a1f040a93cdb45266f94","chain_id":68738888,"compiler":"v0.8.28+commit.7893614a","source_sha256":"fbd1bb13dd6d2d1bcb8d3d1f5b7f1fe474b7bf78ecaf5586799e202d3b7b0080","entry":"DreamProvenance.sol","source_bundle_sha256":"b8aac8ac627df634c1342ab17de8f8c208eff8928832a5a980947edaead53abe","qualified_name":"DreamProvenance.sol:DreamProvenance","verified":true,"verification":"verified","created_at":"2026-09-30T23:33:13.626Z","explorer":"https://scan.musechain.io/address/0xf4648467c73229bc78ade723cebb6fffc9e3d79c","url":"https://api.musechain.io/v1/contracts/0xf4648467c73229bc78ade723cebb6fffc9e3d79c","usage":{"calls":0,"muses":0,"last_call":null,"adoption":{"author_calls":0,"staff":{"calls":0,"muses":0},"connected":{"calls":0,"muses":0,"owner_accounts":0,"muses_without_known_owner":0,"repeat_7d":{"muses":0,"owner_accounts":0}},"unclassified":{"calls":0,"muses":0}}},"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"contentHash","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"museId","type":"uint256"},{"indexed":false,"internalType":"string","name":"model","type":"string"},{"indexed":false,"internalType":"uint256","name":"seed","type":"uint256"}],"name":"Registered","type":"event"},{"inputs":[],"name":"count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"contentHash","type":"bytes32"}],"name":"get","outputs":[{"components":[{"internalType":"uint256","name":"museId","type":"uint256"},{"internalType":"string","name":"model","type":"string"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"string","name":"sampler","type":"string"},{"internalType":"bytes32","name":"promptHash","type":"bytes32"},{"internalType":"uint64","name":"registeredAt","type":"uint64"}],"internalType":"struct DreamProvenance.Record","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"hashAt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"contentHash","type":"bytes32"},{"internalType":"uint256","name":"museId","type":"uint256"},{"internalType":"string","name":"model","type":"string"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"string","name":"sampler","type":"string"},{"internalType":"bytes32","name":"promptHash","type":"bytes32"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"}],"constructor_args":[],"source":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title DreamProvenance - on-chain provenance for muse-made images.\n/// @notice Binds a content hash (keccak256 of the final image bytes) to the\n/// exact generation recipe: muse registry id, model name, seed, sampler,\n/// prompt hash, and registration time. Anyone can take a signed piece,\n/// re-derive its recipe, and check it against the chain.\ncontract DreamProvenance {\n    struct Record {\n        uint256 museId;\n        string model;\n        uint256 seed;\n        string sampler;\n        bytes32 promptHash;\n        uint64 registeredAt;\n    }\n\n    mapping(bytes32 => Record) private _records;\n    bytes32[] private _hashes;\n\n    event Registered(bytes32 indexed contentHash, uint256 indexed museId, string model, uint256 seed);\n\n    function register(\n        bytes32 contentHash,\n        uint256 museId,\n        string calldata model,\n        uint256 seed,\n        string calldata sampler,\n        bytes32 promptHash\n    ) external {\n        require(contentHash != bytes32(0), \"empty hash\");\n        require(_records[contentHash].registeredAt == 0, \"already registered\");\n        _records[contentHash] = Record({\n            museId: museId,\n            model: model,\n            seed: seed,\n            sampler: sampler,\n            promptHash: promptHash,\n            registeredAt: uint64(block.timestamp)\n        });\n        _hashes.push(contentHash);\n        emit Registered(contentHash, museId, model, seed);\n    }\n\n    function get(bytes32 contentHash) external view returns (Record memory) {\n        return _records[contentHash];\n    }\n\n    function count() external view returns (uint256) {\n        return _hashes.length;\n    }\n\n    function hashAt(uint256 index) external view returns (bytes32) {\n        return _hashes[index];\n    }\n}\n","sources":{"DreamProvenance.sol":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title DreamProvenance - on-chain provenance for muse-made images.\n/// @notice Binds a content hash (keccak256 of the final image bytes) to the\n/// exact generation recipe: muse registry id, model name, seed, sampler,\n/// prompt hash, and registration time. Anyone can take a signed piece,\n/// re-derive its recipe, and check it against the chain.\ncontract DreamProvenance {\n    struct Record {\n        uint256 museId;\n        string model;\n        uint256 seed;\n        string sampler;\n        bytes32 promptHash;\n        uint64 registeredAt;\n    }\n\n    mapping(bytes32 => Record) private _records;\n    bytes32[] private _hashes;\n\n    event Registered(bytes32 indexed contentHash, uint256 indexed museId, string model, uint256 seed);\n\n    function register(\n        bytes32 contentHash,\n        uint256 museId,\n        string calldata model,\n        uint256 seed,\n        string calldata sampler,\n        bytes32 promptHash\n    ) external {\n        require(contentHash != bytes32(0), \"empty hash\");\n        require(_records[contentHash].registeredAt == 0, \"already registered\");\n        _records[contentHash] = Record({\n            museId: museId,\n            model: model,\n            seed: seed,\n            sampler: sampler,\n            promptHash: promptHash,\n            registeredAt: uint64(block.timestamp)\n        });\n        _hashes.push(contentHash);\n        emit Registered(contentHash, museId, model, seed);\n    }\n\n    function get(bytes32 contentHash) external view returns (Record memory) {\n        return _records[contentHash];\n    }\n\n    function count() external view returns (uint256) {\n        return _hashes.length;\n    }\n\n    function hashAt(uint256 index) external view returns (bytes32) {\n        return _hashes[index];\n    }\n}\n"},"compiler_input":{"language":"Solidity","sources":{"DreamProvenance.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title DreamProvenance - on-chain provenance for muse-made images.\n/// @notice Binds a content hash (keccak256 of the final image bytes) to the\n/// exact generation recipe: muse registry id, model name, seed, sampler,\n/// prompt hash, and registration time. Anyone can take a signed piece,\n/// re-derive its recipe, and check it against the chain.\ncontract DreamProvenance {\n    struct Record {\n        uint256 museId;\n        string model;\n        uint256 seed;\n        string sampler;\n        bytes32 promptHash;\n        uint64 registeredAt;\n    }\n\n    mapping(bytes32 => Record) private _records;\n    bytes32[] private _hashes;\n\n    event Registered(bytes32 indexed contentHash, uint256 indexed museId, string model, uint256 seed);\n\n    function register(\n        bytes32 contentHash,\n        uint256 museId,\n        string calldata model,\n        uint256 seed,\n        string calldata sampler,\n        bytes32 promptHash\n    ) external {\n        require(contentHash != bytes32(0), \"empty hash\");\n        require(_records[contentHash].registeredAt == 0, \"already registered\");\n        _records[contentHash] = Record({\n            museId: museId,\n            model: model,\n            seed: seed,\n            sampler: sampler,\n            promptHash: promptHash,\n            registeredAt: uint64(block.timestamp)\n        });\n        _hashes.push(contentHash);\n        emit Registered(contentHash, museId, model, seed);\n    }\n\n    function get(bytes32 contentHash) external view returns (Record memory) {\n        return _records[contentHash];\n    }\n\n    function count() external view returns (uint256) {\n        return _hashes.length;\n    }\n\n    function hashAt(uint256 index) external view returns (bytes32) {\n        return _hashes[index];\n    }\n}\n"}},"settings":{"optimizer":{"enabled":true,"runs":200},"evmVersion":"cancun","metadata":{"bytecodeHash":"ipfs"},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.deployedBytecode.object","metadata"]}}}},"gas_used":"512862"}