git.delta.rocks / unique-network / refs/commits / 0f0494df1f4f

difftreelog

fix erc165 expect_selector

Yaroslav Bolyukin2023-01-12parent: #9cba02d.patch.diff
in: master

3 files changed

modifiedcrates/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)*
modifiedpallets/refungible/src/erc.rsdiffbeforeafterboth
295 MintingFinished {},295 MintingFinished {},
296}296}
297297
298/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
299/// @dev See https://eips.ethereum.org/EIPS/eip-721
298#[solidity_interface(name = ERC721Metadata)]300#[solidity_interface(name = ERC721Metadata, expect_selector = 0x5b5e139f)]
299impl<T: Config> RefungibleHandle<T>301impl<T: Config> RefungibleHandle<T>
300where302where
301 T::AccountId: From<[u8; 32]> + AsRef<[u8; 32]>,303 T::AccountId: From<[u8; 32]> + AsRef<[u8; 32]>,
364366
365/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension367/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
366/// @dev See https://eips.ethereum.org/EIPS/eip-721368/// @dev See https://eips.ethereum.org/EIPS/eip-721
367#[solidity_interface(name = ERC721Enumerable)]369#[solidity_interface(name = ERC721Enumerable, expect_selector = 0x780e9d63)]
368impl<T: Config> RefungibleHandle<T> {370impl<T: Config> RefungibleHandle<T> {
369 /// @notice Enumerate valid RFTs371 /// @notice Enumerate valid RFTs
370 /// @param index A counter less than `totalSupply()`372 /// @param index A counter less than `totalSupply()`
391393
392/// @title ERC-721 Non-Fungible Token Standard394/// @title ERC-721 Non-Fungible Token Standard
393/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md395/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
394#[solidity_interface(name = ERC721, events(ERC721Events))]396#[solidity_interface(name = ERC721, events(ERC721Events), expect_selector = 0x80ac58cd)]
395impl<T: Config> RefungibleHandle<T> {397impl<T: Config> RefungibleHandle<T> {
396 /// @notice Count all RFTs assigned to an owner398 /// @notice Count all RFTs assigned to an owner
397 /// @dev RFTs assigned to the zero address are considered invalid, and this399 /// @dev RFTs assigned to the zero address are considered invalid, and this
422 }424 }
423425
424 /// @dev Not implemented426 /// @dev Not implemented
427 #[solidity(rename_selector = "safeTransferFrom")]
425 fn safe_transfer_from_with_data(428 fn safe_transfer_from_with_data(
426 &mut self,429 &mut self,
427 _from: address,430 _from: address,
434 }437 }
435438
436 /// @dev Not implemented439 /// @dev Not implemented
440 #[solidity(rename_selector = "safeTransferFrom")]
437 fn safe_transfer_from(441 fn safe_transfer_from(
438 &mut self,442 &mut self,
439 _from: address,443 _from: address,
518 Ok(<Pallet<T>>::allowance_for_all(self, &owner, &operator))522 Ok(<Pallet<T>>::allowance_for_all(self, &owner, &operator))
519 }523 }
520
521 /// @notice Returns collection helper contract address
522 fn collection_helper_address(&self) -> Result<address> {
523 Ok(T::ContractAddress::get())
524 }
525}524}
526525
527/// Returns amount of pieces of `token` that `owner` have526/// Returns amount of pieces of `token` that `owner` have
1117 ))1116 ))
1118 }1117 }
1118
1119 /// @notice Returns collection helper contract address
1120 fn collection_helper_address(&self) -> Result<address> {
1121 Ok(T::ContractAddress::get())
1122 }
1119}1123}
11201124
1121#[solidity_interface(1125#[solidity_interface(
modifiedruntime/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 { .. }