Skip to main content

builder_relayer_client_rust/builder/
derive.rs

1use crate::errors::Result;
2use alloy::primitives::{Address, B256, keccak256};
3use alloy::sol_types::SolValue;
4use std::str::FromStr;
5
6// SAFE_INIT_CODE_HASH from TS constants
7pub const SAFE_INIT_CODE_HASH: &str =
8    "0x2bce2127ff07fb632d16c8347c4ebf501f4841168bed00d9e6ef715ddb6fcecf";
9// PROXY_INIT_CODE_HASH from TS constants
10pub const PROXY_INIT_CODE_HASH: &str =
11    "0xd21df8dc65880a8606f09fe0ce3df9b8869287ab0b058be05aa9e8af6330a00b";
12
13pub fn derive_safe(factory: Address, owner: Address) -> Result<Address> {
14    let init_code_hash = B256::from_str(SAFE_INIT_CODE_HASH).expect("invalid hash");
15
16    // salt = keccak256(abi.encode(owner))
17    let encoded = owner.abi_encode();
18    let salt = keccak256(&encoded);
19
20    let addr = factory.create2(salt, init_code_hash);
21    Ok(addr)
22}
23
24pub fn derive_proxy(factory: Address, owner: Address) -> Result<Address> {
25    let init_code_hash = B256::from_str(PROXY_INIT_CODE_HASH).expect("invalid hash");
26
27    // TS 使用 encodePacked(address) => keccak(address 20 bytes)
28    let salt = keccak256(owner.as_slice());
29
30    Ok(factory.create2(salt, init_code_hash))
31}