difftreelog
feat implicit implementation of ERC165
in: master
2 files changed
crates/evm-coder-macros/src/solidity_interface.rsdiffbeforeafterboth672 quote! {672 quote! {673 #[derive(Debug)]673 #[derive(Debug)]674 pub enum #call_name {674 pub enum #call_name {675 ERC165Call(::evm_coder::ERC165Call),675 #(676 #(676 #calls,677 #calls,677 )*678 )*691 }692 }692 pub fn supports_interface(interface_id: u32) -> bool {693 pub fn supports_interface(interface_id: u32) -> bool {693 interface_id != 0xffffff && (694 interface_id != 0xffffff && (695 interface_id == ::evm_coder::ERC165Call::INTERFACE_ID ||694 interface_id == Self::interface_id()696 interface_id == Self::interface_id()695 #(697 #(696 || #supports_interface698 || #supports_interface702 use core::fmt::Write;704 use core::fmt::Write;703 let interface = SolidityInterface {705 let interface = SolidityInterface {704 name: #solidity_name,706 name: #solidity_name,705 is: &["Dummy", #(707 is: &["Dummy", "ERC165", #(706 #solidity_is,708 #solidity_is,707 )* #(709 )* #(708 #solidity_events_is,710 #solidity_events_is,712 )*),714 )*),713 };715 };714 if is_impl {716 if is_impl {715 tc.collect("// Common stubs holder\ncontract Dummy {\n\tuint8 dummy;\n\tstring stub_error = \"this contract is implemented in native\";\n}\n".into());717 tc.collect("// Common stubs holder\ncontract Dummy {\n\tuint8 dummy;\n\tstring stub_error = \"this contract is implemented in native\";\n}\ninterface ERC165 {\n\tfunction supportsInterface(bytes4 interfaceID) external view returns (bool) {\n\t\trequire(false, stub_error);\n\t\tinterfaceID;\n\t\treturn true;\n\t}\n}\n".into());716 } else {718 } else {717 tc.collect("// Common stubs holder\ninterface Dummy {\n}\n".into());719 tc.collect("// Common stubs holder\ninterface Dummy {\n}\ninterface ERC165 {\n\tfunction supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n".into());718 }720 }719 #(721 #(720 #solidity_generators722 #solidity_generators737 fn parse(method_id: u32, reader: &mut ::evm_coder::abi::AbiReader) -> ::evm_coder::execution::Result<Option<Self>> {739 fn parse(method_id: u32, reader: &mut ::evm_coder::abi::AbiReader) -> ::evm_coder::execution::Result<Option<Self>> {738 use ::evm_coder::abi::AbiRead;740 use ::evm_coder::abi::AbiRead;739 match method_id {741 match method_id {742 ::evm_coder::ERC165Call::INTERFACE_ID => return Ok(::evm_coder::ERC165Call::parse(method_id, reader)?.map(Self::ERC165Call)),740 #(743 #(741 #parsers,744 #parsers,742 )*745 )*757 #(760 #(758 #call_variants,761 #call_variants,759 )*762 )*763 InternalCall::ERC165Call(::evm_coder::ERC165Call::SupportsInterface {interface_id}) => {764 let mut writer = ::evm_coder::abi::AbiWriter::default();765 writer.bool(&InternalCall::supports_interface(interface_id));766 return Ok(writer);767 }760 _ => {},768 _ => {},761 }769 }762 let mut writer = ::evm_coder::abi::AbiWriter::default();770 let mut writer = ::evm_coder::abi::AbiWriter::default();crates/evm-coder/src/lib.rsdiffbeforeafterboth--- a/crates/evm-coder/src/lib.rs
+++ b/crates/evm-coder/src/lib.rs
@@ -2,7 +2,7 @@
#[cfg(not(feature = "std"))]
extern crate alloc;
-use abi::{AbiReader, AbiWriter};
+use abi::{AbiRead, AbiReader, AbiWriter};
pub use evm_coder_macros::{event_topic, fn_selector, solidity_interface, solidity, ToLog};
pub mod abi;
pub mod events;
@@ -61,6 +61,29 @@
fn call(&mut self, call: types::Msg<C>) -> execution::Result<AbiWriter>;
}
+/// Implementation is implicitly provided for all interfaces
+///
+/// Note: no Callable implementation is provided
+#[derive(Debug)]
+pub enum ERC165Call {
+ SupportsInterface { interface_id: types::bytes4 },
+}
+
+impl ERC165Call {
+ pub const INTERFACE_ID: types::bytes4 = 0x01ffc9a7;
+}
+
+impl Call for ERC165Call {
+ fn parse(selector: u32, input: &mut AbiReader) -> execution::Result<Option<Self>> {
+ if selector != Self::INTERFACE_ID {
+ return Ok(None);
+ }
+ Ok(Some(Self::SupportsInterface {
+ interface_id: input.abi_read()?,
+ }))
+ }
+}
+
#[macro_export]
macro_rules! generate_stubgen {
($name:ident, $decl:ident, $is_impl:literal) => {