nim-eth/eth/common/receipts.nim
Jacek Sieka 6bd6bae86c
Align core types with execution spec (#733)
Since these types were written, we've gained an executable spec:

https://github.com/ethereum/execution-specs

This PR aligns some of the types we use with this spec to simplify
comparisons and cross-referencing.

Using a `distinct` type is a tradeoff between nim ergonomics, type
safety and the ability to work around nim quirks and stdlib weaknesses.

In particular, it allows us to overload common functions such as `hash`
with correct and performant versions as well as maintain control over
string conversions etc at the cost of a little bit of ceremony when
instantiating them.

Apart from distinct byte types, `Hash32`, is introduced in lieu of the
existing `Hash256`, again aligning this commonly used type with the spec
which picks bytes rather than bits in the name.
2024-09-29 10:52:19 +02:00

57 lines
1.6 KiB
Nim

# eth
# Copyright (c) 2024 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.
{.push raises: [].}
import "."/[addresses, base, hashes, transactions]
export addresses, base, hash, transactions
type
Topic* = Bytes32
# topic can be Hash32 or zero padded bytes array
Log* = object
address*: Address
topics*: seq[Topic]
data*: seq[byte]
# easily convertible between
# ReceiptType and TxType
ReceiptType* = TxType
# LegacyReceipt = TxLegacy
# Eip2930Receipt = TxEip2930
# Eip1559Receipt = TxEip1559
# Eip4844Receipt = TxEip4844
# Eip7702Receipt = TxEip7702
Receipt* = object
receiptType* : ReceiptType
isHash* : bool # hash or status
status* : bool # EIP-658
hash* : Hash32
cumulativeGasUsed*: GasInt
logsBloom* : Bloom
logs* : seq[Log]
const
LegacyReceipt* = TxLegacy
Eip2930Receipt* = TxEip2930
Eip1559Receipt* = TxEip1559
Eip4844Receipt* = TxEip4844
Eip7702Receipt* = TxEip7702
func hasStatus*(rec: Receipt): bool {.inline.} =
rec.isHash == false
func hasStateRoot*(rec: Receipt): bool {.inline.} =
rec.isHash == true
func stateRoot*(rec: Receipt): Hash32 {.inline.} =
doAssert(rec.hasStateRoot)
rec.hash