@feelyourprotocol/block 8141.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +466 -0
  3. package/dist/cjs/block/block.d.ts +147 -0
  4. package/dist/cjs/block/block.d.ts.map +1 -0
  5. package/dist/cjs/block/block.js +415 -0
  6. package/dist/cjs/block/block.js.map +1 -0
  7. package/dist/cjs/block/constructors.d.ts +77 -0
  8. package/dist/cjs/block/constructors.d.ts.map +1 -0
  9. package/dist/cjs/block/constructors.js +298 -0
  10. package/dist/cjs/block/constructors.js.map +1 -0
  11. package/dist/cjs/block/index.d.ts +3 -0
  12. package/dist/cjs/block/index.d.ts.map +1 -0
  13. package/dist/cjs/block/index.js +19 -0
  14. package/dist/cjs/block/index.js.map +1 -0
  15. package/dist/cjs/consensus/clique.d.ts +52 -0
  16. package/dist/cjs/consensus/clique.d.ts.map +1 -0
  17. package/dist/cjs/consensus/clique.js +144 -0
  18. package/dist/cjs/consensus/clique.js.map +1 -0
  19. package/dist/cjs/consensus/ethash.d.ts +9 -0
  20. package/dist/cjs/consensus/ethash.d.ts.map +1 -0
  21. package/dist/cjs/consensus/ethash.js +13 -0
  22. package/dist/cjs/consensus/ethash.js.map +1 -0
  23. package/dist/cjs/consensus/index.d.ts +3 -0
  24. package/dist/cjs/consensus/index.d.ts.map +1 -0
  25. package/dist/cjs/consensus/index.js +29 -0
  26. package/dist/cjs/consensus/index.js.map +1 -0
  27. package/dist/cjs/from-beacon-payload.d.ts +36 -0
  28. package/dist/cjs/from-beacon-payload.d.ts.map +1 -0
  29. package/dist/cjs/from-beacon-payload.js +48 -0
  30. package/dist/cjs/from-beacon-payload.js.map +1 -0
  31. package/dist/cjs/header/constructors.d.ts +39 -0
  32. package/dist/cjs/header/constructors.d.ts.map +1 -0
  33. package/dist/cjs/header/constructors.js +127 -0
  34. package/dist/cjs/header/constructors.js.map +1 -0
  35. package/dist/cjs/header/header.d.ts +134 -0
  36. package/dist/cjs/header/header.d.ts.map +1 -0
  37. package/dist/cjs/header/header.js +699 -0
  38. package/dist/cjs/header/header.js.map +1 -0
  39. package/dist/cjs/header/index.d.ts +3 -0
  40. package/dist/cjs/header/index.d.ts.map +1 -0
  41. package/dist/cjs/header/index.js +19 -0
  42. package/dist/cjs/header/index.js.map +1 -0
  43. package/dist/cjs/helpers.d.ts +59 -0
  44. package/dist/cjs/helpers.d.ts.map +1 -0
  45. package/dist/cjs/helpers.js +172 -0
  46. package/dist/cjs/helpers.js.map +1 -0
  47. package/dist/cjs/index.d.ts +8 -0
  48. package/dist/cjs/index.d.ts.map +1 -0
  49. package/dist/cjs/index.js +31 -0
  50. package/dist/cjs/index.js.map +1 -0
  51. package/dist/cjs/package.json +3 -0
  52. package/dist/cjs/params.d.ts +3 -0
  53. package/dist/cjs/params.d.ts.map +1 -0
  54. package/dist/cjs/params.js +97 -0
  55. package/dist/cjs/params.js.map +1 -0
  56. package/dist/cjs/types.d.ts +228 -0
  57. package/dist/cjs/types.d.ts.map +1 -0
  58. package/dist/cjs/types.js +3 -0
  59. package/dist/cjs/types.js.map +1 -0
  60. package/dist/esm/block/block.d.ts +147 -0
  61. package/dist/esm/block/block.d.ts.map +1 -0
  62. package/dist/esm/block/block.js +411 -0
  63. package/dist/esm/block/block.js.map +1 -0
  64. package/dist/esm/block/constructors.d.ts +77 -0
  65. package/dist/esm/block/constructors.d.ts.map +1 -0
  66. package/dist/esm/block/constructors.js +286 -0
  67. package/dist/esm/block/constructors.js.map +1 -0
  68. package/dist/esm/block/index.d.ts +3 -0
  69. package/dist/esm/block/index.d.ts.map +1 -0
  70. package/dist/esm/block/index.js +3 -0
  71. package/dist/esm/block/index.js.map +1 -0
  72. package/dist/esm/consensus/clique.d.ts +52 -0
  73. package/dist/esm/consensus/clique.d.ts.map +1 -0
  74. package/dist/esm/consensus/clique.js +132 -0
  75. package/dist/esm/consensus/clique.js.map +1 -0
  76. package/dist/esm/consensus/ethash.d.ts +9 -0
  77. package/dist/esm/consensus/ethash.d.ts.map +1 -0
  78. package/dist/esm/consensus/ethash.js +10 -0
  79. package/dist/esm/consensus/ethash.js.map +1 -0
  80. package/dist/esm/consensus/index.d.ts +3 -0
  81. package/dist/esm/consensus/index.d.ts.map +1 -0
  82. package/dist/esm/consensus/index.js +3 -0
  83. package/dist/esm/consensus/index.js.map +1 -0
  84. package/dist/esm/from-beacon-payload.d.ts +36 -0
  85. package/dist/esm/from-beacon-payload.d.ts.map +1 -0
  86. package/dist/esm/from-beacon-payload.js +45 -0
  87. package/dist/esm/from-beacon-payload.js.map +1 -0
  88. package/dist/esm/header/constructors.d.ts +39 -0
  89. package/dist/esm/header/constructors.d.ts.map +1 -0
  90. package/dist/esm/header/constructors.js +120 -0
  91. package/dist/esm/header/constructors.js.map +1 -0
  92. package/dist/esm/header/header.d.ts +134 -0
  93. package/dist/esm/header/header.d.ts.map +1 -0
  94. package/dist/esm/header/header.js +695 -0
  95. package/dist/esm/header/header.js.map +1 -0
  96. package/dist/esm/header/index.d.ts +3 -0
  97. package/dist/esm/header/index.d.ts.map +1 -0
  98. package/dist/esm/header/index.js +3 -0
  99. package/dist/esm/header/index.js.map +1 -0
  100. package/dist/esm/helpers.d.ts +59 -0
  101. package/dist/esm/helpers.d.ts.map +1 -0
  102. package/dist/esm/helpers.js +161 -0
  103. package/dist/esm/helpers.js.map +1 -0
  104. package/dist/esm/index.d.ts +8 -0
  105. package/dist/esm/index.d.ts.map +1 -0
  106. package/dist/esm/index.js +8 -0
  107. package/dist/esm/index.js.map +1 -0
  108. package/dist/esm/package.json +3 -0
  109. package/dist/esm/params.d.ts +3 -0
  110. package/dist/esm/params.d.ts.map +1 -0
  111. package/dist/esm/params.js +94 -0
  112. package/dist/esm/params.js.map +1 -0
  113. package/dist/esm/types.d.ts +228 -0
  114. package/dist/esm/types.d.ts.map +1 -0
  115. package/dist/esm/types.js +2 -0
  116. package/dist/esm/types.js.map +1 -0
  117. package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
  118. package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
  119. package/package.json +75 -0
  120. package/src/block/block.ts +526 -0
  121. package/src/block/constructors.ts +407 -0
  122. package/src/block/index.ts +2 -0
  123. package/src/consensus/clique.ts +171 -0
  124. package/src/consensus/ethash.ts +11 -0
  125. package/src/consensus/index.ts +12 -0
  126. package/src/from-beacon-payload.ts +82 -0
  127. package/src/header/constructors.ts +169 -0
  128. package/src/header/header.ts +890 -0
  129. package/src/header/index.ts +2 -0
  130. package/src/helpers.ts +223 -0
  131. package/src/index.ts +13 -0
  132. package/src/params.ts +95 -0
  133. package/src/types.ts +254 -0
@@ -0,0 +1,286 @@
1
+ import { MerklePatriciaTrie } from '@feelyourprotocol/mpt';
2
+ import { RLP } from '@feelyourprotocol/rlp';
3
+ import { createTx, createTxFromBlockBodyData, createTxFromRLP, normalizeTxParams, } from '@feelyourprotocol/tx';
4
+ import { EthereumJSErrorWithoutCode, bigIntToHex, bytesToHex, createWithdrawal, equalsBytes, fetchFromProvider, getProvider, hexToBytes, intToHex, isHexString, } from '@feelyourprotocol/util';
5
+ import { generateCliqueBlockExtraData } from "../consensus/clique.js";
6
+ import { genTransactionsTrieRoot, genWithdrawalsTrieRoot } from "../helpers.js";
7
+ import { Block, createBlockHeader, createBlockHeaderFromBytesArray, createBlockHeaderFromRPC, executionPayloadFromBeaconPayload, } from "../index.js";
8
+ /**
9
+ * Static constructor to create a block from a block data dictionary
10
+ *
11
+ * @param blockData
12
+ * @param opts
13
+ * @returns a new {@link Block} object
14
+ */
15
+ export function createBlock(blockData = {}, opts) {
16
+ const { header: headerData, transactions: txsData, uncleHeaders: uhsData, withdrawals: withdrawalsData, } = blockData;
17
+ const header = createBlockHeader(headerData, opts);
18
+ // parse transactions
19
+ const transactions = [];
20
+ for (const txData of txsData ?? []) {
21
+ const tx = createTx(txData, {
22
+ ...opts,
23
+ // Use header common in case of setHardfork being activated
24
+ common: header.common,
25
+ });
26
+ transactions.push(tx);
27
+ }
28
+ // parse uncle headers
29
+ const uncleHeaders = [];
30
+ const uncleOpts = {
31
+ ...opts,
32
+ // Use header common in case of setHardfork being activated
33
+ common: header.common,
34
+ // Disable this option here (all other options carried over), since this overwrites the provided Difficulty to an incorrect value
35
+ calcDifficultyFromHeader: undefined,
36
+ };
37
+ // Uncles are obsolete post-merge, any hardfork by option implies setHardfork
38
+ if (opts?.setHardfork !== undefined) {
39
+ uncleOpts.setHardfork = true;
40
+ }
41
+ for (const uhData of uhsData ?? []) {
42
+ const uh = createBlockHeader(uhData, uncleOpts);
43
+ uncleHeaders.push(uh);
44
+ }
45
+ const withdrawals = withdrawalsData?.map(createWithdrawal);
46
+ return new Block(header, transactions, uncleHeaders, withdrawals, opts);
47
+ }
48
+ /**
49
+ * Simple static constructor if only an empty block is needed
50
+ * (tree shaking advantages since it does not draw all the tx constructors in)
51
+ *
52
+ * @param headerData
53
+ * @param opts
54
+ * @returns a new {@link Block} object
55
+ */
56
+ export function createEmptyBlock(headerData, opts) {
57
+ const header = createBlockHeader(headerData, opts);
58
+ return new Block(header);
59
+ }
60
+ /**
61
+ * Static constructor to create a block from an array of Bytes values
62
+ *
63
+ * @param values
64
+ * @param opts
65
+ * @returns a new {@link Block} object
66
+ */
67
+ export function createBlockFromBytesArray(values, opts) {
68
+ if (values.length > 5) {
69
+ throw EthereumJSErrorWithoutCode(`invalid More values=${values.length} than expected were received (at most 5)`);
70
+ }
71
+ // First try to load header so that we can use its common (in case of setHardfork being activated)
72
+ // to correctly make checks on the hardforks
73
+ const [headerData, txsData, uhsData, ...valuesTail] = values;
74
+ const header = createBlockHeaderFromBytesArray(headerData, opts);
75
+ // conditional assignment of rest of values and splicing them out from the valuesTail
76
+ const withdrawalBytes = header.common.isActivatedEIP(4895)
77
+ ? valuesTail.splice(0, 1)[0]
78
+ : undefined;
79
+ if (header.common.isActivatedEIP(4895) &&
80
+ (withdrawalBytes === undefined || !Array.isArray(withdrawalBytes))) {
81
+ throw EthereumJSErrorWithoutCode('Invalid serialized block input: EIP-4895 is active, and no withdrawals were provided as array');
82
+ }
83
+ // parse transactions
84
+ const transactions = [];
85
+ for (const txData of txsData ?? []) {
86
+ transactions.push(createTxFromBlockBodyData(txData, {
87
+ ...opts,
88
+ // Use header common in case of setHardfork being activated
89
+ common: header.common,
90
+ }));
91
+ }
92
+ // parse uncle headers
93
+ const uncleHeaders = [];
94
+ const uncleOpts = {
95
+ ...opts,
96
+ // Use header common in case of setHardfork being activated
97
+ common: header.common,
98
+ // Disable this option here (all other options carried over), since this overwrites the provided Difficulty to an incorrect value
99
+ calcDifficultyFromHeader: undefined,
100
+ };
101
+ // Uncles are obsolete post-merge, any hardfork by option implies setHardfork
102
+ if (opts?.setHardfork !== undefined) {
103
+ uncleOpts.setHardfork = true;
104
+ }
105
+ for (const uncleHeaderData of uhsData ?? []) {
106
+ uncleHeaders.push(createBlockHeaderFromBytesArray(uncleHeaderData, uncleOpts));
107
+ }
108
+ const withdrawals = withdrawalBytes
109
+ ?.map(([index, validatorIndex, address, amount]) => ({
110
+ index,
111
+ validatorIndex,
112
+ address,
113
+ amount,
114
+ }))
115
+ ?.map(createWithdrawal);
116
+ return new Block(header, transactions, uncleHeaders, withdrawals, opts);
117
+ }
118
+ /**
119
+ * Static constructor to create a block from a RLP-serialized block
120
+ *
121
+ * @param serialized
122
+ * @param opts
123
+ * @returns a new {@link Block} object
124
+ */
125
+ export function createBlockFromRLP(serialized, opts) {
126
+ if (opts?.common?.isActivatedEIP(7934) === true) {
127
+ const maxRlpBlockSize = opts.common.param('maxRlpBlockSize');
128
+ if (serialized.length > maxRlpBlockSize) {
129
+ throw EthereumJSErrorWithoutCode(`Block size exceeds limit: ${serialized.length} > ${maxRlpBlockSize}`);
130
+ }
131
+ }
132
+ const values = RLP.decode(Uint8Array.from(serialized));
133
+ if (!Array.isArray(values)) {
134
+ throw EthereumJSErrorWithoutCode('Invalid serialized block input. Must be array');
135
+ }
136
+ return createBlockFromBytesArray(values, opts);
137
+ }
138
+ /**
139
+ * Creates a new block object from Ethereum JSON RPC.
140
+ *
141
+ * @param blockParams - Ethereum JSON RPC of block (eth_getBlockByNumber)
142
+ * @param uncles - Optional list of Ethereum JSON RPC of uncles (eth_getUncleByBlockHashAndIndex)
143
+ * @param opts - An object describing the blockchain
144
+ * @returns a new {@link Block} object
145
+ */
146
+ export function createBlockFromRPC(blockParams, uncles = [], options) {
147
+ const header = createBlockHeaderFromRPC(blockParams, options);
148
+ const transactions = [];
149
+ const opts = { common: header.common };
150
+ for (const _txParams of blockParams.transactions ?? []) {
151
+ const txParams = normalizeTxParams(_txParams);
152
+ const tx = createTx(txParams, opts);
153
+ transactions.push(tx);
154
+ }
155
+ const uncleHeaders = uncles.map((uh) => createBlockHeaderFromRPC(uh, options));
156
+ return createBlock({ header, transactions, uncleHeaders, withdrawals: blockParams.withdrawals }, options);
157
+ }
158
+ /**
159
+ * Method to retrieve a block from a JSON-RPC provider and format as a {@link Block}
160
+ * @param provider either a url for a remote provider or an Ethers JSONRPCProvider object
161
+ * @param blockTag block hash or block number to be run
162
+ * @param opts {@link BlockOptions}
163
+ * @returns a new {@link Block} object specified by `blockTag`
164
+ */
165
+ export const createBlockFromJSONRPCProvider = async (provider, blockTag, opts) => {
166
+ let blockData;
167
+ const providerUrl = getProvider(provider);
168
+ if (typeof blockTag === 'string' && blockTag.length === 66) {
169
+ blockData = await fetchFromProvider(providerUrl, {
170
+ method: 'eth_getBlockByHash',
171
+ params: [blockTag, true],
172
+ });
173
+ }
174
+ else if (typeof blockTag === 'bigint') {
175
+ blockData = await fetchFromProvider(providerUrl, {
176
+ method: 'eth_getBlockByNumber',
177
+ params: [bigIntToHex(blockTag), true],
178
+ });
179
+ }
180
+ else if (isHexString(blockTag) ||
181
+ blockTag === 'latest' ||
182
+ blockTag === 'earliest' ||
183
+ blockTag === 'pending' ||
184
+ blockTag === 'finalized' ||
185
+ blockTag === 'safe') {
186
+ blockData = await fetchFromProvider(providerUrl, {
187
+ method: 'eth_getBlockByNumber',
188
+ params: [blockTag, true],
189
+ });
190
+ }
191
+ else {
192
+ throw EthereumJSErrorWithoutCode(`expected blockTag to be block hash, bigint, hex prefixed string, or earliest/latest/pending; got ${blockTag}`);
193
+ }
194
+ if (blockData === null) {
195
+ throw EthereumJSErrorWithoutCode('No block data returned from provider');
196
+ }
197
+ const uncleHeaders = [];
198
+ if (blockData.uncles.length > 0) {
199
+ for (let x = 0; x < blockData.uncles.length; x++) {
200
+ const headerData = await fetchFromProvider(providerUrl, {
201
+ method: 'eth_getUncleByBlockHashAndIndex',
202
+ params: [blockData.hash, intToHex(x)],
203
+ });
204
+ uncleHeaders.push(headerData);
205
+ }
206
+ }
207
+ return createBlockFromRPC(blockData, uncleHeaders, opts);
208
+ };
209
+ /**
210
+ * Method to retrieve a block from an execution payload
211
+ * @param payload Execution payload constructed from beacon payload data
212
+ * @param opts {@link BlockOptions}
213
+ * @returns The constructed {@link Block} object
214
+ */
215
+ export async function createBlockFromExecutionPayload(payload, opts) {
216
+ const { blockNumber: number, receiptsRoot: receiptTrie, prevRandao: mixHash, feeRecipient: coinbase, transactions, withdrawals: withdrawalsData, } = payload;
217
+ const txs = [];
218
+ for (const [index, serializedTx] of transactions.entries()) {
219
+ try {
220
+ const tx = createTxFromRLP(hexToBytes(serializedTx), {
221
+ common: opts?.common,
222
+ });
223
+ txs.push(tx);
224
+ }
225
+ catch (error) {
226
+ const validationError = `Invalid tx at index ${index}: ${error}`;
227
+ throw validationError;
228
+ }
229
+ }
230
+ const transactionsTrie = await genTransactionsTrieRoot(txs, new MerklePatriciaTrie({ common: opts?.common }));
231
+ const withdrawals = withdrawalsData?.map((wData) => createWithdrawal(wData));
232
+ const withdrawalsRoot = withdrawals
233
+ ? await genWithdrawalsTrieRoot(withdrawals, new MerklePatriciaTrie({ common: opts?.common }))
234
+ : undefined;
235
+ const header = {
236
+ ...payload,
237
+ number,
238
+ receiptTrie,
239
+ transactionsTrie,
240
+ withdrawalsRoot,
241
+ mixHash,
242
+ coinbase,
243
+ };
244
+ // we are not setting setHardfork as common is already set to the correct hf
245
+ const block = createBlock({ header, transactions: txs, withdrawals }, opts);
246
+ // Verify blockHash matches payload
247
+ if (!equalsBytes(block.hash(), hexToBytes(payload.blockHash))) {
248
+ const validationError = `Invalid blockHash, expected: ${payload.blockHash}, received: ${bytesToHex(block.hash())}`;
249
+ throw Error(validationError);
250
+ }
251
+ return block;
252
+ }
253
+ /**
254
+ * Method to retrieve a block from a beacon payload JSON
255
+ * @param payload JSON of a beacon block fetched from beacon APIs
256
+ * @param opts {@link BlockOptions}
257
+ * @returns The constructed {@link Block} object
258
+ */
259
+ export async function createBlockFromBeaconPayloadJSON(payload, opts) {
260
+ const executionPayload = executionPayloadFromBeaconPayload(payload);
261
+ return createBlockFromExecutionPayload(executionPayload, opts);
262
+ }
263
+ /**
264
+ * Creates a block for Clique networks with the seal applied during instantiation.
265
+ * @param blockData Block fields used to build the block
266
+ * @param cliqueSigner Private key bytes used to sign the header
267
+ * @param opts {@link BlockOptions}
268
+ * @returns A sealed Clique {@link Block} object
269
+ */
270
+ export function createSealedCliqueBlock(blockData = {}, cliqueSigner, opts = {}) {
271
+ const sealedCliqueBlock = createBlock(blockData, {
272
+ ...opts,
273
+ ...{ freeze: false, skipConsensusFormatValidation: true },
274
+ });
275
+ sealedCliqueBlock.header.extraData = generateCliqueBlockExtraData(sealedCliqueBlock.header, cliqueSigner);
276
+ if (opts?.freeze === true) {
277
+ // We have to freeze here since we can't freeze the block when constructing it since we are overwriting `extraData`
278
+ Object.freeze(sealedCliqueBlock);
279
+ }
280
+ if (opts?.skipConsensusFormatValidation === false) {
281
+ // We need to validate the consensus format here since we skipped it when constructing the block
282
+ sealedCliqueBlock.header['_consensusFormatValidation']();
283
+ }
284
+ return sealedCliqueBlock;
285
+ }
286
+ //# sourceMappingURL=constructors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructors.js","sourceRoot":"","sources":["../../../src/block/constructors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAErC,OAAO,EACL,QAAQ,EACR,yBAAyB,EACzB,eAAe,EACf,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,0BAA0B,EAC1B,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,WAAW,GACZ,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC/E,OAAO,EACL,KAAK,EACL,iBAAiB,EACjB,+BAA+B,EAC/B,wBAAwB,EACxB,iCAAiC,GAClC,MAAM,aAAa,CAAA;AAcpB;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,YAAuB,EAAE,EAAE,IAAmB;IACxE,MAAM,EACJ,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,OAAO,EACrB,WAAW,EAAE,eAAe,GAC7B,GAAG,SAAS,CAAA;IAEb,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAElD,qBAAqB;IACrB,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,KAAK,MAAM,MAAM,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE;YAC1B,GAAG,IAAI;YACP,2DAA2D;YAC3D,MAAM,EAAE,MAAM,CAAC,MAAM;SACT,CAAC,CAAA;QACf,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,MAAM,SAAS,GAAiB;QAC9B,GAAG,IAAI;QACP,2DAA2D;QAC3D,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,iIAAiI;QACjI,wBAAwB,EAAE,SAAS;KACpC,CAAA;IACD,6EAA6E;IAC7E,IAAI,IAAI,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAA;IAC9B,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAC/C,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAE1D,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;AACzE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAsB,EAAE,IAAmB;IAC1E,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAClD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAkB,EAAE,IAAmB;IAC/E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,0BAA0B,CAC9B,wBAAwB,MAAM,CAAC,MAAM,0CAA0C,CAChF,CAAA;IACH,CAAC;IAED,kGAAkG;IAClG,4CAA4C;IAC5C,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,MAAM,CAAA;IAC5D,MAAM,MAAM,GAAG,+BAA+B,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAEhE,qFAAqF;IACrF,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC;QACxD,CAAC,CAAE,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAsB;QAClD,CAAC,CAAC,SAAS,CAAA;IAEb,IACE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC;QAClC,CAAC,eAAe,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAClE,CAAC;QACD,MAAM,0BAA0B,CAC9B,+FAA+F,CAChG,CAAA;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,KAAK,MAAM,MAAM,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QACnC,YAAY,CAAC,IAAI,CACf,yBAAyB,CAAC,MAAM,EAAE;YAChC,GAAG,IAAI;YACP,2DAA2D;YAC3D,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CACH,CAAA;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,MAAM,SAAS,GAAiB;QAC9B,GAAG,IAAI;QACP,2DAA2D;QAC3D,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,iIAAiI;QACjI,wBAAwB,EAAE,SAAS;KACpC,CAAA;IACD,6EAA6E;IAC7E,IAAI,IAAI,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAA;IAC9B,CAAC;IACD,KAAK,MAAM,eAAe,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAC5C,YAAY,CAAC,IAAI,CAAC,+BAA+B,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAA;IAChF,CAAC;IAED,MAAM,WAAW,GAAI,eAAqC;QACxD,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,KAAK;QACL,cAAc;QACd,OAAO;QACP,MAAM;KACP,CAAC,CAAC;QACH,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAEzB,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAsB,EAAE,IAAmB;IAC5E,IAAI,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAC5D,IAAI,UAAU,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,0BAA0B,CAC9B,6BAA6B,UAAU,CAAC,MAAM,MAAM,eAAe,EAAE,CACtE,CAAA;QACH,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAe,CAAA;IAEpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,0BAA0B,CAAC,+CAA+C,CAAC,CAAA;IACnF,CAAC;IAED,OAAO,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAyB,EACzB,SAAgB,EAAE,EAClB,OAAsB;IAEtB,MAAM,MAAM,GAAG,wBAAwB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAE7D,MAAM,YAAY,GAAuB,EAAE,CAAA;IAC3C,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;IACtC,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACnC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;IAE9E,OAAO,WAAW,CAChB,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,EAC5E,OAAO,CACR,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EACjD,QAAiC,EACjC,QAAyB,EACzB,IAAkB,EACF,EAAE;IAClB,IAAI,SAAS,CAAA;IACb,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA;IAEzC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC3D,SAAS,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE;YAC/C,MAAM,EAAE,oBAAoB;YAC5B,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;SACzB,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxC,SAAS,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE;YAC/C,MAAM,EAAE,sBAAsB;YAC9B,MAAM,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;SACtC,CAAC,CAAA;IACJ,CAAC;SAAM,IACL,WAAW,CAAC,QAAQ,CAAC;QACrB,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,UAAU;QACvB,QAAQ,KAAK,SAAS;QACtB,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,MAAM,EACnB,CAAC;QACD,SAAS,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE;YAC/C,MAAM,EAAE,sBAAsB;YAC9B,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;SACzB,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,0BAA0B,CAC9B,oGAAoG,QAAQ,EAAE,CAC/G,CAAA;IACH,CAAC;IAED,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,0BAA0B,CAAC,sCAAsC,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE;gBACtD,MAAM,EAAE,iCAAiC;gBACzC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;aACtC,CAAC,CAAA;YACF,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;AAC1D,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,OAAyB,EACzB,IAAmB;IAEnB,MAAM,EACJ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,WAAW,EACzB,UAAU,EAAE,OAAO,EACnB,YAAY,EAAE,QAAQ,EACtB,YAAY,EACZ,WAAW,EAAE,eAAe,GAC7B,GAAG,OAAO,CAAA;IAEX,MAAM,GAAG,GAAG,EAAE,CAAA;IACd,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;gBACnD,MAAM,EAAE,IAAI,EAAE,MAAM;aACrB,CAAC,CAAA;YACF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,eAAe,GAAG,uBAAuB,KAAK,KAAK,KAAK,EAAE,CAAA;YAChE,MAAM,eAAe,CAAA;QACvB,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,uBAAuB,CACpD,GAAG,EACH,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CACjD,CAAA;IACD,MAAM,WAAW,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;IAC5E,MAAM,eAAe,GAAG,WAAW;QACjC,CAAC,CAAC,MAAM,sBAAsB,CAAC,WAAW,EAAE,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7F,CAAC,CAAC,SAAS,CAAA;IAEb,MAAM,MAAM,GAAe;QACzB,GAAG,OAAO;QACV,MAAM;QACN,WAAW;QACX,gBAAgB;QAChB,eAAe;QACf,OAAO;QACP,QAAQ;KACT,CAAA;IAED,4EAA4E;IAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,IAAI,CAAC,CAAA;IAC3E,mCAAmC;IACnC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,eAAe,GAAG,gCACtB,OAAO,CAAC,SACV,eAAe,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAA;QACzC,MAAM,KAAK,CAAC,eAAe,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,OAA0B,EAC1B,IAAmB;IAEnB,MAAM,gBAAgB,GAAG,iCAAiC,CAAC,OAAO,CAAC,CAAA;IACnE,OAAO,+BAA+B,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;AAChE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAuB,EAAE,EACzB,YAAwB,EACxB,OAAqB,EAAE;IAEvB,MAAM,iBAAiB,GAAG,WAAW,CAAC,SAAS,EAAE;QAC/C,GAAG,IAAI;QACP,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE;KAC1D,CAAC,CACD;IAAC,iBAAiB,CAAC,MAAM,CAAC,SAAiB,GAAG,4BAA4B,CACzE,iBAAiB,CAAC,MAAM,EACxB,YAAY,CACb,CAAA;IACD,IAAI,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;QAC1B,mHAAmH;QACnH,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAClC,CAAC;IACD,IAAI,IAAI,EAAE,6BAA6B,KAAK,KAAK,EAAE,CAAC;QAClD,gGAAgG;QAChG,iBAAiB,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAAE,CAAA;IAC1D,CAAC;IACD,OAAO,iBAAiB,CAAA;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './block.ts';
2
+ export * from './constructors.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from "./block.js";
2
+ export * from "./constructors.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,52 @@
1
+ import { Address } from '@feelyourprotocol/util';
2
+ import type { BlockHeader } from '../index.ts';
3
+ export declare const CLIQUE_EXTRA_VANITY = 32;
4
+ export declare const CLIQUE_EXTRA_SEAL = 65;
5
+ export declare function requireClique(header: BlockHeader, name: string): void;
6
+ /**
7
+ * PoA clique signature hash without the seal.
8
+ */
9
+ export declare function cliqueSigHash(header: BlockHeader): Uint8Array<ArrayBufferLike>;
10
+ /**
11
+ * Checks if the block header is an epoch transition
12
+ * header (only clique PoA, throws otherwise)
13
+ */
14
+ export declare function cliqueIsEpochTransition(header: BlockHeader): boolean;
15
+ /**
16
+ * Returns extra vanity data
17
+ * (only clique PoA, throws otherwise)
18
+ */
19
+ export declare function cliqueExtraVanity(header: BlockHeader): Uint8Array;
20
+ /**
21
+ * Returns extra seal data
22
+ * (only clique PoA, throws otherwise)
23
+ */
24
+ export declare function cliqueExtraSeal(header: BlockHeader): Uint8Array;
25
+ /**
26
+ * Returns a list of signers
27
+ * (only clique PoA, throws otherwise)
28
+ *
29
+ * This function throws if not called on an epoch
30
+ * transition block and should therefore be used
31
+ * in conjunction with {@link cliqueIsEpochTransition}
32
+ */
33
+ export declare function cliqueEpochTransitionSigners(header: BlockHeader): Address[];
34
+ /**
35
+ * Returns the signer address
36
+ */
37
+ export declare function cliqueSigner(header: BlockHeader): Address;
38
+ /**
39
+ * Verifies the signature of the block (last 65 bytes of extraData field)
40
+ * (only clique PoA, throws otherwise)
41
+ *
42
+ * Method throws if signature is invalid
43
+ */
44
+ export declare function cliqueVerifySignature(header: BlockHeader, signerList: Address[]): boolean;
45
+ /**
46
+ * Generates the extraData from a sealed block header
47
+ * @param header block header from which to retrieve extraData
48
+ * @param cliqueSigner clique signer key used for creating sealed block
49
+ * @returns clique seal (i.e. extradata) for the block
50
+ */
51
+ export declare function generateCliqueBlockExtraData(header: BlockHeader, cliqueSigner: Uint8Array): Uint8Array;
52
+ //# sourceMappingURL=clique.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clique.d.ts","sourceRoot":"","sources":["../../../src/consensus/clique.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,OAAO,EAUR,MAAM,kBAAkB,CAAA;AAIzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAGnC,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,QAO9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,+BAKhD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAMpE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CAGjE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CAG/D;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,EAAE,CAiB3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAYzD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAOzF;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,UAAU,GACvB,UAAU,CA4BZ"}
@@ -0,0 +1,132 @@
1
+ import { ConsensusAlgorithm } from '@feelyourprotocol/common';
2
+ import { RLP } from '@feelyourprotocol/rlp';
3
+ import { Address, BIGINT_0, BIGINT_27, EthereumJSErrorWithoutCode, bytesToBigInt, concatBytes, createAddressFromPublicKey, createZeroAddress, ecrecover, equalsBytes, } from '@feelyourprotocol/util';
4
+ import { secp256k1 } from '@noble/curves/secp256k1.js';
5
+ // Fixed number of extra-data prefix bytes reserved for signer vanity
6
+ export const CLIQUE_EXTRA_VANITY = 32;
7
+ // Fixed number of extra-data suffix bytes reserved for signer seal
8
+ export const CLIQUE_EXTRA_SEAL = 65;
9
+ // This function is not exported in the index file to keep it internal
10
+ export function requireClique(header, name) {
11
+ if (header.common.consensusAlgorithm() !== ConsensusAlgorithm.Clique) {
12
+ const msg = header['_errorMsg'](`BlockHeader.${name}() call only supported for clique PoA networks`);
13
+ throw EthereumJSErrorWithoutCode(msg);
14
+ }
15
+ }
16
+ /**
17
+ * PoA clique signature hash without the seal.
18
+ */
19
+ export function cliqueSigHash(header) {
20
+ requireClique(header, 'cliqueSigHash');
21
+ const raw = header.raw();
22
+ raw[12] = header.extraData.subarray(0, header.extraData.length - CLIQUE_EXTRA_SEAL);
23
+ return header['keccakFunction'](RLP.encode(raw));
24
+ }
25
+ /**
26
+ * Checks if the block header is an epoch transition
27
+ * header (only clique PoA, throws otherwise)
28
+ */
29
+ export function cliqueIsEpochTransition(header) {
30
+ requireClique(header, 'cliqueIsEpochTransition');
31
+ const epoch = BigInt(header.common.consensusConfig().epoch);
32
+ // Epoch transition block if the block number has no
33
+ // remainder on the division by the epoch length
34
+ return header.number % epoch === BIGINT_0;
35
+ }
36
+ /**
37
+ * Returns extra vanity data
38
+ * (only clique PoA, throws otherwise)
39
+ */
40
+ export function cliqueExtraVanity(header) {
41
+ requireClique(header, 'cliqueExtraVanity');
42
+ return header.extraData.subarray(0, CLIQUE_EXTRA_VANITY);
43
+ }
44
+ /**
45
+ * Returns extra seal data
46
+ * (only clique PoA, throws otherwise)
47
+ */
48
+ export function cliqueExtraSeal(header) {
49
+ requireClique(header, 'cliqueExtraSeal');
50
+ return header.extraData.subarray(-CLIQUE_EXTRA_SEAL);
51
+ }
52
+ /**
53
+ * Returns a list of signers
54
+ * (only clique PoA, throws otherwise)
55
+ *
56
+ * This function throws if not called on an epoch
57
+ * transition block and should therefore be used
58
+ * in conjunction with {@link cliqueIsEpochTransition}
59
+ */
60
+ export function cliqueEpochTransitionSigners(header) {
61
+ requireClique(header, 'cliqueEpochTransitionSigners');
62
+ if (!cliqueIsEpochTransition(header)) {
63
+ const msg = header['_errorMsg']('Signers are only included in epoch transition blocks (clique)');
64
+ throw EthereumJSErrorWithoutCode(msg);
65
+ }
66
+ const start = CLIQUE_EXTRA_VANITY;
67
+ const end = header.extraData.length - CLIQUE_EXTRA_SEAL;
68
+ const signerBytes = header.extraData.subarray(start, end);
69
+ const signerList = [];
70
+ const signerLength = 20;
71
+ for (let start = 0; start <= signerBytes.length - signerLength; start += signerLength) {
72
+ signerList.push(signerBytes.subarray(start, start + signerLength));
73
+ }
74
+ return signerList.map((buf) => new Address(buf));
75
+ }
76
+ /**
77
+ * Returns the signer address
78
+ */
79
+ export function cliqueSigner(header) {
80
+ requireClique(header, 'cliqueSigner');
81
+ const extraSeal = cliqueExtraSeal(header);
82
+ // Reasonable default for default blocks
83
+ if (extraSeal.length === 0 || equalsBytes(extraSeal, new Uint8Array(65))) {
84
+ return createZeroAddress();
85
+ }
86
+ const r = extraSeal.subarray(0, 32);
87
+ const s = extraSeal.subarray(32, 64);
88
+ const v = bytesToBigInt(extraSeal.subarray(64, 65)) + BIGINT_27;
89
+ const pubKey = ecrecover(cliqueSigHash(header), v, r, s);
90
+ return createAddressFromPublicKey(pubKey);
91
+ }
92
+ /**
93
+ * Verifies the signature of the block (last 65 bytes of extraData field)
94
+ * (only clique PoA, throws otherwise)
95
+ *
96
+ * Method throws if signature is invalid
97
+ */
98
+ export function cliqueVerifySignature(header, signerList) {
99
+ requireClique(header, 'cliqueVerifySignature');
100
+ const signerAddress = cliqueSigner(header);
101
+ const signerFound = signerList.find((signer) => {
102
+ return signer.equals(signerAddress);
103
+ });
104
+ return !!signerFound;
105
+ }
106
+ /**
107
+ * Generates the extraData from a sealed block header
108
+ * @param header block header from which to retrieve extraData
109
+ * @param cliqueSigner clique signer key used for creating sealed block
110
+ * @returns clique seal (i.e. extradata) for the block
111
+ */
112
+ export function generateCliqueBlockExtraData(header, cliqueSigner) {
113
+ // Ensure extraData is at least length CLIQUE_EXTRA_VANITY + CLIQUE_EXTRA_SEAL
114
+ const minExtraDataLength = CLIQUE_EXTRA_VANITY + CLIQUE_EXTRA_SEAL;
115
+ if (header.extraData.length < minExtraDataLength) {
116
+ const remainingLength = minExtraDataLength - header.extraData.length;
117
+ header.extraData = concatBytes(header.extraData, new Uint8Array(remainingLength));
118
+ }
119
+ requireClique(header, 'generateCliqueBlockExtraData');
120
+ const msgHash = cliqueSigHash(header);
121
+ // Use custom ecsign if provided, otherwise use secp256k1.sign
122
+ const ecSignFunction = header.common.customCrypto?.ecsign ?? secp256k1.sign;
123
+ // Use noble/curves secp256k1.sign with recovered format (returns 65-byte Uint8Array)
124
+ // sigBytes format: [recovery (1 byte) | r (32 bytes) | s (32 bytes)]
125
+ const sigBytes = ecSignFunction(msgHash, cliqueSigner, { prehash: false, format: 'recovered' });
126
+ // clique format: [r (32 bytes) | s (32 bytes) | recovery (1 byte)]
127
+ const cliqueSignature = concatBytes(sigBytes.subarray(1), sigBytes.subarray(0, 1));
128
+ const extraDataWithoutSeal = header.extraData.subarray(0, header.extraData.length - CLIQUE_EXTRA_SEAL);
129
+ const extraData = concatBytes(extraDataWithoutSeal, cliqueSignature);
130
+ return extraData;
131
+ }
132
+ //# sourceMappingURL=clique.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clique.js","sourceRoot":"","sources":["../../../src/consensus/clique.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Block } from '../index.ts';
2
+ /**
3
+ * Returns the canonical difficulty for this block.
4
+ *
5
+ * @param block - the block whose difficulty should be calculated
6
+ * @param parentBlock - the parent of this `Block`
7
+ */
8
+ export declare function ethashCanonicalDifficulty(block: Block, parentBlock: Block): bigint;
9
+ //# sourceMappingURL=ethash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethash.d.ts","sourceRoot":"","sources":["../../../src/consensus/ethash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,GAAG,MAAM,CAElF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Returns the canonical difficulty for this block.
3
+ *
4
+ * @param block - the block whose difficulty should be calculated
5
+ * @param parentBlock - the parent of this `Block`
6
+ */
7
+ export function ethashCanonicalDifficulty(block, parentBlock) {
8
+ return block.header.ethashCanonicalDifficulty(parentBlock.header);
9
+ }
10
+ //# sourceMappingURL=ethash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethash.js","sourceRoot":"","sources":["../../../src/consensus/ethash.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAY,EAAE,WAAkB;IACxE,OAAO,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;AACnE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { CLIQUE_EXTRA_SEAL, CLIQUE_EXTRA_VANITY, cliqueEpochTransitionSigners, cliqueExtraSeal, cliqueExtraVanity, cliqueIsEpochTransition, cliqueSigHash, cliqueSigner, cliqueVerifySignature, } from './clique.ts';
2
+ export * from './ethash.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/consensus/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,EAC5B,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,YAAY,EACZ,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,cAAc,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { CLIQUE_EXTRA_SEAL, CLIQUE_EXTRA_VANITY, cliqueEpochTransitionSigners, cliqueExtraSeal, cliqueExtraVanity, cliqueIsEpochTransition, cliqueSigHash, cliqueSigner, cliqueVerifySignature, } from "./clique.js";
2
+ export * from "./ethash.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/consensus/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,EAC5B,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,YAAY,EACZ,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,cAAc,aAAa,CAAA"}
@@ -0,0 +1,36 @@
1
+ import type { NumericString, PrefixedHexString } from '@feelyourprotocol/util';
2
+ import type { ExecutionPayload } from './types.ts';
3
+ type BeaconWithdrawal = {
4
+ index: PrefixedHexString;
5
+ validator_index: PrefixedHexString;
6
+ address: PrefixedHexString;
7
+ amount: PrefixedHexString;
8
+ };
9
+ export type BeaconPayloadJSON = {
10
+ parent_hash: PrefixedHexString;
11
+ fee_recipient: PrefixedHexString;
12
+ state_root: PrefixedHexString;
13
+ receipts_root: PrefixedHexString;
14
+ logs_bloom: PrefixedHexString;
15
+ prev_randao: PrefixedHexString;
16
+ block_number: NumericString;
17
+ gas_limit: NumericString;
18
+ gas_used: NumericString;
19
+ timestamp: NumericString;
20
+ extra_data: PrefixedHexString;
21
+ base_fee_per_gas: NumericString;
22
+ block_hash: PrefixedHexString;
23
+ transactions: PrefixedHexString[];
24
+ withdrawals?: BeaconWithdrawal[];
25
+ blob_gas_used?: NumericString;
26
+ excess_blob_gas?: NumericString;
27
+ parent_beacon_block_root?: PrefixedHexString;
28
+ requests_hash?: PrefixedHexString;
29
+ };
30
+ /**
31
+ * Converts a beacon block execution payload JSON object {@link BeaconPayloadJSON} to the {@link ExecutionPayload} data needed to construct a {@link Block}.
32
+ * The JSON data can be retrieved from a consensus layer (CL) client on this Beacon API `/eth/v2/beacon/blocks/[block number]`
33
+ */
34
+ export declare function executionPayloadFromBeaconPayload(payload: BeaconPayloadJSON): ExecutionPayload;
35
+ export {};
36
+ //# sourceMappingURL=from-beacon-payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-beacon-payload.d.ts","sourceRoot":"","sources":["../../src/from-beacon-payload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,KAAK,gBAAgB,GAAG;IACtB,KAAK,EAAE,iBAAiB,CAAA;IACxB,eAAe,EAAE,iBAAiB,CAAA;IAClC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,MAAM,EAAE,iBAAiB,CAAA;CAC1B,CAAA;AAID,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,iBAAiB,CAAA;IAC9B,aAAa,EAAE,iBAAiB,CAAA;IAChC,UAAU,EAAE,iBAAiB,CAAA;IAC7B,aAAa,EAAE,iBAAiB,CAAA;IAChC,UAAU,EAAE,iBAAiB,CAAA;IAC7B,WAAW,EAAE,iBAAiB,CAAA;IAC9B,YAAY,EAAE,aAAa,CAAA;IAC3B,SAAS,EAAE,aAAa,CAAA;IACxB,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,EAAE,aAAa,CAAA;IACxB,UAAU,EAAE,iBAAiB,CAAA;IAC7B,gBAAgB,EAAE,aAAa,CAAA;IAC/B,UAAU,EAAE,iBAAiB,CAAA;IAC7B,YAAY,EAAE,iBAAiB,EAAE,CAAA;IACjC,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAChC,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,eAAe,CAAC,EAAE,aAAa,CAAA;IAC/B,wBAAwB,CAAC,EAAE,iBAAiB,CAAA;IAC5C,aAAa,CAAC,EAAE,iBAAiB,CAAA;CAClC,CAAA;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAyC9F"}
@@ -0,0 +1,45 @@
1
+ import { bigIntToHex } from '@feelyourprotocol/util';
2
+ /**
3
+ * Converts a beacon block execution payload JSON object {@link BeaconPayloadJSON} to the {@link ExecutionPayload} data needed to construct a {@link Block}.
4
+ * The JSON data can be retrieved from a consensus layer (CL) client on this Beacon API `/eth/v2/beacon/blocks/[block number]`
5
+ */
6
+ export function executionPayloadFromBeaconPayload(payload) {
7
+ const executionPayload = {
8
+ parentHash: payload.parent_hash,
9
+ feeRecipient: payload.fee_recipient,
10
+ stateRoot: payload.state_root,
11
+ receiptsRoot: payload.receipts_root,
12
+ logsBloom: payload.logs_bloom,
13
+ prevRandao: payload.prev_randao,
14
+ blockNumber: bigIntToHex(BigInt(payload.block_number)),
15
+ gasLimit: bigIntToHex(BigInt(payload.gas_limit)),
16
+ gasUsed: bigIntToHex(BigInt(payload.gas_used)),
17
+ timestamp: bigIntToHex(BigInt(payload.timestamp)),
18
+ extraData: payload.extra_data,
19
+ baseFeePerGas: bigIntToHex(BigInt(payload.base_fee_per_gas)),
20
+ blockHash: payload.block_hash,
21
+ transactions: payload.transactions,
22
+ };
23
+ if (payload.withdrawals !== undefined && payload.withdrawals !== null) {
24
+ executionPayload.withdrawals = payload.withdrawals.map((wd) => ({
25
+ index: bigIntToHex(BigInt(wd.index)),
26
+ validatorIndex: bigIntToHex(BigInt(wd.validator_index)),
27
+ address: wd.address,
28
+ amount: bigIntToHex(BigInt(wd.amount)),
29
+ }));
30
+ }
31
+ if (payload.blob_gas_used !== undefined && payload.blob_gas_used !== null) {
32
+ executionPayload.blobGasUsed = bigIntToHex(BigInt(payload.blob_gas_used));
33
+ }
34
+ if (payload.excess_blob_gas !== undefined && payload.excess_blob_gas !== null) {
35
+ executionPayload.excessBlobGas = bigIntToHex(BigInt(payload.excess_blob_gas));
36
+ }
37
+ if (payload.parent_beacon_block_root !== undefined && payload.parent_beacon_block_root !== null) {
38
+ executionPayload.parentBeaconBlockRoot = payload.parent_beacon_block_root;
39
+ }
40
+ if (payload.requests_hash !== undefined && payload.requests_hash !== null) {
41
+ executionPayload.requestsHash = payload.requests_hash;
42
+ }
43
+ return executionPayload;
44
+ }
45
+ //# sourceMappingURL=from-beacon-payload.js.map