@feelyourprotocol/statemanager 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 (169) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +331 -0
  3. package/dist/cjs/cache/account.d.ts +85 -0
  4. package/dist/cjs/cache/account.d.ts.map +1 -0
  5. package/dist/cjs/cache/account.js +252 -0
  6. package/dist/cjs/cache/account.js.map +1 -0
  7. package/dist/cjs/cache/cache.d.ts +23 -0
  8. package/dist/cjs/cache/cache.d.ts.map +1 -0
  9. package/dist/cjs/cache/cache.js +31 -0
  10. package/dist/cjs/cache/cache.js.map +1 -0
  11. package/dist/cjs/cache/caches.d.ts +19 -0
  12. package/dist/cjs/cache/caches.d.ts.map +1 -0
  13. package/dist/cjs/cache/caches.js +107 -0
  14. package/dist/cjs/cache/caches.js.map +1 -0
  15. package/dist/cjs/cache/code.d.ts +87 -0
  16. package/dist/cjs/cache/code.d.ts.map +1 -0
  17. package/dist/cjs/cache/code.js +258 -0
  18. package/dist/cjs/cache/code.js.map +1 -0
  19. package/dist/cjs/cache/index.d.ts +7 -0
  20. package/dist/cjs/cache/index.d.ts.map +1 -0
  21. package/dist/cjs/cache/index.js +23 -0
  22. package/dist/cjs/cache/index.js.map +1 -0
  23. package/dist/cjs/cache/originalStorageCache.d.ts +21 -0
  24. package/dist/cjs/cache/originalStorageCache.d.ts.map +1 -0
  25. package/dist/cjs/cache/originalStorageCache.js +52 -0
  26. package/dist/cjs/cache/originalStorageCache.js.map +1 -0
  27. package/dist/cjs/cache/storage.d.ts +101 -0
  28. package/dist/cjs/cache/storage.d.ts.map +1 -0
  29. package/dist/cjs/cache/storage.js +337 -0
  30. package/dist/cjs/cache/storage.js.map +1 -0
  31. package/dist/cjs/cache/types.d.ts +36 -0
  32. package/dist/cjs/cache/types.d.ts.map +1 -0
  33. package/dist/cjs/cache/types.js +8 -0
  34. package/dist/cjs/cache/types.js.map +1 -0
  35. package/dist/cjs/index.d.ts +8 -0
  36. package/dist/cjs/index.d.ts.map +1 -0
  37. package/dist/cjs/index.js +24 -0
  38. package/dist/cjs/index.js.map +1 -0
  39. package/dist/cjs/merkleStateManager.d.ts +260 -0
  40. package/dist/cjs/merkleStateManager.d.ts.map +1 -0
  41. package/dist/cjs/merkleStateManager.js +616 -0
  42. package/dist/cjs/merkleStateManager.js.map +1 -0
  43. package/dist/cjs/package.json +3 -0
  44. package/dist/cjs/proof/index.d.ts +3 -0
  45. package/dist/cjs/proof/index.d.ts.map +1 -0
  46. package/dist/cjs/proof/index.js +19 -0
  47. package/dist/cjs/proof/index.js.map +1 -0
  48. package/dist/cjs/proof/merkle.d.ts +40 -0
  49. package/dist/cjs/proof/merkle.d.ts.map +1 -0
  50. package/dist/cjs/proof/merkle.js +182 -0
  51. package/dist/cjs/proof/merkle.js.map +1 -0
  52. package/dist/cjs/proof/rpc.d.ts +10 -0
  53. package/dist/cjs/proof/rpc.d.ts.map +1 -0
  54. package/dist/cjs/proof/rpc.js +20 -0
  55. package/dist/cjs/proof/rpc.js.map +1 -0
  56. package/dist/cjs/rpcStateManager.d.ts +162 -0
  57. package/dist/cjs/rpcStateManager.d.ts.map +1 -0
  58. package/dist/cjs/rpcStateManager.js +313 -0
  59. package/dist/cjs/rpcStateManager.js.map +1 -0
  60. package/dist/cjs/simpleStateManager.d.ts +54 -0
  61. package/dist/cjs/simpleStateManager.d.ts.map +1 -0
  62. package/dist/cjs/simpleStateManager.js +125 -0
  63. package/dist/cjs/simpleStateManager.js.map +1 -0
  64. package/dist/cjs/statefulBinaryTreeStateManager.d.ts +69 -0
  65. package/dist/cjs/statefulBinaryTreeStateManager.d.ts.map +1 -0
  66. package/dist/cjs/statefulBinaryTreeStateManager.js +576 -0
  67. package/dist/cjs/statefulBinaryTreeStateManager.js.map +1 -0
  68. package/dist/cjs/types.d.ts +92 -0
  69. package/dist/cjs/types.d.ts.map +1 -0
  70. package/dist/cjs/types.js +3 -0
  71. package/dist/cjs/types.js.map +1 -0
  72. package/dist/cjs/util.d.ts +4 -0
  73. package/dist/cjs/util.d.ts.map +1 -0
  74. package/dist/cjs/util.js +21 -0
  75. package/dist/cjs/util.js.map +1 -0
  76. package/dist/esm/cache/account.d.ts +85 -0
  77. package/dist/esm/cache/account.d.ts.map +1 -0
  78. package/dist/esm/cache/account.js +248 -0
  79. package/dist/esm/cache/account.js.map +1 -0
  80. package/dist/esm/cache/cache.d.ts +23 -0
  81. package/dist/esm/cache/cache.d.ts.map +1 -0
  82. package/dist/esm/cache/cache.js +27 -0
  83. package/dist/esm/cache/cache.js.map +1 -0
  84. package/dist/esm/cache/caches.d.ts +19 -0
  85. package/dist/esm/cache/caches.d.ts.map +1 -0
  86. package/dist/esm/cache/caches.js +103 -0
  87. package/dist/esm/cache/caches.js.map +1 -0
  88. package/dist/esm/cache/code.d.ts +87 -0
  89. package/dist/esm/cache/code.d.ts.map +1 -0
  90. package/dist/esm/cache/code.js +254 -0
  91. package/dist/esm/cache/code.js.map +1 -0
  92. package/dist/esm/cache/index.d.ts +7 -0
  93. package/dist/esm/cache/index.d.ts.map +1 -0
  94. package/dist/esm/cache/index.js +7 -0
  95. package/dist/esm/cache/index.js.map +1 -0
  96. package/dist/esm/cache/originalStorageCache.d.ts +21 -0
  97. package/dist/esm/cache/originalStorageCache.d.ts.map +1 -0
  98. package/dist/esm/cache/originalStorageCache.js +48 -0
  99. package/dist/esm/cache/originalStorageCache.js.map +1 -0
  100. package/dist/esm/cache/storage.d.ts +101 -0
  101. package/dist/esm/cache/storage.d.ts.map +1 -0
  102. package/dist/esm/cache/storage.js +333 -0
  103. package/dist/esm/cache/storage.js.map +1 -0
  104. package/dist/esm/cache/types.d.ts +36 -0
  105. package/dist/esm/cache/types.d.ts.map +1 -0
  106. package/dist/esm/cache/types.js +5 -0
  107. package/dist/esm/cache/types.js.map +1 -0
  108. package/dist/esm/index.d.ts +8 -0
  109. package/dist/esm/index.d.ts.map +1 -0
  110. package/dist/esm/index.js +8 -0
  111. package/dist/esm/index.js.map +1 -0
  112. package/dist/esm/merkleStateManager.d.ts +260 -0
  113. package/dist/esm/merkleStateManager.d.ts.map +1 -0
  114. package/dist/esm/merkleStateManager.js +612 -0
  115. package/dist/esm/merkleStateManager.js.map +1 -0
  116. package/dist/esm/package.json +3 -0
  117. package/dist/esm/proof/index.d.ts +3 -0
  118. package/dist/esm/proof/index.d.ts.map +1 -0
  119. package/dist/esm/proof/index.js +3 -0
  120. package/dist/esm/proof/index.js.map +1 -0
  121. package/dist/esm/proof/merkle.d.ts +40 -0
  122. package/dist/esm/proof/merkle.d.ts.map +1 -0
  123. package/dist/esm/proof/merkle.js +175 -0
  124. package/dist/esm/proof/merkle.js.map +1 -0
  125. package/dist/esm/proof/rpc.d.ts +10 -0
  126. package/dist/esm/proof/rpc.d.ts.map +1 -0
  127. package/dist/esm/proof/rpc.js +17 -0
  128. package/dist/esm/proof/rpc.js.map +1 -0
  129. package/dist/esm/rpcStateManager.d.ts +162 -0
  130. package/dist/esm/rpcStateManager.d.ts.map +1 -0
  131. package/dist/esm/rpcStateManager.js +308 -0
  132. package/dist/esm/rpcStateManager.js.map +1 -0
  133. package/dist/esm/simpleStateManager.d.ts +54 -0
  134. package/dist/esm/simpleStateManager.d.ts.map +1 -0
  135. package/dist/esm/simpleStateManager.js +121 -0
  136. package/dist/esm/simpleStateManager.js.map +1 -0
  137. package/dist/esm/statefulBinaryTreeStateManager.d.ts +69 -0
  138. package/dist/esm/statefulBinaryTreeStateManager.d.ts.map +1 -0
  139. package/dist/esm/statefulBinaryTreeStateManager.js +572 -0
  140. package/dist/esm/statefulBinaryTreeStateManager.js.map +1 -0
  141. package/dist/esm/types.d.ts +92 -0
  142. package/dist/esm/types.d.ts.map +1 -0
  143. package/dist/esm/types.js +2 -0
  144. package/dist/esm/types.js.map +1 -0
  145. package/dist/esm/util.d.ts +4 -0
  146. package/dist/esm/util.d.ts.map +1 -0
  147. package/dist/esm/util.js +18 -0
  148. package/dist/esm/util.js.map +1 -0
  149. package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
  150. package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
  151. package/package.json +74 -0
  152. package/src/cache/account.ts +277 -0
  153. package/src/cache/cache.ts +35 -0
  154. package/src/cache/caches.ts +125 -0
  155. package/src/cache/code.ts +277 -0
  156. package/src/cache/index.ts +6 -0
  157. package/src/cache/originalStorageCache.ts +57 -0
  158. package/src/cache/storage.ts +369 -0
  159. package/src/cache/types.ts +38 -0
  160. package/src/index.ts +7 -0
  161. package/src/merkleStateManager.ts +737 -0
  162. package/src/proof/index.ts +2 -0
  163. package/src/proof/merkle.ts +264 -0
  164. package/src/proof/rpc.ts +24 -0
  165. package/src/rpcStateManager.ts +381 -0
  166. package/src/simpleStateManager.ts +154 -0
  167. package/src/statefulBinaryTreeStateManager.ts +789 -0
  168. package/src/types.ts +103 -0
  169. package/src/util.ts +28 -0
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RPCBlockChain = exports.RPCStateManager = void 0;
4
+ const common_1 = require("@feelyourprotocol/common");
5
+ const rlp_1 = require("@feelyourprotocol/rlp");
6
+ const util_1 = require("@feelyourprotocol/util");
7
+ const sha3_js_1 = require("@noble/hashes/sha3.js");
8
+ const debug_1 = require("debug");
9
+ const index_ts_1 = require("./cache/index.js");
10
+ const util_ts_1 = require("./util.js");
11
+ const KECCAK256_RLP_EMPTY_ACCOUNT = rlp_1.RLP.encode(new util_1.Account().serialize()).slice(2);
12
+ class RPCStateManager {
13
+ constructor(opts) {
14
+ /**
15
+ * @deprecated This method is not used by the RPC State Manager and is a stub required by the State Manager interface
16
+ */
17
+ this.getStateRoot = async () => {
18
+ return new Uint8Array(32);
19
+ };
20
+ /**
21
+ * @deprecated This method is not used by the RPC State Manager and is a stub required by the State Manager interface
22
+ */
23
+ this.setStateRoot = async (_root) => { };
24
+ /**
25
+ * @deprecated This method is not used by the RPC State Manager and is a stub required by the State Manager interface
26
+ */
27
+ this.hasStateRoot = () => {
28
+ throw (0, util_1.EthereumJSErrorWithoutCode)('function not implemented');
29
+ };
30
+ // Skip DEBUG calls unless 'ethjs' included in environmental DEBUG variables
31
+ this.DEBUG = (0, util_1.isDebugEnabled)('ethjs');
32
+ this._debug = (0, debug_1.default)('statemanager:rpc');
33
+ if (typeof opts.provider === 'string' && opts.provider.startsWith('http')) {
34
+ this._provider = opts.provider;
35
+ }
36
+ else {
37
+ throw (0, util_1.EthereumJSErrorWithoutCode)(`valid RPC provider url required; got ${opts.provider}`);
38
+ }
39
+ this._blockTag = opts.blockTag === 'earliest' ? opts.blockTag : (0, util_1.bigIntToHex)(opts.blockTag);
40
+ this._caches = new index_ts_1.Caches({ storage: { size: 100000 }, code: { size: 100000 } });
41
+ this.originalStorageCache = new index_ts_1.OriginalStorageCache(this.getStorage.bind(this));
42
+ this.common = opts.common ?? new common_1.Common({ chain: common_1.Mainnet });
43
+ this.keccakFunction = opts.common?.customCrypto.keccak256 ?? sha3_js_1.keccak_256;
44
+ }
45
+ /**
46
+ * Note that the returned statemanager will share the same JSONRPCProvider as the original
47
+ *
48
+ * @returns RPCStateManager
49
+ */
50
+ shallowCopy() {
51
+ const newState = new RPCStateManager({
52
+ provider: this._provider,
53
+ blockTag: BigInt(this._blockTag),
54
+ });
55
+ newState._caches = new index_ts_1.Caches({ storage: { size: 100000 } });
56
+ return newState;
57
+ }
58
+ /**
59
+ * Sets the new block tag used when querying the provider and clears the
60
+ * internal cache.
61
+ * @param blockTag - the new block tag to use when querying the provider
62
+ */
63
+ setBlockTag(blockTag) {
64
+ this._blockTag = blockTag === 'earliest' ? blockTag : (0, util_1.bigIntToHex)(blockTag);
65
+ this.clearCaches();
66
+ if (this.DEBUG)
67
+ this._debug(`setting block tag to ${this._blockTag}`);
68
+ }
69
+ /**
70
+ * Clears the internal cache so all accounts, contract code, and storage slots will
71
+ * initially be retrieved from the provider
72
+ */
73
+ clearCaches() {
74
+ this._caches.clear();
75
+ }
76
+ /**
77
+ * Gets the code corresponding to the provided `address`.
78
+ * @param address - Address to get the `code` for
79
+ * @returns {Promise<Uint8Array>} - Resolves with the code corresponding to the provided address.
80
+ * Returns an empty `Uint8Array` if the account has no associated code.
81
+ */
82
+ async getCode(address) {
83
+ let codeBytes = this._caches.code?.get(address)?.code;
84
+ if (codeBytes !== undefined)
85
+ return codeBytes;
86
+ const code = await (0, util_1.fetchFromProvider)(this._provider, {
87
+ method: 'eth_getCode',
88
+ params: [address.toString(), this._blockTag],
89
+ });
90
+ codeBytes = (0, util_1.toBytes)(code);
91
+ this._caches.code?.put(address, codeBytes);
92
+ return codeBytes;
93
+ }
94
+ async getCodeSize(address) {
95
+ const contractCode = await this.getCode(address);
96
+ return contractCode.length;
97
+ }
98
+ /**
99
+ * Adds `value` to the state trie as code, and sets `codeHash` on the account
100
+ * corresponding to `address` to reference this.
101
+ * @param address - Address of the `account` to add the `code` for
102
+ * @param value - The value of the `code`
103
+ */
104
+ async putCode(address, value) {
105
+ // Store contract code in the cache
106
+ this._caches.code?.put(address, value);
107
+ }
108
+ /**
109
+ * Gets the storage value associated with the provided `address` and `key`. This method returns
110
+ * the shortest representation of the stored value.
111
+ * @param address - Address of the account to get the storage for
112
+ * @param key - Key in the account's storage to get the value for. Must be 32 bytes long.
113
+ * @returns {Uint8Array} - The storage value for the account
114
+ * corresponding to the provided address at the provided key.
115
+ * If this does not exist an empty `Uint8Array` is returned.
116
+ */
117
+ async getStorage(address, key) {
118
+ // Check storage slot in cache
119
+ if (key.length !== 32) {
120
+ throw (0, util_1.EthereumJSErrorWithoutCode)('Storage key must be 32 bytes long');
121
+ }
122
+ let value = this._caches.storage?.get(address, key);
123
+ if (value !== undefined) {
124
+ return value;
125
+ }
126
+ // Retrieve storage slot from provider if not found in cache
127
+ const storage = await (0, util_1.fetchFromProvider)(this._provider, {
128
+ method: 'eth_getStorageAt',
129
+ params: [address.toString(), (0, util_1.bytesToHex)(key), this._blockTag],
130
+ });
131
+ value = (0, util_1.toBytes)(storage);
132
+ await this.putStorage(address, key, value);
133
+ return value;
134
+ }
135
+ /**
136
+ * Adds value to the cache for the `account`
137
+ * corresponding to `address` at the provided `key`.
138
+ * @param address - Address to set a storage value for
139
+ * @param key - Key to set the value at. Must be 32 bytes long.
140
+ * @param value - Value to set at `key` for account corresponding to `address`.
141
+ * Cannot be more than 32 bytes. Leading zeros are stripped.
142
+ * If it is empty or filled with zeros, deletes the value.
143
+ */
144
+ async putStorage(address, key, value) {
145
+ this._caches.storage?.put(address, key, value);
146
+ }
147
+ /**
148
+ * Clears all storage entries for the account corresponding to `address`.
149
+ * @param address - Address to clear the storage of
150
+ */
151
+ async clearStorage(address) {
152
+ this._caches.storage?.clearStorage(address);
153
+ }
154
+ /**
155
+ * Dumps the RLP-encoded storage values for an `account` specified by `address`.
156
+ * @param address - The address of the `account` to return storage for
157
+ * @returns {Promise<StorageDump>} - The state of the account as an `Object` map.
158
+ * Keys are the storage keys, values are the storage values as strings.
159
+ * Both are represented as `0x` prefixed hex strings.
160
+ */
161
+ dumpStorage(address) {
162
+ const storageMap = this._caches.storage?.dump(address);
163
+ const dump = {};
164
+ if (storageMap !== undefined) {
165
+ for (const slot of storageMap) {
166
+ dump[slot[0]] = (0, util_1.bytesToHex)(slot[1]);
167
+ }
168
+ }
169
+ return Promise.resolve(dump);
170
+ }
171
+ /**
172
+ * Gets the account associated with `address` or `undefined` if account does not exist
173
+ * @param address - Address of the `account` to get
174
+ */
175
+ async getAccount(address) {
176
+ const elem = this._caches.account?.get(address);
177
+ if (elem !== undefined) {
178
+ return elem.accountRLP !== undefined ? (0, util_1.createAccountFromRLP)(elem.accountRLP) : undefined;
179
+ }
180
+ const accountFromProvider = await this.getAccountFromProvider(address);
181
+ const account = (0, util_1.equalsBytes)(accountFromProvider.codeHash, new Uint8Array(32)) ||
182
+ (0, util_1.equalsBytes)(accountFromProvider.serialize(), KECCAK256_RLP_EMPTY_ACCOUNT)
183
+ ? undefined
184
+ : (0, util_1.createAccountFromRLP)(accountFromProvider.serialize());
185
+ this._caches.account?.put(address, account);
186
+ return account;
187
+ }
188
+ /**
189
+ * Retrieves an account from the provider and stores in the local trie
190
+ * @param address Address of account to be retrieved from provider
191
+ * @private
192
+ */
193
+ async getAccountFromProvider(address) {
194
+ if (this.DEBUG)
195
+ this._debug(`retrieving account data from ${address.toString()} from provider`);
196
+ const accountData = await (0, util_1.fetchFromProvider)(this._provider, {
197
+ method: 'eth_getProof',
198
+ params: [address.toString(), [], this._blockTag],
199
+ });
200
+ const account = (0, util_1.createAccount)({
201
+ balance: BigInt(accountData.balance),
202
+ nonce: BigInt(accountData.nonce),
203
+ codeHash: (0, util_1.toBytes)(accountData.codeHash),
204
+ storageRoot: (0, util_1.toBytes)(accountData.storageHash),
205
+ });
206
+ return account;
207
+ }
208
+ /**
209
+ * Saves an account into state under the provided `address`.
210
+ * @param address - Address under which to store `account`
211
+ * @param account - The account to store
212
+ */
213
+ async putAccount(address, account) {
214
+ if (this.DEBUG) {
215
+ this._debug(`Save account address=${address} nonce=${account?.nonce} balance=${account?.balance} contract=${account && account.isContract() ? 'yes' : 'no'} empty=${account && account.isEmpty() ? 'yes' : 'no'}`);
216
+ }
217
+ if (account !== undefined) {
218
+ this._caches.account.put(address, account);
219
+ }
220
+ else {
221
+ this._caches.account.del(address);
222
+ }
223
+ }
224
+ /**
225
+ * Gets the account associated with `address`, modifies the given account
226
+ * fields, then saves the account into state. Account fields can include
227
+ * `nonce`, `balance`, `storageRoot`, and `codeHash`.
228
+ * @param address - Address of the account to modify
229
+ * @param accountFields - Object containing account fields and values to modify
230
+ */
231
+ async modifyAccountFields(address, accountFields) {
232
+ if (this.DEBUG) {
233
+ this._debug(`modifying account fields for ${address.toString()}`);
234
+ this._debug(JSON.stringify(accountFields, (k, v) => {
235
+ if (k === 'nonce')
236
+ return v.toString();
237
+ return v;
238
+ }, 2));
239
+ }
240
+ await (0, util_ts_1.modifyAccountFields)(this, address, accountFields);
241
+ }
242
+ /**
243
+ * Deletes an account from state under the provided `address`.
244
+ * @param address - Address of the account which should be deleted
245
+ */
246
+ async deleteAccount(address) {
247
+ if (this.DEBUG) {
248
+ this._debug(`deleting account corresponding to ${address.toString()}`);
249
+ }
250
+ this._caches.account?.del(address);
251
+ }
252
+ /**
253
+ * Returns the applied key for a given address
254
+ * Used for saving preimages
255
+ * @param address - The address to return the applied key
256
+ * @returns {Uint8Array} - The applied key (e.g. hashed address)
257
+ */
258
+ getAppliedKey(address) {
259
+ return this.keccakFunction(address);
260
+ }
261
+ /**
262
+ * Checkpoints the current state of the StateManager instance.
263
+ * State changes that follow can then be committed by calling
264
+ * `commit` or `reverted` by calling rollback.
265
+ */
266
+ async checkpoint() {
267
+ this._caches.checkpoint();
268
+ }
269
+ /**
270
+ * Commits the current change-set to the instance since the
271
+ * last call to checkpoint.
272
+ *
273
+ * Partial implementation, called from the subclass.
274
+ */
275
+ async commit() {
276
+ // setup cache checkpointing
277
+ this._caches.account?.commit();
278
+ }
279
+ /**
280
+ * Reverts the current change-set to the instance since the
281
+ * last call to checkpoint.
282
+ *
283
+ * Partial implementation , called from the subclass.
284
+ */
285
+ async revert() {
286
+ this._caches.revert();
287
+ }
288
+ async flush() {
289
+ this._caches.account?.flush();
290
+ }
291
+ }
292
+ exports.RPCStateManager = RPCStateManager;
293
+ class RPCBlockChain {
294
+ constructor(provider) {
295
+ if (provider === undefined || provider === '')
296
+ throw (0, util_1.EthereumJSErrorWithoutCode)('provider URL is required');
297
+ this.provider = provider;
298
+ }
299
+ async getBlock(blockId) {
300
+ const block = await (0, util_1.fetchFromProvider)(this.provider, {
301
+ method: 'eth_getBlockByNumber',
302
+ params: [(0, util_1.intToHex)(blockId), false],
303
+ });
304
+ return {
305
+ hash: () => (0, util_1.hexToBytes)(block.hash),
306
+ };
307
+ }
308
+ shallowCopy() {
309
+ return this;
310
+ }
311
+ }
312
+ exports.RPCBlockChain = RPCBlockChain;
313
+ //# sourceMappingURL=rpcStateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpcStateManager.js","sourceRoot":"","sources":["../../src/rpcStateManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { Account } from '@feelyourprotocol/util';
2
+ import type { AccountFields, Common, StateManagerInterface } from '@feelyourprotocol/common';
3
+ import type { Address, PrefixedHexString } from '@feelyourprotocol/util';
4
+ import type { SimpleStateManagerOpts } from './index.ts';
5
+ /**
6
+ * Simple and dependency-free state manager for basic state access use cases
7
+ * where a merkle-patricia or binary tree backed state manager is too heavy-weight.
8
+ *
9
+ * This state manager comes with the basic state access logic for
10
+ * accounts, storage and code (put* and get* methods) as well as a simple
11
+ * implementation of checkpointing but lacks methods implementations of
12
+ * state root related logic as well as some other non-core functions.
13
+ *
14
+ * Functionality provided is sufficient to be used for simple EVM use
15
+ * cases and the state manager is used as default there.
16
+ *
17
+ * For a more full fledged and MPT-backed state manager implementation
18
+ * have a look at the [`@feelyourprotocol/statemanager` package docs](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/docs/README.md).
19
+ */
20
+ export declare class SimpleStateManager implements StateManagerInterface {
21
+ accountStack: Map<PrefixedHexString, Account | undefined>[];
22
+ codeStack: Map<PrefixedHexString, Uint8Array>[];
23
+ storageStack: Map<string, Uint8Array>[];
24
+ originalStorageCache: {
25
+ get(address: Address, key: Uint8Array): Promise<Uint8Array>;
26
+ clear(): void;
27
+ };
28
+ readonly common?: Common;
29
+ constructor(opts?: SimpleStateManagerOpts);
30
+ protected topAccountStack(): Map<`0x${string}`, Account | undefined>;
31
+ protected topCodeStack(): Map<`0x${string}`, Uint8Array<ArrayBufferLike>>;
32
+ protected topStorageStack(): Map<string, Uint8Array<ArrayBufferLike>>;
33
+ protected checkpointSync(): void;
34
+ getAccount(address: Address): Promise<Account | undefined>;
35
+ putAccount(address: Address, account?: Account | undefined): Promise<void>;
36
+ deleteAccount(address: Address): Promise<void>;
37
+ modifyAccountFields(address: Address, accountFields: AccountFields): Promise<void>;
38
+ getCode(address: Address): Promise<Uint8Array>;
39
+ putCode(address: Address, value: Uint8Array): Promise<void>;
40
+ getCodeSize(address: Address): Promise<number>;
41
+ getStorage(address: Address, key: Uint8Array): Promise<Uint8Array>;
42
+ putStorage(address: Address, key: Uint8Array, value: Uint8Array): Promise<void>;
43
+ clearStorage(): Promise<void>;
44
+ checkpoint(): Promise<void>;
45
+ commit(): Promise<void>;
46
+ revert(): Promise<void>;
47
+ flush(): Promise<void>;
48
+ clearCaches(): void;
49
+ shallowCopy(): StateManagerInterface;
50
+ getStateRoot(): Promise<Uint8Array>;
51
+ setStateRoot(): Promise<void>;
52
+ hasStateRoot(): Promise<boolean>;
53
+ }
54
+ //# sourceMappingURL=simpleStateManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleStateManager.d.ts","sourceRoot":"","sources":["../../src/simpleStateManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA0C,MAAM,kBAAkB,CAAA;AAMlF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AACtF,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAExD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,kBAAmB,YAAW,qBAAqB;IACvD,YAAY,EAAE,GAAG,CAAC,iBAAiB,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE,CAAK;IAChE,SAAS,EAAE,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,EAAE,CAAK;IACpD,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAK;IAEnD,oBAAoB,EAAE;QACpB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;QAC3D,KAAK,IAAI,IAAI,CAAA;KACd,CAAA;IAED,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAA;gBAEnB,IAAI,GAAE,sBAA2B;IAM7C,SAAS,CAAC,eAAe;IAGzB,SAAS,CAAC,YAAY;IAGtB,SAAS,CAAC,eAAe;IAKzB,SAAS,CAAC,cAAc;IAclB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAI1D,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1E,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlF,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAI9C,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9C,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAMlE,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/E,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAE7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAG3B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAMvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAMvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAC5B,WAAW,IAAI,IAAI;IAEnB,WAAW,IAAI,qBAAqB;IAWpC,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAGnC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAG7B,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAGjC"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SimpleStateManager = void 0;
4
+ const util_1 = require("@feelyourprotocol/util");
5
+ const sha3_js_1 = require("@noble/hashes/sha3.js");
6
+ const originalStorageCache_ts_1 = require("./cache/originalStorageCache.js");
7
+ const util_ts_1 = require("./util.js");
8
+ /**
9
+ * Simple and dependency-free state manager for basic state access use cases
10
+ * where a merkle-patricia or binary tree backed state manager is too heavy-weight.
11
+ *
12
+ * This state manager comes with the basic state access logic for
13
+ * accounts, storage and code (put* and get* methods) as well as a simple
14
+ * implementation of checkpointing but lacks methods implementations of
15
+ * state root related logic as well as some other non-core functions.
16
+ *
17
+ * Functionality provided is sufficient to be used for simple EVM use
18
+ * cases and the state manager is used as default there.
19
+ *
20
+ * For a more full fledged and MPT-backed state manager implementation
21
+ * have a look at the [`@feelyourprotocol/statemanager` package docs](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/docs/README.md).
22
+ */
23
+ class SimpleStateManager {
24
+ constructor(opts = {}) {
25
+ this.accountStack = [];
26
+ this.codeStack = [];
27
+ this.storageStack = [];
28
+ this.checkpointSync();
29
+ this.originalStorageCache = new originalStorageCache_ts_1.OriginalStorageCache(this.getStorage.bind(this));
30
+ this.common = opts.common;
31
+ }
32
+ topAccountStack() {
33
+ return this.accountStack[this.accountStack.length - 1];
34
+ }
35
+ topCodeStack() {
36
+ return this.codeStack[this.codeStack.length - 1];
37
+ }
38
+ topStorageStack() {
39
+ return this.storageStack[this.storageStack.length - 1];
40
+ }
41
+ // Synchronous version of checkpoint() to allow to call from constructor
42
+ checkpointSync() {
43
+ const newTopA = new Map(this.topAccountStack());
44
+ for (const [address, account] of newTopA) {
45
+ const accountCopy = account !== undefined
46
+ ? Object.assign(Object.create(Object.getPrototypeOf(account)), account)
47
+ : undefined;
48
+ newTopA.set(address, accountCopy);
49
+ }
50
+ this.accountStack.push(newTopA);
51
+ this.codeStack.push(new Map(this.topCodeStack()));
52
+ this.storageStack.push(new Map(this.topStorageStack()));
53
+ }
54
+ async getAccount(address) {
55
+ return this.topAccountStack().get(address.toString());
56
+ }
57
+ async putAccount(address, account) {
58
+ this.topAccountStack().set(address.toString(), account);
59
+ }
60
+ async deleteAccount(address) {
61
+ this.topAccountStack().set(address.toString(), undefined);
62
+ }
63
+ async modifyAccountFields(address, accountFields) {
64
+ await (0, util_ts_1.modifyAccountFields)(this, address, accountFields);
65
+ }
66
+ async getCode(address) {
67
+ return this.topCodeStack().get(address.toString()) ?? new Uint8Array(0);
68
+ }
69
+ async putCode(address, value) {
70
+ this.topCodeStack().set(address.toString(), value);
71
+ if ((await this.getAccount(address)) === undefined) {
72
+ await this.putAccount(address, new util_1.Account());
73
+ }
74
+ await this.modifyAccountFields(address, {
75
+ codeHash: (this.common?.customCrypto.keccak256 ?? sha3_js_1.keccak_256)(value),
76
+ });
77
+ }
78
+ async getCodeSize(address) {
79
+ const contractCode = await this.getCode(address);
80
+ return contractCode.length;
81
+ }
82
+ async getStorage(address, key) {
83
+ return (this.topStorageStack().get(`${address.toString()}_${(0, util_1.bytesToHex)(key)}`) ?? new Uint8Array(0));
84
+ }
85
+ async putStorage(address, key, value) {
86
+ this.topStorageStack().set(`${address.toString()}_${(0, util_1.bytesToHex)(key)}`, value);
87
+ }
88
+ async clearStorage() { }
89
+ async checkpoint() {
90
+ this.checkpointSync();
91
+ }
92
+ async commit() {
93
+ this.accountStack.splice(-2, 1);
94
+ this.codeStack.splice(-2, 1);
95
+ this.storageStack.splice(-2, 1);
96
+ }
97
+ async revert() {
98
+ this.accountStack.pop();
99
+ this.codeStack.pop();
100
+ this.storageStack.pop();
101
+ }
102
+ async flush() { }
103
+ clearCaches() { }
104
+ shallowCopy() {
105
+ const copy = new SimpleStateManager({ common: this.common });
106
+ for (let i = 0; i < this.accountStack.length; i++) {
107
+ copy.accountStack.push(new Map(this.accountStack[i]));
108
+ copy.codeStack.push(new Map(this.codeStack[i]));
109
+ copy.storageStack.push(new Map(this.storageStack[i]));
110
+ }
111
+ return copy;
112
+ }
113
+ // State root functionality not implemented
114
+ getStateRoot() {
115
+ throw (0, util_1.EthereumJSErrorWithoutCode)('Method not implemented.');
116
+ }
117
+ setStateRoot() {
118
+ throw (0, util_1.EthereumJSErrorWithoutCode)('Method not implemented.');
119
+ }
120
+ hasStateRoot() {
121
+ throw (0, util_1.EthereumJSErrorWithoutCode)('Method not implemented.');
122
+ }
123
+ }
124
+ exports.SimpleStateManager = SimpleStateManager;
125
+ //# sourceMappingURL=simpleStateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleStateManager.js","sourceRoot":"","sources":["../../src/simpleStateManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { BinaryTree } from '@feelyourprotocol/binarytree';
2
+ import type { Address, BinaryTreeExecutionWitness, PrefixedHexString } from '@feelyourprotocol/util';
3
+ import { Account } from '@feelyourprotocol/util';
4
+ import { OriginalStorageCache } from './cache/originalStorageCache.ts';
5
+ import type { AccountFields, BinaryTreeAccessWitnessInterface, BinaryTreeAccessedStateWithAddress, GenesisState, StateManagerInterface, StorageDump, StorageRange } from '@feelyourprotocol/common';
6
+ import type { Debugger } from 'debug';
7
+ import type { Caches } from './cache/caches.ts';
8
+ import type { StatefulBinaryTreeStateManagerOpts } from './types.ts';
9
+ export declare class StatefulBinaryTreeStateManager implements StateManagerInterface {
10
+ protected _debug: Debugger;
11
+ protected _caches?: Caches;
12
+ preStateRoot: Uint8Array;
13
+ originalStorageCache: OriginalStorageCache;
14
+ hashFunction: (input: Uint8Array) => Uint8Array;
15
+ protected _tree: BinaryTree;
16
+ protected _checkpointCount: number;
17
+ private _postState;
18
+ /**
19
+ * StateManager is run in DEBUG mode (default: false)
20
+ * Taken from DEBUG environment variable
21
+ *
22
+ * Safeguards on debug() calls are added for
23
+ * performance reasons to avoid string literal evaluation
24
+ * @hidden
25
+ */
26
+ protected readonly DEBUG: boolean;
27
+ private keccakFunction;
28
+ constructor(opts: StatefulBinaryTreeStateManagerOpts);
29
+ /**
30
+ * Gets the account associated with `address` or `undefined` if account does not exist
31
+ * @param address - Address of the `account` to get
32
+ */
33
+ getAccount: (address: Address) => Promise<Account | undefined>;
34
+ initBinaryTreeExecutionWitness(_blockNum: bigint, executionWitness?: BinaryTreeExecutionWitness | null): void;
35
+ /**
36
+ * Saves an account into state under the provided `address`.
37
+ * @param address - Address under which to store `account`
38
+ * @param account - The account to store or undefined if to be deleted
39
+ */
40
+ putAccount: (address: Address, account?: Account) => Promise<void>;
41
+ /**
42
+ * Deletes an account from state under the provided `address`.
43
+ * @param address - Address of the account which should be deleted
44
+ */
45
+ deleteAccount: (address: Address) => Promise<void>;
46
+ modifyAccountFields: (address: Address, accountFields: AccountFields) => Promise<void>;
47
+ putCode: (address: Address, value: Uint8Array) => Promise<void>;
48
+ getCode: (address: Address) => Promise<Uint8Array>;
49
+ getCodeSize: (address: Address) => Promise<number>;
50
+ getStorage: (address: Address, key: Uint8Array) => Promise<Uint8Array>;
51
+ putStorage: (address: Address, key: Uint8Array, value: Uint8Array) => Promise<void>;
52
+ clearStorage: (address: Address) => Promise<void>;
53
+ checkpoint: () => Promise<void>;
54
+ commit: () => Promise<void>;
55
+ revert: () => Promise<void>;
56
+ flush: () => Promise<void>;
57
+ getComputedValue(accessedState: BinaryTreeAccessedStateWithAddress): Promise<PrefixedHexString | null>;
58
+ verifyBinaryTreePostState(accessWitness: BinaryTreeAccessWitnessInterface): Promise<boolean>;
59
+ getStateRoot(): Promise<Uint8Array>;
60
+ setStateRoot(stateRoot: Uint8Array, clearCache?: boolean): Promise<void>;
61
+ hasStateRoot(root: Uint8Array): Promise<boolean>;
62
+ dumpStorage?(_address: Address): Promise<StorageDump>;
63
+ dumpStorageRange?(_address: Address, _startKey: bigint, _limit: number): Promise<StorageRange>;
64
+ clearCaches(): void;
65
+ shallowCopy(_downlevelCaches?: boolean): StateManagerInterface;
66
+ checkChunkWitnessPresent(_address: Address, _codeOffset: number): Promise<boolean>;
67
+ generateCanonicalGenesis(genesisState: GenesisState): Promise<void>;
68
+ }
69
+ //# sourceMappingURL=statefulBinaryTreeStateManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statefulBinaryTreeStateManager.d.ts","sourceRoot":"","sources":["../../src/statefulBinaryTreeStateManager.ts"],"names":[],"mappings":"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"}