From c5bad77e1cf57a62cfff941f915fb0776125d652 Mon Sep 17 00:00:00 2001 From: steven2308 Date: Fri, 1 Mar 2024 11:21:00 -0500 Subject: [PATCH] Adds new interface for extended catalog, to easily identify the new implementation. --- .../catalog/IRMRKCatalogExtended.sol | 71 ++++ .../{ => catalog}/RMRKCatalogFactory.sol | 0 .../{ => catalog}/RMRKCatalogImpl.sol | 52 ++- .../catalog/IRMRKCatalogExtended.md | 371 ++++++++++++++++++ .../{ => catalog}/RMRKCatalogFactory.md | 0 .../{ => catalog}/RMRKCatalogImpl.md | 12 +- hardhat.config.ts | 10 +- scripts/deploy-render-utils.ts | 34 ++ test/implementations/catalog.ts | 7 +- test/interfaces.ts | 64 +-- 10 files changed, 539 insertions(+), 82 deletions(-) create mode 100644 contracts/implementations/catalog/IRMRKCatalogExtended.sol rename contracts/implementations/{ => catalog}/RMRKCatalogFactory.sol (100%) rename contracts/implementations/{ => catalog}/RMRKCatalogImpl.sol (80%) create mode 100644 docs/implementations/catalog/IRMRKCatalogExtended.md rename docs/implementations/{ => catalog}/RMRKCatalogFactory.md (100%) rename docs/implementations/{ => catalog}/RMRKCatalogImpl.md (98%) create mode 100644 scripts/deploy-render-utils.ts diff --git a/contracts/implementations/catalog/IRMRKCatalogExtended.sol b/contracts/implementations/catalog/IRMRKCatalogExtended.sol new file mode 100644 index 00000000..e4a1b080 --- /dev/null +++ b/contracts/implementations/catalog/IRMRKCatalogExtended.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.21; + +import {IRMRKCatalog} from "../../RMRK/catalog/IRMRKCatalog.sol"; + +/** + * @title IRMRKCatalogExtended + * @author RMRK team + * @notice An extended interface for Catalog for RMRK equippable module. + */ +interface IRMRKCatalogExtended is IRMRKCatalog { + /** + * @notice From ERC7572 (Draft) Emitted when the contract-level metadata is updated + */ + event ContractURIUpdated(); + + /** + * @notice Emited when the type of the catalog is updated + * @param newType The new type of the catalog + */ + event TypeUpdated(string newType); + + /** + * @notice Used to get all the part IDs in the catalog. + * @dev Can get at least 10k parts. Higher limits were not tested. + * @dev It may fail if there are too many parts, in that case use either `getPaginatedPartIds` or `getTotalParts` and `getPartByIndex`. + * @return partIds An array of all the part IDs in the catalog + */ + function getAllPartIds() external view returns (uint64[] memory partIds); + + /** + * @notice Used to get all the part IDs in the catalog. + * @param offset The offset to start from + * @param limit The maximum number of parts to return + * @return partIds An array of all the part IDs in the catalog + */ + function getPaginatedPartIds( + uint256 offset, + uint256 limit + ) external view returns (uint64[] memory partIds); + + /** + * @notice Used to get the total number of parts in the catalog. + * @return totalParts The total number of parts in the catalog + */ + function getTotalParts() external view returns (uint256 totalParts); + + /** + * @notice Used to get a single `Part` by the index of its `partId`. + * @param index The index of the `partId`. + * @return part The `Part` struct associated with the `partId` at the given index + */ + function getPartByIndex( + uint256 index + ) external view returns (Part memory part); + + /** + * @notice Used to set the metadata URI of the catalog. + * @param newContractURI The new metadata URI + * @dev emits `ContractURIUpdated` event + */ + function setMetadataURI(string memory newContractURI) external; + + /** + * @notice Used to set the type of the catalog. + * @param newType The new type of the catalog + * @dev emits `TypeUpdated` event + */ + function setType(string memory newType) external; +} diff --git a/contracts/implementations/RMRKCatalogFactory.sol b/contracts/implementations/catalog/RMRKCatalogFactory.sol similarity index 100% rename from contracts/implementations/RMRKCatalogFactory.sol rename to contracts/implementations/catalog/RMRKCatalogFactory.sol diff --git a/contracts/implementations/RMRKCatalogImpl.sol b/contracts/implementations/catalog/RMRKCatalogImpl.sol similarity index 80% rename from contracts/implementations/RMRKCatalogImpl.sol rename to contracts/implementations/catalog/RMRKCatalogImpl.sol index 9056531a..450df7c0 100644 --- a/contracts/implementations/RMRKCatalogImpl.sol +++ b/contracts/implementations/catalog/RMRKCatalogImpl.sol @@ -2,8 +2,9 @@ pragma solidity ^0.8.21; -import {OwnableLock} from "../RMRK/access/OwnableLock.sol"; -import {RMRKCatalog} from "../RMRK/catalog/RMRKCatalog.sol"; +import {OwnableLock} from "../../RMRK/access/OwnableLock.sol"; +import {RMRKCatalog, IERC165} from "../../RMRK/catalog/RMRKCatalog.sol"; +import {IRMRKCatalogExtended} from "./IRMRKCatalogExtended.sol"; /** * @title RMRKCatalogImpl @@ -13,18 +14,7 @@ import {RMRKCatalog} from "../RMRK/catalog/RMRKCatalog.sol"; * This default implementation includes an OwnableLock dependency, which allows the deployer to freeze the state of the * catalog contract. */ -contract RMRKCatalogImpl is OwnableLock, RMRKCatalog { - /** - * @notice From ERC7572 (Draft) Emitted when the contract-level metadata is updated - */ - event ContractURIUpdated(); - - /** - * @notice Emited when the type of the catalog is updated - * @param newType The new type of the catalog - */ - event TypeUpdated(string newType); - +contract RMRKCatalogImpl is OwnableLock, RMRKCatalog, IRMRKCatalogExtended { /** * @notice Used to initialize the smart contract. * @param metadataURI Base metadata URI of the contract @@ -134,20 +124,14 @@ contract RMRKCatalogImpl is OwnableLock, RMRKCatalog { } /** - * @notice Used to get all the part IDs in the catalog. - * @dev Can get at least 10k parts. Higher limits were not tested. - * @dev It may fail if there are too many parts, in that case use either `getPaginatedPartIds` or `getTotalParts` and `getPartByIndex`. - * @return partIds An array of all the part IDs in the catalog + * @inheritdoc IRMRKCatalogExtended */ function getAllPartIds() public view returns (uint64[] memory partIds) { partIds = _partIds; } /** - * @notice Used to get all the part IDs in the catalog. - * @param offset The offset to start from - * @param limit The maximum number of parts to return - * @return partIds An array of all the part IDs in the catalog + * @inheritdoc IRMRKCatalogExtended */ function getPaginatedPartIds( uint256 offset, @@ -165,17 +149,14 @@ contract RMRKCatalogImpl is OwnableLock, RMRKCatalog { } /** - * @notice Used to get the total number of parts in the catalog. - * @return totalParts The total number of parts in the catalog + * @inheritdoc IRMRKCatalogExtended */ function getTotalParts() public view returns (uint256 totalParts) { totalParts = _partIds.length; } /** - * @notice Used to get a single `Part` by the index of its `partId`. - * @param index The index of the `partId`. - * @return part The `Part` struct associated with the `partId` at the given index + * @inheritdoc IRMRKCatalogExtended */ function getPartByIndex( uint256 index @@ -183,6 +164,9 @@ contract RMRKCatalogImpl is OwnableLock, RMRKCatalog { part = getPart(_partIds[index]); } + /** + * @inheritdoc IRMRKCatalogExtended + */ function setMetadataURI( string memory newContractURI ) public virtual onlyOwnerOrContributor { @@ -190,10 +174,24 @@ contract RMRKCatalogImpl is OwnableLock, RMRKCatalog { emit ContractURIUpdated(); } + /** + * @inheritdoc IRMRKCatalogExtended + */ function setType( string memory newType ) public virtual onlyOwnerOrContributor { _setType(newType); emit TypeUpdated(newType); } + + /** + * @inheritdoc IERC165 + */ + function supportsInterface( + bytes4 interfaceId + ) public view virtual override(RMRKCatalog, IERC165) returns (bool) { + return + interfaceId == type(IRMRKCatalogExtended).interfaceId || + super.supportsInterface(interfaceId); + } } diff --git a/docs/implementations/catalog/IRMRKCatalogExtended.md b/docs/implementations/catalog/IRMRKCatalogExtended.md new file mode 100644 index 00000000..e4971b76 --- /dev/null +++ b/docs/implementations/catalog/IRMRKCatalogExtended.md @@ -0,0 +1,371 @@ +# IRMRKCatalogExtended + +*RMRK team* + +> IRMRKCatalogExtended + +An extended interface for Catalog for RMRK equippable module. + + + +## Methods + +### checkIsEquippable + +```solidity +function checkIsEquippable(uint64 partId, address targetAddress) external view returns (bool isEquippable) +``` + +Used to check whether the given address is allowed to equip the desired `Part`. + +*Returns true if a collection may equip asset with `partId`.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| partId | uint64 | The ID of the part that we are checking | +| targetAddress | address | The address that we are checking for whether the part can be equipped into it or not | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| isEquippable | bool | The status indicating whether the `targetAddress` can be equipped into `Part` with `partId` or not | + +### checkIsEquippableToAll + +```solidity +function checkIsEquippableToAll(uint64 partId) external view returns (bool isEquippableToAll) +``` + +Used to check if the part is equippable by all addresses. + +*Returns true if part is equippable to all.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| partId | uint64 | ID of the part that we are checking | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| isEquippableToAll | bool | The status indicating whether the part with `partId` can be equipped by any address or not | + +### getAllPartIds + +```solidity +function getAllPartIds() external view returns (uint64[] partIds) +``` + +Used to get all the part IDs in the catalog. + +*Can get at least 10k parts. Higher limits were not tested.It may fail if there are too many parts, in that case use either `getPaginatedPartIds` or `getTotalParts` and `getPartByIndex`.* + + +#### Returns + +| Name | Type | Description | +|---|---|---| +| partIds | uint64[] | An array of all the part IDs in the catalog | + +### getMetadataURI + +```solidity +function getMetadataURI() external view returns (string) +``` + +Used to return the metadata URI of the associated Catalog. + + + + +#### Returns + +| Name | Type | Description | +|---|---|---| +| _0 | string | Catalog metadata URI | + +### getPaginatedPartIds + +```solidity +function getPaginatedPartIds(uint256 offset, uint256 limit) external view returns (uint64[] partIds) +``` + +Used to get all the part IDs in the catalog. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| offset | uint256 | The offset to start from | +| limit | uint256 | The maximum number of parts to return | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| partIds | uint64[] | An array of all the part IDs in the catalog | + +### getPart + +```solidity +function getPart(uint64 partId) external view returns (struct IRMRKCatalog.Part part) +``` + +Used to retrieve a `Part` with id `partId` + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| partId | uint64 | ID of the part that we are retrieving | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| part | IRMRKCatalog.Part | The `Part` struct associated with given `partId` | + +### getPartByIndex + +```solidity +function getPartByIndex(uint256 index) external view returns (struct IRMRKCatalog.Part part) +``` + +Used to get a single `Part` by the index of its `partId`. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| index | uint256 | The index of the `partId`. | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| part | IRMRKCatalog.Part | The `Part` struct associated with the `partId` at the given index | + +### getParts + +```solidity +function getParts(uint64[] partIds) external view returns (struct IRMRKCatalog.Part[] part) +``` + +Used to retrieve multiple parts at the same time. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| partIds | uint64[] | An array of part IDs that we want to retrieve | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| part | IRMRKCatalog.Part[] | An array of `Part` structs associated with given `partIds` | + +### getTotalParts + +```solidity +function getTotalParts() external view returns (uint256 totalParts) +``` + +Used to get the total number of parts in the catalog. + + + + +#### Returns + +| Name | Type | Description | +|---|---|---| +| totalParts | uint256 | The total number of parts in the catalog | + +### getType + +```solidity +function getType() external view returns (string) +``` + +Used to return the `itemType` of the associated Catalog + + + + +#### Returns + +| Name | Type | Description | +|---|---|---| +| _0 | string | `itemType` of the associated Catalog | + +### setMetadataURI + +```solidity +function setMetadataURI(string newContractURI) external nonpayable +``` + +Used to set the metadata URI of the catalog. + +*emits `ContractURIUpdated` event* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| newContractURI | string | The new metadata URI | + +### setType + +```solidity +function setType(string newType) external nonpayable +``` + +Used to set the type of the catalog. + +*emits `TypeUpdated` event* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| newType | string | The new type of the catalog | + +### supportsInterface + +```solidity +function supportsInterface(bytes4 interfaceId) external view returns (bool) +``` + + + +*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.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| interfaceId | bytes4 | undefined | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| _0 | bool | undefined | + + + +## Events + +### AddedEquippables + +```solidity +event AddedEquippables(uint64 indexed partId, address[] equippableAddresses) +``` + +Event to announce new equippables to the part. + +*It is emitted when new addresses are marked as equippable for `partId`.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| partId `indexed` | uint64 | ID of the part that had new equippable addresses added | +| equippableAddresses | address[] | An array of the new addresses that can equip this part | + +### AddedPart + +```solidity +event AddedPart(uint64 indexed partId, enum IRMRKCatalog.ItemType indexed itemType, uint8 zIndex, address[] equippableAddresses, string metadataURI) +``` + +Event to announce addition of a new part. + +*It is emitted when a new part is added.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| partId `indexed` | uint64 | ID of the part that was added | +| itemType `indexed` | enum IRMRKCatalog.ItemType | Enum value specifying whether the part is `None`, `Slot` and `Fixed` | +| zIndex | uint8 | An uint specifying the z value of the part. It is used to specify the depth which the part should be rendered at | +| equippableAddresses | address[] | An array of addresses that can equip this part | +| metadataURI | string | The metadata URI of the part | + +### ContractURIUpdated + +```solidity +event ContractURIUpdated() +``` + +From ERC7572 (Draft) Emitted when the contract-level metadata is updated + + + + +### SetEquippableToAll + +```solidity +event SetEquippableToAll(uint64 indexed partId) +``` + +Event to announce that a given part can be equipped by any address. + +*It is emitted when a given part is marked as equippable by any.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| partId `indexed` | uint64 | ID of the part marked as equippable by any address | + +### SetEquippables + +```solidity +event SetEquippables(uint64 indexed partId, address[] equippableAddresses) +``` + +Event to announce the overriding of equippable addresses of the part. + +*It is emitted when the existing list of addresses marked as equippable for `partId` is overwritten by a new one.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| partId `indexed` | uint64 | ID of the part whose list of equippable addresses was overwritten | +| equippableAddresses | address[] | The new, full, list of addresses that can equip this part | + +### TypeUpdated + +```solidity +event TypeUpdated(string newType) +``` + +Emited when the type of the catalog is updated + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| newType | string | The new type of the catalog | + + + diff --git a/docs/implementations/RMRKCatalogFactory.md b/docs/implementations/catalog/RMRKCatalogFactory.md similarity index 100% rename from docs/implementations/RMRKCatalogFactory.md rename to docs/implementations/catalog/RMRKCatalogFactory.md diff --git a/docs/implementations/RMRKCatalogImpl.md b/docs/implementations/catalog/RMRKCatalogImpl.md similarity index 98% rename from docs/implementations/RMRKCatalogImpl.md rename to docs/implementations/catalog/RMRKCatalogImpl.md index 1a8d44da..53f7ce1f 100644 --- a/docs/implementations/RMRKCatalogImpl.md +++ b/docs/implementations/catalog/RMRKCatalogImpl.md @@ -411,15 +411,15 @@ Locks the operation. function setMetadataURI(string newContractURI) external nonpayable ``` +Used to set the metadata URI of the catalog. - - +*emits `ContractURIUpdated` event* #### Parameters | Name | Type | Description | |---|---|---| -| newContractURI | string | undefined | +| newContractURI | string | The new metadata URI | ### setType @@ -427,15 +427,15 @@ function setMetadataURI(string newContractURI) external nonpayable function setType(string newType) external nonpayable ``` +Used to set the type of the catalog. - - +*emits `TypeUpdated` event* #### Parameters | Name | Type | Description | |---|---|---| -| newType | string | undefined | +| newType | string | The new type of the catalog | ### supportsInterface diff --git a/hardhat.config.ts b/hardhat.config.ts index 5e6c743e..9fbe7c1e 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -91,7 +91,7 @@ const config: HardhatUserConfig = { url: process.env.ETHEREUM_URL || 'https://eth.drpc.org', chainId: 1, accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], - gasPrice: 27000000000, + gasPrice: 55000000000, }, polygon: { url: process.env.POLYGON_URL || 'https://polygon.drpc.org', @@ -168,16 +168,16 @@ const config: HardhatUserConfig = { network: 'shibuya', chainId: 81, urls: { - apiURL: 'https://blockscout.com/shibuya/api', - browserURL: 'https://blockscout.com/shibuya', + apiURL: 'https://shibuya.blockscout.com//api', + browserURL: 'https://shibuya.blockscout.com/', }, }, { network: 'astar', chainId: 592, urls: { - apiURL: 'https://blockscout.com/astar/api', - browserURL: 'https://blockscout.com/astar/', + apiURL: 'https://astar.blockscout.com/api', + browserURL: 'https://astar.blockscout.com/', }, }, { diff --git a/scripts/deploy-render-utils.ts b/scripts/deploy-render-utils.ts new file mode 100644 index 00000000..ddca88b8 --- /dev/null +++ b/scripts/deploy-render-utils.ts @@ -0,0 +1,34 @@ +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { ethers, run } from 'hardhat'; +import { sleep } from './utils'; + +async function main() { + const accounts: SignerWithAddress[] = await ethers.getSigners(); + const owner = accounts[0]; + console.log(`Deployer address: ${owner.address}`); + + // Calculate future address: + const deployerNonce = await owner.getNonce(); + const futureAddress = ethers.getCreateAddress({ from: owner.address, nonce: deployerNonce }); + console.log(`Render utils will be deployed to: ${futureAddress}`); + + // We get the contract to deploy + const renderUtilsFactory = await ethers.getContractFactory('RMRKEquipRenderUtils'); + const renderUtils = await renderUtilsFactory.deploy(); + await renderUtils.waitForDeployment(); + + console.log('RMRK Equip Render Utils deployed to:', await renderUtils.getAddress()); + await sleep(1000); + + await run('verify:verify', { + address: await renderUtils.getAddress(), + constructorArguments: [], + }); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/test/implementations/catalog.ts b/test/implementations/catalog.ts index 60ba0291..4d366f75 100644 --- a/test/implementations/catalog.ts +++ b/test/implementations/catalog.ts @@ -4,6 +4,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { RMRKCatalogImpl } from '../../typechain-types'; import shouldBehaveLikeCatalog from '../behavior/catalog'; +import { IRMRKCatalogExtended } from '../interfaces'; async function catalogFixture(): Promise { const factory = await ethers.getContractFactory('RMRKCatalogImpl'); @@ -98,12 +99,16 @@ describe('CatalogImpl', async () => { }).timeout(120000); }); - describe('Permissions', async () => { + describe('Interface and Permissions', async () => { beforeEach(async () => { [owner, contributor, other] = await ethers.getSigners(); catalog = await loadFixture(catalogFixture); }); + it('supports catalog interface', async function () { + expect(await catalog.supportsInterface(IRMRKCatalogExtended)).to.equal(true); + }); + it('cannot do admin operations if not owner or contributor', async function () { await expect( catalog.connect(other).addPart({ partId: partId, part: partData }), diff --git a/test/interfaces.ts b/test/interfaces.ts index e94be910..1db845b6 100644 --- a/test/interfaces.ts +++ b/test/interfaces.ts @@ -1,43 +1,21 @@ -const IERC165 = '0x01ffc9a7'; -const IERC721 = '0x80ac58cd'; -const IERC721Metadata = '0x5b5e139f'; -const IERC2981 = '0x2a55205a'; // Royalties -const IERC5773 = '0x06b4329a'; // MultiAsset -const IERC6220 = '0x28bc9ae4'; // Equippable and Composable -const IERC6454 = '0x91a6262f'; // Soulbound -const IERC7401 = '0x42b0e56f'; // Nestable -const IERC7409 = '0x1b3327ab'; // Emotes Repository -const IERC7508 = '0x29b20880'; // Attributes Repository -const IERC7590 = '0x6f87c75c'; // ERC20 Token Holder -const IOtherInterface = '0xffffffff'; -const IRMRKCatalog = '0xd912401f'; // ERC6220 -const IRMRKImplementation = '0x524D524B'; // "RMRK" in ASCII hex -const IRMRKMultiAssetAutoIndex = '0x1cf132fe'; -const IRMRKNestableAutoIndex = '0x1884d52d'; -const IRMRKReclaimableChild = '0x2fb59acf'; -const IRMRKRevealable = '0x4be9cc42'; -const IRMRKRevealer = '0xf9296b16'; -const IRMRKTypedMultiAsset = '0x7f7bb665'; - -export { - IERC165, - IERC7590, - IERC721, - IERC721Metadata, - IOtherInterface, - IRMRKCatalog, - IERC7409, - IERC2981, - IERC6220, - IERC5773, - IERC7401, - IRMRKNestableAutoIndex, - IRMRKMultiAssetAutoIndex, - IRMRKReclaimableChild, - IERC6454, - IRMRKTypedMultiAsset, - IERC7508, - IRMRKImplementation, - IRMRKRevealable, - IRMRKRevealer, -}; +export const IERC165 = '0x01ffc9a7'; +export const IERC721 = '0x80ac58cd'; +export const IERC721Metadata = '0x5b5e139f'; +export const IERC2981 = '0x2a55205a'; // Royalties +export const IERC5773 = '0x06b4329a'; // MultiAsset +export const IERC6220 = '0x28bc9ae4'; // Equippable and Composable +export const IERC6454 = '0x91a6262f'; // Soulbound +export const IERC7401 = '0x42b0e56f'; // Nestable +export const IERC7409 = '0x1b3327ab'; // Emotes Repository +export const IERC7508 = '0x29b20880'; // Attributes Repository +export const IERC7590 = '0x6f87c75c'; // ERC20 Token Holder +export const IOtherInterface = '0xffffffff'; +export const IRMRKCatalog = '0xd912401f'; // ERC6220 +export const IRMRKCatalogExtended = '0xbe1dfb42'; +export const IRMRKImplementation = '0x524D524B'; // "RMRK" in ASCII hex +export const IRMRKMultiAssetAutoIndex = '0x1cf132fe'; +export const IRMRKNestableAutoIndex = '0x1884d52d'; +export const IRMRKReclaimableChild = '0x2fb59acf'; +export const IRMRKRevealable = '0x4be9cc42'; +export const IRMRKRevealer = '0xf9296b16'; +export const IRMRKTypedMultiAsset = '0x7f7bb665';