Sitelet https://github.com/r55-eth/r55/commit/ebcfe359701a61897b11920e0a1cfced307f6390
Skip to content

Commit ebcfe35

Browse files
authored
feat: use hashed fn selector (#10)
1 parent b3492d5 commit ebcfe35

3 files changed

Lines changed: 17 additions & 15 deletions

File tree

‎contract-derive/Cargo.toml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ edition = "2021"
77
proc-macro2 = "1.0"
88
quote = "1.0"
99
syn = { version = "1.0", features = ["full"] }
10+
alloy-core = { version = "0.7.4", default-features = false }
1011

1112
[lib]
1213
proc-macro = true

‎contract-derive/src/lib.rs‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
extern crate proc_macro;
2+
use alloy_core::primitives::keccak256;
23
use proc_macro::TokenStream;
34
use quote::{format_ident, quote};
45
use syn::{parse_macro_input, ImplItem, ItemImpl};
@@ -31,9 +32,13 @@ pub fn contract(_attr: TokenStream, item: TokenStream) -> TokenStream {
3132
}
3233
}
3334

34-
let match_arms: Vec<_> = public_methods.iter().enumerate().map(|(index, method)| {
35+
let match_arms: Vec<_> = public_methods.iter().enumerate().map(|(_, method)| {
3536
let method_name = &method.sig.ident;
36-
let method_selector = index as u32;
37+
let method_selector = u32::from_be_bytes(
38+
keccak256(
39+
method_name.to_string()
40+
)[..4].try_into().unwrap_or_default()
41+
);
3742
let arg_types: Vec<_> = method.sig.inputs.iter().skip(1).map(|arg| {
3843
if let FnArg::Typed(pat_type) = arg {
3944
let ty = &*pat_type.ty;
@@ -88,7 +93,7 @@ pub fn contract(_attr: TokenStream, item: TokenStream) -> TokenStream {
8893
}
8994

9095
fn call_with_data(&self, calldata: &[u8]) {
91-
let selector = u32::from_le_bytes([calldata[0], calldata[1], calldata[2], calldata[3]]);
96+
let selector = u32::from_be_bytes([calldata[0], calldata[1], calldata[2], calldata[3]]);
9297
let calldata = &calldata[4..];
9398

9499
match selector {

‎r55/src/main.rs‎

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -127,19 +127,17 @@ fn test_runtime_from_binary() {
127127

128128
add_contract_to_db(&mut db, CONTRACT_ADDR, bytecode);
129129

130-
let selector_balance: u32 = 0;
131-
let selector_mint: u32 = 2;
130+
let selector_balance = &keccak256("balance_of")[0..4];
131+
let selector_mint = &keccak256("mint")[0..4];
132132
let to: Address = address!("0000000000000000000000000000000000000001");
133133
let value_mint: u64 = 42;
134134
let mut calldata_balance = to.abi_encode();
135135
let mut calldata_mint = (to, value_mint).abi_encode();
136136

137-
let selector_bytes_balance = selector_balance.to_le_bytes().to_vec();
138-
let mut complete_calldata_balance = selector_bytes_balance;
137+
let mut complete_calldata_balance = selector_balance.to_vec();
139138
complete_calldata_balance.append(&mut calldata_balance);
140139

141-
let selector_bytes_mint = selector_mint.to_le_bytes().to_vec();
142-
let mut complete_calldata_mint = selector_bytes_mint;
140+
let mut complete_calldata_mint = selector_mint.to_vec();
143141
complete_calldata_mint.append(&mut calldata_mint);
144142

145143
run_tx(&mut db, &CONTRACT_ADDR, complete_calldata_mint.clone());
@@ -154,19 +152,17 @@ fn test_runtime_from_binary() {
154152
}
155153

156154
fn test_runtime(addr: &Address, db: &mut InMemoryDB) {
157-
let selector_balance: u32 = 0;
158-
let selector_mint: u32 = 2;
155+
let selector_balance = &keccak256("balance_of")[0..4];
156+
let selector_mint = &keccak256("mint")[0..4];
159157
let to: Address = address!("0000000000000000000000000000000000000001");
160158
let value_mint: u64 = 42;
161159
let mut calldata_balance = to.abi_encode();
162160
let mut calldata_mint = (to, value_mint).abi_encode();
163161

164-
let selector_bytes_balance = selector_balance.to_le_bytes().to_vec();
165-
let mut complete_calldata_balance = selector_bytes_balance;
162+
let mut complete_calldata_balance = selector_balance.to_vec();
166163
complete_calldata_balance.append(&mut calldata_balance);
167164

168-
let selector_bytes_mint = selector_mint.to_le_bytes().to_vec();
169-
let mut complete_calldata_mint = selector_bytes_mint;
165+
let mut complete_calldata_mint = selector_mint.to_vec();
170166
complete_calldata_mint.append(&mut calldata_mint);
171167

172168
run_tx(db, addr, complete_calldata_mint.clone());

0 commit comments

Comments
 (0)