git.delta.rocks / unique-network / refs/commits / 316164b9adc2

difftreelog

Merge pull request #832 from UniqueNetwork/feature/calculate_event_signature_at_compile_time

Yaroslav Bolyukin2023-01-16parents: #028059e #4f266b5.patch.diff
in: master

3 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2340,7 +2340,7 @@
 
 [[package]]
 name = "evm-coder-procedural"
-version = "0.2.2"
+version = "0.2.3"
 dependencies = [
  "Inflector",
  "hex",
modifiedcrates/evm-coder/procedural/Cargo.tomldiffbeforeafterboth
--- a/crates/evm-coder/procedural/Cargo.toml
+++ b/crates/evm-coder/procedural/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "evm-coder-procedural"
-version = "0.2.2"
+version = "0.2.3"
 license = "GPLv3"
 edition = "2021"
 
modifiedcrates/evm-coder/procedural/src/to_log.rsdiffbeforeafterboth
1616
17use inflector::cases;17use inflector::cases;
18use syn::{Data, DeriveInput, Field, Fields, Ident, Variant, spanned::Spanned};18use syn::{Data, DeriveInput, Field, Fields, Ident, Variant, spanned::Spanned};
19use std::fmt::Write;
20use quote::quote;19use quote::quote;
2120
22use crate::{parse_ident_from_path, parse_ident_from_type, snake_ident_to_screaming};21use crate::{parse_ident_from_path, parse_ident_from_type, snake_ident_to_screaming};
61 name: Ident,60 name: Ident,
62 name_screaming: Ident,61 name_screaming: Ident,
63 fields: Vec<EventField>,62 fields: Vec<EventField>,
64 selector: [u8; 32],63 selector: proc_macro2::TokenStream,
65 selector_str: String,
66}64}
6765
68impl Event {66impl Event {
69 fn try_from(variant: &Variant) -> syn::Result<Self> {67 fn try_from(variant: &Variant) -> syn::Result<Self> {
70 let name = &variant.ident;68 let name = &variant.ident;
69 let name_lit = proc_macro2::Literal::string(name.to_string().as_str());
71 let name_screaming = snake_ident_to_screaming(name);70 let name_screaming = snake_ident_to_screaming(name);
7271
73 let named = match &variant.fields {72 let named = match &variant.fields {
90 ));89 ));
91 }90 }
91
92 let mut selector_str = format!("{}(", name);92 let args = fields.iter().map(|f| {
93 let ty = &f.ty;
94 quote! {nameof(<#ty as ::evm_coder::abi::AbiType>::SIGNATURE) fixed(",")}
93 for (i, arg) in fields.iter().enumerate() {95 });
94 if i != 0 {96 // Remove trailing comma
95 write!(selector_str, ",").unwrap();
96 }
97 write!(selector_str, "{}", arg.ty).unwrap();97 let shift = (!fields.is_empty()).then(|| quote! {shift_left(1)});
98 }98
99 selector_str.push(')');99 let signature = quote! { ::evm_coder::make_signature!(new fixed(#name_lit) fixed("(") #(#args)* #shift fixed(")")) };
100 let selector = crate::event_selector_str(&selector_str);100 let selector = quote! {
101 {
102 let signature = #signature;
103 let mut sum = ::evm_coder::sha3_const::Keccak256::new();
104 let mut pos = 0;
105 while pos < signature.len {
106 sum = sum.update(&[signature.data[pos]; 1]);
107 pos += 1;
108 }
109 let a = sum.finalize();
110 let mut selector_bytes = [0; 32];
111 let mut i = 0;
112 while i != 32 {
113 selector_bytes[i] = a[i];
114 i += 1;
115 }
116 selector_bytes
117 }
118 };
101119
102 Ok(Self {120 Ok(Self {
103 name: name.to_owned(),121 name: name.to_owned(),
104 name_screaming,122 name_screaming,
105 fields,123 fields,
106 selector,124 selector,
107 selector_str,
108 })125 })
109 }126 }
110127
133150
134 fn expand_consts(&self) -> proc_macro2::TokenStream {151 fn expand_consts(&self) -> proc_macro2::TokenStream {
135 let name_screaming = &self.name_screaming;152 let name_screaming = &self.name_screaming;
136 let selector_str = &self.selector_str;
137 let selector = &self.selector;153 let selector = &self.selector;
138154
139 quote! {155 quote! {
140 #[doc = #selector_str]
141 const #name_screaming: [u8; 32] = [#(156 const #name_screaming: [u8; 32] = #selector;
142 #selector,
143 )*];
144 }157 }
145 }158 }
146159