diff --git a/.changeset/fluffy-bananas-add.md b/.changeset/fluffy-bananas-add.md new file mode 100644 index 00000000000..2bc4d6a61c3 --- /dev/null +++ b/.changeset/fluffy-bananas-add.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`IERC7572`: Add interface to support contract-level metadata. diff --git a/contracts/interfaces/draft-IERC6909.sol b/contracts/interfaces/draft-IERC6909.sol index c6d550d6536..0feafc380dd 100644 --- a/contracts/interfaces/draft-IERC6909.sol +++ b/contracts/interfaces/draft-IERC6909.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.20; import {IERC165} from "../utils/introspection/IERC165.sol"; +import {IERC7572} from "./draft-IERC7572.sol"; /** * @dev Required interface of an ERC-6909 compliant contract, as defined in the @@ -102,12 +103,7 @@ interface IERC6909Metadata is IERC6909 { /** * @dev Optional extension of {IERC6909} that adds content URI functions. */ -interface IERC6909ContentURI is IERC6909 { - /** - * @dev Returns URI for the contract. - */ - function contractURI() external view returns (string memory); - +interface IERC6909ContentURI is IERC6909, IERC7572 { /** * @dev Returns the URI for the token of type `id`. */ diff --git a/contracts/interfaces/draft-IERC7572.sol b/contracts/interfaces/draft-IERC7572.sol new file mode 100644 index 00000000000..a3dff931a53 --- /dev/null +++ b/contracts/interfaces/draft-IERC7572.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/draft-IERC7572.sol) + +pragma solidity ^0.8.20; + +/// @title ERC-7572 Contract Level Metadata +/// @dev Required interface of an ERC-7572 compliant contract, as defined in the +/// https://eips.ethereum.org/EIPS/eip-7572[ERC]. +interface IERC7572 { + /// @dev This event should be emitted on updates to the contract metadata + /// to indicate to offchain indexers that they should query the contract + /// for the latest URI. + event ContractURIUpdated(); + + /// @dev Returns an offchain resource for contract metadata or onchain JSON + /// data string (data:application/json;utf8,{}). + function contractURI() external view returns (string memory); +} diff --git a/contracts/token/ERC6909/extensions/draft-ERC6909ContentURI.sol b/contracts/token/ERC6909/extensions/draft-ERC6909ContentURI.sol index 9d082c06664..d9a1ebb11e5 100644 --- a/contracts/token/ERC6909/extensions/draft-ERC6909ContentURI.sol +++ b/contracts/token/ERC6909/extensions/draft-ERC6909ContentURI.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.20; import {ERC6909} from "../draft-ERC6909.sol"; +import {IERC7572} from "../../../interfaces/draft-IERC7572.sol"; import {IERC6909ContentURI} from "../../../interfaces/draft-IERC6909.sol"; /** @@ -13,13 +14,10 @@ contract ERC6909ContentURI is ERC6909, IERC6909ContentURI { string private _contractURI; mapping(uint256 id => string) private _tokenURIs; - /// @dev Event emitted when the contract URI is changed. See https://eips.ethereum.org/EIPS/eip-7572[ERC-7572] for details. - event ContractURIUpdated(); - /// @dev See {IERC1155-URI} event URI(string value, uint256 indexed id); - /// @inheritdoc IERC6909ContentURI + /// @inheritdoc IERC7572 function contractURI() public view virtual override returns (string memory) { return _contractURI; }