@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,103 @@
1
+ import { AccountCache } from "./account.js";
2
+ import { CodeCache } from "./code.js";
3
+ import { StorageCache } from "./storage.js";
4
+ import { CacheType } from "./types.js";
5
+ export class Caches {
6
+ constructor(opts = {}) {
7
+ const accountSettings = {
8
+ type: opts.account?.type ?? CacheType.ORDERED_MAP,
9
+ size: opts.account?.size ?? 100000,
10
+ };
11
+ const codeSettings = {
12
+ type: opts.code?.type ?? CacheType.ORDERED_MAP,
13
+ size: opts.code?.size ?? 20000,
14
+ };
15
+ const storageSettings = {
16
+ type: opts.storage?.type ?? CacheType.ORDERED_MAP,
17
+ size: opts.storage?.size ?? 20000,
18
+ };
19
+ this.settings = {
20
+ account: accountSettings,
21
+ code: codeSettings,
22
+ storage: storageSettings,
23
+ };
24
+ if (this.settings.account.size !== 0) {
25
+ this.account = new AccountCache({
26
+ size: this.settings.account.size,
27
+ type: this.settings.account.type,
28
+ });
29
+ }
30
+ if (this.settings.code.size !== 0) {
31
+ this.code = new CodeCache({
32
+ size: this.settings.code.size,
33
+ type: this.settings.code.type,
34
+ });
35
+ }
36
+ if (this.settings.storage.size !== 0) {
37
+ this.storage = new StorageCache({
38
+ size: this.settings.storage.size,
39
+ type: this.settings.storage.type,
40
+ });
41
+ }
42
+ }
43
+ checkpoint() {
44
+ this.account?.checkpoint();
45
+ this.storage?.checkpoint();
46
+ this.code?.checkpoint();
47
+ }
48
+ clear() {
49
+ this.account?.clear();
50
+ this.storage?.clear();
51
+ this.code?.clear();
52
+ }
53
+ commit() {
54
+ this.account?.commit();
55
+ this.storage?.commit();
56
+ this.code?.commit();
57
+ }
58
+ deleteAccount(address) {
59
+ this.code?.del(address);
60
+ this.account?.del(address);
61
+ this.storage?.clearStorage(address);
62
+ }
63
+ shallowCopy(downlevelCaches) {
64
+ let cacheOptions;
65
+ // Account cache options
66
+ if (this.settings.account.size !== 0) {
67
+ cacheOptions = {
68
+ account: downlevelCaches
69
+ ? { size: this.settings.account.size, type: CacheType.ORDERED_MAP }
70
+ : this.settings.account,
71
+ };
72
+ }
73
+ // Storage cache options
74
+ if (this.settings.storage.size !== 0) {
75
+ cacheOptions = {
76
+ ...cacheOptions,
77
+ storage: downlevelCaches
78
+ ? { size: this.settings.storage.size, type: CacheType.ORDERED_MAP }
79
+ : this.settings.storage,
80
+ };
81
+ }
82
+ // Code cache options
83
+ if (this.settings.code.size !== 0) {
84
+ cacheOptions = {
85
+ ...cacheOptions,
86
+ code: downlevelCaches
87
+ ? { size: this.settings.code.size, type: CacheType.ORDERED_MAP }
88
+ : this.settings.code,
89
+ };
90
+ }
91
+ if (cacheOptions !== undefined) {
92
+ return new Caches(cacheOptions);
93
+ }
94
+ else
95
+ return undefined;
96
+ }
97
+ revert() {
98
+ this.account?.revert();
99
+ this.storage?.revert();
100
+ this.code?.revert();
101
+ }
102
+ }
103
+ //# sourceMappingURL=caches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caches.js","sourceRoot":"","sources":["../../../src/cache/caches.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { OrderedMap } from '@js-sdsl/ordered-map';
2
+ import { LRUCache } from 'lru-cache';
3
+ import { Cache } from './cache.ts';
4
+ import type { Address } from '@feelyourprotocol/util';
5
+ import type { CacheOpts } from './types.ts';
6
+ /**
7
+ * Represents a cached code element.
8
+ */
9
+ type CodeCacheElement = {
10
+ code: Uint8Array | undefined;
11
+ };
12
+ export declare class CodeCache extends Cache {
13
+ _lruCache: LRUCache<string, CodeCacheElement> | undefined;
14
+ _orderedMapCache: OrderedMap<string, CodeCacheElement> | undefined;
15
+ /**
16
+ * Diff cache collecting the state of the cache
17
+ * at the beginning of checkpoint height
18
+ * (respectively: before a first modification)
19
+ *
20
+ * If the whole cache element is undefined (in contrast
21
+ * to the code), the element didn't exist in the cache
22
+ * before.
23
+ */
24
+ _diffCache: Map<string, CodeCacheElement | undefined>[];
25
+ constructor(opts: CacheOpts);
26
+ /**
27
+ * Saves the state of the code cache before making changes to it.
28
+ *
29
+ * @param cacheKeyHex Account key for which code is being modified.
30
+ */
31
+ _saveCachePreState(cacheKeyHex: string): void;
32
+ /**
33
+ * Puts code into the cache under its hash.
34
+ *
35
+ * @param address - Address of account code is being modified for.
36
+ * @param code - Bytecode or undefined if code doesn't exist.
37
+ */
38
+ put(address: Address, code: Uint8Array | undefined): void;
39
+ /**
40
+ * Returns the queried code or undefined if it doesn't exist.
41
+ *
42
+ * @param address - Account address for which code is being fetched.
43
+ */
44
+ get(address: Address): CodeCacheElement | undefined;
45
+ /**
46
+ * Marks code as deleted in the cache.
47
+ *
48
+ * @param address - Account address for which code is being fetched.
49
+ */
50
+ del(address: Address): void;
51
+ /**
52
+ * Flushes the cache by returning codes that have been modified
53
+ * or deleted and resetting the diff cache (at checkpoint height).
54
+ */
55
+ flush(): [string, CodeCacheElement][];
56
+ /**
57
+ * Revert changes to the cache to the last checkpoint (no effect on trie).
58
+ */
59
+ revert(): void;
60
+ /**
61
+ * Commits the current state of the cache (no effect on trie).
62
+ */
63
+ commit(): void;
64
+ /**
65
+ * Marks the current state of the cache as a checkpoint, which can
66
+ * later be reverted or committed.
67
+ */
68
+ checkpoint(): void;
69
+ /**
70
+ * Returns the size of the cache
71
+ * @returns
72
+ */
73
+ size(): number;
74
+ /**
75
+ * Returns a dictionary with cache statistics.
76
+ *
77
+ * @param reset - Whether to reset statistics after retrieval.
78
+ * @returns A dictionary with cache statistics.
79
+ */
80
+ stats(reset?: boolean): any;
81
+ /**
82
+ * Clears the cache.
83
+ */
84
+ clear(): void;
85
+ }
86
+ export {};
87
+ //# sourceMappingURL=code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../../src/cache/code.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGlC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C;;GAEG;AACH,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;CAC7B,CAAA;AAED,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAA;IACzD,gBAAgB,EAAE,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAA;IAElE;;;;;;;;OAQG;IACH,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC,EAAE,CAAK;gBAEhD,IAAI,EAAE,SAAS;IAe3B;;;;OAIG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM;IAatC;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI;IAmBzD;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS;IAoBnD;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAoB3B;;;OAGG;IACH,KAAK,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE;IA0BrC;;OAEG;IACH,MAAM,IAAI,IAAI;IAyBd;;OAEG;IACH,MAAM,IAAI,IAAI;IAgBd;;;OAGG;IACH,UAAU,IAAI,IAAI;IAQlB;;;OAGG;IACH,IAAI;IAQJ;;;;;OAKG;IACH,KAAK,CAAC,KAAK,UAAO,GAAG,GAAG;IAexB;;OAEG;IACH,KAAK,IAAI,IAAI;CAUd"}
@@ -0,0 +1,254 @@
1
+ import { bytesToUnprefixedHex } from '@feelyourprotocol/util';
2
+ import { OrderedMap } from '@js-sdsl/ordered-map';
3
+ import debugDefault from 'debug';
4
+ import { LRUCache } from 'lru-cache';
5
+ import { Cache } from "./cache.js";
6
+ import { CacheType } from "./types.js";
7
+ export class CodeCache extends Cache {
8
+ constructor(opts) {
9
+ super();
10
+ /**
11
+ * Diff cache collecting the state of the cache
12
+ * at the beginning of checkpoint height
13
+ * (respectively: before a first modification)
14
+ *
15
+ * If the whole cache element is undefined (in contrast
16
+ * to the code), the element didn't exist in the cache
17
+ * before.
18
+ */
19
+ this._diffCache = [];
20
+ if (opts.type === CacheType.LRU) {
21
+ this._lruCache = new LRUCache({
22
+ max: opts.size,
23
+ updateAgeOnGet: true,
24
+ });
25
+ }
26
+ else {
27
+ this._orderedMapCache = new OrderedMap();
28
+ }
29
+ this._diffCache.push(new Map());
30
+ this._debug = debugDefault('statemanager:cache:code');
31
+ }
32
+ /**
33
+ * Saves the state of the code cache before making changes to it.
34
+ *
35
+ * @param cacheKeyHex Account key for which code is being modified.
36
+ */
37
+ _saveCachePreState(cacheKeyHex) {
38
+ const diffMap = this._diffCache[this._checkpoints];
39
+ if (!diffMap.has(cacheKeyHex)) {
40
+ let oldElem;
41
+ if (this._lruCache) {
42
+ oldElem = this._lruCache.get(cacheKeyHex);
43
+ }
44
+ else {
45
+ oldElem = this._orderedMapCache.getElementByKey(cacheKeyHex);
46
+ }
47
+ diffMap.set(cacheKeyHex, oldElem);
48
+ }
49
+ }
50
+ /**
51
+ * Puts code into the cache under its hash.
52
+ *
53
+ * @param address - Address of account code is being modified for.
54
+ * @param code - Bytecode or undefined if code doesn't exist.
55
+ */
56
+ put(address, code) {
57
+ // Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
58
+ const addressHex = bytesToUnprefixedHex(address.bytes);
59
+ this._saveCachePreState(addressHex);
60
+ const elem = {
61
+ code,
62
+ };
63
+ if (this.DEBUG) {
64
+ this._debug(`Put code ${addressHex}`);
65
+ }
66
+ if (this._lruCache) {
67
+ this._lruCache.set(addressHex, elem);
68
+ }
69
+ else {
70
+ this._orderedMapCache.setElement(addressHex, elem);
71
+ }
72
+ this._stats.writes += 1;
73
+ }
74
+ /**
75
+ * Returns the queried code or undefined if it doesn't exist.
76
+ *
77
+ * @param address - Account address for which code is being fetched.
78
+ */
79
+ get(address) {
80
+ // Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
81
+ const addressHex = bytesToUnprefixedHex(address.bytes);
82
+ if (this.DEBUG) {
83
+ this._debug(`Get code ${addressHex}`);
84
+ }
85
+ let elem;
86
+ if (this._lruCache) {
87
+ elem = this._lruCache.get(addressHex);
88
+ }
89
+ else {
90
+ elem = this._orderedMapCache.getElementByKey(addressHex);
91
+ }
92
+ this._stats.reads += 1;
93
+ if (elem) {
94
+ this._stats.hits += 1;
95
+ }
96
+ return elem;
97
+ }
98
+ /**
99
+ * Marks code as deleted in the cache.
100
+ *
101
+ * @param address - Account address for which code is being fetched.
102
+ */
103
+ del(address) {
104
+ // Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
105
+ const addressHex = bytesToUnprefixedHex(address.bytes);
106
+ this._saveCachePreState(addressHex);
107
+ if (this.DEBUG) {
108
+ this._debug(`Delete code ${addressHex}`);
109
+ }
110
+ if (this._lruCache) {
111
+ this._lruCache.set(addressHex, {
112
+ code: undefined,
113
+ });
114
+ }
115
+ else {
116
+ this._orderedMapCache.setElement(addressHex, {
117
+ code: undefined,
118
+ });
119
+ }
120
+ this._stats.deletions += 1;
121
+ }
122
+ /**
123
+ * Flushes the cache by returning codes that have been modified
124
+ * or deleted and resetting the diff cache (at checkpoint height).
125
+ */
126
+ flush() {
127
+ if (this.DEBUG) {
128
+ this._debug(`Flushing cache on checkpoint ${this._checkpoints}`);
129
+ }
130
+ const diffMap = this._diffCache[this._checkpoints];
131
+ const items = [];
132
+ for (const entry of diffMap.entries()) {
133
+ const cacheKeyHex = entry[0];
134
+ let elem;
135
+ if (this._lruCache) {
136
+ elem = this._lruCache.get(cacheKeyHex);
137
+ }
138
+ else {
139
+ elem = this._orderedMapCache.getElementByKey(cacheKeyHex);
140
+ }
141
+ if (elem !== undefined) {
142
+ items.push([cacheKeyHex, elem]);
143
+ }
144
+ }
145
+ this._diffCache[this._checkpoints] = new Map();
146
+ return items;
147
+ }
148
+ /**
149
+ * Revert changes to the cache to the last checkpoint (no effect on trie).
150
+ */
151
+ revert() {
152
+ this._checkpoints -= 1;
153
+ if (this.DEBUG) {
154
+ this._debug(`Revert to checkpoint ${this._checkpoints}`);
155
+ }
156
+ const diffMap = this._diffCache.pop();
157
+ for (const entry of diffMap.entries()) {
158
+ const addressHex = entry[0];
159
+ const elem = entry[1];
160
+ if (elem === undefined) {
161
+ if (this._lruCache) {
162
+ this._lruCache.delete(addressHex);
163
+ }
164
+ else {
165
+ this._orderedMapCache.eraseElementByKey(addressHex);
166
+ }
167
+ }
168
+ else {
169
+ if (this._lruCache) {
170
+ this._lruCache.set(addressHex, elem);
171
+ }
172
+ else {
173
+ this._orderedMapCache.setElement(addressHex, elem);
174
+ }
175
+ }
176
+ }
177
+ }
178
+ /**
179
+ * Commits the current state of the cache (no effect on trie).
180
+ */
181
+ commit() {
182
+ this._checkpoints -= 1;
183
+ if (this.DEBUG) {
184
+ this._debug(`Commit to checkpoint ${this._checkpoints}`);
185
+ }
186
+ const diffMap = this._diffCache.pop();
187
+ for (const entry of diffMap.entries()) {
188
+ const addressHex = entry[0];
189
+ const oldEntry = this._diffCache[this._checkpoints].has(addressHex);
190
+ if (!oldEntry) {
191
+ const elem = entry[1];
192
+ this._diffCache[this._checkpoints].set(addressHex, elem);
193
+ }
194
+ }
195
+ }
196
+ /**
197
+ * Marks the current state of the cache as a checkpoint, which can
198
+ * later be reverted or committed.
199
+ */
200
+ checkpoint() {
201
+ this._checkpoints += 1;
202
+ if (this.DEBUG) {
203
+ this._debug(`New checkpoint ${this._checkpoints}`);
204
+ }
205
+ this._diffCache.push(new Map());
206
+ }
207
+ /**
208
+ * Returns the size of the cache
209
+ * @returns
210
+ */
211
+ size() {
212
+ if (this._lruCache) {
213
+ return this._lruCache.size;
214
+ }
215
+ else {
216
+ return this._orderedMapCache.size();
217
+ }
218
+ }
219
+ /**
220
+ * Returns a dictionary with cache statistics.
221
+ *
222
+ * @param reset - Whether to reset statistics after retrieval.
223
+ * @returns A dictionary with cache statistics.
224
+ */
225
+ stats(reset = true) {
226
+ const stats = { ...this._stats };
227
+ stats.size = this.size();
228
+ if (reset) {
229
+ this._stats = {
230
+ size: 0,
231
+ reads: 0,
232
+ hits: 0,
233
+ writes: 0,
234
+ deletions: 0,
235
+ };
236
+ }
237
+ return stats;
238
+ }
239
+ /**
240
+ * Clears the cache.
241
+ */
242
+ clear() {
243
+ if (this.DEBUG) {
244
+ this._debug(`Clear cache`);
245
+ }
246
+ if (this._lruCache) {
247
+ this._lruCache.clear();
248
+ }
249
+ else {
250
+ this._orderedMapCache.clear();
251
+ }
252
+ }
253
+ }
254
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../../src/cache/code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,YAAY,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAYtC,MAAM,OAAO,SAAU,SAAQ,KAAK;IAelC,YAAY,IAAe;QACzB,KAAK,EAAE,CAAA;QAZT;;;;;;;;WAQG;QACH,eAAU,GAAgD,EAAE,CAAA;QAI1D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC;gBAC5B,GAAG,EAAE,IAAI,CAAC,IAAI;gBACd,cAAc,EAAE,IAAI;aACrB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,UAAU,EAAE,CAAA;QAC1C,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,EAAwC,CAAC,CAAA;QACrE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAA;IACvD,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,WAAmB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,IAAI,OAAqC,CAAA;YACzC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,IAAI,CAAC,gBAAiB,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;YAC/D,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,OAAgB,EAAE,IAA4B;QAChD,6FAA6F;QAC7F,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACtD,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;QACnC,MAAM,IAAI,GAAG;YACX,IAAI;SACL,CAAA;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,YAAY,UAAU,EAAE,CAAC,CAAA;QACvC,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAiB,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAA;IACzB,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,OAAgB;QAClB,6FAA6F;QAC7F,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACtD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,YAAY,UAAU,EAAE,CAAC,CAAA;QACvC,CAAC;QAED,IAAI,IAAkC,CAAA;QACtC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAC,gBAAiB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAA;QACtB,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,OAAgB;QAClB,6FAA6F;QAC7F,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACtD,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;QACnC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,eAAe,UAAU,EAAE,CAAC,CAAA;QAC1C,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC7B,IAAI,EAAE,SAAS;aAChB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAiB,CAAC,UAAU,CAAC,UAAU,EAAE;gBAC5C,IAAI,EAAE,SAAS;aAChB,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,gCAAgC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;QAClE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAElD,MAAM,KAAK,GAAiC,EAAE,CAAA;QAE9C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAC5B,IAAI,IAAkC,CAAA;YACtC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACxC,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,IAAI,CAAC,gBAAiB,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;YAC5D,CAAC;YAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAA;YACjC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG,EAAwC,CAAA;QACpF,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,YAAY,IAAI,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,wBAAwB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;QAC1D,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAG,CAAA;QACtC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YACrB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;gBACnC,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,gBAAiB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAA;gBACtD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;gBACtC,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,gBAAiB,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;gBACrD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,YAAY,IAAI,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,wBAAwB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;QAC1D,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAG,CAAA;QACtC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;gBACrB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,IAAI,CAAC,YAAY,IAAI,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,EAAwC,CAAC,CAAA;IACvE,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,SAAU,CAAC,IAAI,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,gBAAiB,CAAC,IAAI,EAAE,CAAA;QACtC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,GAAG,IAAI;QAChB,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QAChC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACxB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,GAAG;gBACZ,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;aACb,CAAA;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAiB,CAAC,KAAK,EAAE,CAAA;QAChC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export * from './account.ts';
2
+ export * from './caches.ts';
3
+ export * from './code.ts';
4
+ export * from './originalStorageCache.ts';
5
+ export * from './storage.ts';
6
+ export * from './types.ts';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA"}
@@ -0,0 +1,7 @@
1
+ export * from "./account.js";
2
+ export * from "./caches.js";
3
+ export * from "./code.js";
4
+ export * from "./originalStorageCache.js";
5
+ export * from "./storage.js";
6
+ export * from "./types.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA"}
@@ -0,0 +1,21 @@
1
+ import type { Address } from '@feelyourprotocol/util';
2
+ type getStorage = (address: Address, key: Uint8Array) => Promise<Uint8Array>;
3
+ /**
4
+ * Helper class to cache original storage values (so values already being present in
5
+ * the pre-state of a call), mainly for correct gas cost calculation in EVM/VM.
6
+ *
7
+ * TODO: Usage of this class is very implicit through the injected `getStorage()`
8
+ * method bound to the calling state manager. It should be examined if there are alternative
9
+ * designs being more transparent and direct along the next breaking release round.
10
+ *
11
+ */
12
+ export declare class OriginalStorageCache {
13
+ private map;
14
+ private getStorage;
15
+ constructor(getStorage: getStorage);
16
+ get(address: Address, key: Uint8Array): Promise<Uint8Array>;
17
+ put(address: Address, key: Uint8Array, value: Uint8Array): void;
18
+ clear(): void;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=originalStorageCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"originalStorageCache.d.ts","sourceRoot":"","sources":["../../../src/cache/originalStorageCache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE/C,KAAK,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;AAE5E;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAsC;IACjD,OAAO,CAAC,UAAU,CAAY;gBAClB,UAAU,EAAE,UAAU;IAK5B,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBjE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IAcxD,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,48 @@
1
+ import { bytesToUnprefixedHex } from '@feelyourprotocol/util';
2
+ /**
3
+ * Helper class to cache original storage values (so values already being present in
4
+ * the pre-state of a call), mainly for correct gas cost calculation in EVM/VM.
5
+ *
6
+ * TODO: Usage of this class is very implicit through the injected `getStorage()`
7
+ * method bound to the calling state manager. It should be examined if there are alternative
8
+ * designs being more transparent and direct along the next breaking release round.
9
+ *
10
+ */
11
+ export class OriginalStorageCache {
12
+ constructor(getStorage) {
13
+ this.map = new Map();
14
+ this.getStorage = getStorage;
15
+ }
16
+ async get(address, key) {
17
+ // Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
18
+ const addressHex = bytesToUnprefixedHex(address.bytes);
19
+ const map = this.map.get(addressHex);
20
+ if (map !== undefined) {
21
+ const keyHex = bytesToUnprefixedHex(key);
22
+ const value = map.get(keyHex);
23
+ if (value !== undefined) {
24
+ return value;
25
+ }
26
+ }
27
+ const value = await this.getStorage(address, key);
28
+ this.put(address, key, value);
29
+ return value;
30
+ }
31
+ put(address, key, value) {
32
+ // Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
33
+ const addressHex = bytesToUnprefixedHex(address.bytes);
34
+ let map = this.map.get(addressHex);
35
+ if (map === undefined) {
36
+ map = new Map();
37
+ this.map.set(addressHex, map);
38
+ }
39
+ const keyHex = bytesToUnprefixedHex(key);
40
+ if (map.has(keyHex) === false) {
41
+ map.set(keyHex, value);
42
+ }
43
+ }
44
+ clear() {
45
+ this.map = new Map();
46
+ }
47
+ }
48
+ //# sourceMappingURL=originalStorageCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"originalStorageCache.js","sourceRoot":"","sources":["../../../src/cache/originalStorageCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAMvD;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAG/B,YAAY,UAAsB;QAChC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAgB,EAAE,GAAe;QACzC,6FAA6F;QAC7F,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACpC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;YACxC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACjD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC7B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,GAAG,CAAC,OAAgB,EAAE,GAAe,EAAE,KAAiB;QACtD,6FAA6F;QAC7F,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACtD,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAClC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;QAC/B,CAAC;QACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,GAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;YAC/B,GAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;IACtB,CAAC;CACF"}
@@ -0,0 +1,101 @@
1
+ import { OrderedMap } from '@js-sdsl/ordered-map';
2
+ import { LRUCache } from 'lru-cache';
3
+ import { Cache } from './cache.ts';
4
+ import type { Address } from '@feelyourprotocol/util';
5
+ import type { CacheOpts } from './types.ts';
6
+ /**
7
+ * key -> storage mapping
8
+ *
9
+ * undefined: storage value is known not to exist in the cache
10
+ */
11
+ type DiffStorageCacheMap = Map<string, Uint8Array | undefined>;
12
+ type StorageCacheMap = Map<string, Uint8Array>;
13
+ export declare class StorageCache extends Cache {
14
+ _lruCache: LRUCache<string, StorageCacheMap> | undefined;
15
+ _orderedMapCache: OrderedMap<string, StorageCacheMap> | undefined;
16
+ /**
17
+ * Diff cache collecting the state of the cache
18
+ * at the beginning of checkpoint height
19
+ * (respectively: before a first modification)
20
+ *
21
+ * If the whole cache element is undefined (in contrast
22
+ * to the account), the element didn't exist in the cache
23
+ * before.
24
+ */
25
+ _diffCache: Map<string, DiffStorageCacheMap>[];
26
+ constructor(opts: CacheOpts);
27
+ _saveCachePreState(addressHex: string, keyHex: string): void;
28
+ /**
29
+ * Puts storage value to cache under address_key cache key.
30
+ * @param address - Account address
31
+ * @param key - Storage key
32
+ * @param val - RLP-encoded storage value
33
+ */
34
+ put(address: Address, key: Uint8Array, value: Uint8Array): void;
35
+ /**
36
+ * Returns the queried slot as the RLP encoded storage value
37
+ * hexToBytes('0x80'): slot is known to be empty
38
+ * undefined: slot is not in cache
39
+ * @param address - Address of account
40
+ * @param key - Storage key
41
+ * @returns Storage value or undefined
42
+ */
43
+ get(address: Address, key: Uint8Array): Uint8Array | undefined;
44
+ /**
45
+ * Marks storage key for address as deleted in cache.
46
+ * @param address - Address
47
+ * @param key - Storage key
48
+ */
49
+ del(address: Address, key: Uint8Array): void;
50
+ /**
51
+ * Deletes all storage slots for address from the cache
52
+ * @param address
53
+ */
54
+ clearStorage(address: Address): void;
55
+ /**
56
+ * Flushes cache by returning storage slots that have been modified
57
+ * or deleted and resetting the diff cache (at checkpoint height).
58
+ */
59
+ flush(): [string, string, Uint8Array | undefined][];
60
+ /**
61
+ * Revert changes to cache last checkpoint (no effect on trie).
62
+ */
63
+ revert(): void;
64
+ /**
65
+ * Commits to current state of cache (no effect on trie).
66
+ */
67
+ commit(): void;
68
+ /**
69
+ * Marks current state of cache as checkpoint, which can
70
+ * later on be reverted or committed.
71
+ */
72
+ checkpoint(): void;
73
+ /**
74
+ * Returns the size of the cache
75
+ * @returns
76
+ */
77
+ size(): number;
78
+ /**
79
+ * Returns a dict with cache stats
80
+ * @param reset
81
+ */
82
+ stats(reset?: boolean): {
83
+ size: number;
84
+ reads: number;
85
+ hits: number;
86
+ writes: number;
87
+ deletions: number;
88
+ };
89
+ /**
90
+ * Clears cache.
91
+ */
92
+ clear(): void;
93
+ /**
94
+ * Dumps the RLP-encoded storage values for an `account` specified by `address`.
95
+ * @param address - The address of the `account` to return storage for
96
+ * @returns {StorageCacheMap | undefined} - The storage values for the `account` or undefined if the `account` is not in the cache
97
+ */
98
+ dump(address: Address): StorageCacheMap | undefined;
99
+ }
100
+ export {};
101
+ //# sourceMappingURL=storage.d.ts.map