Make error messages to be constants.

This commit is contained in:
cheatfate 2021-04-08 13:49:28 +03:00 committed by zah
parent 934cc453d9
commit b3ad573b1f
4 changed files with 218 additions and 156 deletions

View File

@ -140,16 +140,16 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bslot = let bslot =
block: block:
if state_id.isErr(): if state_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid state_id", return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
$state_id.error()) $state_id.error())
let bres = node.getBlockSlot(state_id.get()) let bres = node.getBlockSlot(state_id.get())
if bres.isErr(): if bres.isErr():
return RestApiResponse.jsonError(Http404, "State not found", return RestApiResponse.jsonError(Http404, StateNotFoundError,
$bres.error()) $bres.error())
bres.get() bres.get()
node.withStateForBlockSlot(bslot): node.withStateForBlockSlot(bslot):
return RestApiResponse.jsonResponse((root: hashedState().root)) return RestApiResponse.jsonResponse((root: hashedState().root))
return RestApiResponse.jsonError(Http500, "Internal server error") return RestApiResponse.jsonError(Http500, InternalServerError)
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateFork # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateFork
router.api(MethodGet, "/api/eth/v1/beacon/states/{state_id}/fork") do ( router.api(MethodGet, "/api/eth/v1/beacon/states/{state_id}/fork") do (
@ -157,11 +157,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bslot = let bslot =
block: block:
if state_id.isErr(): if state_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid state_id", return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
$state_id.error()) $state_id.error())
let bres = node.getBlockSlot(state_id.get()) let bres = node.getBlockSlot(state_id.get())
if bres.isErr(): if bres.isErr():
return RestApiResponse.jsonError(Http404, "State not found", return RestApiResponse.jsonError(Http404, StateNotFoundError,
$bres.error()) $bres.error())
bres.get() bres.get()
node.withStateForBlockSlot(bslot): node.withStateForBlockSlot(bslot):
@ -172,7 +172,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
epoch: state().fork.epoch epoch: state().fork.epoch
) )
) )
return RestApiResponse.jsonError(Http500, "Internal server error") return RestApiResponse.jsonError(Http500, InternalServerError)
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateFinalityCheckpoints # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateFinalityCheckpoints
router.api(MethodGet, router.api(MethodGet,
@ -181,11 +181,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bslot = let bslot =
block: block:
if state_id.isErr(): if state_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid state_id", return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
$state_id.error()) $state_id.error())
let bres = node.getBlockSlot(state_id.get()) let bres = node.getBlockSlot(state_id.get())
if bres.isErr(): if bres.isErr():
return RestApiResponse.jsonError(Http404, "State not found", return RestApiResponse.jsonError(Http404, StateNotFoundError,
$bres.error()) $bres.error())
bres.get() bres.get()
node.withStateForBlockSlot(bslot): node.withStateForBlockSlot(bslot):
@ -196,7 +196,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
finalized: state().finalized_checkpoint finalized: state().finalized_checkpoint
) )
) )
return RestApiResponse.jsonError(Http500, "Internal server error") return RestApiResponse.jsonError(Http500, InternalServerError)
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidators # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidators
router.api(MethodGet, "/api/eth/v1/beacon/states/{state_id}/validators") do ( router.api(MethodGet, "/api/eth/v1/beacon/states/{state_id}/validators") do (
@ -205,33 +205,33 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bslot = let bslot =
block: block:
if state_id.isErr(): if state_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid state_id", return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
$state_id.error()) $state_id.error())
let bres = node.getBlockSlot(state_id.get()) let bres = node.getBlockSlot(state_id.get())
if bres.isErr(): if bres.isErr():
return RestApiResponse.jsonError(Http404, "State not found", return RestApiResponse.jsonError(Http404, StateNotFoundError,
$bres.error()) $bres.error())
bres.get() bres.get()
let validatorIds = let validatorIds =
block: block:
if id.isErr(): if id.isErr():
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Invalid validator identifier(s)") InvalidValidatorIdValueError)
let ires = id.get() let ires = id.get()
if len(ires) > MaximumValidatorIds: if len(ires) > MaximumValidatorIds:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Maximum number of id values exceeded") MaximumNumberOfValidatorIdsError)
ires ires
let validatorsMask = let validatorsMask =
block: block:
if status.isErr(): if status.isErr():
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Invalid validator status(es)") InvalidValidatorStatusValueError)
let res = validateFilter(status.get()) let res = validateFilter(status.get())
if res.isErr(): if res.isErr():
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Invalid validator status value", InvalidValidatorStatusValueError,
$res.error()) $res.error())
res.get() res.get()
@ -243,8 +243,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
case item.kind case item.kind
of ValidatorQueryKind.Key: of ValidatorQueryKind.Key:
if item.key in res1: if item.key in res1:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400, UniqueValidatorKeyError)
"Only unique validator keys allowed")
res1.incl(item.key) res1.incl(item.key)
of ValidatorQueryKind.Index: of ValidatorQueryKind.Index:
let vitem = let vitem =
@ -254,15 +253,15 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
case vres.error() case vres.error()
of ValidatorIndexError.TooHighValue: of ValidatorIndexError.TooHighValue:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Incorrect validator index value") TooHighValidatorIndexValueError)
of ValidatorIndexError.UnsupportedValue: of ValidatorIndexError.UnsupportedValue:
return RestApiResponse.jsonError(Http500, return RestApiResponse.jsonError(Http500,
"Unsupported validator index value") UnsupportedValidatorIndexValueError)
vres.get() vres.get()
if vitem in res2: if vitem in res2:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Only unique validator indexes allowed") UniqueValidatorIndexError)
res2.incl(vitem) res2.incl(vitem)
(res1, res2) (res1, res2)
@ -304,7 +303,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
)) ))
return RestApiResponse.jsonResponse(res) return RestApiResponse.jsonResponse(res)
return RestApiResponse.jsonError(Http500, "Internal server error") return RestApiResponse.jsonError(Http500, InternalServerError)
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidator # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidator
router.api(MethodGet, router.api(MethodGet,
@ -313,16 +312,16 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bslot = let bslot =
block: block:
if state_id.isErr(): if state_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid state_id", return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
$state_id.error()) $state_id.error())
let bres = node.getBlockSlot(state_id.get()) let bres = node.getBlockSlot(state_id.get())
if bres.isErr(): if bres.isErr():
return RestApiResponse.jsonError(Http404, "State not found", return RestApiResponse.jsonError(Http404, StateNotFoundError,
$bres.error()) $bres.error())
bres.get() bres.get()
if validator_id.isErr(): if validator_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid validator_id", return RestApiResponse.jsonError(Http400, InvalidValidatorIdValueError,
$validator_id.error()) $validator_id.error())
node.withStateForBlockSlot(bslot): node.withStateForBlockSlot(bslot):
let current_epoch = get_current_epoch(node.chainDag.headState.data.data) let current_epoch = get_current_epoch(node.chainDag.headState.data.data)
let vid = validator_id.get() let vid = validator_id.get()
@ -342,8 +341,8 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
) )
else: else:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Could not obtain validator's status") ValidatorStatusNotFoundError)
return RestApiResponse.jsonError(Http404, "Could not find validator") return RestApiResponse.jsonError(Http404, ValidatorNotFoundError)
of ValidatorQueryKind.Index: of ValidatorQueryKind.Index:
let vindex = let vindex =
block: block:
@ -352,14 +351,14 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
case vres.error() case vres.error()
of ValidatorIndexError.TooHighValue: of ValidatorIndexError.TooHighValue:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Incorrect validator index value") TooHighValidatorIndexValueError)
of ValidatorIndexError.UnsupportedValue: of ValidatorIndexError.UnsupportedValue:
return RestApiResponse.jsonError(Http500, return RestApiResponse.jsonError(Http500,
"Unsupported validator index value") UnsupportedValidatorIndexValueError)
vres.get() vres.get()
if uint64(vindex) >= uint64(len(state().validators)): if uint64(vindex) >= uint64(len(state().validators)):
return RestApiResponse.jsonError(Http404, "Could not find validator") return RestApiResponse.jsonError(Http404, ValidatorNotFoundError)
let validator = state().validators[vindex] let validator = state().validators[vindex]
let sres = validator.getStatus(current_epoch) let sres = validator.getStatus(current_epoch)
if sres.isOk(): if sres.isOk():
@ -373,8 +372,8 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
) )
else: else:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Could not obtain validator's status") ValidatorStatusNotFoundError)
return RestApiResponse.jsonError(Http500, "Internal server error") return RestApiResponse.jsonError(Http500, InternalServerError)
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidatorBalances # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getStateValidatorBalances
router.api(MethodGet, router.api(MethodGet,
@ -383,22 +382,22 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bslot = let bslot =
block: block:
if state_id.isErr(): if state_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid state_id", return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
$state_id.error()) $state_id.error())
let bres = node.getBlockSlot(state_id.get()) let bres = node.getBlockSlot(state_id.get())
if bres.isErr(): if bres.isErr():
return RestApiResponse.jsonError(Http404, "State not found", return RestApiResponse.jsonError(Http404, StateNotFoundError,
$bres.error()) $bres.error())
bres.get() bres.get()
let validatorIds = let validatorIds =
block: block:
if id.isErr(): if id.isErr():
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Invalid validator identifier(s)") InvalidValidatorIdValueError)
let ires = id.get() let ires = id.get()
if len(ires) > MaximumValidatorIds: if len(ires) > MaximumValidatorIds:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Maximum number of id values exceeded") MaximumNumberOfValidatorIdsError)
ires ires
let (keySet, indexSet) = let (keySet, indexSet) =
block: block:
@ -409,7 +408,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
of ValidatorQueryKind.Key: of ValidatorQueryKind.Key:
if item.key in res1: if item.key in res1:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Only unique validator keys allowed") UniqueValidatorKeyError)
res1.incl(item.key) res1.incl(item.key)
of ValidatorQueryKind.Index: of ValidatorQueryKind.Index:
let vitem = let vitem =
@ -419,14 +418,14 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
case vres.error() case vres.error()
of ValidatorIndexError.TooHighValue: of ValidatorIndexError.TooHighValue:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Incorrect validator index value") TooHighValidatorIndexValueError)
of ValidatorIndexError.UnsupportedValue: of ValidatorIndexError.UnsupportedValue:
return RestApiResponse.jsonError(Http500, return RestApiResponse.jsonError(Http500,
"Unsupported validator index value") UnsupportedValidatorIndexValueError)
vres.get() vres.get()
if vitem in res2: if vitem in res2:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Only unique validator indexes allowed") UniqueValidatorIndexError)
res2.incl(vitem) res2.incl(vitem)
(res1, res2) (res1, res2)
node.withStateForBlockSlot(bslot): node.withStateForBlockSlot(bslot):
@ -464,7 +463,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
)) ))
return RestApiResponse.jsonResponse(res) return RestApiResponse.jsonResponse(res)
return RestApiResponse.jsonError(Http500, "Internal server error") return RestApiResponse.jsonError(Http500, InternalServerError)
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getEpochCommittees # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getEpochCommittees
router.api(MethodGet, router.api(MethodGet,
@ -474,23 +473,22 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bslot = let bslot =
block: block:
if state_id.isErr(): if state_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid state_id", return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
$state_id.error()) $state_id.error())
let bres = node.getBlockSlot(state_id.get()) let bres = node.getBlockSlot(state_id.get())
if bres.isErr(): if bres.isErr():
return RestApiResponse.jsonError(Http404, "State not found", return RestApiResponse.jsonError(Http404, StateNotFoundError,
$bres.error()) $bres.error())
bres.get() bres.get()
let vepoch = let vepoch =
if epoch.isSome(): if epoch.isSome():
let repoch = epoch.get() let repoch = epoch.get()
if repoch.isErr(): if repoch.isErr():
return RestApiResponse.jsonError(Http400, "Invalid epoch value", return RestApiResponse.jsonError(Http400, InvalidEpochValueError,
$repoch.error()) $repoch.error())
let res = repoch.get() let res = repoch.get()
if res > MaxEpoch: if res > MaxEpoch:
return RestApiResponse.jsonError(Http400, "Requesting epoch for " & return RestApiResponse.jsonError(Http400, EpochOverflowValueError)
"which slot would overflow")
some(res) some(res)
else: else:
none[Epoch]() none[Epoch]()
@ -498,7 +496,8 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
if index.isSome(): if index.isSome():
let rindex = index.get() let rindex = index.get()
if rindex.isErr(): if rindex.isErr():
return RestApiResponse.jsonError(Http400, "Invalid index value", return RestApiResponse.jsonError(Http400,
InvalidCommitteeIndexValueError,
$rindex.error()) $rindex.error())
some(rindex.get()) some(rindex.get())
else: else:
@ -507,7 +506,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
if slot.isSome(): if slot.isSome():
let rslot = slot.get() let rslot = slot.get()
if rslot.isErr(): if rslot.isErr():
return RestApiResponse.jsonError(Http400, "Invalid slot value", return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
$rslot.error()) $rslot.error())
some(rslot.get()) some(rslot.get())
else: else:
@ -547,7 +546,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
return RestApiResponse.jsonResponse(res) return RestApiResponse.jsonResponse(res)
return RestApiResponse.jsonError(Http500, "Internal server error") return RestApiResponse.jsonError(Http500, InternalServerError)
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getBlockHeaders # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getBlockHeaders
router.api(MethodGet, "/api/eth/v1/beacon/headers") do ( router.api(MethodGet, "/api/eth/v1/beacon/headers") do (
@ -558,7 +557,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
if slot.isSome(): if slot.isSome():
let rslot = slot.get() let rslot = slot.get()
if rslot.isErr(): if rslot.isErr():
return RestApiResponse.jsonError(Http400, "Invalid slot value", return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
$rslot.error()) $rslot.error())
rslot.get() rslot.get()
else: else:
@ -567,9 +566,9 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
if parent_root.isSome(): if parent_root.isSome():
let rroot = parent_root.get() let rroot = parent_root.get()
if rroot.isErr(): if rroot.isErr():
return RestApiResponse.jsonError(Http400, "Invalid parent_root value", return RestApiResponse.jsonError(Http400, InvalidParentRootValueError,
$rroot.error()) $rroot.error())
return RestApiResponse.jsonError(Http500, "Not implemented yet") return RestApiResponse.jsonError(Http500, NoImplementationError)
let bdata = let bdata =
block: block:
@ -577,13 +576,12 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
block: block:
let res = node.getCurrentHead(qslot) let res = node.getCurrentHead(qslot)
if res.isErr(): if res.isErr():
return RestApiResponse.jsonError(Http404, return RestApiResponse.jsonError(Http404, SlotNotFoundError,
"Slot number is too far away",
$res.error()) $res.error())
res.get() res.get()
let blockSlot = head.atSlot(qslot) let blockSlot = head.atSlot(qslot)
if isNil(blockSlot.blck): if isNil(blockSlot.blck):
return RestApiResponse.jsonError(Http404, "Block header not found") return RestApiResponse.jsonError(Http404, BlockNotFoundError)
node.chainDag.get(blockSlot.blck) node.chainDag.get(blockSlot.blck)
return RestApiResponse.jsonResponse( return RestApiResponse.jsonResponse(
@ -609,11 +607,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bdata = let bdata =
block: block:
if block_id.isErr(): if block_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid block_id", return RestApiResponse.jsonError(Http400, InvalidBlockIdValueError,
$block_id.error()) $block_id.error())
let res = node.getBlockDataFromBlockIdent(block_id.get()) let res = node.getBlockDataFromBlockIdent(block_id.get())
if res.isErr(): if res.isErr():
return RestApiResponse.jsonError(Http404, "Block not found") return RestApiResponse.jsonError(Http404, BlockNotFoundError)
res.get() res.get()
return RestApiResponse.jsonResponse( return RestApiResponse.jsonResponse(
@ -639,32 +637,26 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let blck = let blck =
block: block:
if contentBody.isNone(): if contentBody.isNone():
return RestApiResponse.jsonError(Http400, "Empty request's body") return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
let dres = decodeBody(SignedBeaconBlock, contentBody.get()) let dres = decodeBody(SignedBeaconBlock, contentBody.get())
if dres.isErr(): if dres.isErr():
return RestApiResponse.jsonError(Http400, "Unable to decode block " & return RestApiResponse.jsonError(Http400, InvalidBlockObjectError,
"object", $dres.error()) $dres.error())
dres.get() dres.get()
let head = node.chainDag.head let head = node.chainDag.head
if not(node.isSynced(head)): if not(node.isSynced(head)):
return RestApiResponse.jsonError(Http503, "Beacon node is currently " & return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
"syncing and not serving request on that endpoint")
if head.slot >= blck.message.slot: if head.slot >= blck.message.slot:
node.network.broadcast(getBeaconBlocksTopic(node.forkDigest), blck) node.network.broadcast(getBeaconBlocksTopic(node.forkDigest), blck)
return RestApiResponse.jsonError(Http202, "The block failed " & return RestApiResponse.jsonError(Http202, BlockValidationError)
"validation, but was successfully broadcast anyway. It was not " &
"integrated into the beacon node's database.")
else: else:
let res = proposeSignedBlock(node, head, AttachedValidator(), blck) let res = proposeSignedBlock(node, head, AttachedValidator(), blck)
if res == head: if res == head:
node.network.broadcast(getBeaconBlocksTopic(node.forkDigest), blck) node.network.broadcast(getBeaconBlocksTopic(node.forkDigest), blck)
return RestApiResponse.jsonError(Http202, "The block failed " & return RestApiResponse.jsonError(Http202, BlockValidationError)
"validation, but was successfully broadcast anyway. It was not " &
"integrated into the beacon node's database.")
else: else:
return RestApiResponse.jsonError(Http200, "The block was validated " & return RestApiResponse.jsonError(Http200, BlockValidationSuccess)
"successfully and has been broadcast")
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getBlock # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getBlock
router.api(MethodGet, "/api/eth/v1/beacon/blocks/{block_id}") do ( router.api(MethodGet, "/api/eth/v1/beacon/blocks/{block_id}") do (
@ -672,11 +664,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bdata = let bdata =
block: block:
if block_id.isErr(): if block_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid block_id", return RestApiResponse.jsonError(Http400, InvalidBlockIdValueError,
$block_id.error()) $block_id.error())
let res = node.getBlockDataFromBlockIdent(block_id.get()) let res = node.getBlockDataFromBlockIdent(block_id.get())
if res.isErr(): if res.isErr():
return RestApiResponse.jsonError(Http404, "Block not found") return RestApiResponse.jsonError(Http404, BlockNotFoundError)
res.get() res.get()
return RestApiResponse.jsonResponse(bdata.data) return RestApiResponse.jsonResponse(bdata.data)
@ -686,11 +678,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bdata = let bdata =
block: block:
if block_id.isErr(): if block_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid block_id", return RestApiResponse.jsonError(Http400, InvalidBlockIdValueError,
$block_id.error()) $block_id.error())
let res = node.getBlockDataFromBlockIdent(block_id.get()) let res = node.getBlockDataFromBlockIdent(block_id.get())
if res.isErr(): if res.isErr():
return RestApiResponse.jsonError(Http404, "Block not found") return RestApiResponse.jsonError(Http404, BlockNotFoundError)
res.get() res.get()
return RestApiResponse.jsonResponse((root: bdata.data.root)) return RestApiResponse.jsonResponse((root: bdata.data.root))
@ -701,11 +693,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bdata = let bdata =
block: block:
if block_id.isErr(): if block_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid block_id", return RestApiResponse.jsonError(Http400, InvalidBlockIdValueError,
$block_id.error()) $block_id.error())
let res = node.getBlockDataFromBlockIdent(block_id.get()) let res = node.getBlockDataFromBlockIdent(block_id.get())
if res.isErr(): if res.isErr():
return RestApiResponse.jsonError(Http404, "Block not found") return RestApiResponse.jsonError(Http404, BlockNotFoundError)
res.get() res.get()
return RestApiResponse.jsonResponse( return RestApiResponse.jsonResponse(
bdata.data.message.body.attestations.asSeq() bdata.data.message.body.attestations.asSeq()
@ -720,7 +712,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let rindex = committee_index.get() let rindex = committee_index.get()
if rindex.isErr(): if rindex.isErr():
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Invalid committee_index value", InvalidCommitteeIndexValueError,
$rindex.error()) $rindex.error())
some(rindex.get()) some(rindex.get())
else: else:
@ -729,7 +721,7 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
if slot.isSome(): if slot.isSome():
let rslot = slot.get() let rslot = slot.get()
if rslot.isErr(): if rslot.isErr():
return RestApiResponse.jsonError(Http400, "Invalid slot value", return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
$rslot.error()) $rslot.error())
some(rslot.get()) some(rslot.get())
else: else:
@ -745,11 +737,11 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let attestations = let attestations =
block: block:
if contentBody.isNone(): if contentBody.isNone():
return RestApiResponse.jsonError(Http400, "Empty request's body") return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
let dres = decodeBody(seq[Attestation], contentBody.get()) let dres = decodeBody(seq[Attestation], contentBody.get())
if dres.isErr(): if dres.isErr():
return RestApiResponse.jsonError(Http400, "Unable to decode " & return RestApiResponse.jsonError(Http400,
"attestation object(s)", InvalidAttestationObjectError,
$dres.error()) $dres.error())
dres.get() dres.get()
@ -766,11 +758,10 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
node.sendAttestation(attestation) node.sendAttestation(attestation)
if len(failures) > 0: if len(failures) > 0:
return RestApiResponse.jsonErrorList(Http400, "Some failures happened", return RestApiResponse.jsonErrorList(Http400, AttestationValidationError,
failures) failures)
else: else:
return RestApiResponse.jsonError(Http200, return RestApiResponse.jsonError(Http200, AttestationValidationSuccess)
"Attestation(s) was broadcasted")
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolAttesterSlashings # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolAttesterSlashings
router.api(MethodGet, "/api/eth/v1/beacon/pool/attester_slashings") do ( router.api(MethodGet, "/api/eth/v1/beacon/pool/attester_slashings") do (
@ -790,21 +781,21 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let slashing = let slashing =
block: block:
if contentBody.isNone(): if contentBody.isNone():
return RestApiResponse.jsonError(Http400, "Empty request's body") return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
let dres = decodeBody(AttesterSlashing, contentBody.get()) let dres = decodeBody(AttesterSlashing, contentBody.get())
if dres.isErr(): if dres.isErr():
return RestApiResponse.jsonError(Http400, "Unable to decode " & return RestApiResponse.jsonError(Http400,
"attester slashing object", $dres.error()) InvalidAttesterSlashingObjectError,
$dres.error())
let res = dres.get() let res = dres.get()
let vres = node.exitPool[].validateAttesterSlashing(res) let vres = node.exitPool[].validateAttesterSlashing(res)
if vres.isErr(): if vres.isErr():
return RestApiResponse.jsonError(Http400, "Invalid attester " & return RestApiResponse.jsonError(Http400,
"slashing, it will never pass validation so it's rejected", AttesterSlashingValidationError,
$vres.error()) $vres.error())
res res
node.sendAttesterSlashing(slashing) node.sendAttesterSlashing(slashing)
return RestApiResponse.jsonError(Http200, return RestApiResponse.jsonError(Http200, AttesterSlashingValidationSuccess)
"Attester slashing was broadcasted")
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolProposerSlashings # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolProposerSlashings
router.api(MethodGet, "/api/eth/v1/beacon/pool/proposer_slashings") do ( router.api(MethodGet, "/api/eth/v1/beacon/pool/proposer_slashings") do (
@ -824,21 +815,21 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let slashing = let slashing =
block: block:
if contentBody.isNone(): if contentBody.isNone():
return RestApiResponse.jsonError(Http400, "Empty request's body") return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
let dres = decodeBody(ProposerSlashing, contentBody.get()) let dres = decodeBody(ProposerSlashing, contentBody.get())
if dres.isErr(): if dres.isErr():
return RestApiResponse.jsonError(Http400, "Unable to decode " & return RestApiResponse.jsonError(Http400,
"proposer slashing object", $dres.error()) InvalidProposerSlashingObjectError,
$dres.error())
let res = dres.get() let res = dres.get()
let vres = node.exitPool[].validateProposerSlashing(res) let vres = node.exitPool[].validateProposerSlashing(res)
if vres.isErr(): if vres.isErr():
return RestApiResponse.jsonError(Http400, "Invalid proposer " & return RestApiResponse.jsonError(Http400,
"slashing, it will never pass validation so it's rejected", ProposerSlashingValidationError,
$vres.error()) $vres.error())
res res
node.sendProposerSlashing(slashing) node.sendProposerSlashing(slashing)
return RestApiResponse.jsonError(Http200, return RestApiResponse.jsonError(Http200, ProposerSlashingValidationSuccess)
"Proposer slashing was broadcasted")
# https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolVoluntaryExits # https://ethereum.github.io/eth2.0-APIs/#/Beacon/getPoolVoluntaryExits
router.api(MethodGet, "/api/eth/v1/beacon/pool/voluntary_exits") do ( router.api(MethodGet, "/api/eth/v1/beacon/pool/voluntary_exits") do (
@ -858,17 +849,18 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
let exit = let exit =
block: block:
if contentBody.isNone(): if contentBody.isNone():
return RestApiResponse.jsonError(Http400, "Empty request's body") return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
let dres = decodeBody(SignedVoluntaryExit, contentBody.get()) let dres = decodeBody(SignedVoluntaryExit, contentBody.get())
if dres.isErr(): if dres.isErr():
return RestApiResponse.jsonError(Http400, "Unable to decode " & return RestApiResponse.jsonError(Http400,
"voluntary exit object", $dres.error()) InvalidVoluntaryExitObjectError,
$dres.error())
let res = dres.get() let res = dres.get()
let vres = node.exitPool[].validateVoluntaryExit(res) let vres = node.exitPool[].validateVoluntaryExit(res)
if vres.isErr(): if vres.isErr():
return RestApiResponse.jsonError(Http400, "Invalid voluntary exit, " & return RestApiResponse.jsonError(Http400,
"it will never pass validation so it's rejected", $vres.error()) VoluntaryExitValidationError,
$vres.error())
res res
node.sendVoluntaryExit(exit) node.sendVoluntaryExit(exit)
return RestApiResponse.jsonError(Http200, return RestApiResponse.jsonError(Http200, VoluntaryExitValidationSuccess)
"Voluntary exit was broadcasted")

View File

@ -15,16 +15,16 @@ proc installDebugApiHandlers*(router: var RestRouter, node: BeaconNode) =
let bslot = let bslot =
block: block:
if state_id.isErr(): if state_id.isErr():
return RestApiResponse.jsonError(Http400, "Invalid state_id", return RestApiResponse.jsonError(Http400, InvalidStateIdValueError,
$state_id.error()) $state_id.error())
let bres = node.getBlockSlot(state_id.get()) let bres = node.getBlockSlot(state_id.get())
if bres.isErr(): if bres.isErr():
return RestApiResponse.jsonError(Http404, "State not found", return RestApiResponse.jsonError(Http404, StateNotFoundError,
$bres.error()) $bres.error())
bres.get() bres.get()
node.withStateForBlockSlot(bslot): node.withStateForBlockSlot(bslot):
return RestApiResponse.jsonResponse(state()) return RestApiResponse.jsonResponse(state())
return RestApiResponse.jsonError(Http500, "Internal server error") return RestApiResponse.jsonError(Http500, InternalServerError)
router.api(MethodGet, router.api(MethodGet,
"/api/eth/v1/debug/beacon/heads") do () -> RestApiResponse: "/api/eth/v1/debug/beacon/heads") do () -> RestApiResponse:

View File

@ -29,6 +29,90 @@ const
FarFutureEpochString* = "18446744073709551615" FarFutureEpochString* = "18446744073709551615"
MaxEpoch* = compute_epoch_at_slot(not(0'u64)) MaxEpoch* = compute_epoch_at_slot(not(0'u64))
BlockValidationError* =
"The block failed validation, but was successfully broadcast anyway. It " &
"was not integrated into the beacon node's database."
BlockValidationSuccess* =
"The block was validated successfully and has been broadcast"
BeaconNodeInSyncError* =
"Beacon node is currently syncing and not serving request on that endpoint"
BlockNotFoundError* =
"Block header/data has not been found"
EmptyRequestBodyError* =
"Empty request's body"
InvalidBlockObjectError* =
"Unable to decode block object(s)"
InvalidAttestationObjectError* =
"Unable to decode attestation object(s)"
AttestationValidationError* =
"Some errors happened while validating attestation(s)"
AttestationValidationSuccess* =
"Attestation object(s) was broadcasted"
InvalidAttesterSlashingObjectError* =
"Unable to decode attester slashing object(s)"
AttesterSlashingValidationError* =
"Invalid attester slashing, it will never pass validation so it's rejected"
AttesterSlashingValidationSuccess* =
"Attester slashing object was broadcasted"
InvalidProposerSlashingObjectError* =
"Unable to decode proposer slashing object(s)"
ProposerSlashingValidationError* =
"Invalid proposer slashing, it will never pass validation so it's rejected"
ProposerSlashingValidationSuccess* =
"Proposer slashing object was broadcasted"
InvalidVoluntaryExitObjectError* =
"Unable to decode voluntary exit object(s)"
VoluntaryExitValidationError* =
"Invalid voluntary exit, it will never pass validation so it's rejected"
VoluntaryExitValidationSuccess* =
"Voluntary exit object(s) was broadcasted"
InvalidParentRootValueError* =
"Invalid parent root value"
MissingSlotValueError* =
"Missing `slot` value"
InvalidSlotValueError* =
"Invalid slot value"
MissingCommitteeIndexValueError* =
"Missing `committee_index` value"
InvalidCommitteeIndexValueError* =
"Invalid committee index value"
InvalidEpochValueError* =
"Invalid epoch value"
InvalidStateIdValueError* =
"Invalid state identifier value"
InvalidBlockIdValueError* =
"Invalid block identifier value"
InvalidValidatorIdValueError* =
"Invalid validator's identifier value(s)"
MaximumNumberOfValidatorIdsError* =
"Maximum number of validator identifier values exceeded"
InvalidValidatorStatusValueError* =
"Invalid validator's status value error"
ValidatorNotFoundError* =
"Could not find validator"
ValidatorStatusNotFoundError* =
"Could not obtain validator's status"
UniqueValidatorKeyError* =
"Only unique validator's keys are allowed"
TooHighValidatorIndexValueError* =
"Validator index exceeds maximum number of validators allowed"
UnsupportedValidatorIndexValueError* =
"Validator index exceeds maximum supported number of validators"
UniqueValidatorIndexError* =
"Only unique validator's index are allowed"
StateNotFoundError* =
"State not found"
SlotNotFoundError* =
"Slot number is too far away"
NoHeadForSlotError* =
"Cound not find head for slot"
EpochOverflowValueError* =
"Requesting epoch for which slot would overflow"
InternalServerError* =
"Internal server error"
NoImplementationError* =
"Not implemented yet"
type type
ValidatorQueryKind* {.pure.} = enum ValidatorQueryKind* {.pure.} = enum
Index, Key Index, Key

View File

@ -47,7 +47,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let indexList = let indexList =
block: block:
if contentBody.isNone(): if contentBody.isNone():
return RestApiResponse.jsonError(Http400, "Empty request's body") return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
let dres = decodeBody(seq[RestValidatorIndex], contentBody.get()) let dres = decodeBody(seq[RestValidatorIndex], contentBody.get())
if dres.isErr(): if dres.isErr():
return RestApiResponse.jsonError(Http400, "Unable to decode " & return RestApiResponse.jsonError(Http400, "Unable to decode " &
@ -60,10 +60,10 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
case vres.error() case vres.error()
of ValidatorIndexError.TooHighValue: of ValidatorIndexError.TooHighValue:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Incorrect validator index value") TooHighValidatorIndexValueError)
of ValidatorIndexError.UnsupportedValue: of ValidatorIndexError.UnsupportedValue:
return RestApiResponse.jsonError(Http500, return RestApiResponse.jsonError(Http500,
"Unsupported validator index value") UnsupportedValidatorIndexValueError)
res.add(vres.get()) res.add(vres.get())
if len(res) == 0: if len(res) == 0:
return RestApiResponse.jsonError(Http400, "Empty indexes list") return RestApiResponse.jsonError(Http400, "Empty indexes list")
@ -71,23 +71,20 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let qepoch = let qepoch =
block: block:
if epoch.isErr(): if epoch.isErr():
return RestApiResponse.jsonError(Http400, "Incorrect epoch value", return RestApiResponse.jsonError(Http400, InvalidEpochValueError,
$epoch.error()) $epoch.error())
let res = epoch.get() let res = epoch.get()
if res > MaxEpoch: if res > MaxEpoch:
return RestApiResponse.jsonError(Http400, "Requesting epoch for " & return RestApiResponse.jsonError(Http400, EpochOverflowValueError)
"which slot would overflow")
res res
let qhead = let qhead =
block: block:
let res = node.getCurrentHead(qepoch) let res = node.getCurrentHead(qepoch)
if res.isErr(): if res.isErr():
if not(node.isSynced(node.chainDag.head)): if not(node.isSynced(node.chainDag.head)):
return RestApiResponse.jsonError(Http503, "Beacon node is " & return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
"currently syncing and not serving request on that endpoint")
else: else:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400, NoHeadForSlotError,
"Cound not find head for slot",
$res.error()) $res.error())
res.get() res.get()
let droot = let droot =
@ -97,8 +94,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
) )
if isNil(bref): if isNil(bref):
if not(node.isSynced(node.chainDag.head)): if not(node.isSynced(node.chainDag.head)):
return RestApiResponse.jsonError(Http503, "Beacon node is " & return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
"currently syncing and not serving request on that endpoint")
else: else:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Cound not find slot data") "Cound not find slot data")
@ -141,23 +137,20 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let qepoch = let qepoch =
block: block:
if epoch.isErr(): if epoch.isErr():
return RestApiResponse.jsonError(Http400, "Incorrect epoch value", return RestApiResponse.jsonError(Http400, InvalidEpochValueError,
$epoch.error()) $epoch.error())
let res = epoch.get() let res = epoch.get()
if res > MaxEpoch: if res > MaxEpoch:
return RestApiResponse.jsonError(Http400, "Requesting epoch for " & return RestApiResponse.jsonError(Http400, EpochOverflowValueError)
"which slot would overflow")
res res
let qhead = let qhead =
block: block:
let res = node.getCurrentHead(qepoch) let res = node.getCurrentHead(qepoch)
if res.isErr(): if res.isErr():
if not(node.isSynced(node.chainDag.head)): if not(node.isSynced(node.chainDag.head)):
return RestApiResponse.jsonError(Http503, "Beacon node is " & return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
"currently syncing and not serving request on that endpoint")
else: else:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400, NoHeadForSlotError,
"Cound not find head for slot",
$res.error()) $res.error())
res.get() res.get()
let droot = let droot =
@ -167,11 +160,9 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
) )
if isNil(bref): if isNil(bref):
if not(node.isSynced(node.chainDag.head)): if not(node.isSynced(node.chainDag.head)):
return RestApiResponse.jsonError(Http503, "Beacon node is " & return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
"currently syncing and not serving request on that endpoint")
else: else:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400, BlockNotFoundError)
"Cound not find slot data")
bref.root bref.root
else: else:
node.chainDag.genesis.root node.chainDag.genesis.root
@ -201,7 +192,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let qslot = let qslot =
block: block:
if slot.isErr(): if slot.isErr():
return RestApiResponse.jsonError(Http400, "Incorrect slot value", return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
$slot.error()) $slot.error())
slot.get() slot.get()
let qrandao = let qrandao =
@ -230,11 +221,9 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let res = node.getCurrentHead(qslot) let res = node.getCurrentHead(qslot)
if res.isErr(): if res.isErr():
if not(node.isSynced(node.chainDag.head)): if not(node.isSynced(node.chainDag.head)):
return RestApiResponse.jsonError(Http503, "Beacon node is " & return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
"currently syncing and not serving request on that endpoint")
else: else:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400, NoHeadForSlotError,
"Cound not find head for slot",
$res.error()) $res.error())
res.get() res.get()
let proposer = node.chainDag.getProposer(qhead, qslot) let proposer = node.chainDag.getProposer(qhead, qslot)
@ -258,21 +247,21 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let qslot = let qslot =
block: block:
if slot.isNone(): if slot.isNone():
return RestApiResponse.jsonError(Http400, "Missing slot value") return RestApiResponse.jsonError(Http400, MissingSlotValueError)
let res = slot.get() let res = slot.get()
if res.isErr(): if res.isErr():
return RestApiResponse.jsonError(Http400, "Incorrect slot value", return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
$res.error()) $res.error())
res.get() res.get()
let qindex = let qindex =
block: block:
if committee_index.isNone(): if committee_index.isNone():
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400,
"Missing committee_index value") MissingCommitteeIndexValueError)
let res = committee_index.get() let res = committee_index.get()
if res.isErr(): if res.isErr():
return RestApiResponse.jsonError(Http400, "Incorrect " & return RestApiResponse.jsonError(Http400,
"committee_index value", InvalidCommitteeIndexValueError,
$res.error()) $res.error())
res.get() res.get()
let qhead = let qhead =
@ -280,11 +269,9 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let res = node.getCurrentHead(qslot) let res = node.getCurrentHead(qslot)
if res.isErr(): if res.isErr():
if not(node.isSynced(node.chainDag.head)): if not(node.isSynced(node.chainDag.head)):
return RestApiResponse.jsonError(Http503, "Beacon node is " & return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
"currently syncing and not serving request on that endpoint")
else: else:
return RestApiResponse.jsonError(Http400, return RestApiResponse.jsonError(Http400, NoHeadForSlotError,
"Cound not find head for slot",
$res.error()) $res.error())
res.get() res.get()
let epochRef = node.chainDag.getEpochRef(qhead, qslot.epoch) let epochRef = node.chainDag.getEpochRef(qhead, qslot.epoch)
@ -300,10 +287,10 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let qslot = let qslot =
block: block:
if slot.isNone(): if slot.isNone():
return RestApiResponse.jsonError(Http400, "Missing slot value") return RestApiResponse.jsonError(Http400, MissingSlotValueError)
let res = slot.get() let res = slot.get()
if res.isErr(): if res.isErr():
return RestApiResponse.jsonError(Http400, "Incorrect slot value", return RestApiResponse.jsonError(Http400, InvalidSlotValueError,
$res.error()) $res.error())
res.get() res.get()
let qroot = let qroot =
@ -330,7 +317,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let payload = let payload =
block: block:
if contentBody.isNone(): if contentBody.isNone():
return RestApiResponse.jsonError(Http400, "Empty request's body") return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
let dres = decodeBody(SignedAggregateAndProof, contentBody.get()) let dres = decodeBody(SignedAggregateAndProof, contentBody.get())
if dres.isErr(): if dres.isErr():
return RestApiResponse.jsonError(Http400, "Unable to decode " & return RestApiResponse.jsonError(Http400, "Unable to decode " &
@ -357,7 +344,7 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
let requests = let requests =
block: block:
if contentBody.isNone(): if contentBody.isNone():
return RestApiResponse.jsonError(Http400, "Empty request's body") return RestApiResponse.jsonError(Http400, EmptyRequestBodyError)
let dres = decodeBody(seq[RestCommitteeSubscriptionTuple], let dres = decodeBody(seq[RestCommitteeSubscriptionTuple],
contentBody.get()) contentBody.get())
if dres.isErr(): if dres.isErr():
@ -365,13 +352,12 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
"subscription request(s)") "subscription request(s)")
dres.get() dres.get()
if not(node.isSynced(node.chainDag.head)): if not(node.isSynced(node.chainDag.head)):
return RestApiResponse.jsonError(Http503, "Beacon node is " & return RestApiResponse.jsonError(Http503, BeaconNodeInSyncError)
"currently syncing and not serving request on that endpoint")
for request in requests: for request in requests:
if uint64(request.committee_index) >= uint64(ATTESTATION_SUBNET_COUNT): if uint64(request.committee_index) >= uint64(ATTESTATION_SUBNET_COUNT):
return RestApiResponse.jsonError(Http400, "Invalid committee_index " & return RestApiResponse.jsonError(Http400,
"value") InvalidCommitteeIndexValueError)
let validator_pubkey = let validator_pubkey =
block: block:
let idx = request.validator_index let idx = request.validator_index
@ -400,4 +386,4 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
get_committee_count_per_slot(epochRef), request.slot, get_committee_count_per_slot(epochRef), request.slot,
request.committee_index) request.committee_index)
) )
return RestApiResponse.jsonError(Http500, "Not implemented yet") return RestApiResponse.jsonError(Http500, NoImplementationError)