45 lines
1.9 KiB
Nim
45 lines
1.9 KiB
Nim
# beacon_chain
|
|
# Copyright (c) 2023 Status Research & Development GmbH
|
|
# Licensed and distributed under either of
|
|
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
|
|
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
import
|
|
./rest_utils,
|
|
./state_ttl_cache,
|
|
../beacon_node
|
|
|
|
export rest_utils
|
|
|
|
logScope: topics = "rest_builderapi"
|
|
|
|
proc installBuilderApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|
# https://ethereum.github.io/beacon-APIs/?urls.primaryName=v2.4.0#/Builder/getNextWithdrawals
|
|
# https://github.com/ethereum/beacon-APIs/blob/v2.4.0/apis/builder/states/expected_withdrawals.yaml
|
|
router.api(MethodGet, "/eth/v1/builder/states/{state_id}/expected_withdrawals") do (
|
|
state_id: StateIdent) -> RestApiResponse:
|
|
let
|
|
sid = state_id.valueOr:
|
|
return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
|
|
$error)
|
|
bslot = node.getBlockSlotId(sid).valueOr:
|
|
if sid.kind == StateQueryKind.Root:
|
|
# TODO (cheatfate): Its impossible to retrieve state by `state_root`
|
|
# in current version of database.
|
|
return RestApiResponse.jsonError(Http500, NoImplementationError)
|
|
return RestApiResponse.jsonError(Http404, StateNotFoundError,
|
|
$error)
|
|
|
|
node.withStateForBlockSlotId(bslot):
|
|
withState(state):
|
|
when consensusFork >= ConsensusFork.Capella:
|
|
return RestApiResponse.jsonResponseWOpt(
|
|
get_expected_withdrawals(forkyState.data),
|
|
node.getStateOptimistic(state))
|
|
else:
|
|
return RestApiResponse.jsonError(
|
|
Http400, "The specified state is not a capella state")
|
|
|
|
return RestApiResponse.jsonError(Http404, StateNotFoundError)
|