1#![no_std]
2
3use array_concat::concat_arrays;
4
5use bobcat_interfaces::selectors;
6
7type 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 SIZE_EIP1967: usize = 1 + 20 + 76;
35
36pub const fn make_eip1967_proxy(logic: Address) -> [u8; SIZE_EIP1967] {
38 concat_arrays!(
40 [0x73],
41 logic,
42 unpack_arr!(
43 b"602060305f395f5155603a8060273d393df3365f5f375f5f365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af45f3d5f5f3e3d9161003857fd5bf3",
44 76
45 )
46 )
47}
48
49pub const fn make_beacon_proxy(beacon: Address) -> [u8; 20 + 110] {
52 concat_arrays!(
54 unpack_arr!(
55 b"60408060093d393df3365f5f375f5f365f6020635c60da1b815280806004603c73",
56 33
57 ),
58 beacon,
59 unpack_arr!(b"5afa50515af45f3d5f5f3e3d9161003e57fd5bf3", 20)
60 )
61}
62
63pub const SIZE_UPGRADEABLE_BEACON_PROXY: usize = 1 + 20 + 123;
64
65pub const fn make_upgradeable_beacon_proxy(beacon: Address) -> [u8; SIZE_UPGRADEABLE_BEACON_PROXY] {
69 concat_arrays!(
71 [0x73],
72 beacon,
73 unpack_arr!(
74 b"7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5055604d8060403d393df3365f5f375f5f365f6020635c60da1b815280806004603c7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa50515af45f3d5f5f3e3d9161004b57fd5bf3",
75 123
76 )
77 )
78}
79
80pub const SIZE_MULTI3_PROXY: usize = 46 + 20 + 7 + 20 + 7 + 20 + 6 + 20 + 21;
81
82pub const fn make_multi3_proxy(
83 one: Address,
84 two: Address,
85 three: Address,
86 all: Address,
87) -> [u8; SIZE_MULTI3_PROXY] {
88 concat_arrays!(
90 unpack_arr!(
91 b"609e8060093d393df3365f5f375f5f365f6002355f1a8060011461003d5780600214610058576003146100735773",
92 46
93 ),
94 all,
95 unpack_arr!(b"61008d565b5073", 7),
96 one,
97 unpack_arr!(b"61008d565b5073", 7),
98 two,
99 unpack_arr!(b"61008d565b73", 6),
100 three,
101 unpack_arr!(b"61008d565b5af45f3d5f5f3e3d9161009c57fd5bf3", 21)
102 )
103}
104
105pub const SIZE_BEACON_SEL_PROXY: usize = 24 + 4 + 12 + 20 + 30;
106
107pub const fn make_beacon_sel_proxy_sel(
110 sel: [u8; 4],
111 beacon: Address,
112) -> [u8; SIZE_BEACON_SEL_PROXY] {
113 concat_arrays!(
115 unpack_arr!(b"60518060093d393df3602460046020368282355f5f368663", 24),
116 sel,
117 unpack_arr!(b"5f52855f8937808a80601c73", 12),
118 beacon,
119 unpack_arr!(
120 b"5afa1561004f578951368a8c375af43d5f5f3e5f3d911561004f57f35bfd",
121 30
122 )
123 )
124}
125
126selectors! {
127 SEL_IMPLEMENTATION = b"implementation(bytes4)",
129 SEL_MIGRATE = b"migrate()"
131}
132
133pub const fn make_beacon_sel_proxy(beacon: Address) -> [u8; SIZE_BEACON_SEL_PROXY] {
137 make_beacon_sel_proxy_sel(SEL_IMPLEMENTATION, beacon)
138}
139
140pub const SIZE_METAMORPHIC_ON_FN: usize = 34 + 20 + 61;
141
142pub const fn make_metamorphic_proxy(deployer: Address) -> [u8; SIZE_METAMORPHIC_ON_FN] {
144 concat_arrays!(
146 unpack_arr!(b"606a8060093d393df3365f5f375f3560e01c638fd3ab801461001757610031565b73", 34),
147 deployer,
148 unpack_arr!(
149 b"610054565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545b5f365f5f935af43d5f5f3e3d5f8261006857fd5bf3",
150 61
151 )
152 )
153}
154
155pub const SIZE_METAMORPHIC_ON_FN_BEACON: usize = 35 + 20 + 69;
156
157pub const fn make_metamorphic_beacon_proxy(
160 deployer: Address,
161) -> [u8; SIZE_METAMORPHIC_ON_FN_BEACON] {
162 concat_arrays!(
164 unpack_arr!(b"60738060093d393df35f3560e01c638fd3ab801461001357610036565b60205f5f5f73", 35),
165 deployer,
166 unpack_arr!(
167 b"5afa5f51610059565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545b365f5f375f365f5f935af43d5f5f3e3d5f8261007157fd5bf3",
168 69
169 )
170 )
171}