159 lines
4.4 KiB
Nim
159 lines
4.4 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2023-2024 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
# at your option.
|
|
# This file may not be copied, modified, or distributed except according to
|
|
# those terms.
|
|
|
|
import
|
|
std/[typetraits],
|
|
chronicles,
|
|
web3/primitives as web3types,
|
|
web3/eth_api_types,
|
|
web3/engine_api_types,
|
|
web3/execution_types,
|
|
eth/common/eth_types_rlp,
|
|
stew/byteutils,
|
|
../utils/utils
|
|
|
|
import eth/common/eth_types as common
|
|
|
|
export
|
|
primitives
|
|
|
|
type
|
|
Web3Quantity* = web3types.Quantity
|
|
Web3ExtraData* = web3types.DynamicBytes[0, 32]
|
|
Web3Tx* = engine_api_types.TypedTransaction
|
|
Web3Blob* = engine_api_types.Blob
|
|
|
|
{.push gcsafe, raises:[].}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Pretty printers
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc `$`*(x: Opt[common.Hash32]): string =
|
|
if x.isNone: "none"
|
|
else: x.get().data.toHex
|
|
|
|
proc `$`*(x: Opt[Bytes8]): string =
|
|
if x.isNone: "none"
|
|
else: x.get().toHex
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Web3 types to Eth types
|
|
# ------------------------------------------------------------------------------
|
|
|
|
template unsafeQuantityToInt64*(q: Web3Quantity): int64 =
|
|
int64 q
|
|
|
|
func u64*(x: Opt[Web3Quantity]): Opt[uint64] =
|
|
if x.isNone: Opt.none(uint64)
|
|
else: Opt.some(uint64 x.get)
|
|
|
|
func u256*(x: Web3Quantity): UInt256 =
|
|
u256(x.uint64)
|
|
|
|
func u256*(x: FixedBytes[32]): UInt256 =
|
|
UInt256.fromBytesBE(x.data)
|
|
|
|
func ethTime*(x: Web3Quantity): EthTime =
|
|
EthTime(x)
|
|
|
|
func ethBlob*(x: Web3ExtraData): seq[byte] =
|
|
distinctBase x
|
|
|
|
func ethWithdrawal*(x: WithdrawalV1): Withdrawal =
|
|
Withdrawal(
|
|
index: x.index.uint64,
|
|
validatorIndex: x.validatorIndex.uint64,
|
|
address: x.address,
|
|
amount: x.amount.uint64,
|
|
)
|
|
|
|
func ethWithdrawals*(list: openArray[WithdrawalV1]):
|
|
seq[Withdrawal] =
|
|
result = newSeqOfCap[Withdrawal](list.len)
|
|
for x in list:
|
|
result.add ethWithdrawal(x)
|
|
|
|
func ethWithdrawals*(x: Opt[seq[WithdrawalV1]]):
|
|
Opt[seq[Withdrawal]] =
|
|
if x.isNone: Opt.none(seq[Withdrawal])
|
|
else: Opt.some(ethWithdrawals x.get)
|
|
|
|
func ethTx*(x: Web3Tx): common.Transaction {.gcsafe, raises:[RlpError].} =
|
|
result = rlp.decode(distinctBase x, common.Transaction)
|
|
|
|
func ethTxs*(list: openArray[Web3Tx]):
|
|
seq[common.Transaction] {.gcsafe, raises:[RlpError].} =
|
|
result = newSeqOfCap[common.Transaction](list.len)
|
|
for x in list:
|
|
result.add ethTx(x)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Eth types to Web3 types
|
|
# ------------------------------------------------------------------------------
|
|
|
|
func w3Qty*(x: UInt256): Web3Quantity =
|
|
Web3Quantity x.truncate(uint64)
|
|
|
|
func w3Qty*(x: EthTime): Web3Quantity =
|
|
Web3Quantity x.uint64
|
|
|
|
func w3Qty*(x: EthTime, y: int): Web3Quantity =
|
|
Web3Quantity(x + y.EthTime)
|
|
|
|
func w3Qty*(x: Web3Quantity, y: int): Web3Quantity =
|
|
Web3Quantity(x.uint64 + y.uint64)
|
|
|
|
func w3Qty*(x: Web3Quantity, y: EthTime): Web3Quantity =
|
|
Web3Quantity(x.uint64 + y.uint64)
|
|
|
|
func w3Qty*(x: Web3Quantity, y: uint64): Web3Quantity =
|
|
Web3Quantity(x.uint64 + y)
|
|
|
|
func w3Qty*(x: Opt[uint64]): Opt[Web3Quantity] =
|
|
if x.isNone: Opt.none(Web3Quantity)
|
|
else: Opt.some(Web3Quantity x.get)
|
|
|
|
func w3Qty*(x: uint64): Web3Quantity =
|
|
Web3Quantity(x)
|
|
|
|
func w3Qty*(x: int64): Web3Quantity =
|
|
Web3Quantity(x)
|
|
|
|
func w3ExtraData*(x: seq[byte]): Web3ExtraData =
|
|
Web3ExtraData x
|
|
|
|
func w3Withdrawal*(w: common.Withdrawal): WithdrawalV1 =
|
|
WithdrawalV1(
|
|
index : Web3Quantity w.index,
|
|
validatorIndex: Web3Quantity w.validatorIndex,
|
|
address : w.address,
|
|
amount : Web3Quantity w.amount
|
|
)
|
|
|
|
func w3Withdrawals*(list: openArray[common.Withdrawal]): seq[WithdrawalV1] =
|
|
result = newSeqOfCap[WithdrawalV1](list.len)
|
|
for x in list:
|
|
result.add w3Withdrawal(x)
|
|
|
|
func w3Withdrawals*(x: Opt[seq[common.Withdrawal]]):
|
|
Opt[seq[WithdrawalV1]] =
|
|
if x.isNone: Opt.none(seq[WithdrawalV1])
|
|
else: Opt.some(w3Withdrawals x.get)
|
|
|
|
func w3Tx*(tx: common.Transaction): Web3Tx =
|
|
Web3Tx rlp.encode(tx)
|
|
|
|
func w3Txs*(list: openArray[common.Transaction]): seq[Web3Tx] =
|
|
result = newSeqOfCap[Web3Tx](list.len)
|
|
for tx in list:
|
|
result.add w3Tx(tx)
|
|
|
|
chronicles.formatIt(Quantity): $(distinctBase it)
|