@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,298 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBlockFromJSONRPCProvider = void 0;
4
+ exports.createBlock = createBlock;
5
+ exports.createEmptyBlock = createEmptyBlock;
6
+ exports.createBlockFromBytesArray = createBlockFromBytesArray;
7
+ exports.createBlockFromRLP = createBlockFromRLP;
8
+ exports.createBlockFromRPC = createBlockFromRPC;
9
+ exports.createBlockFromExecutionPayload = createBlockFromExecutionPayload;
10
+ exports.createBlockFromBeaconPayloadJSON = createBlockFromBeaconPayloadJSON;
11
+ exports.createSealedCliqueBlock = createSealedCliqueBlock;
12
+ const mpt_1 = require("@feelyourprotocol/mpt");
13
+ const rlp_1 = require("@feelyourprotocol/rlp");
14
+ const tx_1 = require("@feelyourprotocol/tx");
15
+ const util_1 = require("@feelyourprotocol/util");
16
+ const clique_ts_1 = require("../consensus/clique.js");
17
+ const helpers_ts_1 = require("../helpers.js");
18
+ const index_ts_1 = require("../index.js");
19
+ /**
20
+ * Static constructor to create a block from a block data dictionary
21
+ *
22
+ * @param blockData
23
+ * @param opts
24
+ * @returns a new {@link Block} object
25
+ */
26
+ function createBlock(blockData = {}, opts) {
27
+ const { header: headerData, transactions: txsData, uncleHeaders: uhsData, withdrawals: withdrawalsData, } = blockData;
28
+ const header = (0, index_ts_1.createBlockHeader)(headerData, opts);
29
+ // parse transactions
30
+ const transactions = [];
31
+ for (const txData of txsData ?? []) {
32
+ const tx = (0, tx_1.createTx)(txData, {
33
+ ...opts,
34
+ // Use header common in case of setHardfork being activated
35
+ common: header.common,
36
+ });
37
+ transactions.push(tx);
38
+ }
39
+ // parse uncle headers
40
+ const uncleHeaders = [];
41
+ const uncleOpts = {
42
+ ...opts,
43
+ // Use header common in case of setHardfork being activated
44
+ common: header.common,
45
+ // Disable this option here (all other options carried over), since this overwrites the provided Difficulty to an incorrect value
46
+ calcDifficultyFromHeader: undefined,
47
+ };
48
+ // Uncles are obsolete post-merge, any hardfork by option implies setHardfork
49
+ if (opts?.setHardfork !== undefined) {
50
+ uncleOpts.setHardfork = true;
51
+ }
52
+ for (const uhData of uhsData ?? []) {
53
+ const uh = (0, index_ts_1.createBlockHeader)(uhData, uncleOpts);
54
+ uncleHeaders.push(uh);
55
+ }
56
+ const withdrawals = withdrawalsData?.map(util_1.createWithdrawal);
57
+ return new index_ts_1.Block(header, transactions, uncleHeaders, withdrawals, opts);
58
+ }
59
+ /**
60
+ * Simple static constructor if only an empty block is needed
61
+ * (tree shaking advantages since it does not draw all the tx constructors in)
62
+ *
63
+ * @param headerData
64
+ * @param opts
65
+ * @returns a new {@link Block} object
66
+ */
67
+ function createEmptyBlock(headerData, opts) {
68
+ const header = (0, index_ts_1.createBlockHeader)(headerData, opts);
69
+ return new index_ts_1.Block(header);
70
+ }
71
+ /**
72
+ * Static constructor to create a block from an array of Bytes values
73
+ *
74
+ * @param values
75
+ * @param opts
76
+ * @returns a new {@link Block} object
77
+ */
78
+ function createBlockFromBytesArray(values, opts) {
79
+ if (values.length > 5) {
80
+ throw (0, util_1.EthereumJSErrorWithoutCode)(`invalid More values=${values.length} than expected were received (at most 5)`);
81
+ }
82
+ // First try to load header so that we can use its common (in case of setHardfork being activated)
83
+ // to correctly make checks on the hardforks
84
+ const [headerData, txsData, uhsData, ...valuesTail] = values;
85
+ const header = (0, index_ts_1.createBlockHeaderFromBytesArray)(headerData, opts);
86
+ // conditional assignment of rest of values and splicing them out from the valuesTail
87
+ const withdrawalBytes = header.common.isActivatedEIP(4895)
88
+ ? valuesTail.splice(0, 1)[0]
89
+ : undefined;
90
+ if (header.common.isActivatedEIP(4895) &&
91
+ (withdrawalBytes === undefined || !Array.isArray(withdrawalBytes))) {
92
+ throw (0, util_1.EthereumJSErrorWithoutCode)('Invalid serialized block input: EIP-4895 is active, and no withdrawals were provided as array');
93
+ }
94
+ // parse transactions
95
+ const transactions = [];
96
+ for (const txData of txsData ?? []) {
97
+ transactions.push((0, tx_1.createTxFromBlockBodyData)(txData, {
98
+ ...opts,
99
+ // Use header common in case of setHardfork being activated
100
+ common: header.common,
101
+ }));
102
+ }
103
+ // parse uncle headers
104
+ const uncleHeaders = [];
105
+ const uncleOpts = {
106
+ ...opts,
107
+ // Use header common in case of setHardfork being activated
108
+ common: header.common,
109
+ // Disable this option here (all other options carried over), since this overwrites the provided Difficulty to an incorrect value
110
+ calcDifficultyFromHeader: undefined,
111
+ };
112
+ // Uncles are obsolete post-merge, any hardfork by option implies setHardfork
113
+ if (opts?.setHardfork !== undefined) {
114
+ uncleOpts.setHardfork = true;
115
+ }
116
+ for (const uncleHeaderData of uhsData ?? []) {
117
+ uncleHeaders.push((0, index_ts_1.createBlockHeaderFromBytesArray)(uncleHeaderData, uncleOpts));
118
+ }
119
+ const withdrawals = withdrawalBytes
120
+ ?.map(([index, validatorIndex, address, amount]) => ({
121
+ index,
122
+ validatorIndex,
123
+ address,
124
+ amount,
125
+ }))
126
+ ?.map(util_1.createWithdrawal);
127
+ return new index_ts_1.Block(header, transactions, uncleHeaders, withdrawals, opts);
128
+ }
129
+ /**
130
+ * Static constructor to create a block from a RLP-serialized block
131
+ *
132
+ * @param serialized
133
+ * @param opts
134
+ * @returns a new {@link Block} object
135
+ */
136
+ function createBlockFromRLP(serialized, opts) {
137
+ if (opts?.common?.isActivatedEIP(7934) === true) {
138
+ const maxRlpBlockSize = opts.common.param('maxRlpBlockSize');
139
+ if (serialized.length > maxRlpBlockSize) {
140
+ throw (0, util_1.EthereumJSErrorWithoutCode)(`Block size exceeds limit: ${serialized.length} > ${maxRlpBlockSize}`);
141
+ }
142
+ }
143
+ const values = rlp_1.RLP.decode(Uint8Array.from(serialized));
144
+ if (!Array.isArray(values)) {
145
+ throw (0, util_1.EthereumJSErrorWithoutCode)('Invalid serialized block input. Must be array');
146
+ }
147
+ return createBlockFromBytesArray(values, opts);
148
+ }
149
+ /**
150
+ * Creates a new block object from Ethereum JSON RPC.
151
+ *
152
+ * @param blockParams - Ethereum JSON RPC of block (eth_getBlockByNumber)
153
+ * @param uncles - Optional list of Ethereum JSON RPC of uncles (eth_getUncleByBlockHashAndIndex)
154
+ * @param opts - An object describing the blockchain
155
+ * @returns a new {@link Block} object
156
+ */
157
+ function createBlockFromRPC(blockParams, uncles = [], options) {
158
+ const header = (0, index_ts_1.createBlockHeaderFromRPC)(blockParams, options);
159
+ const transactions = [];
160
+ const opts = { common: header.common };
161
+ for (const _txParams of blockParams.transactions ?? []) {
162
+ const txParams = (0, tx_1.normalizeTxParams)(_txParams);
163
+ const tx = (0, tx_1.createTx)(txParams, opts);
164
+ transactions.push(tx);
165
+ }
166
+ const uncleHeaders = uncles.map((uh) => (0, index_ts_1.createBlockHeaderFromRPC)(uh, options));
167
+ return createBlock({ header, transactions, uncleHeaders, withdrawals: blockParams.withdrawals }, options);
168
+ }
169
+ /**
170
+ * Method to retrieve a block from a JSON-RPC provider and format as a {@link Block}
171
+ * @param provider either a url for a remote provider or an Ethers JSONRPCProvider object
172
+ * @param blockTag block hash or block number to be run
173
+ * @param opts {@link BlockOptions}
174
+ * @returns a new {@link Block} object specified by `blockTag`
175
+ */
176
+ const createBlockFromJSONRPCProvider = async (provider, blockTag, opts) => {
177
+ let blockData;
178
+ const providerUrl = (0, util_1.getProvider)(provider);
179
+ if (typeof blockTag === 'string' && blockTag.length === 66) {
180
+ blockData = await (0, util_1.fetchFromProvider)(providerUrl, {
181
+ method: 'eth_getBlockByHash',
182
+ params: [blockTag, true],
183
+ });
184
+ }
185
+ else if (typeof blockTag === 'bigint') {
186
+ blockData = await (0, util_1.fetchFromProvider)(providerUrl, {
187
+ method: 'eth_getBlockByNumber',
188
+ params: [(0, util_1.bigIntToHex)(blockTag), true],
189
+ });
190
+ }
191
+ else if ((0, util_1.isHexString)(blockTag) ||
192
+ blockTag === 'latest' ||
193
+ blockTag === 'earliest' ||
194
+ blockTag === 'pending' ||
195
+ blockTag === 'finalized' ||
196
+ blockTag === 'safe') {
197
+ blockData = await (0, util_1.fetchFromProvider)(providerUrl, {
198
+ method: 'eth_getBlockByNumber',
199
+ params: [blockTag, true],
200
+ });
201
+ }
202
+ else {
203
+ throw (0, util_1.EthereumJSErrorWithoutCode)(`expected blockTag to be block hash, bigint, hex prefixed string, or earliest/latest/pending; got ${blockTag}`);
204
+ }
205
+ if (blockData === null) {
206
+ throw (0, util_1.EthereumJSErrorWithoutCode)('No block data returned from provider');
207
+ }
208
+ const uncleHeaders = [];
209
+ if (blockData.uncles.length > 0) {
210
+ for (let x = 0; x < blockData.uncles.length; x++) {
211
+ const headerData = await (0, util_1.fetchFromProvider)(providerUrl, {
212
+ method: 'eth_getUncleByBlockHashAndIndex',
213
+ params: [blockData.hash, (0, util_1.intToHex)(x)],
214
+ });
215
+ uncleHeaders.push(headerData);
216
+ }
217
+ }
218
+ return createBlockFromRPC(blockData, uncleHeaders, opts);
219
+ };
220
+ exports.createBlockFromJSONRPCProvider = createBlockFromJSONRPCProvider;
221
+ /**
222
+ * Method to retrieve a block from an execution payload
223
+ * @param payload Execution payload constructed from beacon payload data
224
+ * @param opts {@link BlockOptions}
225
+ * @returns The constructed {@link Block} object
226
+ */
227
+ async function createBlockFromExecutionPayload(payload, opts) {
228
+ const { blockNumber: number, receiptsRoot: receiptTrie, prevRandao: mixHash, feeRecipient: coinbase, transactions, withdrawals: withdrawalsData, } = payload;
229
+ const txs = [];
230
+ for (const [index, serializedTx] of transactions.entries()) {
231
+ try {
232
+ const tx = (0, tx_1.createTxFromRLP)((0, util_1.hexToBytes)(serializedTx), {
233
+ common: opts?.common,
234
+ });
235
+ txs.push(tx);
236
+ }
237
+ catch (error) {
238
+ const validationError = `Invalid tx at index ${index}: ${error}`;
239
+ throw validationError;
240
+ }
241
+ }
242
+ const transactionsTrie = await (0, helpers_ts_1.genTransactionsTrieRoot)(txs, new mpt_1.MerklePatriciaTrie({ common: opts?.common }));
243
+ const withdrawals = withdrawalsData?.map((wData) => (0, util_1.createWithdrawal)(wData));
244
+ const withdrawalsRoot = withdrawals
245
+ ? await (0, helpers_ts_1.genWithdrawalsTrieRoot)(withdrawals, new mpt_1.MerklePatriciaTrie({ common: opts?.common }))
246
+ : undefined;
247
+ const header = {
248
+ ...payload,
249
+ number,
250
+ receiptTrie,
251
+ transactionsTrie,
252
+ withdrawalsRoot,
253
+ mixHash,
254
+ coinbase,
255
+ };
256
+ // we are not setting setHardfork as common is already set to the correct hf
257
+ const block = createBlock({ header, transactions: txs, withdrawals }, opts);
258
+ // Verify blockHash matches payload
259
+ if (!(0, util_1.equalsBytes)(block.hash(), (0, util_1.hexToBytes)(payload.blockHash))) {
260
+ const validationError = `Invalid blockHash, expected: ${payload.blockHash}, received: ${(0, util_1.bytesToHex)(block.hash())}`;
261
+ throw Error(validationError);
262
+ }
263
+ return block;
264
+ }
265
+ /**
266
+ * Method to retrieve a block from a beacon payload JSON
267
+ * @param payload JSON of a beacon block fetched from beacon APIs
268
+ * @param opts {@link BlockOptions}
269
+ * @returns The constructed {@link Block} object
270
+ */
271
+ async function createBlockFromBeaconPayloadJSON(payload, opts) {
272
+ const executionPayload = (0, index_ts_1.executionPayloadFromBeaconPayload)(payload);
273
+ return createBlockFromExecutionPayload(executionPayload, opts);
274
+ }
275
+ /**
276
+ * Creates a block for Clique networks with the seal applied during instantiation.
277
+ * @param blockData Block fields used to build the block
278
+ * @param cliqueSigner Private key bytes used to sign the header
279
+ * @param opts {@link BlockOptions}
280
+ * @returns A sealed Clique {@link Block} object
281
+ */
282
+ function createSealedCliqueBlock(blockData = {}, cliqueSigner, opts = {}) {
283
+ const sealedCliqueBlock = createBlock(blockData, {
284
+ ...opts,
285
+ ...{ freeze: false, skipConsensusFormatValidation: true },
286
+ });
287
+ sealedCliqueBlock.header.extraData = (0, clique_ts_1.generateCliqueBlockExtraData)(sealedCliqueBlock.header, cliqueSigner);
288
+ if (opts?.freeze === true) {
289
+ // We have to freeze here since we can't freeze the block when constructing it since we are overwriting `extraData`
290
+ Object.freeze(sealedCliqueBlock);
291
+ }
292
+ if (opts?.skipConsensusFormatValidation === false) {
293
+ // We need to validate the consensus format here since we skipped it when constructing the block
294
+ sealedCliqueBlock.header['_consensusFormatValidation']();
295
+ }
296
+ return sealedCliqueBlock;
297
+ }
298
+ //# sourceMappingURL=constructors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructors.js","sourceRoot":"","sources":["../../../src/block/constructors.ts"],"names":[],"mappings":";;;AAmDA,kCA0CC;AAUD,4CAGC;AASD,8DAiEC;AASD,gDAgBC;AAUD,gDAqBC;AAqED,0EAwDC;AAQD,4EAMC;AASD,0DAsBC;AAtZD,yCAAoD;AACpD,yCAAqC;AAErC,uCAKuB;AACvB,2CAWyB;AAEzB,sDAAqE;AACrE,8CAA+E;AAC/E,0CAMoB;AAcpB;;;;;;GAMG;AACH,SAAgB,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,IAAA,4BAAiB,EAAC,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,IAAA,aAAQ,EAAC,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,IAAA,4BAAiB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAC/C,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,EAAE,GAAG,CAAC,uBAAgB,CAAC,CAAA;IAE1D,OAAO,IAAI,gBAAK,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;AACzE,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAAC,UAAsB,EAAE,IAAmB;IAC1E,MAAM,MAAM,GAAG,IAAA,4BAAiB,EAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAClD,OAAO,IAAI,gBAAK,CAAC,MAAM,CAAC,CAAA;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,yBAAyB,CAAC,MAAkB,EAAE,IAAmB;IAC/E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAA,iCAA0B,EAC9B,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,IAAA,0CAA+B,EAAC,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,IAAA,iCAA0B,EAC9B,+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,IAAA,8BAAyB,EAAC,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,IAAA,0CAA+B,EAAC,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,uBAAgB,CAAC,CAAA;IAEzB,OAAO,IAAI,gBAAK,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;AACzE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,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,IAAA,iCAA0B,EAC9B,6BAA6B,UAAU,CAAC,MAAM,MAAM,eAAe,EAAE,CACtE,CAAA;QACH,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,SAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAe,CAAA;IAEpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAA,iCAA0B,EAAC,+CAA+C,CAAC,CAAA;IACnF,CAAC;IAED,OAAO,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAChC,WAAyB,EACzB,SAAgB,EAAE,EAClB,OAAsB;IAEtB,MAAM,MAAM,GAAG,IAAA,mCAAwB,EAAC,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,IAAA,sBAAiB,EAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,EAAE,GAAG,IAAA,aAAQ,EAAC,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,IAAA,mCAAwB,EAAC,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;AACI,MAAM,8BAA8B,GAAG,KAAK,EACjD,QAAiC,EACjC,QAAyB,EACzB,IAAkB,EACF,EAAE;IAClB,IAAI,SAAS,CAAA;IACb,MAAM,WAAW,GAAG,IAAA,kBAAW,EAAC,QAAQ,CAAC,CAAA;IAEzC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC3D,SAAS,GAAG,MAAM,IAAA,wBAAiB,EAAC,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,IAAA,wBAAiB,EAAC,WAAW,EAAE;YAC/C,MAAM,EAAE,sBAAsB;YAC9B,MAAM,EAAE,CAAC,IAAA,kBAAW,EAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;SACtC,CAAC,CAAA;IACJ,CAAC;SAAM,IACL,IAAA,kBAAW,EAAC,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,IAAA,wBAAiB,EAAC,WAAW,EAAE;YAC/C,MAAM,EAAE,sBAAsB;YAC9B,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;SACzB,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,IAAA,iCAA0B,EAC9B,oGAAoG,QAAQ,EAAE,CAC/G,CAAA;IACH,CAAC;IAED,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAA,iCAA0B,EAAC,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,IAAA,wBAAiB,EAAC,WAAW,EAAE;gBACtD,MAAM,EAAE,iCAAiC;gBACzC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAA,eAAQ,EAAC,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;AApDY,QAAA,8BAA8B,kCAoD1C;AAED;;;;;GAKG;AACI,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,IAAA,oBAAe,EAAC,IAAA,iBAAU,EAAC,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,IAAA,oCAAuB,EACpD,GAAG,EACH,IAAI,wBAAkB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CACjD,CAAA;IACD,MAAM,WAAW,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,uBAAgB,EAAC,KAAK,CAAC,CAAC,CAAA;IAC5E,MAAM,eAAe,GAAG,WAAW;QACjC,CAAC,CAAC,MAAM,IAAA,mCAAsB,EAAC,WAAW,EAAE,IAAI,wBAAkB,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,IAAA,kBAAW,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAA,iBAAU,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,eAAe,GAAG,gCACtB,OAAO,CAAC,SACV,eAAe,IAAA,iBAAU,EAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAA;QACzC,MAAM,KAAK,CAAC,eAAe,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,gCAAgC,CACpD,OAA0B,EAC1B,IAAmB;IAEnB,MAAM,gBAAgB,GAAG,IAAA,4CAAiC,EAAC,OAAO,CAAC,CAAA;IACnE,OAAO,+BAA+B,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;AAChE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,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,IAAA,wCAA4B,EACzE,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,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./block.js"), exports);
18
+ __exportStar(require("./constructors.js"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/block/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,oDAAiC"}
@@ -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,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLIQUE_EXTRA_SEAL = exports.CLIQUE_EXTRA_VANITY = void 0;
4
+ exports.requireClique = requireClique;
5
+ exports.cliqueSigHash = cliqueSigHash;
6
+ exports.cliqueIsEpochTransition = cliqueIsEpochTransition;
7
+ exports.cliqueExtraVanity = cliqueExtraVanity;
8
+ exports.cliqueExtraSeal = cliqueExtraSeal;
9
+ exports.cliqueEpochTransitionSigners = cliqueEpochTransitionSigners;
10
+ exports.cliqueSigner = cliqueSigner;
11
+ exports.cliqueVerifySignature = cliqueVerifySignature;
12
+ exports.generateCliqueBlockExtraData = generateCliqueBlockExtraData;
13
+ const common_1 = require("@feelyourprotocol/common");
14
+ const rlp_1 = require("@feelyourprotocol/rlp");
15
+ const util_1 = require("@feelyourprotocol/util");
16
+ const secp256k1_js_1 = require("@noble/curves/secp256k1.js");
17
+ // Fixed number of extra-data prefix bytes reserved for signer vanity
18
+ exports.CLIQUE_EXTRA_VANITY = 32;
19
+ // Fixed number of extra-data suffix bytes reserved for signer seal
20
+ exports.CLIQUE_EXTRA_SEAL = 65;
21
+ // This function is not exported in the index file to keep it internal
22
+ function requireClique(header, name) {
23
+ if (header.common.consensusAlgorithm() !== common_1.ConsensusAlgorithm.Clique) {
24
+ const msg = header['_errorMsg'](`BlockHeader.${name}() call only supported for clique PoA networks`);
25
+ throw (0, util_1.EthereumJSErrorWithoutCode)(msg);
26
+ }
27
+ }
28
+ /**
29
+ * PoA clique signature hash without the seal.
30
+ */
31
+ function cliqueSigHash(header) {
32
+ requireClique(header, 'cliqueSigHash');
33
+ const raw = header.raw();
34
+ raw[12] = header.extraData.subarray(0, header.extraData.length - exports.CLIQUE_EXTRA_SEAL);
35
+ return header['keccakFunction'](rlp_1.RLP.encode(raw));
36
+ }
37
+ /**
38
+ * Checks if the block header is an epoch transition
39
+ * header (only clique PoA, throws otherwise)
40
+ */
41
+ function cliqueIsEpochTransition(header) {
42
+ requireClique(header, 'cliqueIsEpochTransition');
43
+ const epoch = BigInt(header.common.consensusConfig().epoch);
44
+ // Epoch transition block if the block number has no
45
+ // remainder on the division by the epoch length
46
+ return header.number % epoch === util_1.BIGINT_0;
47
+ }
48
+ /**
49
+ * Returns extra vanity data
50
+ * (only clique PoA, throws otherwise)
51
+ */
52
+ function cliqueExtraVanity(header) {
53
+ requireClique(header, 'cliqueExtraVanity');
54
+ return header.extraData.subarray(0, exports.CLIQUE_EXTRA_VANITY);
55
+ }
56
+ /**
57
+ * Returns extra seal data
58
+ * (only clique PoA, throws otherwise)
59
+ */
60
+ function cliqueExtraSeal(header) {
61
+ requireClique(header, 'cliqueExtraSeal');
62
+ return header.extraData.subarray(-exports.CLIQUE_EXTRA_SEAL);
63
+ }
64
+ /**
65
+ * Returns a list of signers
66
+ * (only clique PoA, throws otherwise)
67
+ *
68
+ * This function throws if not called on an epoch
69
+ * transition block and should therefore be used
70
+ * in conjunction with {@link cliqueIsEpochTransition}
71
+ */
72
+ function cliqueEpochTransitionSigners(header) {
73
+ requireClique(header, 'cliqueEpochTransitionSigners');
74
+ if (!cliqueIsEpochTransition(header)) {
75
+ const msg = header['_errorMsg']('Signers are only included in epoch transition blocks (clique)');
76
+ throw (0, util_1.EthereumJSErrorWithoutCode)(msg);
77
+ }
78
+ const start = exports.CLIQUE_EXTRA_VANITY;
79
+ const end = header.extraData.length - exports.CLIQUE_EXTRA_SEAL;
80
+ const signerBytes = header.extraData.subarray(start, end);
81
+ const signerList = [];
82
+ const signerLength = 20;
83
+ for (let start = 0; start <= signerBytes.length - signerLength; start += signerLength) {
84
+ signerList.push(signerBytes.subarray(start, start + signerLength));
85
+ }
86
+ return signerList.map((buf) => new util_1.Address(buf));
87
+ }
88
+ /**
89
+ * Returns the signer address
90
+ */
91
+ function cliqueSigner(header) {
92
+ requireClique(header, 'cliqueSigner');
93
+ const extraSeal = cliqueExtraSeal(header);
94
+ // Reasonable default for default blocks
95
+ if (extraSeal.length === 0 || (0, util_1.equalsBytes)(extraSeal, new Uint8Array(65))) {
96
+ return (0, util_1.createZeroAddress)();
97
+ }
98
+ const r = extraSeal.subarray(0, 32);
99
+ const s = extraSeal.subarray(32, 64);
100
+ const v = (0, util_1.bytesToBigInt)(extraSeal.subarray(64, 65)) + util_1.BIGINT_27;
101
+ const pubKey = (0, util_1.ecrecover)(cliqueSigHash(header), v, r, s);
102
+ return (0, util_1.createAddressFromPublicKey)(pubKey);
103
+ }
104
+ /**
105
+ * Verifies the signature of the block (last 65 bytes of extraData field)
106
+ * (only clique PoA, throws otherwise)
107
+ *
108
+ * Method throws if signature is invalid
109
+ */
110
+ function cliqueVerifySignature(header, signerList) {
111
+ requireClique(header, 'cliqueVerifySignature');
112
+ const signerAddress = cliqueSigner(header);
113
+ const signerFound = signerList.find((signer) => {
114
+ return signer.equals(signerAddress);
115
+ });
116
+ return !!signerFound;
117
+ }
118
+ /**
119
+ * Generates the extraData from a sealed block header
120
+ * @param header block header from which to retrieve extraData
121
+ * @param cliqueSigner clique signer key used for creating sealed block
122
+ * @returns clique seal (i.e. extradata) for the block
123
+ */
124
+ function generateCliqueBlockExtraData(header, cliqueSigner) {
125
+ // Ensure extraData is at least length CLIQUE_EXTRA_VANITY + CLIQUE_EXTRA_SEAL
126
+ const minExtraDataLength = exports.CLIQUE_EXTRA_VANITY + exports.CLIQUE_EXTRA_SEAL;
127
+ if (header.extraData.length < minExtraDataLength) {
128
+ const remainingLength = minExtraDataLength - header.extraData.length;
129
+ header.extraData = (0, util_1.concatBytes)(header.extraData, new Uint8Array(remainingLength));
130
+ }
131
+ requireClique(header, 'generateCliqueBlockExtraData');
132
+ const msgHash = cliqueSigHash(header);
133
+ // Use custom ecsign if provided, otherwise use secp256k1.sign
134
+ const ecSignFunction = header.common.customCrypto?.ecsign ?? secp256k1_js_1.secp256k1.sign;
135
+ // Use noble/curves secp256k1.sign with recovered format (returns 65-byte Uint8Array)
136
+ // sigBytes format: [recovery (1 byte) | r (32 bytes) | s (32 bytes)]
137
+ const sigBytes = ecSignFunction(msgHash, cliqueSigner, { prehash: false, format: 'recovered' });
138
+ // clique format: [r (32 bytes) | s (32 bytes) | recovery (1 byte)]
139
+ const cliqueSignature = (0, util_1.concatBytes)(sigBytes.subarray(1), sigBytes.subarray(0, 1));
140
+ const extraDataWithoutSeal = header.extraData.subarray(0, header.extraData.length - exports.CLIQUE_EXTRA_SEAL);
141
+ const extraData = (0, util_1.concatBytes)(extraDataWithoutSeal, cliqueSignature);
142
+ return extraData;
143
+ }
144
+ //# 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,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ethashCanonicalDifficulty = ethashCanonicalDifficulty;
4
+ /**
5
+ * Returns the canonical difficulty for this block.
6
+ *
7
+ * @param block - the block whose difficulty should be calculated
8
+ * @param parentBlock - the parent of this `Block`
9
+ */
10
+ function ethashCanonicalDifficulty(block, parentBlock) {
11
+ return block.header.ethashCanonicalDifficulty(parentBlock.header);
12
+ }
13
+ //# sourceMappingURL=ethash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethash.js","sourceRoot":"","sources":["../../../src/consensus/ethash.ts"],"names":[],"mappings":";;AAQA,8DAEC;AARD;;;;;GAKG;AACH,SAAgB,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,29 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.cliqueVerifySignature = exports.cliqueSigner = exports.cliqueSigHash = exports.cliqueIsEpochTransition = exports.cliqueExtraVanity = exports.cliqueExtraSeal = exports.cliqueEpochTransitionSigners = exports.CLIQUE_EXTRA_VANITY = exports.CLIQUE_EXTRA_SEAL = void 0;
18
+ var clique_ts_1 = require("./clique.js");
19
+ Object.defineProperty(exports, "CLIQUE_EXTRA_SEAL", { enumerable: true, get: function () { return clique_ts_1.CLIQUE_EXTRA_SEAL; } });
20
+ Object.defineProperty(exports, "CLIQUE_EXTRA_VANITY", { enumerable: true, get: function () { return clique_ts_1.CLIQUE_EXTRA_VANITY; } });
21
+ Object.defineProperty(exports, "cliqueEpochTransitionSigners", { enumerable: true, get: function () { return clique_ts_1.cliqueEpochTransitionSigners; } });
22
+ Object.defineProperty(exports, "cliqueExtraSeal", { enumerable: true, get: function () { return clique_ts_1.cliqueExtraSeal; } });
23
+ Object.defineProperty(exports, "cliqueExtraVanity", { enumerable: true, get: function () { return clique_ts_1.cliqueExtraVanity; } });
24
+ Object.defineProperty(exports, "cliqueIsEpochTransition", { enumerable: true, get: function () { return clique_ts_1.cliqueIsEpochTransition; } });
25
+ Object.defineProperty(exports, "cliqueSigHash", { enumerable: true, get: function () { return clique_ts_1.cliqueSigHash; } });
26
+ Object.defineProperty(exports, "cliqueSigner", { enumerable: true, get: function () { return clique_ts_1.cliqueSigner; } });
27
+ Object.defineProperty(exports, "cliqueVerifySignature", { enumerable: true, get: function () { return clique_ts_1.cliqueVerifySignature; } });
28
+ __exportStar(require("./ethash.js"), exports);
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/consensus/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yCAUoB;AATlB,8GAAA,iBAAiB,OAAA;AACjB,gHAAA,mBAAmB,OAAA;AACnB,yHAAA,4BAA4B,OAAA;AAC5B,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA;AACjB,oHAAA,uBAAuB,OAAA;AACvB,0GAAA,aAAa,OAAA;AACb,yGAAA,YAAY,OAAA;AACZ,kHAAA,qBAAqB,OAAA;AAEvB,8CAA2B"}