26
26
jsonSerializationResults, rest_keymanager_types
27
27
28
28
from web3/ primitives import Hash32 , Quantity
29
+ from json import getStr, newJString
29
30
export primitives.Hash32 , primitives.Quantity
30
31
31
32
func decodeMediaType * (
@@ -82,8 +83,6 @@ RestJson.useDefaultSerializationFor(
82
83
GetForkChoiceResponse ,
83
84
GetForkScheduleResponse ,
84
85
GetGenesisResponse ,
85
- GetHeaderResponseDeneb ,
86
- GetHeaderResponseElectra ,
87
86
GetKeystoresResponse ,
88
87
GetNextWithdrawalsResponse ,
89
88
GetPoolAttesterSlashingsResponse ,
@@ -168,8 +167,6 @@ RestJson.useDefaultSerializationFor(
168
167
SignedContributionAndProof ,
169
168
SignedValidatorRegistrationV1 ,
170
169
SignedVoluntaryExit ,
171
- SubmitBlindedBlockResponseDeneb ,
172
- SubmitBlindedBlockResponseElectra ,
173
170
SyncAggregate ,
174
171
SyncAggregatorSelectionData ,
175
172
SyncCommittee ,
@@ -341,6 +338,8 @@ const
341
338
UnableDecodeVersionError = " Unable to decode version"
342
339
UnableDecodeError = " Unable to decode data"
343
340
UnexpectedDecodeError = " Unexpected decoding error"
341
+ InvalidContentTypeError * = " Invalid content type"
342
+ UnexpectedForkVersionError * = " Unexpected fork version received"
344
343
345
344
type
346
345
EncodeTypes * =
356
355
SetGasLimitRequest |
357
356
bellatrix_mev.SignedBlindedBeaconBlock |
358
357
capella_mev.SignedBlindedBeaconBlock |
359
- deneb_mev.SignedBlindedBeaconBlock |
360
- electra_mev.SignedBlindedBeaconBlock |
361
- fulu_mev.SignedBlindedBeaconBlock |
362
358
phase0.AttesterSlashing |
363
359
SignedValidatorRegistrationV1 |
364
360
SignedVoluntaryExit |
@@ -374,7 +370,10 @@ type
374
370
DenebSignedBlockContents |
375
371
ElectraSignedBlockContents |
376
372
FuluSignedBlockContents |
377
- ForkedMaybeBlindedBeaconBlock
373
+ ForkedMaybeBlindedBeaconBlock |
374
+ deneb_mev.SignedBlindedBeaconBlock |
375
+ electra_mev.SignedBlindedBeaconBlock |
376
+ fulu_mev.SignedBlindedBeaconBlock
378
377
379
378
EncodeArrays * =
380
379
seq [phase0.Attestation ] |
@@ -392,6 +391,14 @@ type
392
391
seq [RestBeaconCommitteeSelection ] |
393
392
seq [RestSyncCommitteeSelection ]
394
393
394
+ MevDecodeTypes * =
395
+ GetHeaderResponseDeneb |
396
+ GetHeaderResponseElectra |
397
+ GetHeaderResponseFulu |
398
+ SubmitBlindedBlockResponseDeneb |
399
+ SubmitBlindedBlockResponseElectra |
400
+ SubmitBlindedBlockResponseFulu
401
+
395
402
DecodeTypes * =
396
403
DataEnclosedObject |
397
404
DataMetaEnclosedObject |
@@ -3266,11 +3273,67 @@ proc decodeBodyJsonOrSsz*(
3266
3273
return err (
3267
3274
RestErrorMessage .init (Http400 , UnableDecodeError ,
3268
3275
[exc.formatMsg (" <data>" )]))
3269
- ok (data.toSeq )
3276
+ ok (data.asSeq )
3270
3277
else :
3271
3278
err (RestErrorMessage .init (Http415 , InvalidContentTypeError ,
3272
3279
[$ body.contentType]))
3273
3280
3281
+ proc decodeBytesJsonOrSsz * (
3282
+ T: typedesc [MevDecodeTypes ],
3283
+ data: openArray [byte ],
3284
+ contentType: Opt [ContentTypeData ],
3285
+ version: string
3286
+ ): Result [T, RestErrorMessage ] =
3287
+ var res {.noinit .}: T
3288
+
3289
+ let
3290
+ typeFork = kind (typeof (res.data))
3291
+ consensusFork = ConsensusFork .decodeString (version).valueOr:
3292
+ return err (RestErrorMessage .init (Http400 , UnableDecodeVersionError ,
3293
+ [version, $ error]))
3294
+ if typeFork != consensusFork:
3295
+ return err (
3296
+ RestErrorMessage .init (Http400 , UnexpectedForkVersionError ,
3297
+ [" eth-consensus-version" , consensusFork.toString (),
3298
+ typeFork.toString ()]))
3299
+
3300
+ if contentType == ApplicationJsonMediaType :
3301
+ res =
3302
+ try :
3303
+ RestJson .decode (
3304
+ data,
3305
+ T,
3306
+ requireAllFields = true ,
3307
+ allowUnknownFields = true )
3308
+ except SerializationError as exc:
3309
+ debug " Failed to deserialize REST JSON data" ,
3310
+ err = exc.formatMsg (" <data>" )
3311
+ return err (
3312
+ RestErrorMessage .init (Http400 , UnableDecodeError ,
3313
+ [exc.formatMsg (" <data>" )]))
3314
+ let jsonFork = ConsensusFork .decodeString (res.version.getStr ()).valueOr:
3315
+ return err (RestErrorMessage .init (Http400 , UnableDecodeVersionError ,
3316
+ [res.version.getStr (), $ error]))
3317
+ if typeFork != jsonFork:
3318
+ return err (
3319
+ RestErrorMessage .init (Http400 , UnexpectedForkVersionError ,
3320
+ [" json-version" , res.version.getStr (),
3321
+ typeFork.toString ()]))
3322
+ ok (res)
3323
+ elif contentType == OctetStreamMediaType :
3324
+ ok (T (
3325
+ version: newJString (typeFork.toString ()),
3326
+ data:
3327
+ try :
3328
+ SSZ .decode (data, typeof (res.data))
3329
+ except SerializationError as exc:
3330
+ return err (
3331
+ RestErrorMessage .init (Http400 , UnableDecodeError ,
3332
+ [exc.formatMsg (" <data>" )]))))
3333
+ else :
3334
+ err (RestErrorMessage .init (Http415 , InvalidContentTypeError ,
3335
+ [$ contentType]))
3336
+
3274
3337
proc decodeBody * [T](t: typedesc [T],
3275
3338
body: ContentBody ): Result [T, cstring ] =
3276
3339
if body.contentType != ApplicationJsonMediaType :
@@ -3324,6 +3387,31 @@ proc decodeBodyJsonOrSsz*[T](t: typedesc[T],
3324
3387
err (RestErrorMessage .init (Http415 , InvalidContentTypeError ,
3325
3388
[$ body.contentType]))
3326
3389
3390
+ proc encodeBytes * (value: seq [SignedValidatorRegistrationV1 ],
3391
+ contentType: string ): RestResult [seq [byte ]] =
3392
+ case contentType
3393
+ of " application/json" :
3394
+ try :
3395
+ var
3396
+ stream = memoryOutput ()
3397
+ writer = JsonWriter [RestJson ].init (stream)
3398
+ writer.writeArray (value)
3399
+ ok (stream.getOutput (seq [byte ]))
3400
+ except IOError :
3401
+ return err (" Input/output error" )
3402
+ except SerializationError :
3403
+ return err (" Serialization error" )
3404
+ of " application/octet-stream" :
3405
+ try :
3406
+ ok (SSZ .encode (
3407
+ init (
3408
+ List [SignedValidatorRegistrationV1 , Limit VALIDATOR_REGISTRY_LIMIT ],
3409
+ value)))
3410
+ except SerializationError :
3411
+ return err (" Serialization error" )
3412
+ else :
3413
+ err (" Content-Type not supported" )
3414
+
3327
3415
proc encodeBytes * [T: EncodeTypes ](value: T,
3328
3416
contentType: string ): RestResult [seq [byte ]] =
3329
3417
case contentType
@@ -3363,29 +3451,26 @@ proc encodeBytes*[T: EncodeArrays](value: T,
3363
3451
err (" Content-Type not supported" )
3364
3452
3365
3453
proc encodeBytes * [T: EncodeOctetTypes ](
3366
- value: T,
3367
- contentType: string
3368
- ): RestResult [seq [byte ]] =
3454
+ value: T,
3455
+ contentType: string
3456
+ ): RestResult [seq [byte ]] =
3369
3457
case contentType
3370
3458
of " application/json" :
3371
- let data =
3372
- try :
3373
- var stream = memoryOutput ()
3374
- var writer = JsonWriter [RestJson ].init (stream)
3375
- writer.writeValue (value)
3376
- stream.getOutput (seq [byte ])
3377
- except IOError :
3378
- return err (" Input/output error" )
3379
- except SerializationError :
3380
- return err (" Serialization error" )
3381
- ok (data)
3459
+ try :
3460
+ var
3461
+ stream = memoryOutput ()
3462
+ writer = JsonWriter [RestJson ].init (stream)
3463
+ writer.writeValue (value)
3464
+ ok (stream.getOutput (seq [byte ]))
3465
+ except IOError :
3466
+ err (" Input/output error" )
3467
+ except SerializationError :
3468
+ err (" Serialization error" )
3382
3469
of " application/octet-stream" :
3383
- let data =
3384
- try :
3385
- SSZ .encode (value)
3386
- except CatchableError :
3387
- return err (" Serialization error" )
3388
- ok (data)
3470
+ try :
3471
+ ok (SSZ .encode (value))
3472
+ except CatchableError :
3473
+ err (" Serialization error" )
3389
3474
else :
3390
3475
err (" Content-Type not supported" )
3391
3476
0 commit comments