kona_genesis/chain/
addresses.rs

1//! Address Types
2
3use alloy_primitives::Address;
4
5/// The set of network-specific contracts for a given chain.
6///
7/// See: <https://github.com/ethereum-optimism/superchain-registry/blob/8ff62ada16e14dd59d0fb94ffb47761c7fa96e01/ops/internal/config/chain.go#L156-L175>
8#[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    /// The address manager
15    pub address_manager: Address,
16    /// L1 Cross Domain Messenger proxy address
17    pub l1_cross_domain_messenger_proxy: Address,
18    /// L1 ERC721 Bridge proxy address
19    #[cfg_attr(feature = "serde", serde(alias = "L1ERC721BridgeProxy"))]
20    pub l1_erc721_bridge_proxy: Address,
21    /// L1 Standard Bridge proxy address
22    pub l1_standard_bridge_proxy: Address,
23    /// L2 Output Oracle Proxy address
24    pub l2_output_oracle_proxy: Option<Address>,
25    /// Optimism Mintable ERC20 Factory Proxy address
26    #[cfg_attr(feature = "serde", serde(alias = "OptimismMintableERC20FactoryProxy"))]
27    pub optimism_mintable_erc20_factory_proxy: Address,
28    /// Optimism Portal Proxy address
29    pub optimism_portal_proxy: Address,
30    /// System Config Proxy address
31    pub system_config_proxy: Address,
32    /// Proxy Admin address
33    pub proxy_admin: Address,
34    /// The superchain config address
35    pub superchain_config: Option<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 data availability challenge contract address
55    #[cfg_attr(feature = "serde", serde(alias = "DAChallengeAddress"))]
56    pub data_availability_challenge: Option<Address>,
57}
58
59impl AddressList {
60    /// Sets zeroed addresses to [`Option::None`].
61    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}