--- a/Cargo.lock +++ b/Cargo.lock @@ -2467,7 +2467,7 @@ [[package]] name = "fc-consensus" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "async-trait", "fc-db", @@ -2486,7 +2486,7 @@ [[package]] name = "fc-db" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "fp-storage", "kvdb-rocksdb", @@ -2505,7 +2505,7 @@ [[package]] name = "fc-mapping-sync" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "fc-db", "fp-consensus", @@ -2522,7 +2522,7 @@ [[package]] name = "fc-rpc" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "ethereum 0.14.0", "ethereum-types 0.14.1", @@ -2565,7 +2565,7 @@ [[package]] name = "fc-rpc-core" version = "1.1.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "ethereum 0.14.0", "ethereum-types 0.14.1", @@ -2730,7 +2730,7 @@ [[package]] name = "fp-consensus" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "ethereum 0.14.0", "parity-scale-codec 3.2.1", @@ -2742,7 +2742,7 @@ [[package]] name = "fp-ethereum" version = "1.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "ethereum 0.14.0", "ethereum-types 0.14.1", @@ -2757,7 +2757,7 @@ [[package]] name = "fp-evm" version = "3.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "evm", "frame-support", @@ -2771,7 +2771,7 @@ [[package]] name = "fp-evm-mapping" version = "0.1.0" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "frame-support", "sp-core", @@ -2780,7 +2780,7 @@ [[package]] name = "fp-rpc" version = "3.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "ethereum 0.14.0", "ethereum-types 0.14.1", @@ -2797,7 +2797,7 @@ [[package]] name = "fp-self-contained" version = "1.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "ethereum 0.14.0", "frame-support", @@ -2810,7 +2810,7 @@ [[package]] name = "fp-storage" version = "2.0.0" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "parity-scale-codec 3.2.1", "serde", @@ -5687,7 +5687,7 @@ [[package]] name = "pallet-base-fee" version = "1.0.0" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "fp-evm", "frame-support", @@ -5952,7 +5952,7 @@ [[package]] name = "pallet-ethereum" version = "4.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "ethereum 0.14.0", "ethereum-types 0.14.1", @@ -5980,7 +5980,7 @@ [[package]] name = "pallet-evm" version = "6.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "environmental", "evm", @@ -6066,7 +6066,7 @@ [[package]] name = "pallet-evm-precompile-simple" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#cf1894629c7df1c4dafe58aa773627a3d940da14" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.36#ef8d2809ed05da0664e9b43cb87436451295b634" dependencies = [ "fp-evm", "ripemd", --- a/crates/evm-coder/procedural/src/solidity_interface.rs +++ b/crates/evm-coder/procedural/src/solidity_interface.rs @@ -811,6 +811,13 @@ let list = generics_list(gen); quote! { <#list> } } +fn generics_stub(gen: &Generics) -> proc_macro2::TokenStream { + if gen.params.is_empty() { + return quote! {}; + } + let params = (0..gen.params.len()).map(|_| quote! {()}); + quote! {<#(#params,)*>} +} fn generics_data(gen: &Generics) -> proc_macro2::TokenStream { let list = generics_list(gen); if gen.params.len() == 1 { @@ -866,6 +873,7 @@ let generics = self.generics; let gen_ref = generics_reference(&generics); let gen_data = generics_data(&generics); + let gen_stub = generics_stub(&generics); let gen_where = &generics.where_clause; let call_sub = self @@ -936,6 +944,12 @@ let solidity_events_idents = self.info.events.0.iter().map(|is| is.name.clone()); let docs = &self.docs; + let expect_selector = self.info.expect_selector.map(|s| { + quote! { + const _: () = assert!(#s == u32::from_be_bytes(<#call_name #gen_stub>::interface_id()), "selector mismatch, review contained function selectors"); + } + }); + quote! { #( const _: ::core::marker::PhantomData<#solidity_events_idents> = ::core::marker::PhantomData; @@ -952,12 +966,15 @@ #call_sub, )* } + + #expect_selector + impl #gen_ref #call_name #gen_ref { #( #consts )* /// Return this call ERC165 selector - pub fn interface_id() -> ::evm_coder::types::bytes4 { + pub const fn interface_id() -> ::evm_coder::types::bytes4 { let mut interface_id = 0; #(#interface_id)* #(#inline_interface_id)* --- a/pallets/nonfungible/src/erc.rs +++ b/pallets/nonfungible/src/erc.rs @@ -524,11 +524,6 @@ Ok(>::allowance_for_all(self, &owner, &operator)) } - - /// @notice Returns collection helper contract address - fn collection_helper_address(&self) -> Result
{ - Ok(T::ContractAddress::get()) - } } /// @title ERC721 Token that can be irreversibly burned (destroyed). @@ -1058,6 +1053,11 @@ Ok(token_id.into()) } + + /// @notice Returns collection helper contract address + fn collection_helper_address(&self) -> Result
{ + Ok(T::ContractAddress::get()) + } } #[solidity_interface( --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -785,7 +785,7 @@ } /// @title Unique extensions for ERC721. -/// @dev the ERC-165 identifier for this interface is 0x0e48fdb4 +/// @dev the ERC-165 identifier for this interface is 0x16de3152 contract ERC721UniqueExtensions is Dummy, ERC165 { /// @notice A descriptive name for a collection of NFTs in this contract /// @dev EVM selector for this function is: 0x06fdde03, @@ -986,6 +986,15 @@ dummy = 0; return 0; } + + /// @notice Returns collection helper contract address + /// @dev EVM selector for this function is: 0x1896cce6, + /// or in textual repr: collectionHelperAddress() + function collectionHelperAddress() public view returns (address) { + require(false, stub_error); + dummy; + return 0x0000000000000000000000000000000000000000; + } } /// @dev anonymous struct @@ -1043,7 +1052,7 @@ /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md -/// @dev the ERC-165 identifier for this interface is 0x983a942b +/// @dev the ERC-165 identifier for this interface is 0x80ac58cd contract ERC721 is Dummy, ERC165, ERC721Events { /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this @@ -1175,15 +1184,6 @@ operator; dummy; return false; - } - - /// @notice Returns collection helper contract address - /// @dev EVM selector for this function is: 0x1896cce6, - /// or in textual repr: collectionHelperAddress() - function collectionHelperAddress() public view returns (address) { - require(false, stub_error); - dummy; - return 0x0000000000000000000000000000000000000000; } } --- a/pallets/refungible/src/erc.rs +++ b/pallets/refungible/src/erc.rs @@ -295,7 +295,9 @@ MintingFinished {}, } -#[solidity_interface(name = ERC721Metadata)] +/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +#[solidity_interface(name = ERC721Metadata, expect_selector = 0x5b5e139f)] impl RefungibleHandle where T::AccountId: From<[u8; 32]> + AsRef<[u8; 32]>, @@ -364,7 +366,7 @@ /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 -#[solidity_interface(name = ERC721Enumerable)] +#[solidity_interface(name = ERC721Enumerable, expect_selector = 0x780e9d63)] impl RefungibleHandle { /// @notice Enumerate valid RFTs /// @param index A counter less than `totalSupply()` @@ -391,7 +393,7 @@ /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md -#[solidity_interface(name = ERC721, events(ERC721Events))] +#[solidity_interface(name = ERC721, events(ERC721Events), expect_selector = 0x80ac58cd)] impl RefungibleHandle { /// @notice Count all RFTs assigned to an owner /// @dev RFTs assigned to the zero address are considered invalid, and this @@ -422,6 +424,7 @@ } /// @dev Not implemented + #[solidity(rename_selector = "safeTransferFrom")] fn safe_transfer_from_with_data( &mut self, _from: address, @@ -434,6 +437,7 @@ } /// @dev Not implemented + #[solidity(rename_selector = "safeTransferFrom")] fn safe_transfer_from( &mut self, _from: address, @@ -517,11 +521,6 @@ Ok(>::allowance_for_all(self, &owner, &operator)) } - - /// @notice Returns collection helper contract address - fn collection_helper_address(&self) -> Result
{ - Ok(T::ContractAddress::get()) - } } /// Returns amount of pieces of `token` that `owner` have @@ -1116,6 +1115,11 @@ token.try_into().map_err(|_| "token id overflow")?, )) } + + /// @notice Returns collection helper contract address + fn collection_helper_address(&self) -> Result
{ + Ok(T::ContractAddress::get()) + } } #[solidity_interface( --- a/pallets/refungible/src/stubs/UniqueRefungible.sol +++ b/pallets/refungible/src/stubs/UniqueRefungible.sol @@ -641,6 +641,8 @@ TransferEnabled } +/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 /// @dev the ERC-165 identifier for this interface is 0x5b5e139f contract ERC721Metadata is Dummy, ERC165 { // /// @notice A descriptive name for a collection of NFTs in this contract @@ -783,7 +785,7 @@ } /// @title Unique extensions for ERC721. -/// @dev the ERC-165 identifier for this interface is 0xabf30dc2 +/// @dev the ERC-165 identifier for this interface is 0xb365c124 contract ERC721UniqueExtensions is Dummy, ERC165 { /// @notice A descriptive name for a collection of NFTs in this contract /// @dev EVM selector for this function is: 0x06fdde03, @@ -985,6 +987,15 @@ dummy; return 0x0000000000000000000000000000000000000000; } + + /// @notice Returns collection helper contract address + /// @dev EVM selector for this function is: 0x1896cce6, + /// or in textual repr: collectionHelperAddress() + function collectionHelperAddress() public view returns (address) { + require(false, stub_error); + dummy; + return 0x0000000000000000000000000000000000000000; + } } /// @dev anonymous struct @@ -1042,7 +1053,7 @@ /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md -/// @dev the ERC-165 identifier for this interface is 0x4016cd87 +/// @dev the ERC-165 identifier for this interface is 0x80ac58cd contract ERC721 is Dummy, ERC165, ERC721Events { /// @notice Count all RFTs assigned to an owner /// @dev RFTs assigned to the zero address are considered invalid, and this @@ -1075,9 +1086,9 @@ } /// @dev Not implemented - /// @dev EVM selector for this function is: 0x60a11672, - /// or in textual repr: safeTransferFromWithData(address,address,uint256,bytes) - function safeTransferFromWithData( + /// @dev EVM selector for this function is: 0xb88d4fde, + /// or in textual repr: safeTransferFrom(address,address,uint256,bytes) + function safeTransferFrom( address from, address to, uint256 tokenId, @@ -1172,15 +1183,6 @@ operator; dummy; return false; - } - - /// @notice Returns collection helper contract address - /// @dev EVM selector for this function is: 0x1896cce6, - /// or in textual repr: collectionHelperAddress() - function collectionHelperAddress() public view returns (address) { - require(false, stub_error); - dummy; - return 0x0000000000000000000000000000000000000000; } } --- a/runtime/common/ethereum/sponsoring/refungible.rs +++ b/runtime/common/ethereum/sponsoring/refungible.rs @@ -139,8 +139,7 @@ | BalanceOf { .. } | OwnerOf { .. } | GetApproved { .. } - | IsApprovedForAll { .. } - | CollectionHelperAddress => None, + | IsApprovedForAll { .. } => None, // Not sponsored SafeTransferFromWithData { .. } @@ -230,7 +229,8 @@ | CrossOwnerOf { .. } | Properties { .. } | NextTokenId - | TokenContractAddress { .. } => None, + | TokenContractAddress { .. } + | CollectionHelperAddress => None, // Not sponsored BurnFrom { .. } --- a/runtime/common/runtime_apis.rs +++ b/runtime/common/runtime_apis.rs @@ -451,7 +451,9 @@ } fn account_code_at(address: H160) -> Vec { - EVM::account_codes(address) + use pallet_evm::OnMethodCall; + ::OnMethodCall::get_code(&address) + .unwrap_or_else(|| EVM::account_codes(address)) } fn author() -> H160 { --- a/tests/src/eth/abi/nonFungible.json +++ b/tests/src/eth/abi/nonFungible.json @@ -51,6 +51,12 @@ }, { "anonymous": false, + "inputs": [], + "name": "MintingFinished", + "type": "event" + }, + { + "anonymous": false, "inputs": [ { "indexed": true, @@ -417,6 +423,13 @@ "type": "function" }, { + "inputs": [], + "name": "finishMinting", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], @@ -504,6 +517,13 @@ }, { "inputs": [], + "name": "mintingFinished", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], "name": "name", "outputs": [{ "internalType": "string", "name": "", "type": "string" }], "stateMutability": "view", --- a/tests/src/eth/abi/reFungible.json +++ b/tests/src/eth/abi/reFungible.json @@ -51,6 +51,12 @@ }, { "anonymous": false, + "inputs": [], + "name": "MintingFinished", + "type": "event" + }, + { + "anonymous": false, "inputs": [ { "indexed": true, @@ -399,6 +405,13 @@ "type": "function" }, { + "inputs": [], + "name": "finishMinting", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], @@ -486,6 +499,13 @@ }, { "inputs": [], + "name": "mintingFinished", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], "name": "name", "outputs": [{ "internalType": "string", "name": "", "type": "string" }], "stateMutability": "view", @@ -596,7 +616,7 @@ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], - "name": "safeTransferFromWithData", + "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" --- a/tests/src/eth/abi/reFungibleToken.json +++ b/tests/src/eth/abi/reFungibleToken.json @@ -98,6 +98,16 @@ }, { "inputs": [ + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "burnFrom", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "components": [ { "internalType": "address", "name": "eth", "type": "address" }, --- a/tests/src/eth/api/UniqueNFT.sol +++ b/tests/src/eth/api/UniqueNFT.sol @@ -536,7 +536,7 @@ } /// @title Unique extensions for ERC721. -/// @dev the ERC-165 identifier for this interface is 0x0e48fdb4 +/// @dev the ERC-165 identifier for this interface is 0x16de3152 interface ERC721UniqueExtensions is Dummy, ERC165 { /// @notice A descriptive name for a collection of NFTs in this contract /// @dev EVM selector for this function is: 0x06fdde03, @@ -661,6 +661,11 @@ /// @dev EVM selector for this function is: 0xb904db03, /// or in textual repr: mintCross((address,uint256),(string,bytes)[]) function mintCross(CrossAddress memory to, Property[] memory properties) external returns (uint256); + + /// @notice Returns collection helper contract address + /// @dev EVM selector for this function is: 0x1896cce6, + /// or in textual repr: collectionHelperAddress() + function collectionHelperAddress() external view returns (address); } /// @dev anonymous struct @@ -703,7 +708,7 @@ /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md -/// @dev the ERC-165 identifier for this interface is 0x983a942b +/// @dev the ERC-165 identifier for this interface is 0x80ac58cd interface ERC721 is Dummy, ERC165, ERC721Events { /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this @@ -786,11 +791,6 @@ /// @dev EVM selector for this function is: 0xe985e9c5, /// or in textual repr: isApprovedForAll(address,address) function isApprovedForAll(address owner, address operator) external view returns (bool); - - /// @notice Returns collection helper contract address - /// @dev EVM selector for this function is: 0x1896cce6, - /// or in textual repr: collectionHelperAddress() - function collectionHelperAddress() external view returns (address); } interface UniqueNFT is --- a/tests/src/eth/api/UniqueRefungible.sol +++ b/tests/src/eth/api/UniqueRefungible.sol @@ -441,6 +441,8 @@ TransferEnabled } +/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 /// @dev the ERC-165 identifier for this interface is 0x5b5e139f interface ERC721Metadata is Dummy, ERC165 { // /// @notice A descriptive name for a collection of NFTs in this contract @@ -534,7 +536,7 @@ } /// @title Unique extensions for ERC721. -/// @dev the ERC-165 identifier for this interface is 0xabf30dc2 +/// @dev the ERC-165 identifier for this interface is 0xb365c124 interface ERC721UniqueExtensions is Dummy, ERC165 { /// @notice A descriptive name for a collection of NFTs in this contract /// @dev EVM selector for this function is: 0x06fdde03, @@ -660,6 +662,11 @@ /// @dev EVM selector for this function is: 0xab76fac6, /// or in textual repr: tokenContractAddress(uint256) function tokenContractAddress(uint256 token) external view returns (address); + + /// @notice Returns collection helper contract address + /// @dev EVM selector for this function is: 0x1896cce6, + /// or in textual repr: collectionHelperAddress() + function collectionHelperAddress() external view returns (address); } /// @dev anonymous struct @@ -702,7 +709,7 @@ /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md -/// @dev the ERC-165 identifier for this interface is 0x4016cd87 +/// @dev the ERC-165 identifier for this interface is 0x80ac58cd interface ERC721 is Dummy, ERC165, ERC721Events { /// @notice Count all RFTs assigned to an owner /// @dev RFTs assigned to the zero address are considered invalid, and this @@ -725,9 +732,9 @@ function ownerOf(uint256 tokenId) external view returns (address); /// @dev Not implemented - /// @dev EVM selector for this function is: 0x60a11672, - /// or in textual repr: safeTransferFromWithData(address,address,uint256,bytes) - function safeTransferFromWithData( + /// @dev EVM selector for this function is: 0xb88d4fde, + /// or in textual repr: safeTransferFrom(address,address,uint256,bytes) + function safeTransferFrom( address from, address to, uint256 tokenId, @@ -783,11 +790,6 @@ /// @dev EVM selector for this function is: 0xe985e9c5, /// or in textual repr: isApprovedForAll(address,address) function isApprovedForAll(address owner, address operator) external view returns (bool); - - /// @notice Returns collection helper contract address - /// @dev EVM selector for this function is: 0x1896cce6, - /// or in textual repr: collectionHelperAddress() - function collectionHelperAddress() external view returns (address); } interface UniqueRefungible is