From 0f0494df1f4fc2977114d25d24c8352857e5728d Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Thu, 12 Jan 2023 18:45:53 +0000 Subject: [PATCH] fix: erc165 expect_selector --- --- 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/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/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 { .. } -- gitstuff