Skip to content

Commit 535c82c

Browse files
committed
Generate EIP-1559 receipts with type 2
Plus, a bunch of related generalization to work with future forks.
1 parent 575866b commit 535c82c

File tree

5 files changed

+21
-11
lines changed

5 files changed

+21
-11
lines changed

eth/vm/forks/berlin/receipts.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class TypedReceipt(ReceiptAPI, ReceiptDecoderAPI):
4343
type_id: int
4444
rlp_type = Binary(min_length=1) # must have at least one byte for the type
4545
_inner: ReceiptAPI
46+
codecs = TYPED_RECEIPT_BODY_CODECS
4647

4748
def __init__(self, type_id: int, proxy_target: ReceiptAPI) -> None:
4849
self.type_id = type_id
@@ -69,8 +70,8 @@ def encode(self) -> bytes:
6970

7071
@classmethod
7172
def get_payload_codec(cls, type_id: int) -> Type[ReceiptDecoderAPI]:
72-
if type_id in TYPED_RECEIPT_BODY_CODECS:
73-
return TYPED_RECEIPT_BODY_CODECS[type_id]
73+
if type_id in cls.codecs:
74+
return cls.codecs[type_id]
7475
elif type_id in VALID_TRANSACTION_TYPES:
7576
raise UnrecognizedTransactionType(type_id, "Unknown receipt type")
7677
else:
@@ -124,23 +125,23 @@ def __eq__(self, other: Any) -> bool:
124125

125126
class BerlinReceiptBuilder(ReceiptBuilderAPI):
126127
legacy_sedes = Receipt
127-
codecs = TYPED_RECEIPT_BODY_CODECS
128+
typed_receipt_class = TypedReceipt
128129

129130
@classmethod
130131
def decode(cls, encoded: bytes) -> ReceiptAPI:
131132
if len(encoded) == 0:
132133
raise ValidationError("Encoded receipt was empty, which makes it invalid")
133134

134135
type_id = to_int(encoded[0])
135-
if type_id in cls.codecs:
136-
return TypedReceipt.decode(encoded)
136+
if type_id in cls.typed_receipt_class.codecs:
137+
return cls.typed_receipt_class.decode(encoded)
137138
else:
138139
return rlp.decode(encoded, sedes=cls.legacy_sedes)
139140

140141
@classmethod
141142
def deserialize(cls, encoded: DecodedZeroOrOneLayerRLP) -> ReceiptAPI:
142143
if isinstance(encoded, bytes):
143-
return TypedReceipt.deserialize(encoded)
144+
return cls.typed_receipt_class.deserialize(encoded)
144145
else:
145146
return cls.legacy_sedes.deserialize(encoded)
146147

eth/vm/forks/berlin/transactions.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
VALID_TRANSACTION_TYPES,
6464
)
6565
from .receipts import (
66-
TypedReceipt,
66+
BerlinReceiptBuilder,
6767
)
6868

6969

@@ -246,6 +246,7 @@ class TypedTransaction(SignedTransactionMethods, SignedTransactionAPI, Transacti
246246
decoders: Dict[int, Type[TransactionDecoderAPI]] = {
247247
ACCESS_LIST_TRANSACTION_TYPE: AccessListPayloadDecoder,
248248
}
249+
receipt_builder = BerlinReceiptBuilder
249250

250251
def __init__(self, type_id: int, proxy_target: SignedTransactionAPI) -> None:
251252
self.type_id = type_id
@@ -373,7 +374,7 @@ def make_receipt(
373374

374375
inner_receipt = self._inner.make_receipt(status, gas_used, log_entries)
375376

376-
return TypedReceipt(ACCESS_LIST_TRANSACTION_TYPE, inner_receipt)
377+
return self.receipt_builder.typed_receipt_class(self.type_id, inner_receipt)
377378

378379
def __hash__(self) -> int:
379380
return hash((self.type_id, self._inner))

eth/vm/forks/london/blocks.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ def hash(self) -> Hash32:
144144

145145
@property
146146
def mining_hash(self) -> Hash32:
147-
result = keccak(rlp.encode(self[:-2], LondonMiningHeader))
147+
non_pow_fields = self[:-3] + self[-1:]
148+
result = keccak(rlp.encode(non_pow_fields, LondonMiningHeader))
148149
return cast(Hash32, result)
149150

150151
@property

eth/vm/forks/london/receipts.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
Receipt,
88
)
99
from eth.vm.forks.berlin.receipts import (
10-
BerlinReceiptBuilder
10+
BerlinReceiptBuilder,
11+
TypedReceipt as BerlinTypedReceipt,
1112
)
1213
from eth.vm.forks.berlin.constants import (
1314
ACCESS_LIST_TRANSACTION_TYPE,
@@ -16,8 +17,12 @@
1617
from .constants import DYNAMIC_FEE_TRANSACTION_TYPE
1718

1819

19-
class LondonReceiptBuilder(BerlinReceiptBuilder):
20+
class LondonTypedReceipt(BerlinTypedReceipt):
2021
codecs: Dict[int, Type[Receipt]] = {
2122
ACCESS_LIST_TRANSACTION_TYPE: Receipt,
2223
DYNAMIC_FEE_TRANSACTION_TYPE: Receipt,
2324
}
25+
26+
27+
class LondonReceiptBuilder(BerlinReceiptBuilder):
28+
typed_receipt_class = LondonTypedReceipt

eth/vm/forks/london/transactions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
)
5555

5656
from .constants import DYNAMIC_FEE_TRANSACTION_TYPE
57+
from .receipts import LondonReceiptBuilder
5758

5859

5960
class LondonLegacyTransaction(BerlinLegacyTransaction):
@@ -218,6 +219,7 @@ class LondonTypedTransaction(TypedTransaction):
218219
ACCESS_LIST_TRANSACTION_TYPE: AccessListPayloadDecoder,
219220
DYNAMIC_FEE_TRANSACTION_TYPE: DynamicFeePayloadDecoder,
220221
}
222+
receipt_builder = LondonReceiptBuilder
221223

222224

223225
class LondonTransactionBuilder(BerlinTransactionBuilder):

0 commit comments

Comments
 (0)