@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,154 @@
1
+ import { Account, EthereumJSErrorWithoutCode, bytesToHex } from '@feelyourprotocol/util'
2
+ import { keccak_256 } from '@noble/hashes/sha3.js'
3
+
4
+ import { OriginalStorageCache } from './cache/originalStorageCache.ts'
5
+ import { modifyAccountFields } from './util.ts'
6
+
7
+ import type { AccountFields, Common, StateManagerInterface } from '@feelyourprotocol/common'
8
+ import type { Address, PrefixedHexString } from '@feelyourprotocol/util'
9
+ import type { SimpleStateManagerOpts } from './index.ts'
10
+
11
+ /**
12
+ * Simple and dependency-free state manager for basic state access use cases
13
+ * where a merkle-patricia or binary tree backed state manager is too heavy-weight.
14
+ *
15
+ * This state manager comes with the basic state access logic for
16
+ * accounts, storage and code (put* and get* methods) as well as a simple
17
+ * implementation of checkpointing but lacks methods implementations of
18
+ * state root related logic as well as some other non-core functions.
19
+ *
20
+ * Functionality provided is sufficient to be used for simple EVM use
21
+ * cases and the state manager is used as default there.
22
+ *
23
+ * For a more full fledged and MPT-backed state manager implementation
24
+ * have a look at the [`@feelyourprotocol/statemanager` package docs](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/docs/README.md).
25
+ */
26
+ export class SimpleStateManager implements StateManagerInterface {
27
+ public accountStack: Map<PrefixedHexString, Account | undefined>[] = []
28
+ public codeStack: Map<PrefixedHexString, Uint8Array>[] = []
29
+ public storageStack: Map<string, Uint8Array>[] = []
30
+
31
+ originalStorageCache: {
32
+ get(address: Address, key: Uint8Array): Promise<Uint8Array>
33
+ clear(): void
34
+ }
35
+
36
+ public readonly common?: Common
37
+
38
+ constructor(opts: SimpleStateManagerOpts = {}) {
39
+ this.checkpointSync()
40
+ this.originalStorageCache = new OriginalStorageCache(this.getStorage.bind(this))
41
+ this.common = opts.common
42
+ }
43
+
44
+ protected topAccountStack() {
45
+ return this.accountStack[this.accountStack.length - 1]
46
+ }
47
+ protected topCodeStack() {
48
+ return this.codeStack[this.codeStack.length - 1]
49
+ }
50
+ protected topStorageStack() {
51
+ return this.storageStack[this.storageStack.length - 1]
52
+ }
53
+
54
+ // Synchronous version of checkpoint() to allow to call from constructor
55
+ protected checkpointSync() {
56
+ const newTopA = new Map(this.topAccountStack())
57
+ for (const [address, account] of newTopA) {
58
+ const accountCopy =
59
+ account !== undefined
60
+ ? Object.assign(Object.create(Object.getPrototypeOf(account)), account)
61
+ : undefined
62
+ newTopA.set(address, accountCopy)
63
+ }
64
+ this.accountStack.push(newTopA)
65
+ this.codeStack.push(new Map(this.topCodeStack()))
66
+ this.storageStack.push(new Map(this.topStorageStack()))
67
+ }
68
+
69
+ async getAccount(address: Address): Promise<Account | undefined> {
70
+ return this.topAccountStack().get(address.toString())
71
+ }
72
+
73
+ async putAccount(address: Address, account?: Account | undefined): Promise<void> {
74
+ this.topAccountStack().set(address.toString(), account)
75
+ }
76
+
77
+ async deleteAccount(address: Address): Promise<void> {
78
+ this.topAccountStack().set(address.toString(), undefined)
79
+ }
80
+
81
+ async modifyAccountFields(address: Address, accountFields: AccountFields): Promise<void> {
82
+ await modifyAccountFields(this, address, accountFields)
83
+ }
84
+
85
+ async getCode(address: Address): Promise<Uint8Array> {
86
+ return this.topCodeStack().get(address.toString()) ?? new Uint8Array(0)
87
+ }
88
+
89
+ async putCode(address: Address, value: Uint8Array): Promise<void> {
90
+ this.topCodeStack().set(address.toString(), value)
91
+ if ((await this.getAccount(address)) === undefined) {
92
+ await this.putAccount(address, new Account())
93
+ }
94
+ await this.modifyAccountFields(address, {
95
+ codeHash: (this.common?.customCrypto.keccak256 ?? keccak_256)(value),
96
+ })
97
+ }
98
+
99
+ async getCodeSize(address: Address): Promise<number> {
100
+ const contractCode = await this.getCode(address)
101
+ return contractCode.length
102
+ }
103
+
104
+ async getStorage(address: Address, key: Uint8Array): Promise<Uint8Array> {
105
+ return (
106
+ this.topStorageStack().get(`${address.toString()}_${bytesToHex(key)}`) ?? new Uint8Array(0)
107
+ )
108
+ }
109
+
110
+ async putStorage(address: Address, key: Uint8Array, value: Uint8Array): Promise<void> {
111
+ this.topStorageStack().set(`${address.toString()}_${bytesToHex(key)}`, value)
112
+ }
113
+
114
+ async clearStorage(): Promise<void> {}
115
+
116
+ async checkpoint(): Promise<void> {
117
+ this.checkpointSync()
118
+ }
119
+ async commit(): Promise<void> {
120
+ this.accountStack.splice(-2, 1)
121
+ this.codeStack.splice(-2, 1)
122
+ this.storageStack.splice(-2, 1)
123
+ }
124
+
125
+ async revert(): Promise<void> {
126
+ this.accountStack.pop()
127
+ this.codeStack.pop()
128
+ this.storageStack.pop()
129
+ }
130
+
131
+ async flush(): Promise<void> {}
132
+ clearCaches(): void {}
133
+
134
+ shallowCopy(): StateManagerInterface {
135
+ const copy = new SimpleStateManager({ common: this.common })
136
+ for (let i = 0; i < this.accountStack.length; i++) {
137
+ copy.accountStack.push(new Map(this.accountStack[i]))
138
+ copy.codeStack.push(new Map(this.codeStack[i]))
139
+ copy.storageStack.push(new Map(this.storageStack[i]))
140
+ }
141
+ return copy
142
+ }
143
+
144
+ // State root functionality not implemented
145
+ getStateRoot(): Promise<Uint8Array> {
146
+ throw EthereumJSErrorWithoutCode('Method not implemented.')
147
+ }
148
+ setStateRoot(): Promise<void> {
149
+ throw EthereumJSErrorWithoutCode('Method not implemented.')
150
+ }
151
+ hasStateRoot(): Promise<boolean> {
152
+ throw EthereumJSErrorWithoutCode('Method not implemented.')
153
+ }
154
+ }