@feelyourprotocol/mpt 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 (204) hide show
  1. package/README.md +448 -0
  2. package/dist/cjs/constructors.d.ts +12 -0
  3. package/dist/cjs/constructors.d.ts.map +1 -0
  4. package/dist/cjs/constructors.js +57 -0
  5. package/dist/cjs/constructors.js.map +1 -0
  6. package/dist/cjs/db/checkpointDB.d.ts +87 -0
  7. package/dist/cjs/db/checkpointDB.d.ts.map +1 -0
  8. package/dist/cjs/db/checkpointDB.js +258 -0
  9. package/dist/cjs/db/checkpointDB.js.map +1 -0
  10. package/dist/cjs/db/index.d.ts +2 -0
  11. package/dist/cjs/db/index.d.ts.map +1 -0
  12. package/dist/cjs/db/index.js +18 -0
  13. package/dist/cjs/db/index.js.map +1 -0
  14. package/dist/cjs/index.d.ts +8 -0
  15. package/dist/cjs/index.d.ts.map +1 -0
  16. package/dist/cjs/index.js +24 -0
  17. package/dist/cjs/index.js.map +1 -0
  18. package/dist/cjs/mpt.d.ts +261 -0
  19. package/dist/cjs/mpt.d.ts.map +1 -0
  20. package/dist/cjs/mpt.js +900 -0
  21. package/dist/cjs/mpt.js.map +1 -0
  22. package/dist/cjs/node/branch.d.ts +14 -0
  23. package/dist/cjs/node/branch.d.ts.map +1 -0
  24. package/dist/cjs/node/branch.js +52 -0
  25. package/dist/cjs/node/branch.js.map +1 -0
  26. package/dist/cjs/node/extension.d.ts +7 -0
  27. package/dist/cjs/node/extension.d.ts.map +1 -0
  28. package/dist/cjs/node/extension.js +14 -0
  29. package/dist/cjs/node/extension.js.map +1 -0
  30. package/dist/cjs/node/extensionOrLeafNodeBase.d.ts +15 -0
  31. package/dist/cjs/node/extensionOrLeafNodeBase.d.ts.map +1 -0
  32. package/dist/cjs/node/extensionOrLeafNodeBase.js +42 -0
  33. package/dist/cjs/node/extensionOrLeafNodeBase.js.map +1 -0
  34. package/dist/cjs/node/index.d.ts +5 -0
  35. package/dist/cjs/node/index.d.ts.map +1 -0
  36. package/dist/cjs/node/index.js +21 -0
  37. package/dist/cjs/node/index.js.map +1 -0
  38. package/dist/cjs/node/leaf.d.ts +7 -0
  39. package/dist/cjs/node/leaf.d.ts.map +1 -0
  40. package/dist/cjs/node/leaf.js +14 -0
  41. package/dist/cjs/node/leaf.js.map +1 -0
  42. package/dist/cjs/node/util.d.ts +8 -0
  43. package/dist/cjs/node/util.d.ts.map +1 -0
  44. package/dist/cjs/node/util.js +38 -0
  45. package/dist/cjs/node/util.js.map +1 -0
  46. package/dist/cjs/package.json +3 -0
  47. package/dist/cjs/proof/index.d.ts +3 -0
  48. package/dist/cjs/proof/index.d.ts.map +1 -0
  49. package/dist/cjs/proof/index.js +19 -0
  50. package/dist/cjs/proof/index.js.map +1 -0
  51. package/dist/cjs/proof/proof.d.ts +41 -0
  52. package/dist/cjs/proof/proof.d.ts.map +1 -0
  53. package/dist/cjs/proof/proof.js +119 -0
  54. package/dist/cjs/proof/proof.js.map +1 -0
  55. package/dist/cjs/proof/range.d.ts +35 -0
  56. package/dist/cjs/proof/range.d.ts.map +1 -0
  57. package/dist/cjs/proof/range.js +456 -0
  58. package/dist/cjs/proof/range.js.map +1 -0
  59. package/dist/cjs/types.d.ts +110 -0
  60. package/dist/cjs/types.d.ts.map +1 -0
  61. package/dist/cjs/types.js +6 -0
  62. package/dist/cjs/types.js.map +1 -0
  63. package/dist/cjs/util/asyncWalk.d.ts +20 -0
  64. package/dist/cjs/util/asyncWalk.d.ts.map +1 -0
  65. package/dist/cjs/util/asyncWalk.js +50 -0
  66. package/dist/cjs/util/asyncWalk.js.map +1 -0
  67. package/dist/cjs/util/encoding.d.ts +31 -0
  68. package/dist/cjs/util/encoding.d.ts.map +1 -0
  69. package/dist/cjs/util/encoding.js +200 -0
  70. package/dist/cjs/util/encoding.js.map +1 -0
  71. package/dist/cjs/util/genesisState.d.ts +6 -0
  72. package/dist/cjs/util/genesisState.d.ts.map +1 -0
  73. package/dist/cjs/util/genesisState.js +45 -0
  74. package/dist/cjs/util/genesisState.js.map +1 -0
  75. package/dist/cjs/util/hex.d.ts +20 -0
  76. package/dist/cjs/util/hex.d.ts.map +1 -0
  77. package/dist/cjs/util/hex.js +48 -0
  78. package/dist/cjs/util/hex.js.map +1 -0
  79. package/dist/cjs/util/index.d.ts +4 -0
  80. package/dist/cjs/util/index.d.ts.map +1 -0
  81. package/dist/cjs/util/index.js +20 -0
  82. package/dist/cjs/util/index.js.map +1 -0
  83. package/dist/cjs/util/nibbles.d.ts +30 -0
  84. package/dist/cjs/util/nibbles.d.ts.map +1 -0
  85. package/dist/cjs/util/nibbles.js +79 -0
  86. package/dist/cjs/util/nibbles.js.map +1 -0
  87. package/dist/cjs/util/walkController.d.ts +72 -0
  88. package/dist/cjs/util/walkController.d.ts.map +1 -0
  89. package/dist/cjs/util/walkController.js +138 -0
  90. package/dist/cjs/util/walkController.js.map +1 -0
  91. package/dist/esm/constructors.d.ts +12 -0
  92. package/dist/esm/constructors.d.ts.map +1 -0
  93. package/dist/esm/constructors.js +53 -0
  94. package/dist/esm/constructors.js.map +1 -0
  95. package/dist/esm/db/checkpointDB.d.ts +87 -0
  96. package/dist/esm/db/checkpointDB.d.ts.map +1 -0
  97. package/dist/esm/db/checkpointDB.js +254 -0
  98. package/dist/esm/db/checkpointDB.js.map +1 -0
  99. package/dist/esm/db/index.d.ts +2 -0
  100. package/dist/esm/db/index.d.ts.map +1 -0
  101. package/dist/esm/db/index.js +2 -0
  102. package/dist/esm/db/index.js.map +1 -0
  103. package/dist/esm/index.d.ts +8 -0
  104. package/dist/esm/index.d.ts.map +1 -0
  105. package/dist/esm/index.js +8 -0
  106. package/dist/esm/index.js.map +1 -0
  107. package/dist/esm/mpt.d.ts +261 -0
  108. package/dist/esm/mpt.d.ts.map +1 -0
  109. package/dist/esm/mpt.js +897 -0
  110. package/dist/esm/mpt.js.map +1 -0
  111. package/dist/esm/node/branch.d.ts +14 -0
  112. package/dist/esm/node/branch.d.ts.map +1 -0
  113. package/dist/esm/node/branch.js +48 -0
  114. package/dist/esm/node/branch.js.map +1 -0
  115. package/dist/esm/node/extension.d.ts +7 -0
  116. package/dist/esm/node/extension.d.ts.map +1 -0
  117. package/dist/esm/node/extension.js +10 -0
  118. package/dist/esm/node/extension.js.map +1 -0
  119. package/dist/esm/node/extensionOrLeafNodeBase.d.ts +15 -0
  120. package/dist/esm/node/extensionOrLeafNodeBase.d.ts.map +1 -0
  121. package/dist/esm/node/extensionOrLeafNodeBase.js +38 -0
  122. package/dist/esm/node/extensionOrLeafNodeBase.js.map +1 -0
  123. package/dist/esm/node/index.d.ts +5 -0
  124. package/dist/esm/node/index.d.ts.map +1 -0
  125. package/dist/esm/node/index.js +5 -0
  126. package/dist/esm/node/index.js.map +1 -0
  127. package/dist/esm/node/leaf.d.ts +7 -0
  128. package/dist/esm/node/leaf.d.ts.map +1 -0
  129. package/dist/esm/node/leaf.js +10 -0
  130. package/dist/esm/node/leaf.js.map +1 -0
  131. package/dist/esm/node/util.d.ts +8 -0
  132. package/dist/esm/node/util.d.ts.map +1 -0
  133. package/dist/esm/node/util.js +33 -0
  134. package/dist/esm/node/util.js.map +1 -0
  135. package/dist/esm/package.json +3 -0
  136. package/dist/esm/proof/index.d.ts +3 -0
  137. package/dist/esm/proof/index.d.ts.map +1 -0
  138. package/dist/esm/proof/index.js +3 -0
  139. package/dist/esm/proof/index.js.map +1 -0
  140. package/dist/esm/proof/proof.d.ts +41 -0
  141. package/dist/esm/proof/proof.d.ts.map +1 -0
  142. package/dist/esm/proof/proof.js +113 -0
  143. package/dist/esm/proof/proof.js.map +1 -0
  144. package/dist/esm/proof/range.d.ts +35 -0
  145. package/dist/esm/proof/range.d.ts.map +1 -0
  146. package/dist/esm/proof/range.js +453 -0
  147. package/dist/esm/proof/range.js.map +1 -0
  148. package/dist/esm/types.d.ts +110 -0
  149. package/dist/esm/types.d.ts.map +1 -0
  150. package/dist/esm/types.js +3 -0
  151. package/dist/esm/types.js.map +1 -0
  152. package/dist/esm/util/asyncWalk.d.ts +20 -0
  153. package/dist/esm/util/asyncWalk.d.ts.map +1 -0
  154. package/dist/esm/util/asyncWalk.js +47 -0
  155. package/dist/esm/util/asyncWalk.js.map +1 -0
  156. package/dist/esm/util/encoding.d.ts +31 -0
  157. package/dist/esm/util/encoding.d.ts.map +1 -0
  158. package/dist/esm/util/encoding.js +188 -0
  159. package/dist/esm/util/encoding.js.map +1 -0
  160. package/dist/esm/util/genesisState.d.ts +6 -0
  161. package/dist/esm/util/genesisState.d.ts.map +1 -0
  162. package/dist/esm/util/genesisState.js +42 -0
  163. package/dist/esm/util/genesisState.js.map +1 -0
  164. package/dist/esm/util/hex.d.ts +20 -0
  165. package/dist/esm/util/hex.d.ts.map +1 -0
  166. package/dist/esm/util/hex.js +43 -0
  167. package/dist/esm/util/hex.js.map +1 -0
  168. package/dist/esm/util/index.d.ts +4 -0
  169. package/dist/esm/util/index.d.ts.map +1 -0
  170. package/dist/esm/util/index.js +4 -0
  171. package/dist/esm/util/index.js.map +1 -0
  172. package/dist/esm/util/nibbles.d.ts +30 -0
  173. package/dist/esm/util/nibbles.d.ts.map +1 -0
  174. package/dist/esm/util/nibbles.js +73 -0
  175. package/dist/esm/util/nibbles.js.map +1 -0
  176. package/dist/esm/util/walkController.d.ts +72 -0
  177. package/dist/esm/util/walkController.d.ts.map +1 -0
  178. package/dist/esm/util/walkController.js +134 -0
  179. package/dist/esm/util/walkController.js.map +1 -0
  180. package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
  181. package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
  182. package/package.json +85 -0
  183. package/src/constructors.ts +71 -0
  184. package/src/db/checkpointDB.ts +298 -0
  185. package/src/db/index.ts +1 -0
  186. package/src/index.ts +7 -0
  187. package/src/mpt.ts +1090 -0
  188. package/src/node/branch.ts +60 -0
  189. package/src/node/extension.ts +13 -0
  190. package/src/node/extensionOrLeafNodeBase.ts +54 -0
  191. package/src/node/index.ts +4 -0
  192. package/src/node/leaf.ts +13 -0
  193. package/src/node/util.ts +35 -0
  194. package/src/proof/index.ts +2 -0
  195. package/src/proof/proof.ts +135 -0
  196. package/src/proof/range.ts +542 -0
  197. package/src/types.ts +151 -0
  198. package/src/util/asyncWalk.ts +60 -0
  199. package/src/util/encoding.ts +209 -0
  200. package/src/util/genesisState.ts +52 -0
  201. package/src/util/hex.ts +47 -0
  202. package/src/util/index.ts +3 -0
  203. package/src/util/nibbles.ts +80 -0
  204. package/src/util/walkController.ts +172 -0
@@ -0,0 +1,47 @@
1
+ import { RLP } from '@feelyourprotocol/rlp';
2
+ import { bytesToHex, equalsBytes } from '@feelyourprotocol/util';
3
+ import { BranchMPTNode } from "../node/branch.js";
4
+ import { ExtensionMPTNode } from "../node/extension.js";
5
+ /**
6
+ * Walk MerklePatriciaTrie via async generator
7
+ * @param nodeHash - The root key to walk on.
8
+ * @param currentKey - The current (partial) key.
9
+ * @param onFound - Called on every node found (before filter)
10
+ * @param filter - Filter nodes yielded by the generator.
11
+ * @param visited - Set of visited nodes
12
+ * @returns AsyncIterable<{ node: MPTNode; currentKey: number[] }>
13
+ * Iterate through nodes with
14
+ * `for await (const { node, currentKey } of trie._walkTrie(root)) { ... }`
15
+ */
16
+ export async function* _walkTrie(nodeHash, currentKey = [], onFound = async (_trieNode, _key) => { }, filter = async (_trieNode, _key) => true, visited = new Set()) {
17
+ if (equalsBytes(nodeHash, this.EMPTY_TRIE_ROOT)) {
18
+ return;
19
+ }
20
+ try {
21
+ const node = await this.lookupNode(nodeHash);
22
+ if (node === undefined || visited.has(bytesToHex(this.hash(node.serialize())))) {
23
+ return;
24
+ }
25
+ visited.add(bytesToHex(this.hash(node.serialize())));
26
+ await onFound(node, currentKey);
27
+ if (await filter(node, currentKey)) {
28
+ yield { node: node, currentKey };
29
+ }
30
+ if (node instanceof BranchMPTNode) {
31
+ for (const [nibble, childNode] of node._branches.entries()) {
32
+ const nextKey = [...currentKey, nibble];
33
+ const _childNode = childNode instanceof Uint8Array ? childNode : this.hash(RLP.encode(childNode));
34
+ yield* _walkTrie.bind(this)(_childNode, nextKey, onFound, filter, visited);
35
+ }
36
+ }
37
+ else if (node instanceof ExtensionMPTNode) {
38
+ const childNode = node.value();
39
+ const nextKey = [...currentKey, ...node._nibbles];
40
+ yield* _walkTrie.bind(this)(childNode, nextKey, onFound, filter, visited);
41
+ }
42
+ }
43
+ catch {
44
+ return;
45
+ }
46
+ }
47
+ //# sourceMappingURL=asyncWalk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncWalk.js","sourceRoot":"","sources":["../../../src/util/asyncWalk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAQvD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,SAAS,CAE9B,QAAoB,EACpB,aAAuB,EAAE,EACzB,UAAmB,KAAK,EAAE,SAAkB,EAAE,IAAc,EAAE,EAAE,GAAE,CAAC,EACnE,SAAqB,KAAK,EAAE,SAAkB,EAAE,IAAc,EAAE,EAAE,CAAC,IAAI,EACvE,UAAuB,IAAI,GAAG,EAAU;IAExC,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QAChD,OAAM;IACR,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC5C,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,OAAM;QACR,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAA;QACrD,MAAM,OAAO,CAAC,IAAK,EAAE,UAAU,CAAC,CAAA;QAChC,IAAI,MAAM,MAAM,CAAC,IAAK,EAAE,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,EAAE,IAAI,EAAE,IAAK,EAAE,UAAU,EAAE,CAAA;QACnC,CAAC;QACD,IAAI,IAAI,YAAY,aAAa,EAAE,CAAC;YAClC,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,EAAE,MAAM,CAAC,CAAA;gBACvC,MAAM,UAAU,GACd,SAAS,YAAY,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;gBAChF,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;YAC5E,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,YAAY,gBAAgB,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;YAC9B,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;YACjD,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAC3E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAM;IACR,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Nibbles } from '../types.ts';
2
+ export declare const nibblesToBytes: (nibbles: Uint8Array) => Uint8Array<ArrayBuffer>;
3
+ export declare const hexToKeybytes: (hex: Uint8Array) => Uint8Array<ArrayBuffer>;
4
+ export declare const nibblesToCompactBytes: (nibbles: Uint8Array) => Uint8Array<ArrayBuffer>;
5
+ export declare const bytesToNibbles: (str: Uint8Array) => Uint8Array<ArrayBuffer>;
6
+ export declare const compactBytesToNibbles: (compact: Uint8Array) => Uint8Array<ArrayBufferLike>;
7
+ /**
8
+ * Converts each nibble into a single byte
9
+ *
10
+ * @param arr Nibble typed nibble array
11
+ * @returns Uint8Array typed byte array
12
+ */
13
+ export declare const nibbleTypeToByteType: (arr: Nibbles) => Uint8Array;
14
+ /**
15
+ * Turns each byte into a single nibble, only extracting the lower nibble of each byte
16
+ *
17
+ * @param key Uint8Array typed byte array
18
+ * @returns Nibble typed nibble array
19
+ */
20
+ export declare const byteTypeToNibbleType: (key: Uint8Array) => Nibbles;
21
+ /**
22
+ * Takes a string path and extends it by the given extension nibbles
23
+ *
24
+ * @param path String node path
25
+ * @param extension nibbles to extend by
26
+ * @param retType string indicating whether to return the key in "keybyte" or "hex" encoding
27
+ * @returns hex-encoded key
28
+ */
29
+ export declare const pathToHexKey: (path: string, extension: Nibbles, retType: string) => Uint8Array;
30
+ export declare const mergeAndFormatKeyPaths: (pathStrings: string[]) => Uint8Array<ArrayBuffer>[][];
31
+ //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../../src/util/encoding.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAgC1C,eAAO,MAAM,cAAc,GAAI,SAAS,UAAU,4BAOjD,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,UAAU,4BAS5C,CAAA;AAGD,eAAO,MAAM,qBAAqB,GAAI,SAAS,UAAU,4BAoBxD,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,KAAK,UAAU,4BAY7C,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAS,UAAU,gCAaxD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,KAAK,OAAO,KAAG,UAQnD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,KAAK,UAAU,KAAG,OAStD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,WAAW,OAAO,EAAE,SAAS,MAAM,KAAG,UAShF,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,aAAa,MAAM,EAAE,gCAgD3D,CAAA"}
@@ -0,0 +1,188 @@
1
+ import { concatBytes, hexToBytes, unprefixedHexToBytes } from '@feelyourprotocol/util';
2
+ import { nibblesTypeToPackedBytes } from "./nibbles.js";
3
+ // Reference: https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/
4
+ //
5
+ // MerklePatriciaTrie keys are dealt with in three distinct encodings:
6
+ //
7
+ // KEYBYTES encoding contains the actual key and nothing else. This encoding is the
8
+ // input to most API functions.
9
+ //
10
+ // HEX encoding contains one byte for each nibble of the key and an optional trailing
11
+ // 'terminator' byte of value 0x10 which indicates whether or not the node at the key
12
+ // contains a value. Hex key encoding is used for nodes loaded in memory because it's
13
+ // convenient to access.
14
+ //
15
+ // COMPACT encoding is defined by the Ethereum Yellow Paper (it's called "hex prefix
16
+ // encoding" there) and contains the bytes of the key and a flag. The high nibble of the
17
+ // first byte contains the flag; the lowest bit encoding the oddness of the length and
18
+ // the second-lowest encoding whether the node at the key is a value node. The low nibble
19
+ // of the first byte is zero in the case of an even number of nibbles and the first nibble
20
+ // in the case of an odd number. All remaining nibbles (now an even number) fit properly
21
+ // into the remaining bytes. Compact encoding is used for nodes stored on disk.
22
+ /**
23
+ *
24
+ * @param nibbles byte sequence
25
+ * @returns boolean indicating if input hex nibble sequence has terminator indicating leaf-node
26
+ * terminator is represented with 16 because a nibble ranges from 0 - 15(f)
27
+ */
28
+ const hasTerminator = (nibbles) => {
29
+ return nibbles.length > 0 && nibbles[nibbles.length - 1] === 16;
30
+ };
31
+ export const nibblesToBytes = (nibbles) => {
32
+ const bytes = new Uint8Array(nibbles.length / 2);
33
+ for (let bi = 0, ni = 0; ni < nibbles.length; bi += 1, ni += 2) {
34
+ bytes[bi] = (nibbles[ni] << 4) | nibbles[ni + 1];
35
+ }
36
+ return bytes;
37
+ };
38
+ export const hexToKeybytes = (hex) => {
39
+ if (hasTerminator(hex)) {
40
+ hex = hex.subarray(0, hex.length - 1);
41
+ }
42
+ if (hex.length % 2 === 1) {
43
+ throw Error("Can't convert hex key of odd length");
44
+ }
45
+ return nibblesToBytes(hex);
46
+ };
47
+ // hex to compact
48
+ export const nibblesToCompactBytes = (nibbles) => {
49
+ let terminator = 0;
50
+ if (hasTerminator(nibbles)) {
51
+ terminator = 1;
52
+ // Remove the terminator from the sequence
53
+ nibbles = nibbles.subarray(0, nibbles.length - 1);
54
+ }
55
+ const buf = new Uint8Array(nibbles.length / 2 + 1);
56
+ // Shift the terminator info into the first nibble of buf[0]
57
+ buf[0] = terminator << 5;
58
+ // If odd length, then add that flag into the first nibble and put the odd nibble to
59
+ // second part of buf[0] which otherwise will be left padded with a 0
60
+ if ((nibbles.length & 1) === 1) {
61
+ buf[0] |= 1 << 4;
62
+ buf[0] |= nibbles[0];
63
+ nibbles = nibbles.subarray(1);
64
+ }
65
+ // create bytes out of the rest even nibbles
66
+ return concatBytes(buf.subarray(0, 1), nibblesToBytes(nibbles));
67
+ };
68
+ export const bytesToNibbles = (str) => {
69
+ const l = str.length * 2 + 1;
70
+ const nibbles = new Uint8Array(l);
71
+ for (let i = 0; i < str.length; i++) {
72
+ const b = str[i];
73
+ nibbles[i * 2] = b / 16;
74
+ nibbles[i * 2 + 1] = b % 16;
75
+ }
76
+ // This will get removed from calling function if the first nibble
77
+ // indicates that terminator is not present
78
+ nibbles[l - 1] = 16;
79
+ return nibbles;
80
+ };
81
+ export const compactBytesToNibbles = (compact) => {
82
+ if (compact.length === 0) {
83
+ return compact;
84
+ }
85
+ let base = bytesToNibbles(compact);
86
+ // delete terminator flag if terminator flag was not in first nibble
87
+ if (base[0] < 2) {
88
+ base = base.subarray(0, base.length - 1);
89
+ }
90
+ // chop the terminator nibble and the even padding (if there is one)
91
+ // i.e. chop 2 left nibbles when even else 1 when odd
92
+ const chop = 2 - (base[0] & 1);
93
+ return base.subarray(chop);
94
+ };
95
+ /**
96
+ * Converts each nibble into a single byte
97
+ *
98
+ * @param arr Nibble typed nibble array
99
+ * @returns Uint8Array typed byte array
100
+ */
101
+ export const nibbleTypeToByteType = (arr) => {
102
+ const l = arr.length;
103
+ const buf = new Uint8Array(l);
104
+ for (let i = 0; i < buf.length; i++) {
105
+ buf[i] = arr[i];
106
+ }
107
+ return buf;
108
+ };
109
+ /**
110
+ * Turns each byte into a single nibble, only extracting the lower nibble of each byte
111
+ *
112
+ * @param key Uint8Array typed byte array
113
+ * @returns Nibble typed nibble array
114
+ */
115
+ export const byteTypeToNibbleType = (key) => {
116
+ const nibbles = [];
117
+ for (let i = 0; i < key.length; i++) {
118
+ const q = i;
119
+ nibbles[q] = key[i] % 16;
120
+ }
121
+ return nibbles;
122
+ };
123
+ /**
124
+ * Takes a string path and extends it by the given extension nibbles
125
+ *
126
+ * @param path String node path
127
+ * @param extension nibbles to extend by
128
+ * @param retType string indicating whether to return the key in "keybyte" or "hex" encoding
129
+ * @returns hex-encoded key
130
+ */
131
+ export const pathToHexKey = (path, extension, retType) => {
132
+ const b = hexToBytes(`0x${path}`);
133
+ const n = byteTypeToNibbleType(b);
134
+ if (retType === 'hex') {
135
+ return nibbleTypeToByteType(n.concat(extension));
136
+ }
137
+ else if (retType === 'keybyte') {
138
+ return nibblesTypeToPackedBytes(n.concat(extension));
139
+ }
140
+ throw Error('retType must be either "keybyte" or "hex"');
141
+ };
142
+ export const mergeAndFormatKeyPaths = (pathStrings) => {
143
+ const ret = [];
144
+ let paths = [];
145
+ let i = 0;
146
+ while (i < pathStrings.length) {
147
+ const outerPathString = pathStrings[i].split('/');
148
+ const outerAccountPath = outerPathString[0];
149
+ const outerStoragePath = outerPathString[1];
150
+ paths.push(outerAccountPath);
151
+ if (outerStoragePath !== undefined) {
152
+ paths.push(outerStoragePath);
153
+ }
154
+ let j = ++i;
155
+ while (j < pathStrings.length) {
156
+ const innerPathString = pathStrings[j].split('/');
157
+ const innerAccountPath = innerPathString[0];
158
+ const innerStoragePath = innerPathString[1];
159
+ if (innerAccountPath === outerAccountPath) {
160
+ paths.push(innerStoragePath);
161
+ }
162
+ else {
163
+ ret.push(paths);
164
+ paths = [];
165
+ i = j;
166
+ break;
167
+ }
168
+ j++;
169
+ }
170
+ if (paths.length > 0) {
171
+ ret.push(paths);
172
+ paths = [];
173
+ }
174
+ }
175
+ if (paths.length > 0)
176
+ ret.push(paths);
177
+ return ret.map((pathStrings) => pathStrings.map((s) => {
178
+ if (s.length < 64) {
179
+ // partial path is compact encoded
180
+ return nibblesToCompactBytes(unprefixedHexToBytes(s));
181
+ }
182
+ else {
183
+ // full path is keybyte encoded
184
+ return hexToKeybytes(unprefixedHexToBytes(s));
185
+ }
186
+ }));
187
+ };
188
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../../src/util/encoding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAIvD,wGAAwG;AACxG,EAAE;AACF,sEAAsE;AACtE,EAAE;AACF,mFAAmF;AACnF,+BAA+B;AAC/B,EAAE;AACF,qFAAqF;AACrF,qFAAqF;AACrF,qFAAqF;AACrF,wBAAwB;AACxB,EAAE;AACF,oFAAoF;AACpF,wFAAwF;AACxF,sFAAsF;AACtF,yFAAyF;AACzF,0FAA0F;AAC1F,wFAAwF;AACxF,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,aAAa,GAAG,CAAC,OAAmB,EAAE,EAAE;IAC5C,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAmB,EAAE,EAAE;IACpD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAChD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;QAC/D,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAClD,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAe,EAAE,EAAE;IAC/C,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACpD,CAAC;IAED,OAAO,cAAc,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC,CAAA;AAED,iBAAiB;AACjB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAmB,EAAE,EAAE;IAC3D,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,UAAU,GAAG,CAAC,CAAA;QACd,0CAA0C;QAC1C,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACnD,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAClD,4DAA4D;IAC5D,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,CAAC,CAAA;IACxB,oFAAoF;IACpF,qEAAqE;IACrE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAA;QACpB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC;IAED,4CAA4C;IAC5C,OAAO,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAe,EAAE,EAAE;IAChD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;QACvB,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;IAC7B,CAAC;IACD,kEAAkE;IAClE,2CAA2C;IAC3C,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;IACnB,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAmB,EAAE,EAAE;IAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAClC,oEAAoE;IACpE,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAChB,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,oEAAoE;IACpE,sDAAsD;IACtD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAC5B,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAY,EAAc,EAAE;IAC/D,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAA;IACpB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAe,EAAW,EAAE;IAC/D,MAAM,OAAO,GAAG,EAAa,CAAA;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,CAAA;QACX,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,SAAkB,EAAE,OAAe,EAAc,EAAE;IAC5F,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACjC,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAA;IACjC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,OAAO,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAClD,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,wBAAwB,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IACtD,CAAC;IACD,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAA;AAC1D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,WAAqB,EAAE,EAAE;IAC9D,MAAM,GAAG,GAAe,EAAE,CAAA;IAC1B,IAAI,KAAK,GAAa,EAAE,CAAA;IACxB,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClD,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;QAC3C,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;QAE3C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC5B,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC9B,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QACX,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClD,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;YAC3C,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;YAE3C,IAAI,gBAAgB,KAAK,gBAAgB,EAAE,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC9B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACf,KAAK,GAAG,EAAE,CAAA;gBACV,CAAC,GAAG,CAAC,CAAA;gBACL,MAAK;YACP,CAAC;YACD,CAAC,EAAE,CAAA;QACL,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACf,KAAK,GAAG,EAAE,CAAA;QACZ,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAErC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAC7B,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpB,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAClB,kCAAkC;YAClC,OAAO,qBAAqB,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;QACvD,CAAC;aAAM,CAAC;YACN,+BAA+B;YAC/B,OAAO,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC,CAAC,CACH,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { GenesisState } from '@feelyourprotocol/common';
2
+ /**
3
+ * Derives the stateRoot of the genesis block based on genesis allocations
4
+ */
5
+ export declare function genesisMPTStateRoot(genesisState: GenesisState): Promise<Uint8Array<ArrayBufferLike>>;
6
+ //# sourceMappingURL=genesisState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genesisState.d.ts","sourceRoot":"","sources":["../../../src/util/genesisState.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAgB,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEpE;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,YAAY,wCAkCnE"}
@@ -0,0 +1,42 @@
1
+ import { RLP } from '@feelyourprotocol/rlp';
2
+ import { Account, hexToBytes, isHexString, unpadBytes, unprefixedHexToBytes, } from '@feelyourprotocol/util';
3
+ import { keccak_256 } from '@noble/hashes/sha3.js';
4
+ import { MerklePatriciaTrie } from "../mpt.js";
5
+ /**
6
+ * Derives the stateRoot of the genesis block based on genesis allocations
7
+ */
8
+ export async function genesisMPTStateRoot(genesisState) {
9
+ const trie = new MerklePatriciaTrie({ useKeyHashing: true });
10
+ for (const [key, value] of Object.entries(genesisState)) {
11
+ const address = isHexString(key) ? hexToBytes(key) : unprefixedHexToBytes(key);
12
+ const account = new Account();
13
+ if (typeof value === 'string') {
14
+ account.balance = BigInt(value);
15
+ }
16
+ else {
17
+ const [balance, code, storage, nonce] = value;
18
+ if (balance !== undefined) {
19
+ account.balance = BigInt(balance);
20
+ }
21
+ if (code !== undefined) {
22
+ const codeBytes = isHexString(code) ? hexToBytes(code) : unprefixedHexToBytes(code);
23
+ account.codeHash = keccak_256(codeBytes);
24
+ }
25
+ if (storage !== undefined) {
26
+ const storageTrie = new MerklePatriciaTrie({ useKeyHashing: true });
27
+ for (const [k, val] of storage) {
28
+ const storageKey = isHexString(k) ? hexToBytes(k) : unprefixedHexToBytes(k);
29
+ const storageVal = RLP.encode(unpadBytes(isHexString(val) ? hexToBytes(val) : unprefixedHexToBytes(val)));
30
+ await storageTrie.put(storageKey, storageVal);
31
+ }
32
+ account.storageRoot = storageTrie.root();
33
+ }
34
+ if (nonce !== undefined) {
35
+ account.nonce = BigInt(nonce);
36
+ }
37
+ }
38
+ await trie.put(address, account.serialize());
39
+ }
40
+ return trie.root();
41
+ }
42
+ //# sourceMappingURL=genesisState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genesisState.js","sourceRoot":"","sources":["../../../src/util/genesisState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AACrC,OAAO,EACL,OAAO,EACP,UAAU,EACV,WAAW,EACX,UAAU,EACV,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAI9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,YAA0B;IAClE,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;QAC9E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,KAA8B,CAAA;YACtE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;YACnC,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;gBACnF,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;YAC1C,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;gBACnE,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;oBAC/B,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAA;oBAC3E,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAC3B,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAC3E,CAAA;oBACD,MAAM,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;gBAC/C,CAAC;gBACD,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;YAC1C,CAAC;YACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAA;AACpB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Nibbles } from '../types.ts';
2
+ /**
3
+ * Prepends hex prefix to an array of nibbles.
4
+ * @param key - Array of nibbles
5
+ * @returns returns buffer of encoded data
6
+ **/
7
+ export declare function addHexPrefix(key: Nibbles, terminator: boolean): Nibbles;
8
+ /**
9
+ * Removes hex prefix of an array of nibbles.
10
+ * @param val - Array of nibbles
11
+ * @private
12
+ */
13
+ export declare function removeHexPrefix(val: Nibbles): Nibbles;
14
+ /**
15
+ * Returns true if hex-prefixed path is for a terminating (leaf) node.
16
+ * @param key - a hex-prefixed array of nibbles
17
+ * @private
18
+ */
19
+ export declare function isTerminator(key: Nibbles): boolean;
20
+ //# sourceMappingURL=hex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../../src/util/hex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C;;;;IAII;AACJ,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAevE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAElD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Prepends hex prefix to an array of nibbles.
3
+ * @param key - Array of nibbles
4
+ * @returns returns buffer of encoded data
5
+ **/
6
+ export function addHexPrefix(key, terminator) {
7
+ // odd
8
+ if (key.length % 2) {
9
+ key.unshift(1);
10
+ }
11
+ else {
12
+ // even
13
+ key.unshift(0);
14
+ key.unshift(0);
15
+ }
16
+ if (terminator) {
17
+ key[0] += 2;
18
+ }
19
+ return key;
20
+ }
21
+ /**
22
+ * Removes hex prefix of an array of nibbles.
23
+ * @param val - Array of nibbles
24
+ * @private
25
+ */
26
+ export function removeHexPrefix(val) {
27
+ if (val[0] % 2) {
28
+ val = val.slice(1);
29
+ }
30
+ else {
31
+ val = val.slice(2);
32
+ }
33
+ return val;
34
+ }
35
+ /**
36
+ * Returns true if hex-prefixed path is for a terminating (leaf) node.
37
+ * @param key - a hex-prefixed array of nibbles
38
+ * @private
39
+ */
40
+ export function isTerminator(key) {
41
+ return key[0] > 1;
42
+ }
43
+ //# sourceMappingURL=hex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hex.js","sourceRoot":"","sources":["../../../src/util/hex.ts"],"names":[],"mappings":"AAEA;;;;IAII;AACJ,MAAM,UAAU,YAAY,CAAC,GAAY,EAAE,UAAmB;IAC5D,MAAM;IACN,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACd,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACb,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './encoding.ts';
2
+ export * from './genesisState.ts';
3
+ export * from './walkController.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from "./encoding.js";
2
+ export * from "./genesisState.js";
3
+ export * from "./walkController.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA"}
@@ -0,0 +1,30 @@
1
+ import type { Nibbles } from '../types.ts';
2
+ /**
3
+ * Converts a bytes to a nibble array.
4
+ * @private
5
+ * @param key
6
+ */
7
+ export declare function bytesToNibbles(key: Uint8Array): Nibbles;
8
+ /**
9
+ * Converts a nibble array into bytes.
10
+ * @private
11
+ * @param arr - Nibble array
12
+ */
13
+ export declare function nibblesTypeToPackedBytes(arr: Nibbles): Uint8Array;
14
+ /**
15
+ * Compare two nibble array.
16
+ * * `0` is returned if `n2` === `n1`.
17
+ * * `1` is returned if `n2` > `n1`.
18
+ * * `-1` is returned if `n2` < `n1`.
19
+ * @param n1 - Nibble array
20
+ * @param n2 - Nibble array
21
+ */
22
+ export declare function nibblesCompare(n1: Nibbles, n2: Nibbles): number;
23
+ /**
24
+ * Returns the number of in order matching nibbles of two give nibble arrays.
25
+ * @private
26
+ * @param nib1
27
+ * @param nib2
28
+ */
29
+ export declare function matchingNibbleLength(nib1: Nibbles, nib2: Nibbles): number;
30
+ //# sourceMappingURL=nibbles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nibbles.d.ts","sourceRoot":"","sources":["../../../src/util/nibbles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAWvD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAOjE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,UAuBtD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAMzE"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Converts a bytes to a nibble array.
3
+ * @private
4
+ * @param key
5
+ */
6
+ export function bytesToNibbles(key) {
7
+ const nibbles = [];
8
+ for (let i = 0; i < key.length; i++) {
9
+ let q = i * 2;
10
+ nibbles[q] = key[i] >> 4;
11
+ ++q;
12
+ nibbles[q] = key[i] % 16;
13
+ }
14
+ return nibbles;
15
+ }
16
+ /**
17
+ * Converts a nibble array into bytes.
18
+ * @private
19
+ * @param arr - Nibble array
20
+ */
21
+ export function nibblesTypeToPackedBytes(arr) {
22
+ const buf = new Uint8Array(arr.length / 2);
23
+ for (let i = 0; i < buf.length; i++) {
24
+ let q = i * 2;
25
+ buf[i] = (arr[q] << 4) + arr[++q];
26
+ }
27
+ return buf;
28
+ }
29
+ /**
30
+ * Compare two nibble array.
31
+ * * `0` is returned if `n2` === `n1`.
32
+ * * `1` is returned if `n2` > `n1`.
33
+ * * `-1` is returned if `n2` < `n1`.
34
+ * @param n1 - Nibble array
35
+ * @param n2 - Nibble array
36
+ */
37
+ export function nibblesCompare(n1, n2) {
38
+ const cmpLength = Math.min(n1.length, n2.length);
39
+ let res = 0;
40
+ for (let i = 0; i < cmpLength; i++) {
41
+ if (n1[i] < n2[i]) {
42
+ res = -1;
43
+ break;
44
+ }
45
+ else if (n1[i] > n2[i]) {
46
+ res = 1;
47
+ break;
48
+ }
49
+ }
50
+ if (res === 0) {
51
+ if (n1.length < n2.length) {
52
+ res = -1;
53
+ }
54
+ else if (n1.length > n2.length) {
55
+ res = 1;
56
+ }
57
+ }
58
+ return res;
59
+ }
60
+ /**
61
+ * Returns the number of in order matching nibbles of two give nibble arrays.
62
+ * @private
63
+ * @param nib1
64
+ * @param nib2
65
+ */
66
+ export function matchingNibbleLength(nib1, nib2) {
67
+ let i = 0;
68
+ while (nib1[i] === nib2[i] && nib1.length > i) {
69
+ i++;
70
+ }
71
+ return i;
72
+ }
73
+ //# sourceMappingURL=nibbles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nibbles.js","sourceRoot":"","sources":["../../../src/util/nibbles.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAe;IAC5C,MAAM,OAAO,GAAG,EAAa,CAAA;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACxB,EAAE,CAAC,CAAA;QACH,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,EAAW,EAAE,EAAW;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;IAEhD,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,GAAG,GAAG,CAAC,CAAC,CAAA;YACR,MAAK;QACP,CAAC;aAAM,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,GAAG,CAAC,CAAA;YACP,MAAK;QACP,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;YAC1B,GAAG,GAAG,CAAC,CAAC,CAAA;QACV,CAAC;aAAM,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;YACjC,GAAG,GAAG,CAAC,CAAA;QACT,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAa,EAAE,IAAa;IAC/D,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { PrioritizedTaskExecutor } from '@feelyourprotocol/util';
2
+ import { BranchMPTNode } from '../node/index.ts';
3
+ import type { MerklePatriciaTrie } from '../mpt.ts';
4
+ import type { FoundNodeFunction, MPTNode, Nibbles, NodeReferenceOrRawMPTNode } from '../types.ts';
5
+ /**
6
+ * Interface to control how the trie is being traversed. Schedules node visits via a
7
+ * prioritized task queue and invokes the provided callback for each node.
8
+ *
9
+ * Used by {@link MerklePatriciaTrie.findPath}, {@link MerklePatriciaTrie.walkTrie}, etc.
10
+ */
11
+ export declare class WalkController {
12
+ /** The {@link FoundNodeFunction} to call when a node is found. */
13
+ readonly onNode: FoundNodeFunction;
14
+ /** Task executor that prioritizes node visits (shorter paths first). */
15
+ readonly taskExecutor: PrioritizedTaskExecutor;
16
+ /** The trie being walked. */
17
+ readonly trie: MerklePatriciaTrie;
18
+ private _resolvePromise;
19
+ private _rejectPromise;
20
+ /**
21
+ * @param onNode - The {@link FoundNodeFunction} to call when a node is found.
22
+ * @param trie - The trie to walk on.
23
+ * @param poolSize - The size of the task queue.
24
+ */
25
+ private constructor();
26
+ /**
27
+ * Creates and starts an async walk over a trie from the given root.
28
+ * Resolves when all reachable nodes have been visited and no new tasks were scheduled.
29
+ *
30
+ * @param onNode - The {@link FoundNodeFunction} to call when a node is found.
31
+ * @param trie - The trie to walk on.
32
+ * @param rootHash - The root hash (32-byte keccak) to start walking from.
33
+ * @param poolSize - Task execution pool size to prevent OOM errors. Defaults to 500.
34
+ * @returns A Promise that resolves when the walk is finished.
35
+ */
36
+ static newWalk(onNode: FoundNodeFunction, trie: MerklePatriciaTrie, rootHash: Uint8Array, poolSize?: number): Promise<void>;
37
+ private _startWalk;
38
+ /**
39
+ * Runs all children of a node. Priority of these nodes is the key length of the children.
40
+ * Used when walking an Extension or when exploring all branches of a Branch node.
41
+ *
42
+ * @param node - Node to get all children of and call onNode on.
43
+ * @param currentKeyNibbles - The current key (nibbles) which would yield the `node` when
44
+ * trying to get this node with a `get` operation. Defaults to `[]`.
45
+ * @returns `void`
46
+ */
47
+ allChildren(node: MPTNode, currentKeyNibbles?: Nibbles): void;
48
+ /**
49
+ * Pushes a node to the queue. If the queue has capacity, the node is executed immediately,
50
+ * otherwise it is queued for later execution.
51
+ *
52
+ * @param nodeRef - A node reference (32-byte keccak hash or raw encoding) to enqueue.
53
+ * @param currentKeyNibbles - The current key (nibbles) corresponding to this node. Defaults to `[]`.
54
+ * @param priority - Optional priority. Defaults to key length.
55
+ * @returns `void`
56
+ */
57
+ pushNodeToQueue(nodeRef: NodeReferenceOrRawMPTNode, currentKeyNibbles?: Nibbles, priority?: number): void;
58
+ /**
59
+ * Pushes a branch of a certain BranchMPTNode to the event queue.
60
+ * Used by findPath when following a specific key (only one child index is traversed).
61
+ *
62
+ * @param node - The BranchMPTNode to select a branch on.
63
+ * @param currentKeyNibbles - The current key which leads to the corresponding node. Defaults to `[]`.
64
+ * @param childIndex - The child index (0–15) to add to the event queue.
65
+ * @param priority - Optional priority of the event. Defaults to the total key length.
66
+ * @returns `void`
67
+ * @throws If `node` is not a BranchMPTNode or if the branch at `childIndex` is empty.
68
+ */
69
+ onlyBranchIndex(node: BranchMPTNode, currentKeyNibbles: Nibbles | undefined, childIndex: number, priority?: number): void;
70
+ private _processNode;
71
+ }
72
+ //# sourceMappingURL=walkController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walkController.d.ts","sourceRoot":"","sources":["../../../src/util/walkController.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAEtF,OAAO,EAAE,aAAa,EAAiC,MAAM,kBAAkB,CAAA;AAE/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEjG;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAElC,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAA;IAE9C,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IAEjC,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,cAAc,CAA0B;IAEhD;;;;OAIG;IACH,OAAO;IAQP;;;;;;;;;OASG;WACU,OAAO,CAClB,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,UAAU,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;YAKF,UAAU;IAexB;;;;;;;;OAQG;IACH,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAE,OAAY,GAAG,IAAI;IAqBjE;;;;;;;;OAQG;IACH,eAAe,CACb,OAAO,EAAE,yBAAyB,EAClC,iBAAiB,GAAE,OAAY,EAC/B,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IAeP;;;;;;;;;;OAUG;IACH,eAAe,CACb,IAAI,EAAE,aAAa,EACnB,iBAAiB,EAAE,OAAO,YAAK,EAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IAaP,OAAO,CAAC,YAAY;CAUrB"}