superchain_primitives/
addresses.rs

1//! Address Types
2
3use alloy_primitives::Address;
4
5/// The set of network-specific contracts for a given chain.
6#[derive(Debug, Clone, Hash, PartialEq, Eq, Default)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[cfg_attr(feature = "serde", serde(rename_all = "PascalCase"))]
9pub struct AddressList {
10    /// The address manager
11    pub address_manager: Address,
12    /// L1 Cross Domain Messenger proxy address
13    pub l1_cross_domain_messenger_proxy: Address,
14    /// L1 ERC721 Bridge proxy address
15    #[cfg_attr(feature = "serde", serde(alias = "L1ERC721BridgeProxy"))]
16    pub l1_erc721_bridge_proxy: Address,
17    /// L1 Standard Bridge proxy address
18    pub l1_standard_bridge_proxy: Address,
19    /// L2 Output Oracle Proxy address
20    pub l2_output_oracle_proxy: Option<Address>,
21    /// Optimism Mintable ERC20 Factory Proxy address
22    #[cfg_attr(feature = "serde", serde(alias = "OptimismMintableERC20FactoryProxy"))]
23    pub optimism_mintable_erc20_factory_proxy: Address,
24    /// Optimism Portal Proxy address
25    pub optimism_portal_proxy: Address,
26    /// System Config Proxy address
27    pub system_config_proxy: Address,
28    /// The system config owner
29    pub system_config_owner: Address,
30    /// Proxy Admin address
31    pub proxy_admin: Address,
32    /// The owner of the Proxy Admin
33    pub proxy_admin_owner: Address,
34    /// The guardian address
35    pub guardian: Address,
36
37    // Fault Proof Contract Addresses
38    /// Anchor State Registry Proxy address
39    pub anchor_state_registry_proxy: Option<Address>,
40    /// Delayed WETH Proxy address
41    #[cfg_attr(feature = "serde", serde(alias = "DelayedWETHProxy"))]
42    pub delayed_weth_proxy: Option<Address>,
43    /// Dispute Game Factory Proxy address
44    pub dispute_game_factory_proxy: Option<Address>,
45    /// Fault Dispute Game Proxy address
46    pub fault_dispute_game: Option<Address>,
47    /// MIPS Proxy address
48    #[cfg_attr(feature = "serde", serde(alias = "MIPS"))]
49    pub mips: Option<Address>,
50    /// Permissioned Dispute Game Proxy address
51    pub permissioned_dispute_game: Option<Address>,
52    /// Preimage Oracle Proxy address
53    pub preimage_oracle: Option<Address>,
54    /// The challenger's address
55    pub challenger: Option<Address>,
56}
57
58#[cfg(any(test, feature = "arbitrary"))]
59impl arbitrary::Arbitrary<'_> for AddressList {
60    fn arbitrary(g: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
61        Ok(Self {
62            address_manager: Address::from(g.arbitrary::<[u8; 20]>()?),
63            l1_cross_domain_messenger_proxy: Address::from(g.arbitrary::<[u8; 20]>()?),
64            l1_erc721_bridge_proxy: Address::from(g.arbitrary::<[u8; 20]>()?),
65            l1_standard_bridge_proxy: Address::from(g.arbitrary::<[u8; 20]>()?),
66            l2_output_oracle_proxy: Some(Address::from(g.arbitrary::<[u8; 20]>()?)),
67            optimism_mintable_erc20_factory_proxy: Address::from(g.arbitrary::<[u8; 20]>()?),
68            optimism_portal_proxy: Address::from(g.arbitrary::<[u8; 20]>()?),
69            system_config_proxy: Address::from(g.arbitrary::<[u8; 20]>()?),
70            system_config_owner: Address::from(g.arbitrary::<[u8; 20]>()?),
71            proxy_admin: Address::from(g.arbitrary::<[u8; 20]>()?),
72            proxy_admin_owner: Address::from(g.arbitrary::<[u8; 20]>()?),
73            guardian: Address::from(g.arbitrary::<[u8; 20]>()?),
74            anchor_state_registry_proxy: Some(Address::from(g.arbitrary::<[u8; 20]>()?)),
75            delayed_weth_proxy: Some(Address::from(g.arbitrary::<[u8; 20]>()?)),
76            dispute_game_factory_proxy: Some(Address::from(g.arbitrary::<[u8; 20]>()?)),
77            fault_dispute_game: Some(Address::from(g.arbitrary::<[u8; 20]>()?)),
78            mips: Some(Address::from(g.arbitrary::<[u8; 20]>()?)),
79            permissioned_dispute_game: Some(Address::from(g.arbitrary::<[u8; 20]>()?)),
80            preimage_oracle: Some(Address::from(g.arbitrary::<[u8; 20]>()?)),
81            challenger: Some(Address::from(g.arbitrary::<[u8; 20]>()?)),
82        })
83    }
84}
85
86impl AddressList {
87    /// Sets zeroed addresses to [`Option::None`].
88    pub fn zero_proof_addresses(&mut self) {
89        if self.anchor_state_registry_proxy == Some(Address::ZERO) {
90            self.anchor_state_registry_proxy = None;
91        }
92        if self.delayed_weth_proxy == Some(Address::ZERO) {
93            self.delayed_weth_proxy = None;
94        }
95        if self.dispute_game_factory_proxy == Some(Address::ZERO) {
96            self.dispute_game_factory_proxy = None;
97        }
98        if self.fault_dispute_game == Some(Address::ZERO) {
99            self.fault_dispute_game = None;
100        }
101        if self.mips == Some(Address::ZERO) {
102            self.mips = None;
103        }
104        if self.permissioned_dispute_game == Some(Address::ZERO) {
105            self.permissioned_dispute_game = None;
106        }
107        if self.preimage_oracle == Some(Address::ZERO) {
108            self.preimage_oracle = None;
109        }
110        if self.challenger == Some(Address::ZERO) {
111            self.challenger = None;
112        }
113    }
114}
115
116#[cfg(test)]
117mod tests {
118    use super::*;
119
120    #[test]
121    fn zero_proof_addresses() {
122        let mut addresses = AddressList {
123            anchor_state_registry_proxy: Some(Address::ZERO),
124            delayed_weth_proxy: Some(Address::ZERO),
125            dispute_game_factory_proxy: Some(Address::ZERO),
126            fault_dispute_game: Some(Address::ZERO),
127            mips: Some(Address::ZERO),
128            permissioned_dispute_game: Some(Address::ZERO),
129            preimage_oracle: Some(Address::ZERO),
130            challenger: Some(Address::ZERO),
131            ..Default::default()
132        };
133
134        addresses.zero_proof_addresses();
135
136        assert_eq!(addresses.anchor_state_registry_proxy, None);
137        assert_eq!(addresses.delayed_weth_proxy, None);
138        assert_eq!(addresses.dispute_game_factory_proxy, None);
139        assert_eq!(addresses.fault_dispute_game, None);
140        assert_eq!(addresses.mips, None);
141        assert_eq!(addresses.permissioned_dispute_game, None);
142        assert_eq!(addresses.preimage_oracle, None);
143        assert_eq!(addresses.challenger, None);
144    }
145}