Added EIP-4844 fields to Provider classes and formatter (#4570).

This commit is contained in:
Richard Moore 2024-02-03 00:17:45 -05:00
parent f1666f167f
commit 7b4f2c1a74
5 changed files with 291 additions and 21 deletions

@ -1,5 +1,5 @@
export type TestBlockchainNetwork = export type TestBlockchainNetwork =
"mainnet" | "goerli"; "mainnet" | "goerli" | "sepolia";
export interface TestBlockchainAddress { export interface TestBlockchainAddress {
test: string; test: string;
@ -13,19 +13,21 @@ export interface TestBlockchainAddress {
export interface TestBlockchainBlock { export interface TestBlockchainBlock {
test: string; test: string;
hash: string, hash: string;
parentHash: string, parentHash: string;
number: number, number: number;
timestamp: number, timestamp: number;
nonce: string, nonce: string;
difficulty: bigint, difficulty: bigint;
gasLimit: bigint, gasLimit: bigint;
gasUsed: bigint, gasUsed: bigint;
miner: string, miner: string;
extraData: string, extraData: string;
transactions: Array<string>, transactions: Array<string>;
baseFeePerGas?: bigint baseFeePerGas?: bigint;
blobGasUsed?: bigint;
excessBlobGas?: bigint;
} }
export interface TestBlockchainTransaction { export interface TestBlockchainTransaction {
@ -46,7 +48,7 @@ export interface TestBlockchainTransaction {
r: string, r: string,
s: string, s: string,
yParity: 0 | 1, yParity: 0 | 1,
v: number, v?: number,
networkV: null | bigint, networkV: null | bigint,
}, },
creates: null | string, creates: null | string,
@ -56,6 +58,8 @@ export interface TestBlockchainTransaction {
maxPriorityFeePerGas?: bigint, maxPriorityFeePerGas?: bigint,
maxFeePerGas?: bigint maxFeePerGas?: bigint
maxFeePerBlobGas?: bigint;
blobVersionedHashes?: Array<string>
} }
export interface TestBlockchainReceipt { export interface TestBlockchainReceipt {
@ -84,7 +88,10 @@ export interface TestBlockchainReceipt {
status: null | number, status: null | number,
to: string, to: string,
hash: string, hash: string,
index: number index: number;
blobGasUsed?: bigint;
blobGasPrice?: bigint;
}; };
export const testAddress: Record<TestBlockchainNetwork, Array<TestBlockchainAddress>> = { export const testAddress: Record<TestBlockchainNetwork, Array<TestBlockchainAddress>> = {
@ -109,6 +116,8 @@ export const testAddress: Record<TestBlockchainNetwork, Array<TestBlockchainAddr
}, },
], ],
goerli: [ goerli: [
],
sepolia: [
] ]
}; };
@ -174,6 +183,100 @@ export const testBlock: Record<TestBlockchainNetwork, Array<TestBlockchainBlock>
], ],
goerli: [ goerli: [
], ],
sepolia: [
{
test: "eip-4844-BLob-block",
hash: "0xa76eb2ed547798d6010f599902788136f0cd289e2c6df5bbf5242e36e356124d",
parentHash: "0x2b579cb7224abdbe7a66c76380d60329bba41d95d225feb80ca1a78cf83a5124",
number: 5198187,
timestamp: 1706801700,
nonce: "0x0000000000000000",
difficulty: BigInt(0),
gasLimit: BigInt("30000000"),
gasUsed: BigInt("5622957"),
baseFeePerGas: BigInt("48793932840"),
miner: "0x008b3b2F992C0E14eDaa6E2c662Bec549CAA8df1",
extraData: "0x",
blobGasUsed: BigInt("524288"),
excessBlobGas: BigInt("79691776"),
transactions: [
"0xe8a096a98cd7b8d783cbb30687c3adc8e59f1e9563c0454623cc8af59f8bcab1",
"0x5aac2d50b15e177e8edaae4819e989650a6cdb335dd8924b5a7a7ed1675d15e7",
"0x21c94c24419f746efd2c1f470c0842df21ab8da14f7db8e30a12c53a4e7d5145",
"0x85b40ce37262a7962487bd37bf36867b344525b425a90a25516ac3c2cb1f6535",
"0x1a674ff3bd6bbe7bc7ada2ae3da893a7b74b4cfaadebc8c3f0fe0c9ad3c1c35b",
"0x48cafe99a7d2284a1664e05c404dd88e4113ffb65bf49846716bd855ffc6835d",
"0x658065003e8952782d121d9b5729845862c2a45ed24e46c634041a77c4577bed",
"0xc5416e0a2383b1a9b3ba030803f88e45faebfb35ad5db022e44a09b15aeae385",
"0x9030f7962f3f638f96bb703f45cdaa8778cf393ead767592aa50bce32230eae3",
"0xce008888308a4c1d51f87a1c2a75b1d0bd15eb096c675ad091dcc9705e4d016d",
"0xcf17c1f09a22c992a469da0023ad3c9bd2c29a8532146bcdf9ce3216609ea50c",
"0x3933e49a215c80b35ec7d48e2741fda50c8cc7b92652e79663e4423c00e8e1e2",
"0x82b2af4ed108880c151ee38cb3ab28e81ba86a2b0e707dd9cee9bf341f895a8a",
"0x51ef5af42d572d6135bec154d5c754928465bad00d1ff7b769a5b65e0054a90e",
"0x87cab3ae3a36d439a539ded7eb57e0ef07c5a1fbe1697c2e5ba8d7c03875fd22",
"0x70371a20dfbff0ee753b52cd9445f431454b929c7375624a96f5dbc25e88afed",
"0x57ee8a4a09875b7720f7d9e75fb93a1cc86d166ad9a1b4c2d7cf2c7c8324fbc0",
"0xf004bd2b0119aca5f364b16421a5b2e7db811568761f5542fdcd74903cd9115d",
"0x5b6635688362651e1cd33c668bd748d964ba93006661e53dc117d1c1e44886a5",
"0xe5893e07bfec18dd206da279a47ee5cc9471930bbb3b85d64ee4945b98137348",
"0x4f0f48032a77a80550f71cbcbe86f7d1b34009910f12dbe153a93cb66965393e",
"0x5420c3f7b5118e0829df31794aa55a1a91e0009600bbff283b553d5ac7a248ff",
"0xece2175e4b06bf6105f5be10a9ed48808a5f96f12f80b3941ee7cb1eeca99e03",
"0x383ea6445cd183e32fbc7b846c00b34c419078fe4055cd078f8692fc02b300c8",
"0x6c4aef4c26410b1fcbf24d0148e3d66a10cb3e9ad4ca10a71782489688cdd45a",
"0xe7e24b8c8182832e7b1113cd07ae68e4ca8618decdc527650f57d25d0b681fde",
"0xef5f520662c133be33209249fbc93afb7c614c06a0b45086d15c33bd7c0ca47a",
"0x4af20dc2e952e381789065f2cd0c88730fea820bcc3db82eaddf63b36e65b3ac",
"0xf99eef2240abc5002c9d71a90ffd463935642aaf81213f37337327c1afcb502c",
"0xf7d1ad53e2435e6d978563e39db89660d1b4de6084a3a3cefe7025d28507017f",
"0xfc21e64a158ac26ea9afc754460e16fefc4316a3fb92ec9a6042b792d7855788",
"0xee60e551bcf518853ef4f5c33551ad07fa95267814940c4203934c79355b1ac0",
"0x2a3c649caf77b942b206b9eb1be4635d950cf9a15fea2b43d3d7cbeddf700739",
"0xbbd7b9c1434eb98d177f2ff8911b0186309534dea942c40a86517d69247cd0ac",
"0xd86daa6d16e2aee4fc6ae831336ada63623685fb998dc5c605284a034604d751",
"0xcfc848dfbbbe76fe0095f04ef35c931799c294eb3623e5cb8c0d81362e8bf125",
"0x71e3ea97c91bd14388d99d69d122314a1cf0d595cbad1e45040277b470c4e67b",
"0xa9b2e44e46d38bb67cbd7a2d47d57e60892dff018f7754b54a221ae3f1b996c4",
"0xd1b8f9d669bd7f5072a095476e94e90510f2a18b434551fb7852b5c38c41471a",
"0xa3858e80680997080fddde083398e857b14cd4e2cfe74629f6a1245df0447efb",
"0x97593f663b07f8a4555202abb691cf7997210284195c24980abee02040c60618",
"0x03387f22b01919486338fbd874dd7059f8df62d5b16052cb0ab855b6a364777e",
"0xf2561f5f487c3d20c42b42e697a49fb5d05e0fb844ca97b2f127b210475f457e",
"0xa67951a1309f1c7ec07ee518ecad831d12c5c78619250681068e7973243f7d9b",
"0x7b007997da62b3ac9e5a7005066941e74f5c14d0bdaf4ac44faa8c3479b3cf45",
"0x74379408aa3518cbbb394886c91f77ba95ccd37f6b10517834f69a8ff5120ca7",
"0xd4843ef02a0d9802d31a89e13e60b6e71870de9124d0b472047012f7a4320f83",
"0xaa50331afeafd8f9e913a9f78e898e299314d0825936724cc31211ebf177a9bf",
"0xf20c83f2e5d199ad84a7b5dc6fda9611772516e07e7fc71b9f7889af4f2a16aa",
"0x89a7c645987dc079ce1af236ed3dd445ad805cc030e5a57766324d4a0a1def9a",
"0xe8e7d1116c2c60afd063b9c1e87624426cf6c9fd8d3fa6befe25666e68459570",
"0x50be079e71cabf80ca27c39a27f9c0759ac272151f4608b9b75ebfac8284a601",
"0xca24f69d47438ebd0b8f304f2f6d7a513d056905f10b164ed6a2cff6da1d4fea",
"0x08d2521e04dfd0decc2f556b11274212e84076ff84a0135e9b4e3434de09d42a",
"0xcc1e01932a627e9aa20d2b72480d13b4826e128efbbe03526504f7cb9facfc1f",
"0x0a3ac907b6d1584cb3d7f9f588ddb4bdd7878db34bc47bd8baf881dd71a98f7d",
"0x487539ee9cc6933e13e75e94935c30faffa826c28460fed6d9c3a07d15e2617f",
"0xad251856762796acc75dc2846def1f6995fe1b5c747bcab51c10f561d22ffd57",
"0x27ca72aa253e009e5e4497dd838986c561e7bea129fec930bc276968525456a8",
"0xe26391de668d3eb6f5a3c2f3e14f911dc683873b7ea60d883116c205610b36ff",
"0x691c3c5583c5f6444dc6c2f26315a127fc72ebd4f3848055cc8abb8a941d065b",
"0x449578293a1dce8d3c147fed564a765515d090e8cd8866209648eb86cd5c1090",
"0xb79c6f59d533663ca4fa3a70e9c8be18a3761edc43923c2ecd0904447f654f90",
"0xc03863ffa85dd15e0d774ea20006dffd01a868dbf3ff2abe04ccdbf4f027d7ec",
"0x28bc1a65696947beb387adbbeabb5328e5f812c435db288688041d9a8c6ab372",
"0x6dca99c2103d3894ba83c75e0fa0d42f722e5e93fe6f7a6a55a80cf2907a1a5e",
"0x75a7c5f00d79f1b30f82855a8b25077182f1abfd5dbccdf18fe1276e6c9e6a1e",
"0x3fc5a320d8c16bcfe2eda847582d34731abc12a3bffbf334a238b47c0bacb90d",
"0x47a61770f0771ba34d8e8ab883a3d588769a8d387eb5531b4befccb7ea23a6d3",
"0xdc8d0b20e8d8b0fbce50d24eaa36bc56467f35459139dda5e42ffebb1060535c",
"0x65bebb9628b5bf5d5e1dbedf00a7e6610fb5615c7ff9d92adaa135bc88f90648",
"0x9d2f5b7858631ee196bc24d14d2ef1ce07af081d8fe27b2be70ab90bd8edf930",
"0xd7724915af54b4d2c896d05c039f5ba508c878d524eb132c09c3abc22f6111ca",
"0xfda6f72dde86c0b8f84ea7c1e157f1d207dd2e974589cc351404bd5a01fe1d9d",
"0x3fae3676e266af80b0cc810b6b491750b64b013da78935a288b93e33215bee32" ]
},
],
}; };
export const testTransaction: Record<TestBlockchainNetwork, Array<TestBlockchainTransaction>> = { export const testTransaction: Record<TestBlockchainNetwork, Array<TestBlockchainTransaction>> = {
@ -231,6 +334,41 @@ export const testTransaction: Record<TestBlockchainNetwork, Array<TestBlockchain
} }
], ],
goerli: [ goerli: [
],
sepolia: [
{
test: "EIP-4844-BLOb-tx",
hash: "0x6c4aef4c26410b1fcbf24d0148e3d66a10cb3e9ad4ca10a71782489688cdd45a",
blockHash: '0xa76eb2ed547798d6010f599902788136f0cd289e2c6df5bbf5242e36e356124d',
blockNumber: 5198187,
// index: 185,
type: 3,
from: '0x1803c760451DC8da8935c7B7E47e1c60910E6986',
to: '0x4f56fFC63c28b72F79b02E91F11a4707bac4043C',
gasLimit: BigInt("21000"),
nonce: 1635,
data: '0x',
value: BigInt("0"),
gasPrice: BigInt("54793932840"),
maxPriorityFeePerGas: BigInt("6000000000"),
maxFeePerGas: BigInt("600000000000"),
maxFeePerBlobGas: BigInt("60000000000"),
chainId: BigInt(11155111),
signature: {
r: "0x56fc10a770e9fa39a30f71a56d13affbdc390a1bfb419ff806e59b54bfc8bab1",
s: "0x35be8b0c774c179520dd43df46925361c4817472441d7dd5162d43efc90679f1",
yParity: 1,
networkV: null
},
creates: null,
accessList: [ ],
blobVersionedHashes: [
"0x010264a7b018f0edbe5caa5cb309ca50d3d7c6c7c990d21bf30a7f18ffd06cd6",
"0x017fe9ef61e3c501acec804ec15849d977433f4cf87050c098272dd1257f9c68",
"0x019975416c9d7c70ba9cc041464a6e1c3e4f176bdab463573504b55c681364c8",
"0x0123ae55ad7d8e8afec2202bdc6dfb931efc8990acf29afbd0c3c0ef61eae92d"
]
}
] ]
}; };
@ -319,11 +457,34 @@ export const testReceipt: Record<TestBlockchainNetwork, Array<TestBlockchainRece
} }
], ],
goerli: [ goerli: [
],
sepolia: [
{
test: "eip-4844-BLOb-receipt",
//byzantium: true,
blockHash: "0xa76eb2ed547798d6010f599902788136f0cd289e2c6df5bbf5242e36e356124d",
blockNumber: 5198187,
type: 3,
contractAddress: null,
cumulativeGasUsed: BigInt("930313"),
from: "0x1803c760451DC8da8935c7B7E47e1c60910E6986",
gasUsed: BigInt("21000"),
gasPrice: BigInt("54793932840"),
logs: [ ],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
root: null,
status: 1,
to: "0x4f56fFC63c28b72F79b02E91F11a4707bac4043C",
hash: "0x6c4aef4c26410b1fcbf24d0148e3d66a10cb3e9ad4ca10a71782489688cdd45a",
index: 24,
blobGasUsed: BigInt("524288"),
blobGasPrice: BigInt("23276216517"),
}
] ]
}; };
export const networkNames: Array<TestBlockchainNetwork> = [ export const networkNames: Array<TestBlockchainNetwork> = [
"mainnet", "goerli" "mainnet", "goerli", "sepolia"
]; ];
export function networkFeatureAtBlock(feature: string, block: number): boolean { export function networkFeatureAtBlock(feature: string, block: number): boolean {
switch (feature) { switch (feature) {

@ -109,9 +109,23 @@ describe("Test Provider Address operations", function() {
function assertObj(prefix: string, actual: any, expected: any): void { function assertObj(prefix: string, actual: any, expected: any): void {
assert.ok(actual != null, `${ prefix } is null`); assert.ok(actual != null, `${ prefix } is null`);
if (typeof(expected) !== "object") {
assert.equal(actual, expected, prefix);
return;
}
for (const key in expected) { for (const key in expected) {
if (expected[key] === undefined) { continue; } if (expected[key] === undefined) { continue; }
assert.equal(actual[key], expected[key], `${ prefix }.${ key }`); if (Array.isArray(expected[key])) {
assert.ok(Array.isArray(actual[key]), `Array.isArray(${ prefix }.${ key })`);
assert.equal(actual[key].length, expected[key].length, `${ prefix }.${ key }.length`);
for (let i = 0; i < expected[key].length; i++) {
assertObj(`${ prefix }[${ i }]`, actual[key][i], expected[key][i]);
}
} else {
assert.equal(actual[key], expected[key], `${ prefix }.${ key }`);
}
} }
} }
@ -252,6 +266,7 @@ describe("Test Networks", function() {
if (provider == null || !(provider instanceof JsonRpcProvider)) { continue; } if (provider == null || !(provider instanceof JsonRpcProvider)) { continue; }
it(`checks network chainId: ${ providerName }/${ networkName }`, async function() { it(`checks network chainId: ${ providerName }/${ networkName }`, async function() {
this.timeout(10000);
const chainId = await provider.send("eth_chainId", [ ]); const chainId = await provider.send("eth_chainId", [ ]);
assert.equal(parseInt(chainId), network.chainId, "chainId"); assert.equal(parseInt(chainId), network.chainId, "chainId");
}); });

@ -26,8 +26,9 @@ export function allowNull(format: FormatFunc, nullValue?: any): FormatFunc {
}); });
} }
export function arrayOf(format: FormatFunc): FormatFunc { export function arrayOf(format: FormatFunc, allowNull?: boolean): FormatFunc {
return ((array: any) => { return ((array: any) => {
if (allowNull && array == null) { return null; }
if (!Array.isArray(array)) { throw new Error("not an array"); } if (!Array.isArray(array)) { throw new Error("not an array"); }
return array.map((i) => format(i)); return array.map((i) => format(i));
}); });
@ -119,6 +120,9 @@ const _formatBlock = object({
gasLimit: getBigInt, gasLimit: getBigInt,
gasUsed: getBigInt, gasUsed: getBigInt,
blobGasUsed: allowNull(getBigInt, null),
excessBlobGas: allowNull(getBigInt, null),
miner: allowNull(getAddress), miner: allowNull(getAddress),
extraData: formatData, extraData: formatData,
@ -159,6 +163,7 @@ const _formatTransactionReceipt = object({
index: getNumber, index: getNumber,
root: allowNull(hexlify), root: allowNull(hexlify),
gasUsed: getBigInt, gasUsed: getBigInt,
blobGasUsed: allowNull(getBigInt, null),
logsBloom: allowNull(formatData), logsBloom: allowNull(formatData),
blockHash: formatHash, blockHash: formatHash,
hash: formatHash, hash: formatHash,
@ -167,6 +172,7 @@ const _formatTransactionReceipt = object({
//confirmations: allowNull(getNumber, null), //confirmations: allowNull(getNumber, null),
cumulativeGasUsed: getBigInt, cumulativeGasUsed: getBigInt,
effectiveGasPrice: allowNull(getBigInt), effectiveGasPrice: allowNull(getBigInt),
blobGasPrice: allowNull(getBigInt, null),
status: allowNull(getNumber), status: allowNull(getNumber),
type: allowNull(getNumber, 0) type: allowNull(getNumber, 0)
}, { }, {
@ -195,6 +201,7 @@ export function formatTransactionResponse(value: any): TransactionResponseParams
return getNumber(value); return getNumber(value);
}, },
accessList: allowNull(accessListify, null), accessList: allowNull(accessListify, null),
blobVersionedHashes: allowNull(arrayOf(formatHash, true), null),
blockHash: allowNull(formatHash, null), blockHash: allowNull(formatHash, null),
blockNumber: allowNull(getNumber, null), blockNumber: allowNull(getNumber, null),
@ -208,6 +215,7 @@ export function formatTransactionResponse(value: any): TransactionResponseParams
gasPrice: allowNull(getBigInt), gasPrice: allowNull(getBigInt),
maxPriorityFeePerGas: allowNull(getBigInt), maxPriorityFeePerGas: allowNull(getBigInt),
maxFeePerGas: allowNull(getBigInt), maxFeePerGas: allowNull(getBigInt),
maxFeePerBlobGas: allowNull(getBigInt, null),
gasLimit: getBigInt, gasLimit: getBigInt,
to: allowNull(getAddress, null), to: allowNull(getAddress, null),

@ -60,6 +60,18 @@ export interface BlockParams {
*/ */
gasUsed: bigint; gasUsed: bigint;
/**
* The total amount of BLOb gas consumed by transactions within
* the block. See [[link-eip4844].
*/
blobGasUsed?: null | bigint;
/**
* The running total of BLOb gas consumed in excess of the target
* prior to the block. See [[link-eip-4844]].
*/
excessBlobGas?: null | bigint;
/** /**
* The miner (or author) of a block. * The miner (or author) of a block.
*/ */
@ -203,6 +215,11 @@ export interface TransactionReceiptParams {
*/ */
gasUsed: bigint; gasUsed: bigint;
/**
* The amount of BLOb gas used. See [[link-eip-4844]].
*/
blobGasUsed?: null | bigint;
/** /**
* The total amount of gas consumed during the entire block up to * The total amount of gas consumed during the entire block up to
* and including this transaction. * and including this transaction.
@ -214,6 +231,11 @@ export interface TransactionReceiptParams {
*/ */
gasPrice?: null | bigint; gasPrice?: null | bigint;
/**
* The actual BLOb gas price that was charged. See [[link-eip-4844]].
*/
blobGasPrice?: null | bigint;
/** /**
* The actual gas price per gas charged for this transaction. * The actual gas price per gas charged for this transaction.
*/ */
@ -327,6 +349,12 @@ export interface TransactionResponseParams {
*/ */
maxFeePerGas: null | bigint; maxFeePerGas: null | bigint;
/**
* For [[link-eip-4844]] transactions, this is the maximum fee that
* will be paid per BLOb.
*/
maxFeePerBlobGas?: null | bigint;
/** /**
* The transaction data. * The transaction data.
*/ */
@ -351,6 +379,11 @@ export interface TransactionResponseParams {
* The transaction access list. * The transaction access list.
*/ */
accessList: null | AccessList; accessList: null | AccessList;
/**
* The [[link-eip-4844]] BLOb versioned hashes.
*/
blobVersionedHashes?: null | Array<string>;
}; };

@ -466,6 +466,18 @@ export class Block implements BlockParams, Iterable<string> {
*/ */
readonly gasUsed!: bigint; readonly gasUsed!: bigint;
/**
* The total amount of blob gas consumed by the transactions
* within the block. See [[link-eip-4844]].
*/
readonly blobGasUsed!: null | bigint;
/**
* The running total of blob gas consumed in excess of the
* target, prior to the block. See [[link-eip-4844]].
*/
readonly excessBlobGas!: null | bigint;
/** /**
* The miner coinbase address, wihch receives any subsidies for * The miner coinbase address, wihch receives any subsidies for
* including this block. * including this block.
@ -518,6 +530,8 @@ export class Block implements BlockParams, Iterable<string> {
gasLimit: block.gasLimit, gasLimit: block.gasLimit,
gasUsed: block.gasUsed, gasUsed: block.gasUsed,
blobGasUsed: block.blobGasUsed,
excessBlobGas: block.excessBlobGas,
miner: block.miner, miner: block.miner,
extraData: block.extraData, extraData: block.extraData,
@ -574,6 +588,8 @@ export class Block implements BlockParams, Iterable<string> {
extraData, extraData,
gasLimit: toJson(gasLimit), gasLimit: toJson(gasLimit),
gasUsed: toJson(gasUsed), gasUsed: toJson(gasUsed),
blobGasUsed: toJson(this.blobGasUsed),
excessBlobGas: toJson(this.excessBlobGas),
hash, miner, nonce, number, parentHash, timestamp, hash, miner, nonce, number, parentHash, timestamp,
transactions, transactions,
}; };
@ -914,6 +930,11 @@ export class TransactionReceipt implements TransactionReceiptParams, Iterable<Lo
*/ */
readonly gasUsed!: bigint; readonly gasUsed!: bigint;
/**
* The gas used for BLObs. See [[link-eip-4844]].
*/
readonly blobGasUsed!: null | bigint;
/** /**
* The amount of gas used by all transactions within the block for this * The amount of gas used by all transactions within the block for this
* and all transactions with a lower ``index``. * and all transactions with a lower ``index``.
@ -932,6 +953,11 @@ export class TransactionReceipt implements TransactionReceiptParams, Iterable<Lo
*/ */
readonly gasPrice!: bigint; readonly gasPrice!: bigint;
/**
* The price paid per BLOB in gas. See [[link-eip-4844]].
*/
readonly blobGasPrice!: null | bigint;
/** /**
* The [[link-eip-2718]] transaction type. * The [[link-eip-2718]] transaction type.
*/ */
@ -989,7 +1015,9 @@ export class TransactionReceipt implements TransactionReceiptParams, Iterable<Lo
gasUsed: tx.gasUsed, gasUsed: tx.gasUsed,
cumulativeGasUsed: tx.cumulativeGasUsed, cumulativeGasUsed: tx.cumulativeGasUsed,
blobGasUsed: tx.blobGasUsed,
gasPrice, gasPrice,
blobGasPrice: tx.blobGasPrice,
type: tx.type, type: tx.type,
//byzantium: tx.byzantium, //byzantium: tx.byzantium,
@ -1008,7 +1036,8 @@ export class TransactionReceipt implements TransactionReceiptParams, Iterable<Lo
*/ */
toJSON(): any { toJSON(): any {
const { const {
to, from, contractAddress, hash, index, blockHash, blockNumber, logsBloom, to, from, contractAddress, hash, index,
blockHash, blockNumber, logsBloom,
logs, //byzantium, logs, //byzantium,
status, root status, root
} = this; } = this;
@ -1021,6 +1050,8 @@ export class TransactionReceipt implements TransactionReceiptParams, Iterable<Lo
cumulativeGasUsed: toJson(this.cumulativeGasUsed), cumulativeGasUsed: toJson(this.cumulativeGasUsed),
from, from,
gasPrice: toJson(this.gasPrice), gasPrice: toJson(this.gasPrice),
blobGasUsed: toJson(this.blobGasUsed),
blobGasPrice: toJson(this.blobGasPrice),
gasUsed: toJson(this.gasUsed), gasUsed: toJson(this.gasUsed),
hash, index, logs, logsBloom, root, status, to hash, index, logs, logsBloom, root, status, to
}; };
@ -1236,6 +1267,11 @@ export class TransactionResponse implements TransactionLike<string>, Transaction
*/ */
readonly maxFeePerGas!: null | bigint; readonly maxFeePerGas!: null | bigint;
/**
* The [[link-eip-4844]] max fee per BLOb gas.
*/
readonly maxFeePerBlobGas!: null | bigint;
/** /**
* The data. * The data.
*/ */
@ -1263,6 +1299,11 @@ export class TransactionResponse implements TransactionLike<string>, Transaction
*/ */
readonly accessList!: null | AccessList; readonly accessList!: null | AccessList;
/**
* The [[link-eip-4844]] BLOb versioned hashes.
*/
readonly blobVersionedHashes!: null | Array<string>;
#startBlock: number; #startBlock: number;
/** /**
@ -1290,11 +1331,13 @@ export class TransactionResponse implements TransactionLike<string>, Transaction
this.gasPrice = tx.gasPrice; this.gasPrice = tx.gasPrice;
this.maxPriorityFeePerGas = (tx.maxPriorityFeePerGas != null) ? tx.maxPriorityFeePerGas: null; this.maxPriorityFeePerGas = (tx.maxPriorityFeePerGas != null) ? tx.maxPriorityFeePerGas: null;
this.maxFeePerGas = (tx.maxFeePerGas != null) ? tx.maxFeePerGas: null; this.maxFeePerGas = (tx.maxFeePerGas != null) ? tx.maxFeePerGas: null;
this.maxFeePerBlobGas = (tx.maxFeePerBlobGas != null) ? tx.maxFeePerBlobGas: null;
this.chainId = tx.chainId; this.chainId = tx.chainId;
this.signature = tx.signature; this.signature = tx.signature;
this.accessList = (tx.accessList != null) ? tx.accessList: null; this.accessList = (tx.accessList != null) ? tx.accessList: null;
this.blobVersionedHashes = (tx.blobVersionedHashes != null) ? tx.blobVersionedHashes: null;
this.#startBlock = -1; this.#startBlock = -1;
} }
@ -1305,12 +1348,13 @@ export class TransactionResponse implements TransactionLike<string>, Transaction
toJSON(): any { toJSON(): any {
const { const {
blockNumber, blockHash, index, hash, type, to, from, nonce, blockNumber, blockHash, index, hash, type, to, from, nonce,
data, signature, accessList data, signature, accessList, blobVersionedHashes
} = this; } = this;
return { return {
_type: "TransactionReceipt", _type: "TransactionResponse",
accessList, blockNumber, blockHash, accessList, blockNumber, blockHash,
blobVersionedHashes,
chainId: toJson(this.chainId), chainId: toJson(this.chainId),
data, from, data, from,
gasLimit: toJson(this.gasLimit), gasLimit: toJson(this.gasLimit),
@ -1318,6 +1362,7 @@ export class TransactionResponse implements TransactionLike<string>, Transaction
hash, hash,
maxFeePerGas: toJson(this.maxFeePerGas), maxFeePerGas: toJson(this.maxFeePerGas),
maxPriorityFeePerGas: toJson(this.maxPriorityFeePerGas), maxPriorityFeePerGas: toJson(this.maxPriorityFeePerGas),
maxFeePerBlobGas: toJson(this.maxFeePerBlobGas),
nonce, signature, to, index, type, nonce, signature, to, index, type,
value: toJson(this.value), value: toJson(this.value),
}; };
@ -1599,6 +1644,14 @@ export class TransactionResponse implements TransactionLike<string>, Transaction
return (this.type === 2); return (this.type === 2);
} }
/**
* Returns true if hte transaction is a Cancun (i.e. ``type == 3``)
* transaction. See [[link-eip-4844]].
*/
isCancun(): this is (TransactionResponse & { accessList: AccessList, maxFeePerGas: bigint, maxPriorityFeePerGas: bigint, maxFeePerBlobGas: bigint, blobVersionedHashes: Array<string> }){
return (this.type === 3);
}
/** /**
* Returns a filter which can be used to listen for orphan events * Returns a filter which can be used to listen for orphan events
* that evict this transaction. * that evict this transaction.