difftreelog
Merge pull request #827 from UniqueNetwork/fix/frontier-get-code
in: master
Fix eth_getCode
15 files changed
Cargo.lockdiffbeforeafterboth--- 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",
crates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth--- 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)*
pallets/nonfungible/src/erc.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -524,11 +524,6 @@
Ok(<Pallet<T>>::allowance_for_all(self, &owner, &operator))
}
-
- /// @notice Returns collection helper contract address
- fn collection_helper_address(&self) -> Result<address> {
- 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<address> {
+ Ok(T::ContractAddress::get())
+ }
}
#[solidity_interface(
pallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterbothbinary blob — no preview
pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth--- 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;
}
}
pallets/refungible/src/erc.rsdiffbeforeafterboth--- 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<T: Config> RefungibleHandle<T>
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<T: Config> RefungibleHandle<T> {
/// @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<T: Config> RefungibleHandle<T> {
/// @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(<Pallet<T>>::allowance_for_all(self, &owner, &operator))
}
-
- /// @notice Returns collection helper contract address
- fn collection_helper_address(&self) -> Result<address> {
- 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<address> {
+ Ok(T::ContractAddress::get())
+ }
}
#[solidity_interface(
pallets/refungible/src/stubs/UniqueRefungible.rawdiffbeforeafterbothbinary blob — no preview
pallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth--- 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;
}
}
runtime/common/ethereum/sponsoring/refungible.rsdiffbeforeafterboth--- 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 { .. }
runtime/common/runtime_apis.rsdiffbeforeafterboth--- a/runtime/common/runtime_apis.rs
+++ b/runtime/common/runtime_apis.rs
@@ -451,7 +451,9 @@
}
fn account_code_at(address: H160) -> Vec<u8> {
- EVM::account_codes(address)
+ use pallet_evm::OnMethodCall;
+ <Runtime as pallet_evm::Config>::OnMethodCall::get_code(&address)
+ .unwrap_or_else(|| EVM::account_codes(address))
}
fn author() -> H160 {
tests/src/eth/abi/nonFungible.jsondiffbeforeafterboth--- 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",
tests/src/eth/abi/reFungible.jsondiffbeforeafterboth1[2 {3 "anonymous": false,4 "inputs": [5 {6 "indexed": true,7 "internalType": "address",8 "name": "owner",9 "type": "address"10 },11 {12 "indexed": true,13 "internalType": "address",14 "name": "approved",15 "type": "address"16 },17 {18 "indexed": true,19 "internalType": "uint256",20 "name": "tokenId",21 "type": "uint256"22 }23 ],24 "name": "Approval",25 "type": "event"26 },27 {28 "anonymous": false,29 "inputs": [30 {31 "indexed": true,32 "internalType": "address",33 "name": "owner",34 "type": "address"35 },36 {37 "indexed": true,38 "internalType": "address",39 "name": "operator",40 "type": "address"41 },42 {43 "indexed": false,44 "internalType": "bool",45 "name": "approved",46 "type": "bool"47 }48 ],49 "name": "ApprovalForAll",50 "type": "event"51 },52 {53 "anonymous": false,54 "inputs": [55 {56 "indexed": true,57 "internalType": "address",58 "name": "from",59 "type": "address"60 },61 {62 "indexed": true,63 "internalType": "address",64 "name": "to",65 "type": "address"66 },67 {68 "indexed": true,69 "internalType": "uint256",70 "name": "tokenId",71 "type": "uint256"72 }73 ],74 "name": "Transfer",75 "type": "event"76 },77 {78 "inputs": [79 {80 "components": [81 { "internalType": "address", "name": "eth", "type": "address" },82 { "internalType": "uint256", "name": "sub", "type": "uint256" }83 ],84 "internalType": "struct CrossAddress",85 "name": "newAdmin",86 "type": "tuple"87 }88 ],89 "name": "addCollectionAdminCross",90 "outputs": [],91 "stateMutability": "nonpayable",92 "type": "function"93 },94 {95 "inputs": [96 {97 "components": [98 { "internalType": "address", "name": "eth", "type": "address" },99 { "internalType": "uint256", "name": "sub", "type": "uint256" }100 ],101 "internalType": "struct CrossAddress",102 "name": "user",103 "type": "tuple"104 }105 ],106 "name": "addToCollectionAllowListCross",107 "outputs": [],108 "stateMutability": "nonpayable",109 "type": "function"110 },111 {112 "inputs": [113 {114 "components": [115 { "internalType": "address", "name": "eth", "type": "address" },116 { "internalType": "uint256", "name": "sub", "type": "uint256" }117 ],118 "internalType": "struct CrossAddress",119 "name": "user",120 "type": "tuple"121 }122 ],123 "name": "allowlistedCross",124 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],125 "stateMutability": "view",126 "type": "function"127 },128 {129 "inputs": [130 { "internalType": "address", "name": "approved", "type": "address" },131 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }132 ],133 "name": "approve",134 "outputs": [],135 "stateMutability": "nonpayable",136 "type": "function"137 },138 {139 "inputs": [140 { "internalType": "address", "name": "owner", "type": "address" }141 ],142 "name": "balanceOf",143 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],144 "stateMutability": "view",145 "type": "function"146 },147 {148 "inputs": [149 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }150 ],151 "name": "burn",152 "outputs": [],153 "stateMutability": "nonpayable",154 "type": "function"155 },156 {157 "inputs": [158 {159 "components": [160 { "internalType": "address", "name": "eth", "type": "address" },161 { "internalType": "uint256", "name": "sub", "type": "uint256" }162 ],163 "internalType": "struct CrossAddress",164 "name": "from",165 "type": "tuple"166 },167 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }168 ],169 "name": "burnFromCross",170 "outputs": [],171 "stateMutability": "nonpayable",172 "type": "function"173 },174 {175 "inputs": [176 {177 "components": [178 { "internalType": "address", "name": "eth", "type": "address" },179 { "internalType": "uint256", "name": "sub", "type": "uint256" }180 ],181 "internalType": "struct CrossAddress",182 "name": "newOwner",183 "type": "tuple"184 }185 ],186 "name": "changeCollectionOwnerCross",187 "outputs": [],188 "stateMutability": "nonpayable",189 "type": "function"190 },191 {192 "inputs": [],193 "name": "collectionAdmins",194 "outputs": [195 {196 "components": [197 { "internalType": "address", "name": "eth", "type": "address" },198 { "internalType": "uint256", "name": "sub", "type": "uint256" }199 ],200 "internalType": "struct CrossAddress[]",201 "name": "",202 "type": "tuple[]"203 }204 ],205 "stateMutability": "view",206 "type": "function"207 },208 {209 "inputs": [],210 "name": "collectionHelperAddress",211 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],212 "stateMutability": "view",213 "type": "function"214 },215 {216 "inputs": [],217 "name": "collectionLimits",218 "outputs": [219 {220 "components": [221 {222 "internalType": "enum CollectionLimitField",223 "name": "field",224 "type": "uint8"225 },226 {227 "components": [228 { "internalType": "bool", "name": "status", "type": "bool" },229 { "internalType": "uint256", "name": "value", "type": "uint256" }230 ],231 "internalType": "struct OptionUint256",232 "name": "value",233 "type": "tuple"234 }235 ],236 "internalType": "struct CollectionLimit[]",237 "name": "",238 "type": "tuple[]"239 }240 ],241 "stateMutability": "view",242 "type": "function"243 },244 {245 "inputs": [],246 "name": "collectionNestingPermissions",247 "outputs": [248 {249 "components": [250 {251 "internalType": "enum CollectionPermissionField",252 "name": "field",253 "type": "uint8"254 },255 { "internalType": "bool", "name": "value", "type": "bool" }256 ],257 "internalType": "struct CollectionNestingPermission[]",258 "name": "",259 "type": "tuple[]"260 }261 ],262 "stateMutability": "view",263 "type": "function"264 },265 {266 "inputs": [],267 "name": "collectionNestingRestrictedCollectionIds",268 "outputs": [269 {270 "components": [271 { "internalType": "bool", "name": "token_owner", "type": "bool" },272 { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }273 ],274 "internalType": "struct CollectionNesting",275 "name": "",276 "type": "tuple"277 }278 ],279 "stateMutability": "view",280 "type": "function"281 },282 {283 "inputs": [],284 "name": "collectionOwner",285 "outputs": [286 {287 "components": [288 { "internalType": "address", "name": "eth", "type": "address" },289 { "internalType": "uint256", "name": "sub", "type": "uint256" }290 ],291 "internalType": "struct CrossAddress",292 "name": "",293 "type": "tuple"294 }295 ],296 "stateMutability": "view",297 "type": "function"298 },299 {300 "inputs": [301 { "internalType": "string[]", "name": "keys", "type": "string[]" }302 ],303 "name": "collectionProperties",304 "outputs": [305 {306 "components": [307 { "internalType": "string", "name": "key", "type": "string" },308 { "internalType": "bytes", "name": "value", "type": "bytes" }309 ],310 "internalType": "struct Property[]",311 "name": "",312 "type": "tuple[]"313 }314 ],315 "stateMutability": "view",316 "type": "function"317 },318 {319 "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],320 "name": "collectionProperty",321 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],322 "stateMutability": "view",323 "type": "function"324 },325 {326 "inputs": [],327 "name": "collectionSponsor",328 "outputs": [329 {330 "components": [331 { "internalType": "address", "name": "eth", "type": "address" },332 { "internalType": "uint256", "name": "sub", "type": "uint256" }333 ],334 "internalType": "struct CrossAddress",335 "name": "",336 "type": "tuple"337 }338 ],339 "stateMutability": "view",340 "type": "function"341 },342 {343 "inputs": [],344 "name": "confirmCollectionSponsorship",345 "outputs": [],346 "stateMutability": "nonpayable",347 "type": "function"348 },349 {350 "inputs": [],351 "name": "contractAddress",352 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],353 "stateMutability": "view",354 "type": "function"355 },356 {357 "inputs": [358 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }359 ],360 "name": "crossOwnerOf",361 "outputs": [362 {363 "components": [364 { "internalType": "address", "name": "eth", "type": "address" },365 { "internalType": "uint256", "name": "sub", "type": "uint256" }366 ],367 "internalType": "struct CrossAddress",368 "name": "",369 "type": "tuple"370 }371 ],372 "stateMutability": "view",373 "type": "function"374 },375 {376 "inputs": [377 { "internalType": "string[]", "name": "keys", "type": "string[]" }378 ],379 "name": "deleteCollectionProperties",380 "outputs": [],381 "stateMutability": "nonpayable",382 "type": "function"383 },384 {385 "inputs": [386 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },387 { "internalType": "string[]", "name": "keys", "type": "string[]" }388 ],389 "name": "deleteProperties",390 "outputs": [],391 "stateMutability": "nonpayable",392 "type": "function"393 },394 {395 "inputs": [],396 "name": "description",397 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],398 "stateMutability": "view",399 "type": "function"400 },401 {402 "inputs": [403 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }404 ],405 "name": "getApproved",406 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],407 "stateMutability": "view",408 "type": "function"409 },410 {411 "inputs": [],412 "name": "hasCollectionPendingSponsor",413 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],414 "stateMutability": "view",415 "type": "function"416 },417 {418 "inputs": [419 { "internalType": "address", "name": "owner", "type": "address" },420 { "internalType": "address", "name": "operator", "type": "address" }421 ],422 "name": "isApprovedForAll",423 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],424 "stateMutability": "view",425 "type": "function"426 },427 {428 "inputs": [429 {430 "components": [431 { "internalType": "address", "name": "eth", "type": "address" },432 { "internalType": "uint256", "name": "sub", "type": "uint256" }433 ],434 "internalType": "struct CrossAddress",435 "name": "user",436 "type": "tuple"437 }438 ],439 "name": "isOwnerOrAdminCross",440 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],441 "stateMutability": "view",442 "type": "function"443 },444 {445 "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],446 "name": "mint",447 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],448 "stateMutability": "nonpayable",449 "type": "function"450 },451 {452 "inputs": [453 {454 "components": [455 { "internalType": "address", "name": "eth", "type": "address" },456 { "internalType": "uint256", "name": "sub", "type": "uint256" }457 ],458 "internalType": "struct CrossAddress",459 "name": "to",460 "type": "tuple"461 },462 {463 "components": [464 { "internalType": "string", "name": "key", "type": "string" },465 { "internalType": "bytes", "name": "value", "type": "bytes" }466 ],467 "internalType": "struct Property[]",468 "name": "properties",469 "type": "tuple[]"470 }471 ],472 "name": "mintCross",473 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],474 "stateMutability": "nonpayable",475 "type": "function"476 },477 {478 "inputs": [479 { "internalType": "address", "name": "to", "type": "address" },480 { "internalType": "string", "name": "tokenUri", "type": "string" }481 ],482 "name": "mintWithTokenURI",483 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],484 "stateMutability": "nonpayable",485 "type": "function"486 },487 {488 "inputs": [],489 "name": "name",490 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],491 "stateMutability": "view",492 "type": "function"493 },494 {495 "inputs": [],496 "name": "nextTokenId",497 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],498 "stateMutability": "view",499 "type": "function"500 },501 {502 "inputs": [503 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }504 ],505 "name": "ownerOf",506 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],507 "stateMutability": "view",508 "type": "function"509 },510 {511 "inputs": [512 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },513 { "internalType": "string[]", "name": "keys", "type": "string[]" }514 ],515 "name": "properties",516 "outputs": [517 {518 "components": [519 { "internalType": "string", "name": "key", "type": "string" },520 { "internalType": "bytes", "name": "value", "type": "bytes" }521 ],522 "internalType": "struct Property[]",523 "name": "",524 "type": "tuple[]"525 }526 ],527 "stateMutability": "view",528 "type": "function"529 },530 {531 "inputs": [532 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },533 { "internalType": "string", "name": "key", "type": "string" }534 ],535 "name": "property",536 "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],537 "stateMutability": "view",538 "type": "function"539 },540 {541 "inputs": [542 {543 "components": [544 { "internalType": "address", "name": "eth", "type": "address" },545 { "internalType": "uint256", "name": "sub", "type": "uint256" }546 ],547 "internalType": "struct CrossAddress",548 "name": "admin",549 "type": "tuple"550 }551 ],552 "name": "removeCollectionAdminCross",553 "outputs": [],554 "stateMutability": "nonpayable",555 "type": "function"556 },557 {558 "inputs": [],559 "name": "removeCollectionSponsor",560 "outputs": [],561 "stateMutability": "nonpayable",562 "type": "function"563 },564 {565 "inputs": [566 {567 "components": [568 { "internalType": "address", "name": "eth", "type": "address" },569 { "internalType": "uint256", "name": "sub", "type": "uint256" }570 ],571 "internalType": "struct CrossAddress",572 "name": "user",573 "type": "tuple"574 }575 ],576 "name": "removeFromCollectionAllowListCross",577 "outputs": [],578 "stateMutability": "nonpayable",579 "type": "function"580 },581 {582 "inputs": [583 { "internalType": "address", "name": "from", "type": "address" },584 { "internalType": "address", "name": "to", "type": "address" },585 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }586 ],587 "name": "safeTransferFrom",588 "outputs": [],589 "stateMutability": "nonpayable",590 "type": "function"591 },592 {593 "inputs": [594 { "internalType": "address", "name": "from", "type": "address" },595 { "internalType": "address", "name": "to", "type": "address" },596 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },597 { "internalType": "bytes", "name": "data", "type": "bytes" }598 ],599 "name": "safeTransferFromWithData",600 "outputs": [],601 "stateMutability": "nonpayable",602 "type": "function"603 },604 {605 "inputs": [606 { "internalType": "address", "name": "operator", "type": "address" },607 { "internalType": "bool", "name": "approved", "type": "bool" }608 ],609 "name": "setApprovalForAll",610 "outputs": [],611 "stateMutability": "nonpayable",612 "type": "function"613 },614 {615 "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],616 "name": "setCollectionAccess",617 "outputs": [],618 "stateMutability": "nonpayable",619 "type": "function"620 },621 {622 "inputs": [623 {624 "components": [625 {626 "internalType": "enum CollectionLimitField",627 "name": "field",628 "type": "uint8"629 },630 {631 "components": [632 { "internalType": "bool", "name": "status", "type": "bool" },633 { "internalType": "uint256", "name": "value", "type": "uint256" }634 ],635 "internalType": "struct OptionUint256",636 "name": "value",637 "type": "tuple"638 }639 ],640 "internalType": "struct CollectionLimit",641 "name": "limit",642 "type": "tuple"643 }644 ],645 "name": "setCollectionLimit",646 "outputs": [],647 "stateMutability": "nonpayable",648 "type": "function"649 },650 {651 "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],652 "name": "setCollectionMintMode",653 "outputs": [],654 "stateMutability": "nonpayable",655 "type": "function"656 },657 {658 "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],659 "name": "setCollectionNesting",660 "outputs": [],661 "stateMutability": "nonpayable",662 "type": "function"663 },664 {665 "inputs": [666 { "internalType": "bool", "name": "enable", "type": "bool" },667 {668 "internalType": "address[]",669 "name": "collections",670 "type": "address[]"671 }672 ],673 "name": "setCollectionNesting",674 "outputs": [],675 "stateMutability": "nonpayable",676 "type": "function"677 },678 {679 "inputs": [680 {681 "components": [682 { "internalType": "string", "name": "key", "type": "string" },683 { "internalType": "bytes", "name": "value", "type": "bytes" }684 ],685 "internalType": "struct Property[]",686 "name": "properties",687 "type": "tuple[]"688 }689 ],690 "name": "setCollectionProperties",691 "outputs": [],692 "stateMutability": "nonpayable",693 "type": "function"694 },695 {696 "inputs": [697 {698 "components": [699 { "internalType": "address", "name": "eth", "type": "address" },700 { "internalType": "uint256", "name": "sub", "type": "uint256" }701 ],702 "internalType": "struct CrossAddress",703 "name": "sponsor",704 "type": "tuple"705 }706 ],707 "name": "setCollectionSponsorCross",708 "outputs": [],709 "stateMutability": "nonpayable",710 "type": "function"711 },712 {713 "inputs": [714 { "internalType": "uint256", "name": "tokenId", "type": "uint256" },715 {716 "components": [717 { "internalType": "string", "name": "key", "type": "string" },718 { "internalType": "bytes", "name": "value", "type": "bytes" }719 ],720 "internalType": "struct Property[]",721 "name": "properties",722 "type": "tuple[]"723 }724 ],725 "name": "setProperties",726 "outputs": [],727 "stateMutability": "nonpayable",728 "type": "function"729 },730 {731 "inputs": [732 {733 "components": [734 { "internalType": "string", "name": "key", "type": "string" },735 {736 "components": [737 {738 "internalType": "enum TokenPermissionField",739 "name": "code",740 "type": "uint8"741 },742 { "internalType": "bool", "name": "value", "type": "bool" }743 ],744 "internalType": "struct PropertyPermission[]",745 "name": "permissions",746 "type": "tuple[]"747 }748 ],749 "internalType": "struct TokenPropertyPermission[]",750 "name": "permissions",751 "type": "tuple[]"752 }753 ],754 "name": "setTokenPropertyPermissions",755 "outputs": [],756 "stateMutability": "nonpayable",757 "type": "function"758 },759 {760 "inputs": [761 { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }762 ],763 "name": "supportsInterface",764 "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],765 "stateMutability": "view",766 "type": "function"767 },768 {769 "inputs": [],770 "name": "symbol",771 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],772 "stateMutability": "view",773 "type": "function"774 },775 {776 "inputs": [777 { "internalType": "uint256", "name": "index", "type": "uint256" }778 ],779 "name": "tokenByIndex",780 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],781 "stateMutability": "view",782 "type": "function"783 },784 {785 "inputs": [786 { "internalType": "uint256", "name": "token", "type": "uint256" }787 ],788 "name": "tokenContractAddress",789 "outputs": [{ "internalType": "address", "name": "", "type": "address" }],790 "stateMutability": "view",791 "type": "function"792 },793 {794 "inputs": [795 { "internalType": "address", "name": "owner", "type": "address" },796 { "internalType": "uint256", "name": "index", "type": "uint256" }797 ],798 "name": "tokenOfOwnerByIndex",799 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],800 "stateMutability": "view",801 "type": "function"802 },803 {804 "inputs": [],805 "name": "tokenPropertyPermissions",806 "outputs": [807 {808 "components": [809 { "internalType": "string", "name": "key", "type": "string" },810 {811 "components": [812 {813 "internalType": "enum TokenPermissionField",814 "name": "code",815 "type": "uint8"816 },817 { "internalType": "bool", "name": "value", "type": "bool" }818 ],819 "internalType": "struct PropertyPermission[]",820 "name": "permissions",821 "type": "tuple[]"822 }823 ],824 "internalType": "struct TokenPropertyPermission[]",825 "name": "",826 "type": "tuple[]"827 }828 ],829 "stateMutability": "view",830 "type": "function"831 },832 {833 "inputs": [834 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }835 ],836 "name": "tokenURI",837 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],838 "stateMutability": "view",839 "type": "function"840 },841 {842 "inputs": [],843 "name": "totalSupply",844 "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],845 "stateMutability": "view",846 "type": "function"847 },848 {849 "inputs": [850 { "internalType": "address", "name": "to", "type": "address" },851 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }852 ],853 "name": "transfer",854 "outputs": [],855 "stateMutability": "nonpayable",856 "type": "function"857 },858 {859 "inputs": [860 {861 "components": [862 { "internalType": "address", "name": "eth", "type": "address" },863 { "internalType": "uint256", "name": "sub", "type": "uint256" }864 ],865 "internalType": "struct CrossAddress",866 "name": "to",867 "type": "tuple"868 },869 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }870 ],871 "name": "transferCross",872 "outputs": [],873 "stateMutability": "nonpayable",874 "type": "function"875 },876 {877 "inputs": [878 { "internalType": "address", "name": "from", "type": "address" },879 { "internalType": "address", "name": "to", "type": "address" },880 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }881 ],882 "name": "transferFrom",883 "outputs": [],884 "stateMutability": "nonpayable",885 "type": "function"886 },887 {888 "inputs": [889 {890 "components": [891 { "internalType": "address", "name": "eth", "type": "address" },892 { "internalType": "uint256", "name": "sub", "type": "uint256" }893 ],894 "internalType": "struct CrossAddress",895 "name": "from",896 "type": "tuple"897 },898 {899 "components": [900 { "internalType": "address", "name": "eth", "type": "address" },901 { "internalType": "uint256", "name": "sub", "type": "uint256" }902 ],903 "internalType": "struct CrossAddress",904 "name": "to",905 "type": "tuple"906 },907 { "internalType": "uint256", "name": "tokenId", "type": "uint256" }908 ],909 "name": "transferFromCross",910 "outputs": [],911 "stateMutability": "nonpayable",912 "type": "function"913 },914 {915 "inputs": [],916 "name": "uniqueCollectionType",917 "outputs": [{ "internalType": "string", "name": "", "type": "string" }],918 "stateMutability": "view",919 "type": "function"920 }921]tests/src/eth/abi/reFungibleToken.jsondiffbeforeafterboth--- 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" },
tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth--- 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
tests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth--- 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