1#![no_std]
2
3use array_concat::concat_arrays;
4
5use bobcat_interfaces::selectors;
6
7pub type Address = [u8; 20];
8
9pub const fn make_minimal_proxy(addr: Address) -> [u8; 18 + 16 + 20] {
10 concat_arrays!(
13 [
14 0x60, 0x2d, 0x5f, 0x81, 0x60, 0x09, 0x5f, 0x39, 0xf3, 0x5f, 0x5f, 0x36, 0x5f, 0x5f,
15 0x37, 0x36, 0x5f, 0x73,
16 ],
17 addr,
18 [
19 0x5a, 0xf4, 0x3d, 0x5f, 0x5f, 0x3e, 0x60, 0x29, 0x57, 0x3d, 0x5f, 0xfd, 0x5b, 0x3d,
20 0x5f, 0xf3,
21 ]
22 )
23}
24
25macro_rules! unpack_arr {
26 ($b:expr, $l:expr) => {
27 match const_hex::const_decode_to_array::<$l>($b) {
28 Ok(v) => v,
29 Err(_) => panic!("bad code"),
30 }
31 };
32}
33
34pub const fn make_eip1967_proxy(logic: Address) -> [u8; 1 + 20 + 102] {
36 concat_arrays!(
38 [0x73],
39 logic,
40 unpack_arr!(
41 b"7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55603a8060403d393df3365f5f375f5f365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af45f3d5f5f3e3d9161003857fd5bf3",
42 101
43 )
44 )
45}
46
47pub const fn make_beacon_proxy(beacon: Address) -> [u8; 20 + 110] {
50 concat_arrays!(
52 unpack_arr!(
53 b"60408060093d393df3365f5f375f5f365f6020635c60da1b815280806004603c73",
54 33
55 ),
56 beacon,
57 unpack_arr!(b"5afa50515af45f3d5f5f3e3d9161003e57fd5bf3", 20)
58 )
59}
60
61pub const fn make_upgradeable_beacon_proxy(beacon: Address) -> [u8; 1 + 20 + 123] {
65 concat_arrays!(
67 [0x73],
68 beacon,
69 unpack_arr!(
70 b"7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5055604d8060403d393df3365f5f375f5f365f6020635c60da1b815280806004603c7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa50515af45f3d5f5f3e3d9161004b57fd5bf3",
71 123
72 )
73 )
74}
75
76pub const fn make_multi3_proxy(
77 one: Address,
78 two: Address,
79 three: Address,
80 all: Address,
81) -> [u8; 46 + 20 + 7 + 20 + 7 + 20 + 6 + 20 + 21] {
82 concat_arrays!(
84 unpack_arr!(
85 b"609e8060093d393df3365f5f375f5f365f6002355f1a8060011461003d5780600214610058576003146100735773",
86 46
87 ),
88 all,
89 unpack_arr!(b"61008d565b5073", 7),
90 one,
91 unpack_arr!(b"61008d565b5073", 7),
92 two,
93 unpack_arr!(b"61008d565b73", 6),
94 three,
95 unpack_arr!(b"61008d565b5af45f3d5f5f3e3d9161009c57fd5bf3", 21)
96 )
97}
98
99pub const fn make_beacon_sel_proxy_sel(
102 sel: [u8; 4],
103 beacon: Address,
104) -> [u8; 24 + 4 + 12 + 20 + 30] {
105 concat_arrays!(
107 unpack_arr!(b"60518060093d393df3602460046020368282355f5f368663", 24),
108 sel,
109 unpack_arr!(b"5f52855f8937808a80601c73", 12),
110 beacon,
111 unpack_arr!(
112 b"5afa1561004f578951368a8c375af43d5f5f3e5f3d911561004f57f35bfd",
113 30
114 )
115 )
116}
117
118selectors! {
119 SEL_IMPLEMENTATION = b"implementation(bytes4)",
120}
121
122pub const fn make_beacon_sel_proxy(beacon: Address) -> [u8; 24 + 4 + 12 + 20 + 30] {
126 make_beacon_sel_proxy_sel(SEL_IMPLEMENTATION, beacon)
127}