1use alloy_primitives::Address;
4
5#[derive(Debug, Clone, Hash, PartialEq, Eq, Default)]
9#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11#[cfg_attr(feature = "serde", serde(rename_all = "PascalCase"))]
12#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
13pub struct AddressList {
14 pub address_manager: Address,
16 pub l1_cross_domain_messenger_proxy: Address,
18 #[cfg_attr(feature = "serde", serde(alias = "L1ERC721BridgeProxy"))]
20 pub l1_erc721_bridge_proxy: Address,
21 pub l1_standard_bridge_proxy: Address,
23 pub l2_output_oracle_proxy: Option<Address>,
25 #[cfg_attr(feature = "serde", serde(alias = "OptimismMintableERC20FactoryProxy"))]
27 pub optimism_mintable_erc20_factory_proxy: Address,
28 pub optimism_portal_proxy: Address,
30 pub system_config_proxy: Address,
32 pub proxy_admin: Address,
34 pub superchain_config: Option<Address>,
36
37 pub anchor_state_registry_proxy: Option<Address>,
40 #[cfg_attr(feature = "serde", serde(alias = "DelayedWETHProxy"))]
42 pub delayed_weth_proxy: Option<Address>,
43 pub dispute_game_factory_proxy: Option<Address>,
45 pub fault_dispute_game: Option<Address>,
47 #[cfg_attr(feature = "serde", serde(alias = "MIPS"))]
49 pub mips: Option<Address>,
50 pub permissioned_dispute_game: Option<Address>,
52 pub preimage_oracle: Option<Address>,
54 #[cfg_attr(feature = "serde", serde(alias = "DAChallengeAddress"))]
56 pub data_availability_challenge: Option<Address>,
57}
58
59impl AddressList {
60 pub fn zero_proof_addresses(&mut self) {
62 if self.anchor_state_registry_proxy == Some(Address::ZERO) {
63 self.anchor_state_registry_proxy = None;
64 }
65 if self.delayed_weth_proxy == Some(Address::ZERO) {
66 self.delayed_weth_proxy = None;
67 }
68 if self.dispute_game_factory_proxy == Some(Address::ZERO) {
69 self.dispute_game_factory_proxy = None;
70 }
71 if self.fault_dispute_game == Some(Address::ZERO) {
72 self.fault_dispute_game = None;
73 }
74 if self.mips == Some(Address::ZERO) {
75 self.mips = None;
76 }
77 if self.permissioned_dispute_game == Some(Address::ZERO) {
78 self.permissioned_dispute_game = None;
79 }
80 if self.preimage_oracle == Some(Address::ZERO) {
81 self.preimage_oracle = None;
82 }
83 }
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89 use alloy_primitives::address;
90
91 #[test]
92 fn zero_proof_addresses() {
93 let mut addresses = AddressList {
94 anchor_state_registry_proxy: Some(Address::ZERO),
95 delayed_weth_proxy: Some(Address::ZERO),
96 dispute_game_factory_proxy: Some(Address::ZERO),
97 fault_dispute_game: Some(Address::ZERO),
98 mips: Some(Address::ZERO),
99 permissioned_dispute_game: Some(Address::ZERO),
100 preimage_oracle: Some(Address::ZERO),
101 ..Default::default()
102 };
103
104 addresses.zero_proof_addresses();
105
106 assert_eq!(addresses.anchor_state_registry_proxy, None);
107 assert_eq!(addresses.delayed_weth_proxy, None);
108 assert_eq!(addresses.dispute_game_factory_proxy, None);
109 assert_eq!(addresses.fault_dispute_game, None);
110 assert_eq!(addresses.mips, None);
111 assert_eq!(addresses.permissioned_dispute_game, None);
112 assert_eq!(addresses.preimage_oracle, None);
113 }
114
115 #[test]
116 fn test_addresses_deserialize() {
117 let raw: &str = r#"
118 {
119 "AddressManager": "0x8efb6b5c4767b09dc9aa6af4eaa89f749522bae2",
120 "L1CrossDomainMessengerProxy": "0x866e82a600a1414e583f7f13623f1ac5d58b0afa",
121 "L1Erc721BridgeProxy": "0x608d94945a64503e642e6370ec598e519a2c1e53",
122 "L1StandardBridgeProxy": "0x3154cf16ccdb4c6d922629664174b904d80f2c35",
123 "L2OutputOracleProxy": "0x56315b90c40730925ec5485cf004d835058518a0",
124 "OptimismMintableErc20FactoryProxy": "0x05cc379ebd9b30bba19c6fa282ab29218ec61d84",
125 "OptimismPortalProxy": "0x49048044d57e1c92a77f79988d21fa8faf74e97e",
126 "SystemConfigProxy": "0x73a79fab69143498ed3712e519a88a918e1f4072",
127 "ProxyAdmin": "0x0475cbcaebd9ce8afa5025828d5b98dfb67e059e",
128 "AnchorStateRegistryProxy": "0xdb9091e48b1c42992a1213e6916184f9ebdbfedf",
129 "DelayedWethProxy": "0xa2f2ac6f5af72e494a227d79db20473cf7a1ffe8",
130 "DisputeGameFactoryProxy": "0x43edb88c4b80fdd2adff2412a7bebf9df42cb40e",
131 "FaultDisputeGame": "0xcd3c0194db74c23807d4b90a5181e1b28cf7007c",
132 "Mips": "0x16e83ce5ce29bf90ad9da06d2fe6a15d5f344ce4",
133 "PermissionedDisputeGame": "0x19009debf8954b610f207d5925eede827805986e",
134 "PreimageOracle": "0x9c065e11870b891d214bc2da7ef1f9ddfa1be277"
135 }
136 "#;
137
138 let addresses = AddressList {
139 address_manager: address!("8EfB6B5c4767B09Dc9AA6Af4eAA89F749522BaE2"),
140 l1_cross_domain_messenger_proxy: address!("866E82a600A1414e583f7F13623F1aC5d58b0Afa"),
141 l1_erc721_bridge_proxy: address!("608d94945A64503E642E6370Ec598e519a2C1E53"),
142 l1_standard_bridge_proxy: address!("3154Cf16ccdb4C6d922629664174b904d80F2C35"),
143 l2_output_oracle_proxy: Some(address!("56315b90c40730925ec5485cf004d835058518A0")),
144 optimism_mintable_erc20_factory_proxy: address!(
145 "05cc379EBD9B30BbA19C6fA282AB29218EC61D84"
146 ),
147 optimism_portal_proxy: address!("49048044D57e1C92A77f79988d21Fa8fAF74E97e"),
148 system_config_proxy: address!("73a79Fab69143498Ed3712e519A88a918e1f4072"),
149 proxy_admin: address!("0475cBCAebd9CE8AfA5025828d5b98DFb67E059E"),
150 superchain_config: None,
151 anchor_state_registry_proxy: Some(address!("db9091e48b1c42992a1213e6916184f9ebdbfedf")),
152 delayed_weth_proxy: Some(address!("a2f2ac6f5af72e494a227d79db20473cf7a1ffe8")),
153 dispute_game_factory_proxy: Some(address!("43edb88c4b80fdd2adff2412a7bebf9df42cb40e")),
154 fault_dispute_game: Some(address!("cd3c0194db74c23807d4b90a5181e1b28cf7007c")),
155 mips: Some(address!("16e83ce5ce29bf90ad9da06d2fe6a15d5f344ce4")),
156 permissioned_dispute_game: Some(address!("19009debf8954b610f207d5925eede827805986e")),
157 preimage_oracle: Some(address!("9c065e11870b891d214bc2da7ef1f9ddfa1be277")),
158 data_availability_challenge: None,
159 };
160
161 let deserialized: AddressList = serde_json::from_str(raw).unwrap();
162 assert_eq!(addresses, deserialized);
163 }
164
165 #[test]
166 fn test_addresses_unknown_field_json() {
167 let raw: &str = r#"
168 {
169 "AddressManager": "0x8efb6b5c4767b09dc9aa6af4eaa89f749522bae2",
170 "L1CrossDomainMessengerProxy": "0x866e82a600a1414e583f7f13623f1ac5d58b0afa",
171 "L1Erc721BridgeProxy": "0x608d94945a64503e642e6370ec598e519a2c1e53",
172 "L1StandardBridgeProxy": "0x3154cf16ccdb4c6d922629664174b904d80f2c35",
173 "L2OutputOracleProxy": "0x56315b90c40730925ec5485cf004d835058518a0",
174 "OptimismMintableErc20FactoryProxy": "0x05cc379ebd9b30bba19c6fa282ab29218ec61d84",
175 "OptimismPortalProxy": "0x49048044d57e1c92a77f79988d21fa8faf74e97e",
176 "SystemConfigProxy": "0x73a79fab69143498ed3712e519a88a918e1f4072",
177 "ProxyAdmin": "0x0475cbcaebd9ce8afa5025828d5b98dfb67e059e",
178 "AnchorStateRegistryProxy": "0xdb9091e48b1c42992a1213e6916184f9ebdbfedf",
179 "DelayedWethProxy": "0xa2f2ac6f5af72e494a227d79db20473cf7a1ffe8",
180 "DisputeGameFactoryProxy": "0x43edb88c4b80fdd2adff2412a7bebf9df42cb40e",
181 "FaultDisputeGame": "0xcd3c0194db74c23807d4b90a5181e1b28cf7007c",
182 "Mips": "0x16e83ce5ce29bf90ad9da06d2fe6a15d5f344ce4",
183 "PermissionedDisputeGame": "0x19009debf8954b610f207d5925eede827805986e",
184 "PreimageOracle": "0x9c065e11870b891d214bc2da7ef1f9ddfa1be277",
185 "unknown_field": "unknown"
186 }
187 "#;
188
189 let err = serde_json::from_str::<AddressList>(raw).unwrap_err();
190 assert_eq!(err.classify(), serde_json::error::Category::Data);
191 }
192}