Skip to content

Commit e073c71

Browse files
jochem-brouwerScottyPoigabrocheleau
authored
TX package cleanup (#3890)
* tx: cleanup: get rid of access/authority JSONs inside the tx * vm: fix build * tx: ensure jsons do not get auto-generated in constructors * tx: add util docs * tx: fix access list related tests * tx: rename imports .js back to .ts * tx: move capability-specific utilities to capabilities * remove duplicate code * tx: minor readability improvements * tx: remove any * tx: eip7702 refactor * tx: eip2930 refactor * tx: undo eip2930 refactor * tx: simplify 2930 * tx: update TODO comment to include issue * tx: cleanup 7702 logic * tx: fix 2930 test cases * tx: 7702 add length check for auth list * tx: eip2930 move back methods to util and use correct capability sig * tx: eip2930 also use `EIP2930CompatibleTx` as function arg for capability method * tx: ensure 7702 is also compliant to capability method sigs + move back utility methods from 7702 to util * tx: split and move util methods * tx: only export util/general * tx: split up util more (authorization+access dedicated) * tx: checkMaxInitCodeSize moved into internal util * tx: also move txTypeBytse and validateNotArray to internal util methods * tx: fix test imports --------- Co-authored-by: ScottyPoi <[email protected]> Co-authored-by: Gabriel Rocheleau <[email protected]>
1 parent f1dc1e9 commit e073c71

25 files changed

+366
-398
lines changed

packages/tx/src/1559/constructors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
} from '@ethereumjs/util'
99

1010
import { TransactionType } from '../types.ts'
11-
import { txTypeBytes, validateNotArray } from '../util.ts'
11+
import { txTypeBytes, validateNotArray } from '../util/internal.ts'
1212

1313
import { FeeMarket1559Tx } from './tx.ts'
1414

packages/tx/src/1559/tx.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,14 @@ import * as EIP1559 from '../capabilities/eip1559.ts'
1313
import * as EIP2718 from '../capabilities/eip2718.ts'
1414
import * as EIP2930 from '../capabilities/eip2930.ts'
1515
import * as Legacy from '../capabilities/legacy.ts'
16-
import { getBaseJSON, sharedConstructor, valueBoundaryCheck } from '../features/util.ts'
17-
import { TransactionType } from '../types.ts'
18-
import { AccessLists } from '../util.ts'
16+
import { TransactionType, isAccessList } from '../types.ts'
17+
import { getBaseJSON, sharedConstructor, valueBoundaryCheck } from '../util/internal.ts'
1918

2019
import { createFeeMarket1559Tx } from './constructors.ts'
2120

2221
import type { Common } from '@ethereumjs/common'
2322
import type { Address } from '@ethereumjs/util'
2423
import type {
25-
AccessList,
2624
AccessListBytes,
2725
TxData as AllTypesTxData,
2826
TxValuesArray as AllTypesTxValuesArray,
@@ -32,6 +30,7 @@ import type {
3230
TransactionInterface,
3331
TxOptions,
3432
} from '../types.ts'
33+
import { accessListBytesToJSON, accessListJSONToBytes } from '../util/access.ts'
3534

3635
export type TxData = AllTypesTxData[typeof TransactionType.FeeMarketEIP1559]
3736
export type TxValuesArray = AllTypesTxValuesArray[typeof TransactionType.FeeMarketEIP1559]
@@ -66,8 +65,6 @@ export class FeeMarket1559Tx
6665

6766
// End of Tx data part
6867

69-
public readonly AccessListJSON: AccessList
70-
7168
public readonly common!: Common
7269

7370
readonly txOptions!: TxOptions
@@ -90,7 +87,8 @@ export class FeeMarket1559Tx
9087
*/
9188
public constructor(txData: TxData, opts: TxOptions = {}) {
9289
sharedConstructor(this, { ...txData, type: TransactionType.FeeMarketEIP1559 }, opts)
93-
const { chainId, accessList, maxFeePerGas, maxPriorityFeePerGas } = txData
90+
const { chainId, accessList: rawAccessList, maxFeePerGas, maxPriorityFeePerGas } = txData
91+
const accessList = rawAccessList ?? []
9492

9593
if (chainId !== undefined && bytesToBigInt(toBytes(chainId)) !== this.common.chainId()) {
9694
throw EthereumJSErrorWithoutCode(
@@ -105,12 +103,10 @@ export class FeeMarket1559Tx
105103
this.activeCapabilities = this.activeCapabilities.concat([1559, 2718, 2930])
106104

107105
// Populate the access list fields
108-
const accessListData = AccessLists.getAccessListData(accessList ?? [])
109-
this.accessList = accessListData.accessList
110-
this.AccessListJSON = accessListData.AccessListJSON
111-
// Verify the access list format.
112-
AccessLists.verifyAccessList(this.accessList)
106+
this.accessList = isAccessList(accessList) ? accessListJSONToBytes(accessList) : accessList
113107

108+
// Verify the access list format.
109+
EIP2930.verifyAccessList(this)
114110
this.maxFeePerGas = bytesToBigInt(toBytes(maxFeePerGas))
115111
this.maxPriorityFeePerGas = bytesToBigInt(toBytes(maxPriorityFeePerGas))
116112

@@ -332,7 +328,7 @@ export class FeeMarket1559Tx
332328
* Returns an object with the JSON representation of the transaction
333329
*/
334330
toJSON(): JSONTx {
335-
const accessListJSON = AccessLists.getAccessListJSON(this.accessList)
331+
const accessListJSON = accessListBytesToJSON(this.accessList)
336332
const baseJSON = getBaseJSON(this)
337333

338334
return {

packages/tx/src/2930/constructors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
} from '@ethereumjs/util'
99

1010
import { TransactionType } from '../types.ts'
11-
import { txTypeBytes, validateNotArray } from '../util.ts'
11+
import { txTypeBytes, validateNotArray } from '../util/internal.ts'
1212

1313
import { AccessList2930Tx } from './tx.ts'
1414

packages/tx/src/2930/tx.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,14 @@ import {
1111
import * as EIP2718 from '../capabilities/eip2718.ts'
1212
import * as EIP2930 from '../capabilities/eip2930.ts'
1313
import * as Legacy from '../capabilities/legacy.ts'
14-
import { getBaseJSON, sharedConstructor, valueBoundaryCheck } from '../features/util.ts'
15-
import { TransactionType } from '../types.ts'
16-
import { AccessLists } from '../util.ts'
14+
import { TransactionType, isAccessList } from '../types.ts'
15+
import { getBaseJSON, sharedConstructor, valueBoundaryCheck } from '../util/internal.ts'
1716

1817
import { createAccessList2930Tx } from './constructors.ts'
1918

2019
import type { Common } from '@ethereumjs/common'
2120
import type { Address } from '@ethereumjs/util'
2221
import type {
23-
AccessList,
2422
AccessListBytes,
2523
TxData as AllTypesTxData,
2624
TxValuesArray as AllTypesTxValuesArray,
@@ -30,6 +28,7 @@ import type {
3028
TransactionInterface,
3129
TxOptions,
3230
} from '../types.ts'
31+
import { accessListBytesToJSON, accessListJSONToBytes } from '../util/access.ts'
3332

3433
export type TxData = AllTypesTxData[typeof TransactionType.AccessListEIP2930]
3534
export type TxValuesArray = AllTypesTxValuesArray[typeof TransactionType.AccessListEIP2930]
@@ -62,8 +61,6 @@ export class AccessList2930Tx
6261

6362
// End of Tx data part
6463

65-
public readonly AccessListJSON: AccessList
66-
6764
public readonly common!: Common
6865

6966
readonly txOptions!: TxOptions
@@ -86,7 +83,8 @@ export class AccessList2930Tx
8683
*/
8784
public constructor(txData: TxData, opts: TxOptions = {}) {
8885
sharedConstructor(this, { ...txData, type: TransactionType.AccessListEIP2930 }, opts)
89-
const { chainId, accessList, gasPrice } = txData
86+
const { chainId, accessList: rawAccessList, gasPrice } = txData
87+
const accessList = rawAccessList ?? []
9088

9189
if (chainId !== undefined && bytesToBigInt(toBytes(chainId)) !== this.common.chainId()) {
9290
throw EthereumJSErrorWithoutCode(
@@ -102,11 +100,9 @@ export class AccessList2930Tx
102100
this.activeCapabilities = this.activeCapabilities.concat([2718, 2930])
103101

104102
// Populate the access list fields
105-
const accessListData = AccessLists.getAccessListData(accessList ?? [])
106-
this.accessList = accessListData.accessList
107-
this.AccessListJSON = accessListData.AccessListJSON
103+
this.accessList = isAccessList(accessList) ? accessListJSONToBytes(accessList) : accessList
108104
// Verify the access list format.
109-
AccessLists.verifyAccessList(this.accessList)
105+
EIP2930.verifyAccessList(this)
110106

111107
this.gasPrice = bytesToBigInt(toBytes(gasPrice))
112108

@@ -307,7 +303,7 @@ export class AccessList2930Tx
307303
* Returns an object with the JSON representation of the transaction
308304
*/
309305
toJSON(): JSONTx {
310-
const accessListJSON = AccessLists.getAccessListJSON(this.accessList)
306+
const accessListJSON = accessListBytesToJSON(this.accessList)
311307
const baseJSON = getBaseJSON(this)
312308

313309
return {

packages/tx/src/4844/constructors.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515

1616
import { paramsTx } from '../params.ts'
1717
import { TransactionType } from '../types.ts'
18-
import { AccessLists, txTypeBytes, validateNotArray } from '../util.ts'
18+
import { accessListBytesToJSON } from '../util/access.ts'
1919

2020
import { Blob4844Tx } from './tx.ts'
2121

@@ -25,6 +25,7 @@ import type {
2525
JSONBlobTxNetworkWrapper,
2626
TxOptions,
2727
} from '../types.ts'
28+
import { txTypeBytes, validateNotArray } from '../util/internal.ts'
2829
import type { TxData, TxValuesArray } from './tx.ts'
2930

3031
const validateBlobTransactionNetworkWrapper = (
@@ -331,7 +332,7 @@ export function blobTxNetworkWrapperToJSON(
331332
): JSONBlobTxNetworkWrapper {
332333
const tx = createBlob4844TxFromSerializedNetworkWrapper(serialized, opts)
333334

334-
const accessListJSON = AccessLists.getAccessListJSON(tx.accessList)
335+
const accessListJSON = accessListBytesToJSON(tx.accessList)
335336
const baseJSON = tx.toJSON()
336337

337338
return {

packages/tx/src/4844/tx.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,20 @@ import * as EIP1559 from '../capabilities/eip1559.ts'
1616
import * as EIP2718 from '../capabilities/eip2718.ts'
1717
import * as EIP2930 from '../capabilities/eip2930.ts'
1818
import * as Legacy from '../capabilities/legacy.ts'
19-
import { getBaseJSON, sharedConstructor, valueBoundaryCheck } from '../features/util.ts'
20-
import { TransactionType } from '../types.ts'
21-
import { AccessLists, validateNotArray } from '../util.ts'
19+
import { TransactionType, isAccessList } from '../types.ts'
20+
import { accessListBytesToJSON, accessListJSONToBytes } from '../util/access.ts'
21+
import {
22+
getBaseJSON,
23+
sharedConstructor,
24+
validateNotArray,
25+
valueBoundaryCheck,
26+
} from '../util/internal.ts'
2227

2328
import { createBlob4844Tx } from './constructors.ts'
2429

2530
import type { Common } from '@ethereumjs/common'
2631
import type { Address, PrefixedHexString } from '@ethereumjs/util'
2732
import type {
28-
AccessList,
2933
AccessListBytes,
3034
TxData as AllTypesTxData,
3135
TxValuesArray as AllTypesTxValuesArray,
@@ -72,8 +76,6 @@ export class Blob4844Tx implements TransactionInterface<typeof TransactionType.B
7276
kzgCommitments?: PrefixedHexString[] // This property should only be populated when the transaction is in the "Network Wrapper" format
7377
kzgProofs?: PrefixedHexString[] // This property should only be populated when the transaction is in the "Network Wrapper" format
7478

75-
public readonly AccessListJSON: AccessList
76-
7779
public readonly common!: Common
7880

7981
readonly txOptions!: TxOptions
@@ -96,7 +98,14 @@ export class Blob4844Tx implements TransactionInterface<typeof TransactionType.B
9698
*/
9799
constructor(txData: TxData, opts: TxOptions = {}) {
98100
sharedConstructor(this, { ...txData, type: TransactionType.BlobEIP4844 }, opts)
99-
const { chainId, accessList, maxFeePerGas, maxPriorityFeePerGas, maxFeePerBlobGas } = txData
101+
const {
102+
chainId,
103+
accessList: rawAccessList,
104+
maxFeePerGas,
105+
maxPriorityFeePerGas,
106+
maxFeePerBlobGas,
107+
} = txData
108+
const accessList = rawAccessList ?? []
100109

101110
if (chainId !== undefined && bytesToBigInt(toBytes(chainId)) !== this.common.chainId()) {
102111
throw EthereumJSErrorWithoutCode(
@@ -115,11 +124,9 @@ export class Blob4844Tx implements TransactionInterface<typeof TransactionType.B
115124
this.activeCapabilities = this.activeCapabilities.concat([1559, 2718, 2930])
116125

117126
// Populate the access list fields
118-
const accessListData = AccessLists.getAccessListData(accessList ?? [])
119-
this.accessList = accessListData.accessList
120-
this.AccessListJSON = accessListData.AccessListJSON
127+
this.accessList = isAccessList(accessList) ? accessListJSONToBytes(accessList) : accessList
121128
// Verify the access list format.
122-
AccessLists.verifyAccessList(this.accessList)
129+
EIP2930.verifyAccessList(this)
123130

124131
this.maxFeePerGas = bytesToBigInt(toBytes(maxFeePerGas))
125132
this.maxPriorityFeePerGas = bytesToBigInt(toBytes(maxPriorityFeePerGas))
@@ -375,7 +382,7 @@ export class Blob4844Tx implements TransactionInterface<typeof TransactionType.B
375382
}
376383

377384
toJSON(): JSONTx {
378-
const accessListJSON = AccessLists.getAccessListJSON(this.accessList)
385+
const accessListJSON = accessListBytesToJSON(this.accessList)
379386
const baseJSON = getBaseJSON(this)
380387

381388
return {

packages/tx/src/7702/constructors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
} from '@ethereumjs/util'
99

1010
import { TransactionType } from '../types.ts'
11-
import { txTypeBytes, validateNotArray } from '../util.ts'
11+
import { txTypeBytes, validateNotArray } from '../util/internal.ts'
1212

1313
import { EOACode7702Tx } from './tx.ts'
1414

packages/tx/src/7702/tx.ts

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,37 @@ import {
1111

1212
import * as EIP1559 from '../capabilities/eip1559.ts'
1313
import * as EIP2718 from '../capabilities/eip2718.ts'
14+
import * as EIP2930 from '../capabilities/eip2930.ts'
1415
import * as EIP7702 from '../capabilities/eip7702.ts'
1516
import * as Legacy from '../capabilities/legacy.ts'
16-
import { getBaseJSON, sharedConstructor, valueBoundaryCheck } from '../features/util.ts'
17-
import { TransactionType } from '../types.ts'
18-
import { AccessLists, AuthorizationLists, validateNotArray } from '../util.ts'
17+
import { TransactionType, isAccessList, isAuthorizationList } from '../types.ts'
18+
import {
19+
getBaseJSON,
20+
sharedConstructor,
21+
validateNotArray,
22+
valueBoundaryCheck,
23+
} from '../util/internal.ts'
1924

2025
import { createEOACode7702Tx } from './constructors.ts'
2126

2227
import type { Common } from '@ethereumjs/common'
2328
import type { Address } from '@ethereumjs/util'
2429
import type {
25-
AccessList,
2630
AccessListBytes,
2731
TxData as AllTypesTxData,
2832
TxValuesArray as AllTypesTxValuesArray,
29-
AuthorizationList,
3033
AuthorizationListBytes,
3134
Capability,
3235
JSONTx,
3336
TransactionCache,
3437
TransactionInterface,
3538
TxOptions,
3639
} from '../types.ts'
40+
import { accessListBytesToJSON, accessListJSONToBytes } from '../util/access.ts'
41+
import {
42+
authorizationListBytesToJSON,
43+
authorizationListJSONToBytes,
44+
} from '../util/authorization.ts'
3745

3846
export type TxData = AllTypesTxData[typeof TransactionType.EOACodeEIP7702]
3947
export type TxValuesArray = AllTypesTxValuesArray[typeof TransactionType.EOACodeEIP7702]
@@ -66,9 +74,6 @@ export class EOACode7702Tx implements TransactionInterface<typeof TransactionTyp
6674

6775
// End of Tx data part
6876

69-
public readonly AccessListJSON: AccessList
70-
public readonly AuthorizationListJSON: AuthorizationList
71-
7277
public readonly common!: Common
7378

7479
readonly txOptions!: TxOptions
@@ -91,7 +96,15 @@ export class EOACode7702Tx implements TransactionInterface<typeof TransactionTyp
9196
*/
9297
public constructor(txData: TxData, opts: TxOptions = {}) {
9398
sharedConstructor(this, { ...txData, type: TransactionType.EOACodeEIP7702 }, opts)
94-
const { chainId, accessList, authorizationList, maxFeePerGas, maxPriorityFeePerGas } = txData
99+
const {
100+
chainId,
101+
accessList: rawAccessList,
102+
authorizationList: rawAuthorizationList,
103+
maxFeePerGas,
104+
maxPriorityFeePerGas,
105+
} = txData
106+
const accessList = rawAccessList ?? []
107+
const authorizationList = rawAuthorizationList ?? []
95108

96109
if (chainId !== undefined && bytesToBigInt(toBytes(chainId)) !== this.common.chainId()) {
97110
throw EthereumJSErrorWithoutCode(
@@ -106,20 +119,16 @@ export class EOACode7702Tx implements TransactionInterface<typeof TransactionTyp
106119
this.activeCapabilities = this.activeCapabilities.concat([1559, 2718, 2930, 7702])
107120

108121
// Populate the access list fields
109-
const accessListData = AccessLists.getAccessListData(accessList ?? [])
110-
this.accessList = accessListData.accessList
111-
this.AccessListJSON = accessListData.AccessListJSON
122+
this.accessList = isAccessList(accessList) ? accessListJSONToBytes(accessList) : accessList
112123
// Verify the access list format.
113-
AccessLists.verifyAccessList(this.accessList)
124+
EIP2930.verifyAccessList(this)
114125

115126
// Populate the authority list fields
116-
const authorizationListData = AuthorizationLists.getAuthorizationListData(
117-
authorizationList ?? [],
118-
)
119-
this.authorizationList = authorizationListData.authorizationList
120-
this.AuthorizationListJSON = authorizationListData.AuthorizationListJSON
127+
this.authorizationList = isAuthorizationList(authorizationList)
128+
? authorizationListJSONToBytes(authorizationList)
129+
: authorizationList
121130
// Verify the authority list format.
122-
AuthorizationLists.verifyAuthorizationList(this.authorizationList)
131+
EIP7702.verifyAuthorizationList(this)
123132

124133
this.maxFeePerGas = bytesToBigInt(toBytes(maxFeePerGas))
125134
this.maxPriorityFeePerGas = bytesToBigInt(toBytes(maxPriorityFeePerGas))
@@ -354,7 +363,9 @@ export class EOACode7702Tx implements TransactionInterface<typeof TransactionTyp
354363
* Returns an object with the JSON representation of the transaction
355364
*/
356365
toJSON(): JSONTx {
357-
const accessListJSON = AccessLists.getAccessListJSON(this.accessList)
366+
const accessListJSON = accessListBytesToJSON(this.accessList)
367+
const authorizationList = authorizationListBytesToJSON(this.authorizationList)
368+
358369
const baseJSON = getBaseJSON(this)
359370

360371
return {
@@ -363,7 +374,7 @@ export class EOACode7702Tx implements TransactionInterface<typeof TransactionTyp
363374
maxPriorityFeePerGas: bigIntToHex(this.maxPriorityFeePerGas),
364375
maxFeePerGas: bigIntToHex(this.maxFeePerGas),
365376
accessList: accessListJSON,
366-
authorizationList: this.AuthorizationListJSON,
377+
authorizationList,
367378
}
368379
}
369380

packages/tx/src/capabilities/eip2718.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { RLP } from '@ethereumjs/rlp'
22
import { BIGINT_0, BIGINT_1, EthereumJSErrorWithoutCode, concatBytes } from '@ethereumjs/util'
33
import { keccak256 } from 'ethereum-cryptography/keccak.js'
44

5-
import { txTypeBytes } from '../util.ts'
5+
import { txTypeBytes } from '../util/internal.ts'
66

77
import { errorMsg } from './legacy.ts'
88

0 commit comments

Comments
 (0)