@@ -98,8 +98,125 @@ impl FromStr for PubdataType {
9898 }
9999}
100100
101- #[ derive( Default , Copy , Debug , Clone , PartialEq , Serialize , Deserialize ) ]
101+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Serialize , Deserialize , Display ) ]
102+ #[ repr( u8 ) ]
103+ pub enum L2DACommitmentScheme {
104+ None = 0 ,
105+ EmptyNoDA = 1 ,
106+ PubdataKeccak256 = 2 ,
107+ BlobsAndPubdataKeccak256 = 3 ,
108+ }
109+
110+ impl TryFrom < u8 > for L2DACommitmentScheme {
111+ type Error = & ' static str ;
112+ fn try_from ( value : u8 ) -> Result < Self , Self :: Error > {
113+ match value {
114+ 0 => Ok ( L2DACommitmentScheme :: None ) ,
115+ 1 => Ok ( L2DACommitmentScheme :: EmptyNoDA ) ,
116+ 2 => Ok ( L2DACommitmentScheme :: PubdataKeccak256 ) ,
117+ 3 => Ok ( L2DACommitmentScheme :: BlobsAndPubdataKeccak256 ) ,
118+ _ => Err ( "Invalid L2DACommitmentScheme value" ) ,
119+ }
120+ }
121+ }
122+
123+ impl FromStr for L2DACommitmentScheme {
124+ type Err = & ' static str ;
125+
126+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
127+ match s {
128+ "None" => Ok ( Self :: None ) ,
129+ "EmptyNoDA" => Ok ( Self :: EmptyNoDA ) ,
130+ "PubdataKeccak256" => Ok ( Self :: PubdataKeccak256 ) ,
131+ "BlobsAndPubdataKeccak256" => Ok ( Self :: BlobsAndPubdataKeccak256 ) ,
132+ _ => Err ( "Incorrect L2 DA commitment scheme; expected one of `None`, `EmptyNoDA`, `PubdataKeccak256`, `BlobsAndPubdataKeccak256`" ) ,
133+ }
134+ }
135+ }
136+
137+ #[ derive( Copy , Debug , Clone , PartialEq , Serialize , Deserialize ) ]
138+ pub enum L2PubdataValidator {
139+ Address ( Address ) ,
140+ CommitmentScheme ( L2DACommitmentScheme ) ,
141+ }
142+
143+ impl TryFrom < ( Option < Address > , Option < L2DACommitmentScheme > ) > for L2PubdataValidator {
144+ type Error = anyhow:: Error ;
145+
146+ fn try_from (
147+ value : ( Option < Address > , Option < L2DACommitmentScheme > ) ,
148+ ) -> Result < Self , Self :: Error > {
149+ match value {
150+ ( None , Some ( scheme) ) => Ok ( L2PubdataValidator :: CommitmentScheme ( scheme) ) ,
151+ ( Some ( address) , None ) => Ok ( L2PubdataValidator :: Address ( address) ) ,
152+ ( Some ( _) , Some ( _) ) => anyhow:: bail!(
153+ "Address and L2DACommitmentScheme are specified, should be chosen only one"
154+ ) ,
155+ ( None , None ) => anyhow:: bail!(
156+ "Address and L2DACommitmentScheme are not specified, should be chosen at least one"
157+ ) ,
158+ }
159+ }
160+ }
161+
162+ impl L2PubdataValidator {
163+ pub fn l2_da_validator ( & self ) -> Option < Address > {
164+ match self {
165+ L2PubdataValidator :: Address ( addr) => Some ( * addr) ,
166+ L2PubdataValidator :: CommitmentScheme ( _) => None ,
167+ }
168+ }
169+
170+ pub fn l2_da_commitment_scheme ( & self ) -> Option < L2DACommitmentScheme > {
171+ match self {
172+ L2PubdataValidator :: Address ( _) => None ,
173+ L2PubdataValidator :: CommitmentScheme ( scheme) => Some ( * scheme) ,
174+ }
175+ }
176+ }
177+
178+ #[ derive( Copy , Debug , Clone , PartialEq , Serialize , Deserialize ) ]
102179pub struct PubdataParams {
103- pub l2_da_validator_address : Address ,
104- pub pubdata_type : PubdataType ,
180+ pubdata_validator : L2PubdataValidator ,
181+ pubdata_type : PubdataType ,
182+ }
183+
184+ impl PubdataParams {
185+ pub fn new (
186+ pubdata_validator : L2PubdataValidator ,
187+ pubdata_type : PubdataType ,
188+ ) -> anyhow:: Result < Self > {
189+ if L2PubdataValidator :: CommitmentScheme ( L2DACommitmentScheme :: None ) == pubdata_validator {
190+ anyhow:: bail!( "L2DACommitmentScheme::None is not allowed as a legit pubdata parameter" ) ;
191+ } ;
192+
193+ Ok ( PubdataParams {
194+ pubdata_validator,
195+ pubdata_type,
196+ } )
197+ }
198+
199+ pub fn pubdata_validator ( & self ) -> L2PubdataValidator {
200+ self . pubdata_validator
201+ }
202+
203+ pub fn pubdata_type ( & self ) -> PubdataType {
204+ self . pubdata_type
205+ }
206+
207+ pub fn genesis ( ) -> Self {
208+ PubdataParams {
209+ pubdata_validator : L2PubdataValidator :: CommitmentScheme (
210+ L2DACommitmentScheme :: BlobsAndPubdataKeccak256 ,
211+ ) ,
212+ pubdata_type : PubdataType :: Rollup ,
213+ }
214+ }
215+
216+ pub fn pre_gateway ( ) -> Self {
217+ PubdataParams {
218+ pubdata_validator : L2PubdataValidator :: Address ( Address :: zero ( ) ) ,
219+ pubdata_type : Default :: default ( ) ,
220+ }
221+ }
105222}
0 commit comments