@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.
- package/README.md +448 -0
- package/dist/cjs/constructors.d.ts +12 -0
- package/dist/cjs/constructors.d.ts.map +1 -0
- package/dist/cjs/constructors.js +57 -0
- package/dist/cjs/constructors.js.map +1 -0
- package/dist/cjs/db/checkpointDB.d.ts +87 -0
- package/dist/cjs/db/checkpointDB.d.ts.map +1 -0
- package/dist/cjs/db/checkpointDB.js +258 -0
- package/dist/cjs/db/checkpointDB.js.map +1 -0
- package/dist/cjs/db/index.d.ts +2 -0
- package/dist/cjs/db/index.d.ts.map +1 -0
- package/dist/cjs/db/index.js +18 -0
- package/dist/cjs/db/index.js.map +1 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/mpt.d.ts +261 -0
- package/dist/cjs/mpt.d.ts.map +1 -0
- package/dist/cjs/mpt.js +900 -0
- package/dist/cjs/mpt.js.map +1 -0
- package/dist/cjs/node/branch.d.ts +14 -0
- package/dist/cjs/node/branch.d.ts.map +1 -0
- package/dist/cjs/node/branch.js +52 -0
- package/dist/cjs/node/branch.js.map +1 -0
- package/dist/cjs/node/extension.d.ts +7 -0
- package/dist/cjs/node/extension.d.ts.map +1 -0
- package/dist/cjs/node/extension.js +14 -0
- package/dist/cjs/node/extension.js.map +1 -0
- package/dist/cjs/node/extensionOrLeafNodeBase.d.ts +15 -0
- package/dist/cjs/node/extensionOrLeafNodeBase.d.ts.map +1 -0
- package/dist/cjs/node/extensionOrLeafNodeBase.js +42 -0
- package/dist/cjs/node/extensionOrLeafNodeBase.js.map +1 -0
- package/dist/cjs/node/index.d.ts +5 -0
- package/dist/cjs/node/index.d.ts.map +1 -0
- package/dist/cjs/node/index.js +21 -0
- package/dist/cjs/node/index.js.map +1 -0
- package/dist/cjs/node/leaf.d.ts +7 -0
- package/dist/cjs/node/leaf.d.ts.map +1 -0
- package/dist/cjs/node/leaf.js +14 -0
- package/dist/cjs/node/leaf.js.map +1 -0
- package/dist/cjs/node/util.d.ts +8 -0
- package/dist/cjs/node/util.d.ts.map +1 -0
- package/dist/cjs/node/util.js +38 -0
- package/dist/cjs/node/util.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/proof/index.d.ts +3 -0
- package/dist/cjs/proof/index.d.ts.map +1 -0
- package/dist/cjs/proof/index.js +19 -0
- package/dist/cjs/proof/index.js.map +1 -0
- package/dist/cjs/proof/proof.d.ts +41 -0
- package/dist/cjs/proof/proof.d.ts.map +1 -0
- package/dist/cjs/proof/proof.js +119 -0
- package/dist/cjs/proof/proof.js.map +1 -0
- package/dist/cjs/proof/range.d.ts +35 -0
- package/dist/cjs/proof/range.d.ts.map +1 -0
- package/dist/cjs/proof/range.js +456 -0
- package/dist/cjs/proof/range.js.map +1 -0
- package/dist/cjs/types.d.ts +110 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/util/asyncWalk.d.ts +20 -0
- package/dist/cjs/util/asyncWalk.d.ts.map +1 -0
- package/dist/cjs/util/asyncWalk.js +50 -0
- package/dist/cjs/util/asyncWalk.js.map +1 -0
- package/dist/cjs/util/encoding.d.ts +31 -0
- package/dist/cjs/util/encoding.d.ts.map +1 -0
- package/dist/cjs/util/encoding.js +200 -0
- package/dist/cjs/util/encoding.js.map +1 -0
- package/dist/cjs/util/genesisState.d.ts +6 -0
- package/dist/cjs/util/genesisState.d.ts.map +1 -0
- package/dist/cjs/util/genesisState.js +45 -0
- package/dist/cjs/util/genesisState.js.map +1 -0
- package/dist/cjs/util/hex.d.ts +20 -0
- package/dist/cjs/util/hex.d.ts.map +1 -0
- package/dist/cjs/util/hex.js +48 -0
- package/dist/cjs/util/hex.js.map +1 -0
- package/dist/cjs/util/index.d.ts +4 -0
- package/dist/cjs/util/index.d.ts.map +1 -0
- package/dist/cjs/util/index.js +20 -0
- package/dist/cjs/util/index.js.map +1 -0
- package/dist/cjs/util/nibbles.d.ts +30 -0
- package/dist/cjs/util/nibbles.d.ts.map +1 -0
- package/dist/cjs/util/nibbles.js +79 -0
- package/dist/cjs/util/nibbles.js.map +1 -0
- package/dist/cjs/util/walkController.d.ts +72 -0
- package/dist/cjs/util/walkController.d.ts.map +1 -0
- package/dist/cjs/util/walkController.js +138 -0
- package/dist/cjs/util/walkController.js.map +1 -0
- package/dist/esm/constructors.d.ts +12 -0
- package/dist/esm/constructors.d.ts.map +1 -0
- package/dist/esm/constructors.js +53 -0
- package/dist/esm/constructors.js.map +1 -0
- package/dist/esm/db/checkpointDB.d.ts +87 -0
- package/dist/esm/db/checkpointDB.d.ts.map +1 -0
- package/dist/esm/db/checkpointDB.js +254 -0
- package/dist/esm/db/checkpointDB.js.map +1 -0
- package/dist/esm/db/index.d.ts +2 -0
- package/dist/esm/db/index.d.ts.map +1 -0
- package/dist/esm/db/index.js +2 -0
- package/dist/esm/db/index.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/mpt.d.ts +261 -0
- package/dist/esm/mpt.d.ts.map +1 -0
- package/dist/esm/mpt.js +897 -0
- package/dist/esm/mpt.js.map +1 -0
- package/dist/esm/node/branch.d.ts +14 -0
- package/dist/esm/node/branch.d.ts.map +1 -0
- package/dist/esm/node/branch.js +48 -0
- package/dist/esm/node/branch.js.map +1 -0
- package/dist/esm/node/extension.d.ts +7 -0
- package/dist/esm/node/extension.d.ts.map +1 -0
- package/dist/esm/node/extension.js +10 -0
- package/dist/esm/node/extension.js.map +1 -0
- package/dist/esm/node/extensionOrLeafNodeBase.d.ts +15 -0
- package/dist/esm/node/extensionOrLeafNodeBase.d.ts.map +1 -0
- package/dist/esm/node/extensionOrLeafNodeBase.js +38 -0
- package/dist/esm/node/extensionOrLeafNodeBase.js.map +1 -0
- package/dist/esm/node/index.d.ts +5 -0
- package/dist/esm/node/index.d.ts.map +1 -0
- package/dist/esm/node/index.js +5 -0
- package/dist/esm/node/index.js.map +1 -0
- package/dist/esm/node/leaf.d.ts +7 -0
- package/dist/esm/node/leaf.d.ts.map +1 -0
- package/dist/esm/node/leaf.js +10 -0
- package/dist/esm/node/leaf.js.map +1 -0
- package/dist/esm/node/util.d.ts +8 -0
- package/dist/esm/node/util.d.ts.map +1 -0
- package/dist/esm/node/util.js +33 -0
- package/dist/esm/node/util.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/proof/index.d.ts +3 -0
- package/dist/esm/proof/index.d.ts.map +1 -0
- package/dist/esm/proof/index.js +3 -0
- package/dist/esm/proof/index.js.map +1 -0
- package/dist/esm/proof/proof.d.ts +41 -0
- package/dist/esm/proof/proof.d.ts.map +1 -0
- package/dist/esm/proof/proof.js +113 -0
- package/dist/esm/proof/proof.js.map +1 -0
- package/dist/esm/proof/range.d.ts +35 -0
- package/dist/esm/proof/range.d.ts.map +1 -0
- package/dist/esm/proof/range.js +453 -0
- package/dist/esm/proof/range.js.map +1 -0
- package/dist/esm/types.d.ts +110 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +3 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/util/asyncWalk.d.ts +20 -0
- package/dist/esm/util/asyncWalk.d.ts.map +1 -0
- package/dist/esm/util/asyncWalk.js +47 -0
- package/dist/esm/util/asyncWalk.js.map +1 -0
- package/dist/esm/util/encoding.d.ts +31 -0
- package/dist/esm/util/encoding.d.ts.map +1 -0
- package/dist/esm/util/encoding.js +188 -0
- package/dist/esm/util/encoding.js.map +1 -0
- package/dist/esm/util/genesisState.d.ts +6 -0
- package/dist/esm/util/genesisState.d.ts.map +1 -0
- package/dist/esm/util/genesisState.js +42 -0
- package/dist/esm/util/genesisState.js.map +1 -0
- package/dist/esm/util/hex.d.ts +20 -0
- package/dist/esm/util/hex.d.ts.map +1 -0
- package/dist/esm/util/hex.js +43 -0
- package/dist/esm/util/hex.js.map +1 -0
- package/dist/esm/util/index.d.ts +4 -0
- package/dist/esm/util/index.d.ts.map +1 -0
- package/dist/esm/util/index.js +4 -0
- package/dist/esm/util/index.js.map +1 -0
- package/dist/esm/util/nibbles.d.ts +30 -0
- package/dist/esm/util/nibbles.d.ts.map +1 -0
- package/dist/esm/util/nibbles.js +73 -0
- package/dist/esm/util/nibbles.js.map +1 -0
- package/dist/esm/util/walkController.d.ts +72 -0
- package/dist/esm/util/walkController.d.ts.map +1 -0
- package/dist/esm/util/walkController.js +134 -0
- package/dist/esm/util/walkController.js.map +1 -0
- package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
- package/package.json +85 -0
- package/src/constructors.ts +71 -0
- package/src/db/checkpointDB.ts +298 -0
- package/src/db/index.ts +1 -0
- package/src/index.ts +7 -0
- package/src/mpt.ts +1090 -0
- package/src/node/branch.ts +60 -0
- package/src/node/extension.ts +13 -0
- package/src/node/extensionOrLeafNodeBase.ts +54 -0
- package/src/node/index.ts +4 -0
- package/src/node/leaf.ts +13 -0
- package/src/node/util.ts +35 -0
- package/src/proof/index.ts +2 -0
- package/src/proof/proof.ts +135 -0
- package/src/proof/range.ts +542 -0
- package/src/types.ts +151 -0
- package/src/util/asyncWalk.ts +60 -0
- package/src/util/encoding.ts +209 -0
- package/src/util/genesisState.ts +52 -0
- package/src/util/hex.ts +47 -0
- package/src/util/index.ts +3 -0
- package/src/util/nibbles.ts +80 -0
- package/src/util/walkController.ts +172 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports._walkTrie = _walkTrie;
|
|
4
|
+
const rlp_1 = require("@feelyourprotocol/rlp");
|
|
5
|
+
const util_1 = require("@feelyourprotocol/util");
|
|
6
|
+
const branch_ts_1 = require("../node/branch.js");
|
|
7
|
+
const extension_ts_1 = require("../node/extension.js");
|
|
8
|
+
/**
|
|
9
|
+
* Walk MerklePatriciaTrie via async generator
|
|
10
|
+
* @param nodeHash - The root key to walk on.
|
|
11
|
+
* @param currentKey - The current (partial) key.
|
|
12
|
+
* @param onFound - Called on every node found (before filter)
|
|
13
|
+
* @param filter - Filter nodes yielded by the generator.
|
|
14
|
+
* @param visited - Set of visited nodes
|
|
15
|
+
* @returns AsyncIterable<{ node: MPTNode; currentKey: number[] }>
|
|
16
|
+
* Iterate through nodes with
|
|
17
|
+
* `for await (const { node, currentKey } of trie._walkTrie(root)) { ... }`
|
|
18
|
+
*/
|
|
19
|
+
async function* _walkTrie(nodeHash, currentKey = [], onFound = async (_trieNode, _key) => { }, filter = async (_trieNode, _key) => true, visited = new Set()) {
|
|
20
|
+
if ((0, util_1.equalsBytes)(nodeHash, this.EMPTY_TRIE_ROOT)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const node = await this.lookupNode(nodeHash);
|
|
25
|
+
if (node === undefined || visited.has((0, util_1.bytesToHex)(this.hash(node.serialize())))) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
visited.add((0, util_1.bytesToHex)(this.hash(node.serialize())));
|
|
29
|
+
await onFound(node, currentKey);
|
|
30
|
+
if (await filter(node, currentKey)) {
|
|
31
|
+
yield { node: node, currentKey };
|
|
32
|
+
}
|
|
33
|
+
if (node instanceof branch_ts_1.BranchMPTNode) {
|
|
34
|
+
for (const [nibble, childNode] of node._branches.entries()) {
|
|
35
|
+
const nextKey = [...currentKey, nibble];
|
|
36
|
+
const _childNode = childNode instanceof Uint8Array ? childNode : this.hash(rlp_1.RLP.encode(childNode));
|
|
37
|
+
yield* _walkTrie.bind(this)(_childNode, nextKey, onFound, filter, visited);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else if (node instanceof extension_ts_1.ExtensionMPTNode) {
|
|
41
|
+
const childNode = node.value();
|
|
42
|
+
const nextKey = [...currentKey, ...node._nibbles];
|
|
43
|
+
yield* _walkTrie.bind(this)(childNode, nextKey, onFound, filter, visited);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=asyncWalk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asyncWalk.js","sourceRoot":"","sources":["../../../src/util/asyncWalk.ts"],"names":[],"mappings":";;AAuBA,8BAoCC;AA3DD,yCAAqC;AACrC,2CAA0D;AAE1D,iDAAiD;AACjD,uDAAuD;AAQvD;;;;;;;;;;GAUG;AACI,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,IAAA,kBAAW,EAAC,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,IAAA,iBAAU,EAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,OAAM;QACR,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAA,iBAAU,EAAC,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,yBAAa,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,SAAG,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,+BAAgB,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,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeAndFormatKeyPaths = exports.pathToHexKey = exports.byteTypeToNibbleType = exports.nibbleTypeToByteType = exports.compactBytesToNibbles = exports.bytesToNibbles = exports.nibblesToCompactBytes = exports.hexToKeybytes = exports.nibblesToBytes = void 0;
|
|
4
|
+
const util_1 = require("@feelyourprotocol/util");
|
|
5
|
+
const nibbles_ts_1 = require("./nibbles.js");
|
|
6
|
+
// Reference: https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/
|
|
7
|
+
//
|
|
8
|
+
// MerklePatriciaTrie keys are dealt with in three distinct encodings:
|
|
9
|
+
//
|
|
10
|
+
// KEYBYTES encoding contains the actual key and nothing else. This encoding is the
|
|
11
|
+
// input to most API functions.
|
|
12
|
+
//
|
|
13
|
+
// HEX encoding contains one byte for each nibble of the key and an optional trailing
|
|
14
|
+
// 'terminator' byte of value 0x10 which indicates whether or not the node at the key
|
|
15
|
+
// contains a value. Hex key encoding is used for nodes loaded in memory because it's
|
|
16
|
+
// convenient to access.
|
|
17
|
+
//
|
|
18
|
+
// COMPACT encoding is defined by the Ethereum Yellow Paper (it's called "hex prefix
|
|
19
|
+
// encoding" there) and contains the bytes of the key and a flag. The high nibble of the
|
|
20
|
+
// first byte contains the flag; the lowest bit encoding the oddness of the length and
|
|
21
|
+
// the second-lowest encoding whether the node at the key is a value node. The low nibble
|
|
22
|
+
// of the first byte is zero in the case of an even number of nibbles and the first nibble
|
|
23
|
+
// in the case of an odd number. All remaining nibbles (now an even number) fit properly
|
|
24
|
+
// into the remaining bytes. Compact encoding is used for nodes stored on disk.
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
* @param nibbles byte sequence
|
|
28
|
+
* @returns boolean indicating if input hex nibble sequence has terminator indicating leaf-node
|
|
29
|
+
* terminator is represented with 16 because a nibble ranges from 0 - 15(f)
|
|
30
|
+
*/
|
|
31
|
+
const hasTerminator = (nibbles) => {
|
|
32
|
+
return nibbles.length > 0 && nibbles[nibbles.length - 1] === 16;
|
|
33
|
+
};
|
|
34
|
+
const nibblesToBytes = (nibbles) => {
|
|
35
|
+
const bytes = new Uint8Array(nibbles.length / 2);
|
|
36
|
+
for (let bi = 0, ni = 0; ni < nibbles.length; bi += 1, ni += 2) {
|
|
37
|
+
bytes[bi] = (nibbles[ni] << 4) | nibbles[ni + 1];
|
|
38
|
+
}
|
|
39
|
+
return bytes;
|
|
40
|
+
};
|
|
41
|
+
exports.nibblesToBytes = nibblesToBytes;
|
|
42
|
+
const hexToKeybytes = (hex) => {
|
|
43
|
+
if (hasTerminator(hex)) {
|
|
44
|
+
hex = hex.subarray(0, hex.length - 1);
|
|
45
|
+
}
|
|
46
|
+
if (hex.length % 2 === 1) {
|
|
47
|
+
throw Error("Can't convert hex key of odd length");
|
|
48
|
+
}
|
|
49
|
+
return (0, exports.nibblesToBytes)(hex);
|
|
50
|
+
};
|
|
51
|
+
exports.hexToKeybytes = hexToKeybytes;
|
|
52
|
+
// hex to compact
|
|
53
|
+
const nibblesToCompactBytes = (nibbles) => {
|
|
54
|
+
let terminator = 0;
|
|
55
|
+
if (hasTerminator(nibbles)) {
|
|
56
|
+
terminator = 1;
|
|
57
|
+
// Remove the terminator from the sequence
|
|
58
|
+
nibbles = nibbles.subarray(0, nibbles.length - 1);
|
|
59
|
+
}
|
|
60
|
+
const buf = new Uint8Array(nibbles.length / 2 + 1);
|
|
61
|
+
// Shift the terminator info into the first nibble of buf[0]
|
|
62
|
+
buf[0] = terminator << 5;
|
|
63
|
+
// If odd length, then add that flag into the first nibble and put the odd nibble to
|
|
64
|
+
// second part of buf[0] which otherwise will be left padded with a 0
|
|
65
|
+
if ((nibbles.length & 1) === 1) {
|
|
66
|
+
buf[0] |= 1 << 4;
|
|
67
|
+
buf[0] |= nibbles[0];
|
|
68
|
+
nibbles = nibbles.subarray(1);
|
|
69
|
+
}
|
|
70
|
+
// create bytes out of the rest even nibbles
|
|
71
|
+
return (0, util_1.concatBytes)(buf.subarray(0, 1), (0, exports.nibblesToBytes)(nibbles));
|
|
72
|
+
};
|
|
73
|
+
exports.nibblesToCompactBytes = nibblesToCompactBytes;
|
|
74
|
+
const bytesToNibbles = (str) => {
|
|
75
|
+
const l = str.length * 2 + 1;
|
|
76
|
+
const nibbles = new Uint8Array(l);
|
|
77
|
+
for (let i = 0; i < str.length; i++) {
|
|
78
|
+
const b = str[i];
|
|
79
|
+
nibbles[i * 2] = b / 16;
|
|
80
|
+
nibbles[i * 2 + 1] = b % 16;
|
|
81
|
+
}
|
|
82
|
+
// This will get removed from calling function if the first nibble
|
|
83
|
+
// indicates that terminator is not present
|
|
84
|
+
nibbles[l - 1] = 16;
|
|
85
|
+
return nibbles;
|
|
86
|
+
};
|
|
87
|
+
exports.bytesToNibbles = bytesToNibbles;
|
|
88
|
+
const compactBytesToNibbles = (compact) => {
|
|
89
|
+
if (compact.length === 0) {
|
|
90
|
+
return compact;
|
|
91
|
+
}
|
|
92
|
+
let base = (0, exports.bytesToNibbles)(compact);
|
|
93
|
+
// delete terminator flag if terminator flag was not in first nibble
|
|
94
|
+
if (base[0] < 2) {
|
|
95
|
+
base = base.subarray(0, base.length - 1);
|
|
96
|
+
}
|
|
97
|
+
// chop the terminator nibble and the even padding (if there is one)
|
|
98
|
+
// i.e. chop 2 left nibbles when even else 1 when odd
|
|
99
|
+
const chop = 2 - (base[0] & 1);
|
|
100
|
+
return base.subarray(chop);
|
|
101
|
+
};
|
|
102
|
+
exports.compactBytesToNibbles = compactBytesToNibbles;
|
|
103
|
+
/**
|
|
104
|
+
* Converts each nibble into a single byte
|
|
105
|
+
*
|
|
106
|
+
* @param arr Nibble typed nibble array
|
|
107
|
+
* @returns Uint8Array typed byte array
|
|
108
|
+
*/
|
|
109
|
+
const nibbleTypeToByteType = (arr) => {
|
|
110
|
+
const l = arr.length;
|
|
111
|
+
const buf = new Uint8Array(l);
|
|
112
|
+
for (let i = 0; i < buf.length; i++) {
|
|
113
|
+
buf[i] = arr[i];
|
|
114
|
+
}
|
|
115
|
+
return buf;
|
|
116
|
+
};
|
|
117
|
+
exports.nibbleTypeToByteType = nibbleTypeToByteType;
|
|
118
|
+
/**
|
|
119
|
+
* Turns each byte into a single nibble, only extracting the lower nibble of each byte
|
|
120
|
+
*
|
|
121
|
+
* @param key Uint8Array typed byte array
|
|
122
|
+
* @returns Nibble typed nibble array
|
|
123
|
+
*/
|
|
124
|
+
const byteTypeToNibbleType = (key) => {
|
|
125
|
+
const nibbles = [];
|
|
126
|
+
for (let i = 0; i < key.length; i++) {
|
|
127
|
+
const q = i;
|
|
128
|
+
nibbles[q] = key[i] % 16;
|
|
129
|
+
}
|
|
130
|
+
return nibbles;
|
|
131
|
+
};
|
|
132
|
+
exports.byteTypeToNibbleType = byteTypeToNibbleType;
|
|
133
|
+
/**
|
|
134
|
+
* Takes a string path and extends it by the given extension nibbles
|
|
135
|
+
*
|
|
136
|
+
* @param path String node path
|
|
137
|
+
* @param extension nibbles to extend by
|
|
138
|
+
* @param retType string indicating whether to return the key in "keybyte" or "hex" encoding
|
|
139
|
+
* @returns hex-encoded key
|
|
140
|
+
*/
|
|
141
|
+
const pathToHexKey = (path, extension, retType) => {
|
|
142
|
+
const b = (0, util_1.hexToBytes)(`0x${path}`);
|
|
143
|
+
const n = (0, exports.byteTypeToNibbleType)(b);
|
|
144
|
+
if (retType === 'hex') {
|
|
145
|
+
return (0, exports.nibbleTypeToByteType)(n.concat(extension));
|
|
146
|
+
}
|
|
147
|
+
else if (retType === 'keybyte') {
|
|
148
|
+
return (0, nibbles_ts_1.nibblesTypeToPackedBytes)(n.concat(extension));
|
|
149
|
+
}
|
|
150
|
+
throw Error('retType must be either "keybyte" or "hex"');
|
|
151
|
+
};
|
|
152
|
+
exports.pathToHexKey = pathToHexKey;
|
|
153
|
+
const mergeAndFormatKeyPaths = (pathStrings) => {
|
|
154
|
+
const ret = [];
|
|
155
|
+
let paths = [];
|
|
156
|
+
let i = 0;
|
|
157
|
+
while (i < pathStrings.length) {
|
|
158
|
+
const outerPathString = pathStrings[i].split('/');
|
|
159
|
+
const outerAccountPath = outerPathString[0];
|
|
160
|
+
const outerStoragePath = outerPathString[1];
|
|
161
|
+
paths.push(outerAccountPath);
|
|
162
|
+
if (outerStoragePath !== undefined) {
|
|
163
|
+
paths.push(outerStoragePath);
|
|
164
|
+
}
|
|
165
|
+
let j = ++i;
|
|
166
|
+
while (j < pathStrings.length) {
|
|
167
|
+
const innerPathString = pathStrings[j].split('/');
|
|
168
|
+
const innerAccountPath = innerPathString[0];
|
|
169
|
+
const innerStoragePath = innerPathString[1];
|
|
170
|
+
if (innerAccountPath === outerAccountPath) {
|
|
171
|
+
paths.push(innerStoragePath);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
ret.push(paths);
|
|
175
|
+
paths = [];
|
|
176
|
+
i = j;
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
j++;
|
|
180
|
+
}
|
|
181
|
+
if (paths.length > 0) {
|
|
182
|
+
ret.push(paths);
|
|
183
|
+
paths = [];
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (paths.length > 0)
|
|
187
|
+
ret.push(paths);
|
|
188
|
+
return ret.map((pathStrings) => pathStrings.map((s) => {
|
|
189
|
+
if (s.length < 64) {
|
|
190
|
+
// partial path is compact encoded
|
|
191
|
+
return (0, exports.nibblesToCompactBytes)((0, util_1.unprefixedHexToBytes)(s));
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// full path is keybyte encoded
|
|
195
|
+
return (0, exports.hexToKeybytes)((0, util_1.unprefixedHexToBytes)(s));
|
|
196
|
+
}
|
|
197
|
+
}));
|
|
198
|
+
};
|
|
199
|
+
exports.mergeAndFormatKeyPaths = mergeAndFormatKeyPaths;
|
|
200
|
+
//# sourceMappingURL=encoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../../src/util/encoding.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.genesisMPTStateRoot = genesisMPTStateRoot;
|
|
4
|
+
const rlp_1 = require("@feelyourprotocol/rlp");
|
|
5
|
+
const util_1 = require("@feelyourprotocol/util");
|
|
6
|
+
const sha3_js_1 = require("@noble/hashes/sha3.js");
|
|
7
|
+
const mpt_ts_1 = require("../mpt.js");
|
|
8
|
+
/**
|
|
9
|
+
* Derives the stateRoot of the genesis block based on genesis allocations
|
|
10
|
+
*/
|
|
11
|
+
async function genesisMPTStateRoot(genesisState) {
|
|
12
|
+
const trie = new mpt_ts_1.MerklePatriciaTrie({ useKeyHashing: true });
|
|
13
|
+
for (const [key, value] of Object.entries(genesisState)) {
|
|
14
|
+
const address = (0, util_1.isHexString)(key) ? (0, util_1.hexToBytes)(key) : (0, util_1.unprefixedHexToBytes)(key);
|
|
15
|
+
const account = new util_1.Account();
|
|
16
|
+
if (typeof value === 'string') {
|
|
17
|
+
account.balance = BigInt(value);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
const [balance, code, storage, nonce] = value;
|
|
21
|
+
if (balance !== undefined) {
|
|
22
|
+
account.balance = BigInt(balance);
|
|
23
|
+
}
|
|
24
|
+
if (code !== undefined) {
|
|
25
|
+
const codeBytes = (0, util_1.isHexString)(code) ? (0, util_1.hexToBytes)(code) : (0, util_1.unprefixedHexToBytes)(code);
|
|
26
|
+
account.codeHash = (0, sha3_js_1.keccak_256)(codeBytes);
|
|
27
|
+
}
|
|
28
|
+
if (storage !== undefined) {
|
|
29
|
+
const storageTrie = new mpt_ts_1.MerklePatriciaTrie({ useKeyHashing: true });
|
|
30
|
+
for (const [k, val] of storage) {
|
|
31
|
+
const storageKey = (0, util_1.isHexString)(k) ? (0, util_1.hexToBytes)(k) : (0, util_1.unprefixedHexToBytes)(k);
|
|
32
|
+
const storageVal = rlp_1.RLP.encode((0, util_1.unpadBytes)((0, util_1.isHexString)(val) ? (0, util_1.hexToBytes)(val) : (0, util_1.unprefixedHexToBytes)(val)));
|
|
33
|
+
await storageTrie.put(storageKey, storageVal);
|
|
34
|
+
}
|
|
35
|
+
account.storageRoot = storageTrie.root();
|
|
36
|
+
}
|
|
37
|
+
if (nonce !== undefined) {
|
|
38
|
+
account.nonce = BigInt(nonce);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
await trie.put(address, account.serialize());
|
|
42
|
+
}
|
|
43
|
+
return trie.root();
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=genesisState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesisState.js","sourceRoot":"","sources":["../../../src/util/genesisState.ts"],"names":[],"mappings":";;AAiBA,kDAkCC;AAnDD,yCAAqC;AACrC,2CAMyB;AACzB,mDAAkD;AAElD,sCAA8C;AAI9C;;GAEG;AACI,KAAK,UAAU,mBAAmB,CAAC,YAA0B;IAClE,MAAM,IAAI,GAAG,IAAI,2BAAkB,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,IAAA,kBAAW,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAU,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,2BAAoB,EAAC,GAAG,CAAC,CAAA;QAC9E,MAAM,OAAO,GAAG,IAAI,cAAO,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,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,2BAAoB,EAAC,IAAI,CAAC,CAAA;gBACnF,OAAO,CAAC,QAAQ,GAAG,IAAA,oBAAU,EAAC,SAAS,CAAC,CAAA;YAC1C,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,WAAW,GAAG,IAAI,2BAAkB,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,IAAA,kBAAW,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAU,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,2BAAoB,EAAC,CAAC,CAAC,CAAA;oBAC3E,MAAM,UAAU,GAAG,SAAG,CAAC,MAAM,CAC3B,IAAA,iBAAU,EAAC,IAAA,kBAAW,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAU,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,2BAAoB,EAAC,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,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addHexPrefix = addHexPrefix;
|
|
4
|
+
exports.removeHexPrefix = removeHexPrefix;
|
|
5
|
+
exports.isTerminator = isTerminator;
|
|
6
|
+
/**
|
|
7
|
+
* Prepends hex prefix to an array of nibbles.
|
|
8
|
+
* @param key - Array of nibbles
|
|
9
|
+
* @returns returns buffer of encoded data
|
|
10
|
+
**/
|
|
11
|
+
function addHexPrefix(key, terminator) {
|
|
12
|
+
// odd
|
|
13
|
+
if (key.length % 2) {
|
|
14
|
+
key.unshift(1);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
// even
|
|
18
|
+
key.unshift(0);
|
|
19
|
+
key.unshift(0);
|
|
20
|
+
}
|
|
21
|
+
if (terminator) {
|
|
22
|
+
key[0] += 2;
|
|
23
|
+
}
|
|
24
|
+
return key;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Removes hex prefix of an array of nibbles.
|
|
28
|
+
* @param val - Array of nibbles
|
|
29
|
+
* @private
|
|
30
|
+
*/
|
|
31
|
+
function removeHexPrefix(val) {
|
|
32
|
+
if (val[0] % 2) {
|
|
33
|
+
val = val.slice(1);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
val = val.slice(2);
|
|
37
|
+
}
|
|
38
|
+
return val;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns true if hex-prefixed path is for a terminating (leaf) node.
|
|
42
|
+
* @param key - a hex-prefixed array of nibbles
|
|
43
|
+
* @private
|
|
44
|
+
*/
|
|
45
|
+
function isTerminator(key) {
|
|
46
|
+
return key[0] > 1;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=hex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.js","sourceRoot":"","sources":["../../../src/util/hex.ts"],"names":[],"mappings":";;AAOA,oCAeC;AAOD,0CAQC;AAOD,oCAEC;AA5CD;;;;IAII;AACJ,SAAgB,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,SAAgB,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,SAAgB,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC"}
|
|
@@ -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,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./encoding.js"), exports);
|
|
18
|
+
__exportStar(require("./genesisState.js"), exports);
|
|
19
|
+
__exportStar(require("./walkController.js"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA6B;AAC7B,oDAAiC;AACjC,sDAAmC"}
|
|
@@ -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,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bytesToNibbles = bytesToNibbles;
|
|
4
|
+
exports.nibblesTypeToPackedBytes = nibblesTypeToPackedBytes;
|
|
5
|
+
exports.nibblesCompare = nibblesCompare;
|
|
6
|
+
exports.matchingNibbleLength = matchingNibbleLength;
|
|
7
|
+
/**
|
|
8
|
+
* Converts a bytes to a nibble array.
|
|
9
|
+
* @private
|
|
10
|
+
* @param key
|
|
11
|
+
*/
|
|
12
|
+
function bytesToNibbles(key) {
|
|
13
|
+
const nibbles = [];
|
|
14
|
+
for (let i = 0; i < key.length; i++) {
|
|
15
|
+
let q = i * 2;
|
|
16
|
+
nibbles[q] = key[i] >> 4;
|
|
17
|
+
++q;
|
|
18
|
+
nibbles[q] = key[i] % 16;
|
|
19
|
+
}
|
|
20
|
+
return nibbles;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Converts a nibble array into bytes.
|
|
24
|
+
* @private
|
|
25
|
+
* @param arr - Nibble array
|
|
26
|
+
*/
|
|
27
|
+
function nibblesTypeToPackedBytes(arr) {
|
|
28
|
+
const buf = new Uint8Array(arr.length / 2);
|
|
29
|
+
for (let i = 0; i < buf.length; i++) {
|
|
30
|
+
let q = i * 2;
|
|
31
|
+
buf[i] = (arr[q] << 4) + arr[++q];
|
|
32
|
+
}
|
|
33
|
+
return buf;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Compare two nibble array.
|
|
37
|
+
* * `0` is returned if `n2` === `n1`.
|
|
38
|
+
* * `1` is returned if `n2` > `n1`.
|
|
39
|
+
* * `-1` is returned if `n2` < `n1`.
|
|
40
|
+
* @param n1 - Nibble array
|
|
41
|
+
* @param n2 - Nibble array
|
|
42
|
+
*/
|
|
43
|
+
function nibblesCompare(n1, n2) {
|
|
44
|
+
const cmpLength = Math.min(n1.length, n2.length);
|
|
45
|
+
let res = 0;
|
|
46
|
+
for (let i = 0; i < cmpLength; i++) {
|
|
47
|
+
if (n1[i] < n2[i]) {
|
|
48
|
+
res = -1;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
else if (n1[i] > n2[i]) {
|
|
52
|
+
res = 1;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (res === 0) {
|
|
57
|
+
if (n1.length < n2.length) {
|
|
58
|
+
res = -1;
|
|
59
|
+
}
|
|
60
|
+
else if (n1.length > n2.length) {
|
|
61
|
+
res = 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return res;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Returns the number of in order matching nibbles of two give nibble arrays.
|
|
68
|
+
* @private
|
|
69
|
+
* @param nib1
|
|
70
|
+
* @param nib2
|
|
71
|
+
*/
|
|
72
|
+
function matchingNibbleLength(nib1, nib2) {
|
|
73
|
+
let i = 0;
|
|
74
|
+
while (nib1[i] === nib2[i] && nib1.length > i) {
|
|
75
|
+
i++;
|
|
76
|
+
}
|
|
77
|
+
return i;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=nibbles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nibbles.js","sourceRoot":"","sources":["../../../src/util/nibbles.ts"],"names":[],"mappings":";;AAOA,wCAWC;AAOD,4DAOC;AAUD,wCAuBC;AAQD,oDAMC;AA7ED;;;;GAIG;AACH,SAAgB,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,SAAgB,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,SAAgB,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,SAAgB,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"}
|