编译器
0.8.21+commit.d9974bed
文件 1 的 8:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 8:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 3 的 8:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool _approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
文件 4 的 8:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 5 的 8:IMintWithAssets.sol
pragma solidity ^0.8.21;
interface IMintWithAssets {
function mintWithAssets(address to, uint64[] memory assetIds) external;
function nestMintWithAssets(
address parentContract,
uint256 destinationId,
uint64[] memory assetIds
) external;
}
文件 6 的 8:Migrator.sol
pragma solidity ^0.8.21;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@rmrk-team/evm-contracts/contracts/RMRK/access/Ownable.sol";
import "./interfaces/IMintWithAssets.sol";
error AlreadyMigrated();
error ItemNeverConfigured();
error ItemPreviouslyConfigured();
error MigrationNotAvailable();
error NothingToMigrate();
error NotMapper();
contract Migrator is Ownable, IERC721Receiver {
event KanariaMigrated(uint256 indexed kanariaId, address indexed owner);
event ItemMigrated(
uint256 indexed kanariaId,
address indexed owner,
address contractAddress,
uint64[] itemsAssetIds
);
event EvmToSubstrateAddressSet(
address indexed evmAddress,
string indexed substrateAddress
);
event EvmToSubstrateAddressReset(
address indexed evmAddress,
string indexed substrateAddress
);
struct ItemWithAssets {
address contractAddress;
uint64[] assetIds;
}
struct ItemWithAssetsAndId {
address contractAddress;
uint64[] assetIds;
uint256 itemId;
}
struct ItemInputConfig {
address owner;
ItemWithAssetsAndId[] itemsWithAssets;
}
struct KanariaMigrationConfig {
uint256 kanariaId;
address owner;
ItemWithAssets[] items;
}
mapping(uint256 kanariaId => uint256 migrated)
private _kanariaMigrationState;
mapping(uint256 kanariaId => address owner) private _kanariaOwners;
mapping(uint256 kanariaId => ItemWithAssets[] items)
private _kanariaItemsWithAssets;
mapping(address owner => ItemWithAssetsAndId[])
private _unnestedItemsMigrationConfig;
mapping(uint256 itemId => uint256 configured)
private _unnestedItemsConfiguredIds;
address private _kanaria;
address private _kanariaHolder;
address private _mapper;
mapping(address evm => string substrate) private _evmToSubstrate;
mapping(string substrate => address evm) private _substrateToEvm;
constructor(address kanaria) {
_kanaria = kanaria;
}
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external pure override returns (bytes4) {
return this.onERC721Received.selector;
}
function configureKanariaMigrations(
KanariaMigrationConfig[] calldata kanariaMigrationConfigs
) public onlyOwnerOrContributor {
uint256 length = kanariaMigrationConfigs.length;
for (uint256 i; i < length; ) {
KanariaMigrationConfig memory config = kanariaMigrationConfigs[i];
uint256 kanariaId = config.kanariaId;
if (_kanariaMigrationState[kanariaId] == 1)
revert AlreadyMigrated();
_kanariaOwners[kanariaId] = config.owner;
ItemWithAssets[] memory items = config.items;
delete _kanariaItemsWithAssets[kanariaId];
uint256 itemsLength = items.length;
for (uint256 j; j < itemsLength; ) {
_kanariaItemsWithAssets[kanariaId].push(items[j]);
unchecked {
++j;
}
}
unchecked {
++i;
}
}
}
function configureItemMigrations(
ItemInputConfig[] calldata itemsConfig
) public onlyOwnerOrContributor {
uint256 length = itemsConfig.length;
for (uint256 i; i < length; ) {
ItemWithAssetsAndId[] memory items = itemsConfig[i].itemsWithAssets;
address owner = itemsConfig[i].owner;
for (uint256 j; j < items.length; ) {
ItemWithAssetsAndId memory item = items[j];
uint256 itemId = item.itemId;
if (_unnestedItemsConfiguredIds[itemId] == 1)
revert ItemPreviouslyConfigured();
_unnestedItemsConfiguredIds[itemId] = 1;
_unnestedItemsMigrationConfig[owner].push(item);
unchecked {
++j;
}
}
unchecked {
++i;
}
}
}
function updateItemConfiguration(
address owner,
uint256 itemId,
address contractAddress,
uint64[] memory assetIds
) public onlyOwnerOrContributor {
if (_unnestedItemsConfiguredIds[itemId] == 0)
revert ItemNeverConfigured();
uint256 length = _unnestedItemsMigrationConfig[owner].length;
bool found;
for (uint256 i; i < length; ) {
if (_unnestedItemsMigrationConfig[owner][i].itemId == itemId) {
found = true;
_unnestedItemsMigrationConfig[owner][i] = ItemWithAssetsAndId({
contractAddress: contractAddress,
assetIds: assetIds,
itemId: itemId
});
break;
}
unchecked {
++i;
}
}
if (!found) revert AlreadyMigrated();
}
function getConfigForKanarias(
uint256[] memory kanariaIds
) public view returns (KanariaMigrationConfig[] memory) {
KanariaMigrationConfig[] memory configs = new KanariaMigrationConfig[](
kanariaIds.length
);
for (uint256 i; i < kanariaIds.length; ) {
configs[i] = KanariaMigrationConfig({
kanariaId: kanariaIds[i],
owner: _kanariaOwners[kanariaIds[i]],
items: _kanariaItemsWithAssets[kanariaIds[i]]
});
unchecked {
++i;
}
}
return configs;
}
function getMigratedStateForKanarias(
uint256[] memory kanariaIds
) public view returns (bool[] memory) {
bool[] memory states = new bool[](kanariaIds.length);
for (uint256 i; i < kanariaIds.length; ) {
states[i] = _kanariaMigrationState[kanariaIds[i]] == 1;
unchecked {
++i;
}
}
return states;
}
function getConfigForItems(
address[] memory owners
) public view returns (ItemWithAssetsAndId[][] memory configs) {
uint256 length = owners.length;
configs = new ItemWithAssetsAndId[][](length);
for (uint256 i; i < length; ) {
configs[i] = _unnestedItemsMigrationConfig[owners[i]];
unchecked {
++i;
}
}
return configs;
}
function getTotalItemsToMigrateForOwners(
address[] memory owners
) public view returns (uint256[] memory total) {
uint256 length = owners.length;
total = new uint256[](length);
for (uint256 i; i < length; ) {
total[i] = _unnestedItemsMigrationConfig[owners[i]].length;
unchecked {
++i;
}
}
}
function migrateKanarias(uint256[] calldata kanariaIds) public {
for (uint256 i; i < kanariaIds.length; ) {
_migrateKanaria(kanariaIds[i]);
unchecked {
++i;
}
}
}
function _migrateKanaria(uint256 kanariaId) private {
address owner = _kanariaOwners[kanariaId];
ItemWithAssets[] memory items = _kanariaItemsWithAssets[kanariaId];
if (owner == address(0)) revert MigrationNotAvailable();
if (_kanariaMigrationState[kanariaId] == 1) revert AlreadyMigrated();
_kanariaMigrationState[kanariaId] = 1;
for (uint256 i; i < items.length; ) {
ItemWithAssets memory item = items[i];
IMintWithAssets(item.contractAddress).nestMintWithAssets(
_kanaria,
kanariaId,
item.assetIds
);
emit ItemMigrated(
kanariaId,
owner,
item.contractAddress,
item.assetIds
);
unchecked {
++i;
}
}
IERC721(_kanaria).transferFrom(_kanariaHolder, owner, kanariaId);
emit KanariaMigrated(kanariaId, owner);
}
function migrateItems(address owner, uint256 amount) public {
uint256 length = _unnestedItemsMigrationConfig[owner].length;
if (length == 0) revert NothingToMigrate();
amount = amount > length ? length : amount;
for (uint256 i; i < amount; ) {
uint256 lastIndex = length - i - 1;
ItemWithAssetsAndId memory item = _unnestedItemsMigrationConfig[
owner
][lastIndex];
_unnestedItemsMigrationConfig[owner].pop();
IMintWithAssets(item.contractAddress).mintWithAssets(
owner,
item.assetIds
);
emit ItemMigrated(0, owner, item.contractAddress, item.assetIds);
unchecked {
++i;
}
}
}
function getKanariaAddress() public view returns (address) {
return _kanaria;
}
function getKanariaHolderAddress() public view returns (address) {
return _kanariaHolder;
}
function setKanariaHolderAddress(
address kanariaHolder
) external onlyOwnerOrContributor {
_kanariaHolder = kanariaHolder;
}
function getMapperAddress() public view returns (address) {
return _mapper;
}
function setMapperAddress(address mapper) external onlyOwnerOrContributor {
_mapper = mapper;
}
function setSubstrateAddress(
address evm,
string memory substrateAddress
) external {
if (msg.sender != _mapper) revert NotMapper();
_evmToSubstrate[evm] = substrateAddress;
_substrateToEvm[substrateAddress] = evm;
emit EvmToSubstrateAddressSet(evm, substrateAddress);
}
function resetSubstrateAddress(
address evm,
string memory substrateAddress
) external {
if (msg.sender != _mapper) revert NotMapper();
delete _evmToSubstrate[evm];
delete _substrateToEvm[substrateAddress];
emit EvmToSubstrateAddressReset(evm, substrateAddress);
}
function batchGetSubstrateAddresses(
address[] memory evmAddress
) public view returns (string[] memory substrateAddresses) {
substrateAddresses = new string[](evmAddress.length);
for (uint256 i; i < evmAddress.length; ) {
substrateAddresses[i] = _evmToSubstrate[evmAddress[i]];
unchecked {
++i;
}
}
}
function batchGetEvmAddresses(
string[] memory substrateAddress
) public view returns (address[] memory evmAddresses) {
evmAddresses = new address[](substrateAddress.length);
for (uint256 i; i < substrateAddress.length; ) {
evmAddresses[i] = _substrateToEvm[substrateAddress[i]];
unchecked {
++i;
}
}
}
}
文件 7 的 8:Ownable.sol
pragma solidity ^0.8.21;
import "@openzeppelin/contracts/utils/Context.sol";
import "../library/RMRKErrors.sol";
contract Ownable is Context {
address private _owner;
mapping(address => uint256) private _contributors;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
event ContributorUpdate(address indexed contributor, bool isContributor);
modifier onlyOwnerOrContributor() {
_onlyOwnerOrContributor();
_;
}
modifier onlyOwner() {
_onlyOwner();
_;
}
constructor() {
_transferOwnership(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) revert RMRKNewOwnerIsZeroAddress();
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
function manageContributor(
address contributor,
bool grantRole
) external onlyOwner {
if (contributor == address(0)) revert RMRKNewContributorIsZeroAddress();
grantRole
? _contributors[contributor] = 1
: _contributors[contributor] = 0;
emit ContributorUpdate(contributor, grantRole);
}
function isContributor(address contributor) public view returns (bool) {
return _contributors[contributor] == 1;
}
function _onlyOwnerOrContributor() private view {
if (owner() != _msgSender() && !isContributor(_msgSender()))
revert RMRKNotOwnerOrContributor();
}
function _onlyOwner() private view {
if (owner() != _msgSender()) revert RMRKNotOwner();
}
}
文件 8 的 8:RMRKErrors.sol
pragma solidity ^0.8.21;
error ERC721AddressZeroIsNotaValidOwner();
error ERC721ApprovalToCurrentOwner();
error ERC721ApproveCallerIsNotOwnerNorApprovedForAll();
error ERC721ApprovedQueryForNonexistentToken();
error ERC721ApproveToCaller();
error ERC721InvalidTokenId();
error ERC721MintToTheZeroAddress();
error ERC721NotApprovedOrOwner();
error ERC721TokenAlreadyMinted();
error ERC721TransferFromIncorrectOwner();
error ERC721TransferToNonReceiverImplementer();
error ERC721TransferToTheZeroAddress();
error RMRKApprovalForAssetsToCurrentOwner();
error RMRKApproveForAssetsCallerIsNotOwnerNorApprovedForAll();
error RMRKBadConfig();
error RMRKBadPriorityListLength();
error RMRKCatalogRequiredForParts();
error RMRKCannotTransferSoulbound();
error RMRKChildAlreadyExists();
error RMRKChildIndexOutOfRange();
error RMRKChildNotFoundInParent();
error RMRKCollaboratorArraysNotEqualLength();
error RMRKCollectionAlreadyRegistered();
error RMRKCollectionNotRegistered();
error RMRKEquippableEquipNotAllowedByCatalog();
error RMRKExpiredDeadline();
error RMRKIdZeroForbidden();
error RMRKIndexOutOfRange();
error RMRKInvalidChildReclaim();
error RMRKInvalidSignature();
error RMRKIsNotContract();
error RMRKLocked();
error RMRKMaxPendingChildrenReached();
error RMRKMaxPendingAssetsReached();
error RMRKMaxRecursiveBurnsReached(address childContract, uint256 childId);
error RMRKMintOverMax();
error RMRKMintToNonRMRKNestableImplementer();
error RMRKMintZero();
error RMRKMismachedArrayLength();
error RMRKMustUnequipFirst();
error RMRKNestableTooDeep();
error RMRKNestableTransferToDescendant();
error RMRKNestableTransferToNonRMRKNestableImplementer();
error RMRKNestableTransferToSelf();
error RMRKNoAssetMatchingId();
error RMRKNotApprovedForAssetsOrOwner();
error RMRKNotApprovedOrDirectOwner();
error RMRKNotCollectionCollaborator();
error RMRKNotCollectionIssuer();
error RMRKNotCollectionIssuerOrCollaborator();
error RMRKNotComposableAsset();
error RMRKNotEquipped();
error RMRKNotOwner();
error RMRKNotOwnerOrContributor();
error RMRKNotSpecificAddress();
error RMRKNotTokenOwner();
error RMRKNewOwnerIsZeroAddress();
error RMRKNewContributorIsZeroAddress();
error RMRKOwnableNotImplemented();
error RMRKParentIsNotNFT();
error RMRKPartAlreadyExists();
error RMRKPartDoesNotExist();
error RMRKPartIsNotSlot();
error RMRKPendingChildIndexOutOfRange();
error RMRKAssetAlreadyExists();
error RMRKSlotAlreadyUsed();
error RMRKTargetAssetCannotReceiveSlot();
error RMRKTokenCannotBeEquippedWithAssetIntoSlot();
error RMRKTokenDoesNotHaveAsset();
error RMRKTokenHasNoAssets();
error RMRKUnexpectedChildId();
error RMRKUnexpectedNumberOfAssets();
error RMRKUnexpectedNumberOfChildren();
error RMRKUnexpectedAssetId();
error RMRKUnexpectedParent();
error RMRKZeroLengthIdsPassed();
error RMRKRoyaltiesTooHigh();
error RMRKCanOnlyDoBulkOperationsOnOwnedTokens();
error RMRKCanOnlyDoBulkOperationsWithOneTokenAtATime();
error RMRKWrongValueSent();
{
"compilationTarget": {
"contracts/Migrator.sol": "Migrator"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"kanaria","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyMigrated","type":"error"},{"inputs":[],"name":"ItemNeverConfigured","type":"error"},{"inputs":[],"name":"ItemPreviouslyConfigured","type":"error"},{"inputs":[],"name":"MigrationNotAvailable","type":"error"},{"inputs":[],"name":"NotMapper","type":"error"},{"inputs":[],"name":"NothingToMigrate","type":"error"},{"inputs":[],"name":"RMRKNewContributorIsZeroAddress","type":"error"},{"inputs":[],"name":"RMRKNewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"RMRKNotOwner","type":"error"},{"inputs":[],"name":"RMRKNotOwnerOrContributor","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contributor","type":"address"},{"indexed":false,"internalType":"bool","name":"isContributor","type":"bool"}],"name":"ContributorUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"evmAddress","type":"address"},{"indexed":true,"internalType":"string","name":"substrateAddress","type":"string"}],"name":"EvmToSubstrateAddressReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"evmAddress","type":"address"},{"indexed":true,"internalType":"string","name":"substrateAddress","type":"string"}],"name":"EvmToSubstrateAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"kanariaId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint64[]","name":"itemsAssetIds","type":"uint64[]"}],"name":"ItemMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"kanariaId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"KanariaMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"string[]","name":"substrateAddress","type":"string[]"}],"name":"batchGetEvmAddresses","outputs":[{"internalType":"address[]","name":"evmAddresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"evmAddress","type":"address[]"}],"name":"batchGetSubstrateAddresses","outputs":[{"internalType":"string[]","name":"substrateAddresses","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint64[]","name":"assetIds","type":"uint64[]"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"internalType":"struct Migrator.ItemWithAssetsAndId[]","name":"itemsWithAssets","type":"tuple[]"}],"internalType":"struct Migrator.ItemInputConfig[]","name":"itemsConfig","type":"tuple[]"}],"name":"configureItemMigrations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"kanariaId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint64[]","name":"assetIds","type":"uint64[]"}],"internalType":"struct Migrator.ItemWithAssets[]","name":"items","type":"tuple[]"}],"internalType":"struct Migrator.KanariaMigrationConfig[]","name":"kanariaMigrationConfigs","type":"tuple[]"}],"name":"configureKanariaMigrations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"}],"name":"getConfigForItems","outputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint64[]","name":"assetIds","type":"uint64[]"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"internalType":"struct Migrator.ItemWithAssetsAndId[][]","name":"configs","type":"tuple[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"kanariaIds","type":"uint256[]"}],"name":"getConfigForKanarias","outputs":[{"components":[{"internalType":"uint256","name":"kanariaId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint64[]","name":"assetIds","type":"uint64[]"}],"internalType":"struct Migrator.ItemWithAssets[]","name":"items","type":"tuple[]"}],"internalType":"struct Migrator.KanariaMigrationConfig[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getKanariaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getKanariaHolderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMapperAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"kanariaIds","type":"uint256[]"}],"name":"getMigratedStateForKanarias","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"}],"name":"getTotalItemsToMigrateForOwners","outputs":[{"internalType":"uint256[]","name":"total","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"isContributor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"},{"internalType":"bool","name":"grantRole","type":"bool"}],"name":"manageContributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"migrateItems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"kanariaIds","type":"uint256[]"}],"name":"migrateKanarias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"evm","type":"address"},{"internalType":"string","name":"substrateAddress","type":"string"}],"name":"resetSubstrateAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"kanariaHolder","type":"address"}],"name":"setKanariaHolderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mapper","type":"address"}],"name":"setMapperAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"evm","type":"address"},{"internalType":"string","name":"substrateAddress","type":"string"}],"name":"setSubstrateAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint64[]","name":"assetIds","type":"uint64[]"}],"name":"updateItemConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"}]