@feelyourprotocol/util 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 (223) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +297 -0
  3. package/dist/cjs/account.d.ts +165 -0
  4. package/dist/cjs/account.d.ts.map +1 -0
  5. package/dist/cjs/account.js +530 -0
  6. package/dist/cjs/account.js.map +1 -0
  7. package/dist/cjs/address.d.ts +67 -0
  8. package/dist/cjs/address.d.ts.map +1 -0
  9. package/dist/cjs/address.js +136 -0
  10. package/dist/cjs/address.js.map +1 -0
  11. package/dist/cjs/authorization.d.ts +41 -0
  12. package/dist/cjs/authorization.d.ts.map +1 -0
  13. package/dist/cjs/authorization.js +135 -0
  14. package/dist/cjs/authorization.js.map +1 -0
  15. package/dist/cjs/bal.d.ts +129 -0
  16. package/dist/cjs/bal.d.ts.map +1 -0
  17. package/dist/cjs/bal.js +529 -0
  18. package/dist/cjs/bal.js.map +1 -0
  19. package/dist/cjs/binaryTree.d.ts +148 -0
  20. package/dist/cjs/binaryTree.d.ts.map +1 -0
  21. package/dist/cjs/binaryTree.js +240 -0
  22. package/dist/cjs/binaryTree.js.map +1 -0
  23. package/dist/cjs/blobs.d.ts +76 -0
  24. package/dist/cjs/blobs.d.ts.map +1 -0
  25. package/dist/cjs/blobs.js +175 -0
  26. package/dist/cjs/blobs.js.map +1 -0
  27. package/dist/cjs/bytes.d.ts +291 -0
  28. package/dist/cjs/bytes.d.ts.map +1 -0
  29. package/dist/cjs/bytes.js +606 -0
  30. package/dist/cjs/bytes.js.map +1 -0
  31. package/dist/cjs/constants.d.ts +91 -0
  32. package/dist/cjs/constants.d.ts.map +1 -0
  33. package/dist/cjs/constants.js +97 -0
  34. package/dist/cjs/constants.js.map +1 -0
  35. package/dist/cjs/db.d.ts +65 -0
  36. package/dist/cjs/db.d.ts.map +1 -0
  37. package/dist/cjs/db.js +14 -0
  38. package/dist/cjs/db.js.map +1 -0
  39. package/dist/cjs/env.d.ts +9 -0
  40. package/dist/cjs/env.d.ts.map +1 -0
  41. package/dist/cjs/env.js +13 -0
  42. package/dist/cjs/env.js.map +1 -0
  43. package/dist/cjs/errors.d.ts +3 -0
  44. package/dist/cjs/errors.d.ts.map +1 -0
  45. package/dist/cjs/errors.js +19 -0
  46. package/dist/cjs/errors.js.map +1 -0
  47. package/dist/cjs/helpers.d.ts +21 -0
  48. package/dist/cjs/helpers.d.ts.map +1 -0
  49. package/dist/cjs/helpers.js +50 -0
  50. package/dist/cjs/helpers.js.map +1 -0
  51. package/dist/cjs/index.d.ts +67 -0
  52. package/dist/cjs/index.d.ts.map +1 -0
  53. package/dist/cjs/index.js +93 -0
  54. package/dist/cjs/index.js.map +1 -0
  55. package/dist/cjs/internal.d.ts +72 -0
  56. package/dist/cjs/internal.d.ts.map +1 -0
  57. package/dist/cjs/internal.js +182 -0
  58. package/dist/cjs/internal.js.map +1 -0
  59. package/dist/cjs/kzg.d.ts +14 -0
  60. package/dist/cjs/kzg.d.ts.map +1 -0
  61. package/dist/cjs/kzg.js +3 -0
  62. package/dist/cjs/kzg.js.map +1 -0
  63. package/dist/cjs/lock.d.ts +15 -0
  64. package/dist/cjs/lock.d.ts.map +1 -0
  65. package/dist/cjs/lock.js +45 -0
  66. package/dist/cjs/lock.js.map +1 -0
  67. package/dist/cjs/mapDB.d.ts +17 -0
  68. package/dist/cjs/mapDB.d.ts.map +1 -0
  69. package/dist/cjs/mapDB.js +46 -0
  70. package/dist/cjs/mapDB.js.map +1 -0
  71. package/dist/cjs/package.json +3 -0
  72. package/dist/cjs/provider.d.ts +46 -0
  73. package/dist/cjs/provider.d.ts.map +1 -0
  74. package/dist/cjs/provider.js +84 -0
  75. package/dist/cjs/provider.js.map +1 -0
  76. package/dist/cjs/request.d.ts +20 -0
  77. package/dist/cjs/request.d.ts.map +1 -0
  78. package/dist/cjs/request.js +35 -0
  79. package/dist/cjs/request.js.map +1 -0
  80. package/dist/cjs/signature.d.ts +47 -0
  81. package/dist/cjs/signature.d.ts.map +1 -0
  82. package/dist/cjs/signature.js +147 -0
  83. package/dist/cjs/signature.js.map +1 -0
  84. package/dist/cjs/tasks.d.ts +32 -0
  85. package/dist/cjs/tasks.d.ts.map +1 -0
  86. package/dist/cjs/tasks.js +51 -0
  87. package/dist/cjs/tasks.js.map +1 -0
  88. package/dist/cjs/types.d.ts +64 -0
  89. package/dist/cjs/types.d.ts.map +1 -0
  90. package/dist/cjs/types.js +78 -0
  91. package/dist/cjs/types.js.map +1 -0
  92. package/dist/cjs/units.d.ts +22 -0
  93. package/dist/cjs/units.d.ts.map +1 -0
  94. package/dist/cjs/units.js +51 -0
  95. package/dist/cjs/units.js.map +1 -0
  96. package/dist/cjs/withdrawal.d.ts +72 -0
  97. package/dist/cjs/withdrawal.d.ts.map +1 -0
  98. package/dist/cjs/withdrawal.js +93 -0
  99. package/dist/cjs/withdrawal.js.map +1 -0
  100. package/dist/esm/account.d.ts +165 -0
  101. package/dist/esm/account.d.ts.map +1 -0
  102. package/dist/esm/account.js +505 -0
  103. package/dist/esm/account.js.map +1 -0
  104. package/dist/esm/address.d.ts +67 -0
  105. package/dist/esm/address.d.ts.map +1 -0
  106. package/dist/esm/address.js +125 -0
  107. package/dist/esm/address.js.map +1 -0
  108. package/dist/esm/authorization.d.ts +41 -0
  109. package/dist/esm/authorization.d.ts.map +1 -0
  110. package/dist/esm/authorization.js +126 -0
  111. package/dist/esm/authorization.js.map +1 -0
  112. package/dist/esm/bal.d.ts +129 -0
  113. package/dist/esm/bal.d.ts.map +1 -0
  114. package/dist/esm/bal.js +522 -0
  115. package/dist/esm/bal.js.map +1 -0
  116. package/dist/esm/binaryTree.d.ts +148 -0
  117. package/dist/esm/binaryTree.d.ts.map +1 -0
  118. package/dist/esm/binaryTree.js +226 -0
  119. package/dist/esm/binaryTree.js.map +1 -0
  120. package/dist/esm/blobs.d.ts +76 -0
  121. package/dist/esm/blobs.d.ts.map +1 -0
  122. package/dist/esm/blobs.js +163 -0
  123. package/dist/esm/blobs.js.map +1 -0
  124. package/dist/esm/bytes.d.ts +291 -0
  125. package/dist/esm/bytes.d.ts.map +1 -0
  126. package/dist/esm/bytes.js +562 -0
  127. package/dist/esm/bytes.js.map +1 -0
  128. package/dist/esm/constants.d.ts +91 -0
  129. package/dist/esm/constants.d.ts.map +1 -0
  130. package/dist/esm/constants.js +94 -0
  131. package/dist/esm/constants.js.map +1 -0
  132. package/dist/esm/db.d.ts +65 -0
  133. package/dist/esm/db.d.ts.map +1 -0
  134. package/dist/esm/db.js +11 -0
  135. package/dist/esm/db.js.map +1 -0
  136. package/dist/esm/env.d.ts +9 -0
  137. package/dist/esm/env.d.ts.map +1 -0
  138. package/dist/esm/env.js +9 -0
  139. package/dist/esm/env.js.map +1 -0
  140. package/dist/esm/errors.d.ts +3 -0
  141. package/dist/esm/errors.d.ts.map +1 -0
  142. package/dist/esm/errors.js +14 -0
  143. package/dist/esm/errors.js.map +1 -0
  144. package/dist/esm/helpers.d.ts +21 -0
  145. package/dist/esm/helpers.d.ts.map +1 -0
  146. package/dist/esm/helpers.js +43 -0
  147. package/dist/esm/helpers.js.map +1 -0
  148. package/dist/esm/index.d.ts +67 -0
  149. package/dist/esm/index.d.ts.map +1 -0
  150. package/dist/esm/index.js +67 -0
  151. package/dist/esm/index.js.map +1 -0
  152. package/dist/esm/internal.d.ts +72 -0
  153. package/dist/esm/internal.d.ts.map +1 -0
  154. package/dist/esm/internal.js +170 -0
  155. package/dist/esm/internal.js.map +1 -0
  156. package/dist/esm/kzg.d.ts +14 -0
  157. package/dist/esm/kzg.d.ts.map +1 -0
  158. package/dist/esm/kzg.js +2 -0
  159. package/dist/esm/kzg.js.map +1 -0
  160. package/dist/esm/lock.d.ts +15 -0
  161. package/dist/esm/lock.d.ts.map +1 -0
  162. package/dist/esm/lock.js +41 -0
  163. package/dist/esm/lock.js.map +1 -0
  164. package/dist/esm/mapDB.d.ts +17 -0
  165. package/dist/esm/mapDB.d.ts.map +1 -0
  166. package/dist/esm/mapDB.js +42 -0
  167. package/dist/esm/mapDB.js.map +1 -0
  168. package/dist/esm/package.json +3 -0
  169. package/dist/esm/provider.d.ts +46 -0
  170. package/dist/esm/provider.d.ts.map +1 -0
  171. package/dist/esm/provider.js +79 -0
  172. package/dist/esm/provider.js.map +1 -0
  173. package/dist/esm/request.d.ts +20 -0
  174. package/dist/esm/request.d.ts.map +1 -0
  175. package/dist/esm/request.js +30 -0
  176. package/dist/esm/request.js.map +1 -0
  177. package/dist/esm/signature.d.ts +47 -0
  178. package/dist/esm/signature.d.ts.map +1 -0
  179. package/dist/esm/signature.js +137 -0
  180. package/dist/esm/signature.js.map +1 -0
  181. package/dist/esm/tasks.d.ts +32 -0
  182. package/dist/esm/tasks.d.ts.map +1 -0
  183. package/dist/esm/tasks.js +47 -0
  184. package/dist/esm/tasks.js.map +1 -0
  185. package/dist/esm/types.d.ts +64 -0
  186. package/dist/esm/types.d.ts.map +1 -0
  187. package/dist/esm/types.js +71 -0
  188. package/dist/esm/types.js.map +1 -0
  189. package/dist/esm/units.d.ts +22 -0
  190. package/dist/esm/units.d.ts.map +1 -0
  191. package/dist/esm/units.js +46 -0
  192. package/dist/esm/units.js.map +1 -0
  193. package/dist/esm/withdrawal.d.ts +72 -0
  194. package/dist/esm/withdrawal.d.ts.map +1 -0
  195. package/dist/esm/withdrawal.js +86 -0
  196. package/dist/esm/withdrawal.js.map +1 -0
  197. package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
  198. package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
  199. package/package.json +116 -0
  200. package/src/account.ts +630 -0
  201. package/src/address.ts +158 -0
  202. package/src/authorization.ts +180 -0
  203. package/src/bal.ts +761 -0
  204. package/src/binaryTree.ts +353 -0
  205. package/src/blobs.ts +209 -0
  206. package/src/bytes.ts +659 -0
  207. package/src/constants.ts +125 -0
  208. package/src/db.ts +86 -0
  209. package/src/env.ts +9 -0
  210. package/src/errors.ts +28 -0
  211. package/src/helpers.ts +46 -0
  212. package/src/index.ts +88 -0
  213. package/src/internal.ts +212 -0
  214. package/src/kzg.ts +24 -0
  215. package/src/lock.ts +42 -0
  216. package/src/mapDB.ts +57 -0
  217. package/src/provider.ts +109 -0
  218. package/src/request.ts +48 -0
  219. package/src/signature.ts +202 -0
  220. package/src/tasks.ts +59 -0
  221. package/src/types.ts +177 -0
  222. package/src/units.ts +56 -0
  223. package/src/withdrawal.ts +133 -0
@@ -0,0 +1,522 @@
1
+ import { RLP } from '@feelyourprotocol/rlp';
2
+ import { keccak_256 } from '@noble/hashes/sha3.js';
3
+ import { bigIntToBytes, bigIntToHex, bytesToHex, bytesToInt, hexToBigInt, hexToBytes, } from "./bytes.js";
4
+ import { SYSTEM_ADDRESS } from "./constants.js";
5
+ import { padToEven } from "./internal.js";
6
+ /**
7
+ * Structural helper class for block level access lists
8
+ *
9
+ * EXPERIMENTAL: DO NOT USE IN PRODUCTION!
10
+ */
11
+ export class BlockLevelAccessList {
12
+ constructor(accesses = {}) {
13
+ this.checkpoints = [];
14
+ // Track original (pre-transaction) balances for net-zero detection
15
+ this.originalBalances = new Map();
16
+ // Track original code at the start of each blockAccessIndex for each address
17
+ // Key format: `${address}-${blockAccessIndex}`
18
+ this.originalCodesAtIndex = new Map();
19
+ this.accesses = accesses;
20
+ this.blockAccessIndex = 0;
21
+ }
22
+ /**
23
+ * Serializes the block level access list to RLP.
24
+ *
25
+ * @returns the RLP encoded block level access list
26
+ */
27
+ serialize() {
28
+ return RLP.encode(this.raw());
29
+ }
30
+ /**
31
+ * This hash is used in the block header
32
+ *
33
+ * @returns the hash of the serialized block level access list
34
+ */
35
+ hash() {
36
+ return keccak_256(this.serialize());
37
+ }
38
+ checkpoint() {
39
+ this.checkpoints.push({
40
+ accesses: this.cloneAccesses(this.accesses),
41
+ blockAccessIndex: this.blockAccessIndex,
42
+ });
43
+ }
44
+ commit() {
45
+ if (this.checkpoints.length > 0) {
46
+ this.checkpoints.pop();
47
+ }
48
+ }
49
+ revert() {
50
+ const snapshot = this.checkpoints.pop();
51
+ if (!snapshot) {
52
+ return;
53
+ }
54
+ const current = this.accesses;
55
+ this.accesses = snapshot.accesses;
56
+ this.blockAccessIndex = snapshot.blockAccessIndex;
57
+ // Preserve address touches and storage reads across reverts.
58
+ // EIP-7928: When storage writes are reverted, the slot keys MUST still
59
+ // appear in storageReads since the slots were accessed (SSTORE reads
60
+ // the current value for gas calculation).
61
+ for (const [address, access] of Object.entries(current)) {
62
+ if (this.accesses[address] === undefined) {
63
+ // Collect both explicit reads and slots that were written (but will be reverted)
64
+ const allReads = new Set(access.storageReads);
65
+ for (const slot of Object.keys(access.storageChanges)) {
66
+ allReads.add(slot);
67
+ }
68
+ this.accesses[address] = {
69
+ nonceChanges: new Map(),
70
+ balanceChanges: new Map(),
71
+ codeChanges: [],
72
+ storageChanges: {},
73
+ storageReads: allReads,
74
+ };
75
+ continue;
76
+ }
77
+ const target = this.accesses[address];
78
+ // Preserve explicit storageReads
79
+ for (const slot of access.storageReads) {
80
+ target.storageReads.add(slot);
81
+ }
82
+ // EIP-7928: Convert reverted storageChanges to storageReads
83
+ for (const slot of Object.keys(access.storageChanges)) {
84
+ // Only add to reads if not already in the target's storageChanges
85
+ // (a successful write subsumes a read)
86
+ if (target.storageChanges[slot] === undefined) {
87
+ target.storageReads.add(slot);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ cloneAccesses(accesses) {
93
+ const cloned = {};
94
+ for (const [address, access] of Object.entries(accesses)) {
95
+ const storageChanges = {};
96
+ for (const [slot, changes] of Object.entries(access.storageChanges)) {
97
+ storageChanges[slot] = changes.map(([index, value]) => [index, value]);
98
+ }
99
+ cloned[address] = {
100
+ nonceChanges: new Map(access.nonceChanges),
101
+ balanceChanges: new Map(access.balanceChanges),
102
+ codeChanges: access.codeChanges.map(([index, code]) => [index, code]),
103
+ storageChanges,
104
+ storageReads: new Set(access.storageReads),
105
+ };
106
+ }
107
+ return cloned;
108
+ }
109
+ /**
110
+ * Returns the raw block level access list with values
111
+ * correctly sorted.
112
+ *
113
+ * @returns the raw block level access list
114
+ */
115
+ raw() {
116
+ const bal = [];
117
+ for (const address of Object.keys(this.accesses)
118
+ .sort()
119
+ .filter((address) => shouldIncludeAddress(address, this.accesses[address]))) {
120
+ const data = this.accesses[address];
121
+ // Format storage changes: [slot, [[index, value], ...]]
122
+ // Normalize slot keys for canonical RLP encoding (0 -> empty bytes)
123
+ const storageChanges = Object.entries(data.storageChanges)
124
+ .sort((a, b) => compareLexicographicHexOrBytes(a[0], b[0]))
125
+ .map(([slot, changes]) => [
126
+ normalizeHexForRLP(slot),
127
+ changes
128
+ .sort((a, b) => a[0] - b[0])
129
+ .map(([index, value]) => [index, normalizeBytesForRLPQuantity(value)]),
130
+ ]);
131
+ // Normalize storage reads for canonical RLP encoding (0 -> empty bytes)
132
+ const storageReads = Array.from(data.storageReads)
133
+ .map(normalizeHexForRLP)
134
+ .sort((a, b) => compareLexicographicHexOrBytes(a, b));
135
+ const balanceChanges = Array.from(data.balanceChanges.entries())
136
+ .sort(([a], [b]) => a - b)
137
+ .map(([index, balance]) => [index, normalizeQuantityHexForRLP(balance)]);
138
+ const nonceChanges = Array.from(data.nonceChanges.entries())
139
+ .sort(([a], [b]) => a - b)
140
+ .map(([index, nonce]) => [index, normalizeQuantityHexForRLP(nonce)]);
141
+ const codeChanges = [...data.codeChanges].sort(([a], [b]) => a - b);
142
+ bal.push([
143
+ address,
144
+ storageChanges,
145
+ storageReads,
146
+ balanceChanges,
147
+ nonceChanges,
148
+ codeChanges,
149
+ ]);
150
+ }
151
+ return bal;
152
+ }
153
+ addAddress(address) {
154
+ if (this.accesses[address] !== undefined) {
155
+ return;
156
+ }
157
+ this.accesses[address] = {
158
+ storageChanges: {},
159
+ storageReads: new Set(),
160
+ balanceChanges: new Map(),
161
+ nonceChanges: new Map(),
162
+ codeChanges: [],
163
+ };
164
+ }
165
+ addStorageWrite(address, storageKey, value, blockAccessIndex, originalValue) {
166
+ const strippedKey = normalizeStorageKeyHex(bytesToHex(stripLeadingZeros(storageKey)));
167
+ const strippedValue = stripLeadingZeros(value);
168
+ const strippedOriginal = originalValue ? stripLeadingZeros(originalValue) : undefined;
169
+ const isZeroWrite = strippedValue.length === 0;
170
+ // EIP-7928: Check if this is a no-op write (value equals pre-transaction value)
171
+ // No-op writes should be recorded as reads, not changes.
172
+ // Note: Both empty arrays (zero values) compare equal via bytesToHex
173
+ let isNoOp = false;
174
+ if (strippedOriginal !== undefined) {
175
+ // We have original value - compare properly
176
+ isNoOp = bytesToHex(strippedValue) === bytesToHex(strippedOriginal);
177
+ }
178
+ else if (isZeroWrite) {
179
+ // No original value provided and writing zero - likely a no-op for system contracts
180
+ // reading empty slots. Treat as read for safety.
181
+ isNoOp = true;
182
+ }
183
+ // Only no-op writes (writing same value as original) are treated as reads
184
+ // EIP-7928: Zeroing a slot (pre-value exists, post-value is zero) IS a write
185
+ if (isNoOp) {
186
+ // EIP-7928: If a slot is written back to its original value (net-zero change),
187
+ // it should appear in storageReads, not storageChanges.
188
+ // This handles nested calls where intermediate frames write different values
189
+ // but the final value equals the original.
190
+ if (this.accesses[address] !== undefined) {
191
+ // Remove any existing storageChanges for this slot since final == original
192
+ delete this.accesses[address].storageChanges[strippedKey];
193
+ }
194
+ this.addStorageRead(address, storageKey);
195
+ return;
196
+ }
197
+ if (this.accesses[address] === undefined) {
198
+ this.addAddress(address);
199
+ }
200
+ if (this.accesses[address].storageChanges[strippedKey] === undefined) {
201
+ this.accesses[address].storageChanges[strippedKey] = [];
202
+ }
203
+ // For zero values, strippedValue is empty - this is correct for RLP encoding
204
+ this.accesses[address].storageChanges[strippedKey].push([blockAccessIndex, strippedValue]);
205
+ // Per EIP-7928: A successful storage write subsumes any prior read of the same slot.
206
+ // Remove the slot from storageReads since it's now in storageChanges.
207
+ this.accesses[address].storageReads.delete(strippedKey);
208
+ }
209
+ addStorageRead(address, storageKey) {
210
+ if (this.accesses[address] === undefined) {
211
+ this.addAddress(address);
212
+ }
213
+ const strippedKey = normalizeStorageKeyHex(bytesToHex(stripLeadingZeros(storageKey)));
214
+ // Per EIP-7928: Don't add to storageReads if the slot was already written.
215
+ // A write subsumes any reads of the same slot.
216
+ if (this.accesses[address].storageChanges[strippedKey] === undefined) {
217
+ this.accesses[address].storageReads.add(strippedKey);
218
+ }
219
+ }
220
+ addBalanceChange(address, balance, blockAccessIndex, originalBalance) {
221
+ if (this.accesses[address] === undefined) {
222
+ this.addAddress(address);
223
+ }
224
+ // EIP-7928: Track the original (pre-transaction) balance for net-zero detection
225
+ // Only set if not already tracked (first call wins)
226
+ if (originalBalance !== undefined && !this.originalBalances.has(address)) {
227
+ this.originalBalances.set(address, originalBalance);
228
+ }
229
+ this.accesses[address].balanceChanges.set(blockAccessIndex, padToEvenHex(bytesToHex(stripLeadingZeros(bigIntToBytes(balance)))));
230
+ }
231
+ /**
232
+ * EIP-7928: Remove balance changes for addresses where final balance equals first balance.
233
+ * Call this at the end of each transaction to clean up net-zero balance changes.
234
+ */
235
+ cleanupNetZeroBalanceChanges() {
236
+ for (const [address, originalBalance] of this.originalBalances.entries()) {
237
+ const access = this.accesses[address];
238
+ if (access === undefined || access.balanceChanges.size === 0) {
239
+ continue;
240
+ }
241
+ // Get the final balance (last entry in the balanceChanges map)
242
+ const entries = Array.from(access.balanceChanges.values());
243
+ const finalBalanceHex = entries[entries.length - 1];
244
+ const finalBalance = finalBalanceHex === '0x' ? BigInt(0) : BigInt(`0x${finalBalanceHex.replace(/^0x/, '')}`);
245
+ // EIP-7928: If final balance == original balance, remove all balanceChanges
246
+ // for the current blockAccessIndex only, but keep prior tx entries.
247
+ if (finalBalance === originalBalance) {
248
+ access.balanceChanges.delete(this.blockAccessIndex);
249
+ }
250
+ }
251
+ // Clear the tracking map for the next transaction
252
+ this.originalBalances.clear();
253
+ }
254
+ addNonceChange(address, nonce, blockAccessIndex) {
255
+ if (this.accesses[address] === undefined) {
256
+ this.addAddress(address);
257
+ }
258
+ this.accesses[address].nonceChanges.set(blockAccessIndex, padToEvenHex(bigIntToHex(nonce)));
259
+ }
260
+ addCodeChange(address, code, blockAccessIndex, originalCode) {
261
+ if (this.accesses[address] === undefined) {
262
+ this.addAddress(address);
263
+ }
264
+ const codeChanges = this.accesses[address].codeChanges;
265
+ // Track the original code at the start of this blockAccessIndex
266
+ const trackingKey = `${address}-${blockAccessIndex}`;
267
+ if (!this.originalCodesAtIndex.has(trackingKey) && originalCode !== undefined) {
268
+ this.originalCodesAtIndex.set(trackingKey, originalCode);
269
+ }
270
+ // Get the original code at the start of this blockAccessIndex
271
+ const originalCodeAtIndex = this.originalCodesAtIndex.get(trackingKey);
272
+ // Check if there's already a code change at this blockAccessIndex
273
+ const existingIndex = codeChanges.findIndex(([idx]) => idx === blockAccessIndex);
274
+ if (existingIndex !== -1) {
275
+ // Check if the new code equals the original code at start of this blockAccessIndex
276
+ // If so, remove the entry (net-zero change within this blockAccessIndex)
277
+ if (originalCodeAtIndex !== undefined &&
278
+ bytesToHex(code) === bytesToHex(originalCodeAtIndex)) {
279
+ codeChanges.splice(existingIndex, 1);
280
+ }
281
+ else {
282
+ // Update the existing entry with the new code
283
+ codeChanges[existingIndex] = [blockAccessIndex, code];
284
+ }
285
+ }
286
+ else {
287
+ // Add new entry, but only if code is actually different from originalCode
288
+ if (originalCode !== undefined && bytesToHex(code) === bytesToHex(originalCode)) {
289
+ // No actual change, don't record
290
+ return;
291
+ }
292
+ codeChanges.push([blockAccessIndex, code]);
293
+ }
294
+ }
295
+ /**
296
+ * EIP-7928: For selfdestructed accounts, drop all state changes while
297
+ * preserving read footprints. Any storageChanges are converted to storageReads.
298
+ *
299
+ * Per EIP-7928: "if the account had a positive balance pre-transaction,
300
+ * the balance change to zero MUST be recorded."
301
+ */
302
+ /**
303
+ * Converts the internal representation to the JSON format (BALJSONBlockAccessList).
304
+ * Inverse of createBlockLevelAccessListFromJSON().
305
+ */
306
+ toJSON() {
307
+ const result = [];
308
+ for (const [address, access] of Object.entries(this.accesses)
309
+ .sort(([a], [b]) => a.localeCompare(b))
310
+ .filter(([address, access]) => shouldIncludeAddress(address, access))) {
311
+ const storageChanges = Object.entries(access.storageChanges)
312
+ .sort(([a], [b]) => a.localeCompare(b))
313
+ .map(([slot, changes]) => ({
314
+ slot,
315
+ slotChanges: changes
316
+ .sort((a, b) => a[0] - b[0])
317
+ .map(([index, value]) => ({
318
+ blockAccessIndex: indexToHex(index),
319
+ postValue: padToEvenHex(bytesToHex(value)),
320
+ })),
321
+ }));
322
+ const storageReads = Array.from(access.storageReads).sort((a, b) => Number((a === '0x' ? 0n : hexToBigInt(a)) -
323
+ (b === '0x' ? 0n : hexToBigInt(b))));
324
+ const balanceChanges = Array.from(access.balanceChanges.entries())
325
+ .sort(([a], [b]) => a - b)
326
+ .map(([index, balance]) => ({
327
+ blockAccessIndex: indexToHex(index),
328
+ postBalance: balance,
329
+ }));
330
+ const nonceChanges = Array.from(access.nonceChanges.entries())
331
+ .sort(([a], [b]) => a - b)
332
+ .map(([index, nonce]) => ({
333
+ blockAccessIndex: indexToHex(index),
334
+ postNonce: nonce,
335
+ }));
336
+ const codeChanges = access.codeChanges.map(([index, code]) => ({
337
+ blockAccessIndex: indexToHex(index),
338
+ newCode: bytesToHex(code),
339
+ }));
340
+ result.push({
341
+ address: address,
342
+ nonceChanges,
343
+ balanceChanges,
344
+ codeChanges,
345
+ storageChanges,
346
+ storageReads,
347
+ });
348
+ }
349
+ return result;
350
+ }
351
+ cleanupSelfdestructed(addresses) {
352
+ for (const address of addresses) {
353
+ const access = this.accesses[address];
354
+ if (access === undefined) {
355
+ continue;
356
+ }
357
+ // Convert any storageChanges into storageReads
358
+ for (const slot of Object.keys(access.storageChanges)) {
359
+ access.storageReads.add(slot);
360
+ }
361
+ access.storageChanges = {};
362
+ access.nonceChanges.clear();
363
+ access.codeChanges = [];
364
+ // EIP-7928: If the account had a positive pre-transaction balance,
365
+ // the balance change to zero MUST be recorded.
366
+ // The balance change to 0 is already added during SELFDESTRUCT execution.
367
+ // We only clear balance changes if pre-transaction balance was 0 (no actual change).
368
+ const originalBalance = this.originalBalances.get(address);
369
+ if (originalBalance === undefined || originalBalance === BigInt(0)) {
370
+ // Pre-transaction balance was 0 or unknown - clear balance changes
371
+ // (0 -> 0 is no change, so nothing to record)
372
+ access.balanceChanges.clear();
373
+ }
374
+ // If originalBalance > 0, keep the balance changes (which should show balance = 0)
375
+ }
376
+ }
377
+ }
378
+ function compareLexicographicHexOrBytes(a, b) {
379
+ const aBytes = a instanceof Uint8Array ? a : hexToBytes(a);
380
+ const bBytes = b instanceof Uint8Array ? b : hexToBytes(b);
381
+ const minLength = Math.min(aBytes.length, bBytes.length);
382
+ for (let i = 0; i < minLength; i++) {
383
+ if (aBytes[i] < bBytes[i])
384
+ return -1;
385
+ if (aBytes[i] > bBytes[i])
386
+ return 1;
387
+ }
388
+ if (aBytes.length < bBytes.length)
389
+ return -1;
390
+ if (aBytes.length > bBytes.length)
391
+ return 1;
392
+ return 0;
393
+ }
394
+ export function createBlockLevelAccessList() {
395
+ return new BlockLevelAccessList();
396
+ }
397
+ export function createBlockLevelAccessListFromJSON(json) {
398
+ const bal = new BlockLevelAccessList();
399
+ for (const account of json) {
400
+ bal.addAddress(account.address);
401
+ const access = bal.accesses[account.address];
402
+ for (const slotChange of account.storageChanges) {
403
+ const normalizedSlot = normalizeStorageKeyHex(slotChange.slot);
404
+ if (access.storageChanges[normalizedSlot] === undefined) {
405
+ access.storageChanges[normalizedSlot] = [];
406
+ }
407
+ for (const change of slotChange.slotChanges) {
408
+ access.storageChanges[normalizedSlot].push([
409
+ parseInt(change.blockAccessIndex, 16),
410
+ hexToBytes(change.postValue),
411
+ ]);
412
+ }
413
+ }
414
+ for (const slot of account.storageReads) {
415
+ access.storageReads.add(normalizeStorageKeyHex(slot));
416
+ }
417
+ for (const change of account.balanceChanges) {
418
+ access.balanceChanges.set(parseInt(change.blockAccessIndex, 16), padToEvenHex(change.postBalance));
419
+ }
420
+ for (const change of account.nonceChanges) {
421
+ access.nonceChanges.set(parseInt(change.blockAccessIndex, 16), padToEvenHex(change.postNonce));
422
+ }
423
+ for (const change of account.codeChanges) {
424
+ access.codeChanges.push([parseInt(change.blockAccessIndex, 16), hexToBytes(change.newCode)]);
425
+ }
426
+ }
427
+ return bal;
428
+ }
429
+ /**
430
+ * Normalizes a quantity-like hex string for canonical RLP encoding.
431
+ * Integer fields in the BAL use minimal big-endian encoding, so leading zero bytes
432
+ * are stripped and zero is encoded as empty bytes.
433
+ */
434
+ function normalizeHexForRLP(hex) {
435
+ const stripped = hex.slice(2).replace(/^0+/, '');
436
+ if (stripped === '') {
437
+ return Uint8Array.from([]);
438
+ }
439
+ return `0x${padToEven(stripped)}`;
440
+ }
441
+ function normalizeBytesForRLPQuantity(bytes) {
442
+ return stripLeadingZeros(bytes);
443
+ }
444
+ function normalizeQuantityHexForRLP(hex) {
445
+ const stripped = hex.slice(2).replace(/^0+/, '');
446
+ if (stripped === '') {
447
+ return '0x';
448
+ }
449
+ return `0x${padToEven(stripped)}`;
450
+ }
451
+ export function createBlockLevelAccessListFromRLP(rlp) {
452
+ const decoded = RLP.decode(rlp);
453
+ const bal = new BlockLevelAccessList();
454
+ for (const account of decoded) {
455
+ const [addressBytes, storageChangesRaw, storageReadsRaw, balanceChangesRaw, nonceChangesRaw, codeChangesRaw,] = account;
456
+ const address = bytesToHex(addressBytes);
457
+ bal.addAddress(address);
458
+ const access = bal.accesses[address];
459
+ for (const [slotBytes, slotChangesRaw] of storageChangesRaw) {
460
+ const slot = normalizeStorageKeyHex(bytesToHex(slotBytes));
461
+ if (access.storageChanges[slot] === undefined) {
462
+ access.storageChanges[slot] = [];
463
+ }
464
+ for (const [indexBytes, valueBytes] of slotChangesRaw) {
465
+ access.storageChanges[slot].push([bytesToInt(indexBytes), valueBytes]);
466
+ }
467
+ }
468
+ for (const slotBytes of storageReadsRaw) {
469
+ access.storageReads.add(normalizeStorageKeyHex(bytesToHex(slotBytes)));
470
+ }
471
+ for (const [indexBytes, balanceBytes] of balanceChangesRaw) {
472
+ access.balanceChanges.set(bytesToInt(indexBytes), padToEvenHex(bytesToHex(balanceBytes)));
473
+ }
474
+ for (const [indexBytes, nonceBytes] of nonceChangesRaw) {
475
+ access.nonceChanges.set(bytesToInt(indexBytes), padToEvenHex(bytesToHex(nonceBytes)));
476
+ }
477
+ for (const [indexBytes, codeBytes] of codeChangesRaw) {
478
+ access.codeChanges.push([bytesToInt(indexBytes), codeBytes]);
479
+ }
480
+ }
481
+ return bal;
482
+ }
483
+ function stripLeadingZeros(bytes) {
484
+ let first = bytes[0];
485
+ while (bytes.length > 0 && first.toString() === '0') {
486
+ bytes = bytes.slice(1);
487
+ first = bytes[0];
488
+ }
489
+ return bytes;
490
+ }
491
+ function padToEvenHex(hex) {
492
+ return `0x${padToEven(hex.slice(2))}`;
493
+ }
494
+ /**
495
+ * Normalizes a storage key hex string to ensure consistent even-length representation.
496
+ * - "0x" (empty bytes) is kept as is
497
+ * - "0x0" becomes "0x00"
498
+ * - Any odd-length hex is padded to even (e.g., "0x1" → "0x01")
499
+ */
500
+ function normalizeStorageKeyHex(hex) {
501
+ const stripped = hex.slice(2);
502
+ // Empty string "0x" stays as is
503
+ if (stripped === '') {
504
+ return '0x';
505
+ }
506
+ // Pad to even length (handles "0x0" → "0x00", "0x1" → "0x01", etc.)
507
+ return `0x${padToEven(stripped)}`;
508
+ }
509
+ function shouldIncludeAddress(address, access) {
510
+ if (address !== SYSTEM_ADDRESS) {
511
+ return true;
512
+ }
513
+ return (access.storageReads.size > 0 ||
514
+ Object.keys(access.storageChanges).length > 0 ||
515
+ access.balanceChanges.size > 0 ||
516
+ access.nonceChanges.size > 0 ||
517
+ access.codeChanges.length > 0);
518
+ }
519
+ function indexToHex(index) {
520
+ return padToEvenHex(`0x${index.toString(16)}`);
521
+ }
522
+ //# sourceMappingURL=bal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bal.js","sourceRoot":"","sources":["../../src/bal.ts"],"names":[],"mappings":"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"}