1use alloy::sol;
18
19pub use crate::bindings::{
26 erc1967proxy::ERC1967Proxy,
27 esptoken::EspToken,
28 esptokenv2::EspTokenV2,
29 feecontract::FeeContract::{self, Deposit},
30 lightclient::{
31 IPlonkVerifier::{PlonkProof as PlonkProofSol, VerifyingKey as VerifyingKeySol},
32 LightClient::{
33 self, LightClientErrors, LightClientInstance, LightClientState as LightClientStateSol,
34 StakeTableState as StakeTableStateSol,
35 },
36 BN254::G1Point as G1PointSol,
37 },
38 lightclientmock::{self, LightClientMock},
39 lightclientv2::{self, LightClientV2},
40 lightclientv2mock::{self, LightClientV2Mock},
41 lightclientv3::{self, LightClientV3},
42 lightclientv3mock::{self, LightClientV3Mock},
43 opstimelock::OpsTimelock,
44 ownableupgradeable::OwnableUpgradeable,
45 plonkverifier::PlonkVerifier,
46 plonkverifierv2::PlonkVerifierV2,
47 plonkverifierv3::PlonkVerifierV3,
48 rewardclaimprototypemock::{
49 RewardClaimPrototypeMock,
50 RewardMerkleTreeVerifier::AccruedRewardsProof as AccruedRewardsProofSol,
51 },
52 safeexittimelock::SafeExitTimelock,
53 staketable::StakeTable,
54 staketablev2::{
55 self, EdOnBN254::EdOnBN254Point as EdOnBN254PointSol, StakeTableV2,
56 BN254::G2Point as G2PointSol,
57 },
58};
59
60sol! {
65 struct TranscriptDataSol {
67 bytes32 state;
68 bytes transcript;
69 }
70
71 struct ChallengesSol {
73 uint256 alpha;
74 uint256 alpha2;
75 uint256 alpha3;
76 uint256 beta;
77 uint256 gamma;
78 uint256 zeta;
79 uint256 v;
80 uint256 u;
81 }
82
83}
84
85impl From<LightClient::genesisStateReturn> for LightClientStateSol {
90 fn from(v: LightClient::genesisStateReturn) -> Self {
91 unsafe { std::mem::transmute(v) }
92 }
93}
94
95impl From<lightclientmock::LightClient::LightClientState> for LightClientStateSol {
96 fn from(v: lightclientmock::LightClient::LightClientState) -> Self {
97 unsafe { std::mem::transmute(v) }
98 }
99}
100impl From<lightclientmock::LightClientMock::finalizedStateReturn> for LightClientStateSol {
101 fn from(v: lightclientmock::LightClientMock::finalizedStateReturn) -> Self {
102 unsafe { std::mem::transmute(v) }
103 }
104}
105
106impl From<LightClientStateSol> for lightclientmock::LightClient::LightClientState {
107 fn from(v: LightClientStateSol) -> Self {
108 unsafe { std::mem::transmute(v) }
109 }
110}
111
112impl From<PlonkProofSol> for lightclientmock::IPlonkVerifier::PlonkProof {
113 fn from(v: PlonkProofSol) -> Self {
114 unsafe { std::mem::transmute(v) }
115 }
116}
117
118impl From<lightclientmock::LightClientMock::genesisStateReturn> for LightClientStateSol {
119 fn from(v: lightclientmock::LightClientMock::genesisStateReturn) -> Self {
120 unsafe { std::mem::transmute(v) }
121 }
122}
123
124impl From<LightClientV2::finalizedStateReturn> for LightClientStateSol {
125 fn from(v: LightClientV2::finalizedStateReturn) -> Self {
126 unsafe { std::mem::transmute(v) }
127 }
128}
129
130impl From<LightClientV2::votingStakeTableStateReturn> for StakeTableStateSol {
131 fn from(v: LightClientV2::votingStakeTableStateReturn) -> Self {
132 unsafe { std::mem::transmute(v) }
133 }
134}
135
136impl From<lightclientv2mock::LightClient::LightClientState> for LightClientStateSol {
137 fn from(v: lightclientv2mock::LightClient::LightClientState) -> Self {
138 unsafe { std::mem::transmute(v) }
139 }
140}
141impl From<LightClientStateSol> for lightclientv2mock::LightClient::LightClientState {
142 fn from(v: LightClientStateSol) -> Self {
143 unsafe { std::mem::transmute(v) }
144 }
145}
146impl From<LightClientStateSol> for lightclientv2::LightClient::LightClientState {
147 fn from(v: LightClientStateSol) -> Self {
148 unsafe { std::mem::transmute(v) }
149 }
150}
151
152impl From<StakeTableStateSol> for lightclientv2::LightClient::StakeTableState {
153 fn from(v: StakeTableStateSol) -> Self {
154 unsafe { std::mem::transmute(v) }
155 }
156}
157impl From<StakeTableStateSol> for lightclientv2mock::LightClient::StakeTableState {
158 fn from(v: StakeTableStateSol) -> Self {
159 unsafe { std::mem::transmute(v) }
160 }
161}
162
163impl From<LightClientV2Mock::genesisStateReturn> for LightClientStateSol {
164 fn from(v: LightClientV2Mock::genesisStateReturn) -> Self {
165 unsafe { std::mem::transmute(v) }
166 }
167}
168
169impl From<LightClientV2Mock::finalizedStateReturn> for LightClientStateSol {
170 fn from(v: LightClientV2Mock::finalizedStateReturn) -> Self {
171 unsafe { std::mem::transmute(v) }
172 }
173}
174
175impl From<PlonkProofSol> for lightclientv2::IPlonkVerifier::PlonkProof {
176 fn from(v: PlonkProofSol) -> Self {
177 unsafe { std::mem::transmute(v) }
178 }
179}
180
181impl From<LightClientV2Mock::votingStakeTableStateReturn> for StakeTableStateSol {
182 fn from(v: LightClientV2Mock::votingStakeTableStateReturn) -> Self {
183 unsafe { std::mem::transmute(v) }
184 }
185}
186
187impl From<G1PointSol> for staketablev2::BN254::G1Point {
188 fn from(v: G1PointSol) -> Self {
189 unsafe { std::mem::transmute(v) }
190 }
191}
192
193impl From<staketablev2::BN254::G1Point> for G1PointSol {
194 fn from(v: staketablev2::BN254::G1Point) -> Self {
195 unsafe { std::mem::transmute(v) }
196 }
197}
198
199impl From<LightClientV3::finalizedStateReturn> for LightClientStateSol {
201 fn from(v: LightClientV3::finalizedStateReturn) -> Self {
202 unsafe { std::mem::transmute(v) }
203 }
204}
205
206impl From<LightClientV3::votingStakeTableStateReturn> for StakeTableStateSol {
207 fn from(v: LightClientV3::votingStakeTableStateReturn) -> Self {
208 unsafe { std::mem::transmute(v) }
209 }
210}
211
212impl From<LightClientStateSol> for lightclientv3::LightClient::LightClientState {
213 fn from(v: LightClientStateSol) -> Self {
214 unsafe { std::mem::transmute(v) }
215 }
216}
217
218impl From<StakeTableStateSol> for lightclientv3::LightClient::StakeTableState {
219 fn from(v: StakeTableStateSol) -> Self {
220 unsafe { std::mem::transmute(v) }
221 }
222}
223
224impl From<PlonkProofSol> for lightclientv3::IPlonkVerifier::PlonkProof {
225 fn from(v: PlonkProofSol) -> Self {
226 unsafe { std::mem::transmute(v) }
227 }
228}
229
230impl From<lightclientv3mock::LightClient::LightClientState> for LightClientStateSol {
232 fn from(v: lightclientv3mock::LightClient::LightClientState) -> Self {
233 unsafe { std::mem::transmute(v) }
234 }
235}
236
237impl From<LightClientStateSol> for lightclientv3mock::LightClient::LightClientState {
238 fn from(v: LightClientStateSol) -> Self {
239 unsafe { std::mem::transmute(v) }
240 }
241}
242
243impl From<StakeTableStateSol> for lightclientv3mock::LightClient::StakeTableState {
244 fn from(v: StakeTableStateSol) -> Self {
245 unsafe { std::mem::transmute(v) }
246 }
247}
248
249impl From<LightClientV3Mock::genesisStateReturn> for LightClientStateSol {
250 fn from(v: LightClientV3Mock::genesisStateReturn) -> Self {
251 unsafe { std::mem::transmute(v) }
252 }
253}
254
255impl From<LightClientV3Mock::finalizedStateReturn> for LightClientStateSol {
256 fn from(v: LightClientV3Mock::finalizedStateReturn) -> Self {
257 unsafe { std::mem::transmute(v) }
258 }
259}
260
261impl From<LightClientV3Mock::votingStakeTableStateReturn> for StakeTableStateSol {
262 fn from(v: LightClientV3Mock::votingStakeTableStateReturn) -> Self {
263 unsafe { std::mem::transmute(v) }
264 }
265}
266
267use serde::{Deserialize, Deserializer, Serialize, Serializer};
268
269use self::{
270 staketablev2::{EdOnBN254::EdOnBN254Point, BN254::G2Point},
271 StakeTableV2::{
272 CommissionUpdated, ConsensusKeysUpdated, ConsensusKeysUpdatedV2, Delegated, Undelegated,
273 ValidatorExit, ValidatorRegistered, ValidatorRegisteredV2,
274 },
275};
276
277impl PartialEq for ValidatorRegistered {
278 fn eq(&self, other: &Self) -> bool {
279 self.account == other.account
280 && self.blsVk == other.blsVk
281 && self.schnorrVk == other.schnorrVk
282 && self.commission == other.commission
283 }
284}
285
286impl PartialEq for ValidatorRegisteredV2 {
287 fn eq(&self, other: &Self) -> bool {
288 self.account == other.account
289 && self.blsVK == other.blsVK
290 && self.schnorrVK == other.schnorrVK
291 && self.commission == other.commission
292 && self.blsSig == other.blsSig
293 && self.schnorrSig == other.schnorrSig
294 }
295}
296
297impl PartialEq for ConsensusKeysUpdated {
298 fn eq(&self, other: &Self) -> bool {
299 self.account == other.account
300 && self.blsVK == other.blsVK
301 && self.schnorrVK == other.schnorrVK
302 }
303}
304
305impl PartialEq for ConsensusKeysUpdatedV2 {
306 fn eq(&self, other: &Self) -> bool {
307 self.account == other.account
308 && self.blsVK == other.blsVK
309 && self.schnorrVK == other.schnorrVK
310 && self.blsSig == other.blsSig
311 && self.schnorrSig == other.schnorrSig
312 }
313}
314
315impl Serialize for ValidatorRegistered {
316 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
317 where
318 S: Serializer,
319 {
320 (&self.account, &self.blsVk, &self.schnorrVk, self.commission).serialize(serializer)
321 }
322}
323
324#[allow(non_snake_case)]
325impl<'de> Deserialize<'de> for ValidatorRegistered {
326 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
327 where
328 D: Deserializer<'de>,
329 {
330 let (account, blsVk, schnorrVk, commission) = <(_, _, _, u16)>::deserialize(deserializer)?;
331 Ok(Self {
332 account,
333 blsVk,
334 schnorrVk,
335 commission,
336 })
337 }
338}
339
340impl Serialize for ValidatorRegisteredV2 {
341 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
342 where
343 S: Serializer,
344 {
345 (
346 &self.account,
347 &self.blsVK,
348 &self.schnorrVK,
349 self.commission,
350 &self.blsSig,
351 &self.schnorrSig,
352 )
353 .serialize(serializer)
354 }
355}
356
357#[allow(non_snake_case)]
358impl<'de> Deserialize<'de> for ValidatorRegisteredV2 {
359 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
360 where
361 D: Deserializer<'de>,
362 {
363 let (account, blsVK, schnorrVK, commission, blsSig, schnorrSig) =
364 <(_, _, _, u16, _, _)>::deserialize(deserializer)?;
365 Ok(ValidatorRegisteredV2 {
366 account,
367 blsVK,
368 schnorrVK,
369 commission,
370 blsSig,
371 schnorrSig,
372 })
373 }
374}
375
376impl Serialize for CommissionUpdated {
377 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
378 where
379 S: Serializer,
380 {
381 (
382 &self.validator,
383 self.timestamp,
384 self.oldCommission,
385 self.newCommission,
386 )
387 .serialize(serializer)
388 }
389}
390
391#[allow(non_snake_case)]
392impl<'de> Deserialize<'de> for CommissionUpdated {
393 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
394 where
395 D: Deserializer<'de>,
396 {
397 let (validator, timestamp, oldCommission, newCommission) = <_>::deserialize(deserializer)?;
398 Ok(Self {
399 validator,
400 timestamp,
401 newCommission,
402 oldCommission,
403 })
404 }
405}
406
407impl Serialize for EdOnBN254Point {
408 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
409 where
410 S: Serializer,
411 {
412 (self.x, self.y).serialize(serializer)
413 }
414}
415
416impl<'de> Deserialize<'de> for EdOnBN254Point {
417 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
418 where
419 D: Deserializer<'de>,
420 {
421 let (x, y) = Deserialize::deserialize(deserializer)?;
422 Ok(Self { x, y })
423 }
424}
425
426impl Serialize for G2Point {
427 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
428 where
429 S: Serializer,
430 {
431 (&self.x0, &self.x1, &self.y0, &self.y1).serialize(serializer)
432 }
433}
434
435impl<'de> Deserialize<'de> for G2Point {
436 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
437 where
438 D: Deserializer<'de>,
439 {
440 let (x0, x1, y0, y1) = Deserialize::deserialize(deserializer)?;
441
442 Ok(Self { x0, x1, y0, y1 })
443 }
444}
445
446impl Serialize for staketablev2::BN254::G1Point {
447 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
448 where
449 S: Serializer,
450 {
451 (&self.x, &self.y).serialize(serializer)
452 }
453}
454
455impl<'de> Deserialize<'de> for staketablev2::BN254::G1Point {
456 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
457 where
458 D: Deserializer<'de>,
459 {
460 let (x, y) = Deserialize::deserialize(deserializer)?;
461 Ok(Self { x, y })
462 }
463}
464
465impl Serialize for ValidatorExit {
466 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
467 where
468 S: Serializer,
469 {
470 (&self.validator,).serialize(serializer)
471 }
472}
473
474impl<'de> Deserialize<'de> for ValidatorExit {
475 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
476 where
477 D: Deserializer<'de>,
478 {
479 let (validator,): (alloy::sol_types::private::Address,) =
480 Deserialize::deserialize(deserializer)?;
481 Ok(ValidatorExit { validator })
482 }
483}
484
485impl Serialize for Delegated {
486 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
487 where
488 S: Serializer,
489 {
490 (&self.delegator, &self.validator, &self.amount).serialize(serializer)
491 }
492}
493
494impl<'de> Deserialize<'de> for Delegated {
495 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
496 where
497 D: Deserializer<'de>,
498 {
499 let (delegator, validator, amount) = Deserialize::deserialize(deserializer)?;
500
501 Ok(Delegated {
502 delegator,
503 validator,
504 amount,
505 })
506 }
507}
508
509impl Serialize for Undelegated {
510 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
511 where
512 S: Serializer,
513 {
514 (&self.delegator, &self.validator, &self.amount).serialize(serializer)
515 }
516}
517
518impl<'de> Deserialize<'de> for Undelegated {
519 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
520 where
521 D: Deserializer<'de>,
522 {
523 let (delegator, validator, amount) = Deserialize::deserialize(deserializer)?;
524
525 Ok(Undelegated {
526 delegator,
527 validator,
528 amount,
529 })
530 }
531}
532
533impl Serialize for ConsensusKeysUpdated {
534 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
535 where
536 S: Serializer,
537 {
538 (&self.account, &self.blsVK, &self.schnorrVK).serialize(serializer)
539 }
540}
541
542#[allow(non_snake_case)]
543impl<'de> Deserialize<'de> for ConsensusKeysUpdated {
544 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
545 where
546 D: Deserializer<'de>,
547 {
548 let (account, blsVK, schnorrVK) = Deserialize::deserialize(deserializer)?;
549
550 Ok(ConsensusKeysUpdated {
551 account,
552 blsVK,
553 schnorrVK,
554 })
555 }
556}
557
558impl Serialize for ConsensusKeysUpdatedV2 {
559 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
560 where
561 S: Serializer,
562 {
563 (
564 &self.account,
565 &self.blsVK,
566 &self.schnorrVK,
567 &self.blsSig,
568 &self.schnorrSig,
569 )
570 .serialize(serializer)
571 }
572}
573
574#[allow(non_snake_case)]
575impl<'de> Deserialize<'de> for ConsensusKeysUpdatedV2 {
576 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
577 where
578 D: Deserializer<'de>,
579 {
580 let (account, blsVK, schnorrVK, blsSig, schnorrSig) =
581 Deserialize::deserialize(deserializer)?;
582
583 Ok(ConsensusKeysUpdatedV2 {
584 account,
585 blsVK,
586 schnorrVK,
587 blsSig,
588 schnorrSig,
589 })
590 }
591}
592
593#[cfg(test)]
594mod tests {
595 use alloy::{primitives::U256, sol_types::private::Address};
596
597 use super::*;
598
599 #[test]
600 fn test_commission_updated_serde_roundtrip() {
601 let original = CommissionUpdated {
602 validator: Address::random(),
603 timestamp: U256::from(999),
604 oldCommission: 123,
605 newCommission: 456,
606 };
607
608 let serialized = bincode::serialize(&original).expect("Failed to serialize");
609 let deserialized: CommissionUpdated =
610 bincode::deserialize(&serialized).expect("Failed to deserialize");
611
612 assert_eq!(original.validator, deserialized.validator);
613 assert_eq!(original.timestamp, deserialized.timestamp);
614 assert_eq!(original.oldCommission, deserialized.oldCommission);
615 assert_eq!(original.newCommission, deserialized.newCommission);
616 }
617}