diff --git a/CHANGELOG.md b/CHANGELOG.md index a51deb6..8f0454d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Added `SimpleMerkleTree` class that supports `bytes32` leaves with no extra hashing. - Support custom hashing function for computing internal nodes. Available in the core and in `SimpleMerkleTree`. +- Add `length` and `at()` (leaf getter) to `StandardMerkleTree` and `SimpleMerkleTree`. ## 1.0.6 diff --git a/src/merkletree.ts b/src/merkletree.ts index eda1b81..3739c20 100644 --- a/src/merkletree.ts +++ b/src/merkletree.ts @@ -23,6 +23,8 @@ export interface MerkleTreeData { export interface MerkleTree { root: HexString; + length: number; + at(index: number): T | undefined; render(): string; dump(): MerkleTreeData; entries(): Iterable<[number, T]>; @@ -85,6 +87,14 @@ export abstract class MerkleTreeImpl implements MerkleTree { return this.tree[0]!; } + get length(): number { + return this.values.length; + } + + at(index: number): T | undefined { + return this.values.at(index)?.value; + } + abstract dump(): MerkleTreeData; render() { diff --git a/src/simple.test.ts b/src/simple.test.ts index c9811ac..5bfb64c 100644 --- a/src/simple.test.ts +++ b/src/simple.test.ts @@ -2,16 +2,19 @@ import { test, testProp, fc } from '@fast-check/ava'; import { HashZero as zero } from '@ethersproject/constants'; import { keccak256 } from '@ethersproject/keccak256'; import { SimpleMerkleTree } from './simple'; -import { BytesLike, HexString, concat, compare } from './bytes'; +import { BytesLike, HexString, concat, compare, toHex } from './bytes'; +import { InvalidArgumentError, InvariantError } from './utils/errors'; + +fc.configureGlobal({ numRuns: process.env.CI ? 5000 : 100 }); const reverseNodeHash = (a: BytesLike, b: BytesLike): HexString => keccak256(concat([a, b].sort(compare).reverse())); const otherNodeHash = (a: BytesLike, b: BytesLike): HexString => keccak256(reverseNodeHash(a, b)); // double hash -import { toHex } from './bytes'; -import { InvalidArgumentError, InvariantError } from './utils/errors'; - -const leaf = fc.uint8Array({ minLength: 32, maxLength: 32 }).map(toHex); -const leaves = fc.array(leaf, { minLength: 1 }); +// Use a mix of uint8array and hexstring to cover the Byteslike space +const leaf = fc + .uint8Array({ minLength: 32, maxLength: 32 }) + .chain(l => fc.oneof(fc.constant(l), fc.constant(toHex(l)))); +const leaves = fc.array(leaf, { minLength: 1, maxLength: 1000 }); const options = fc.record({ sortLeaves: fc.oneof(fc.constant(undefined), fc.boolean()), nodeHash: fc.oneof(fc.constant(undefined), fc.constant(reverseNodeHash)), @@ -20,27 +23,31 @@ const options = fc.record({ const tree = fc .tuple(leaves, options) .chain(([leaves, options]) => fc.tuple(fc.constant(SimpleMerkleTree.of(leaves, options)), fc.constant(options))); -const treeAndLeaf = fc.tuple(leaves, options).chain(([leaves, options]) => +const treeAndLeaf = tree.chain(([tree, options]) => fc.tuple( - fc.constant(SimpleMerkleTree.of(leaves, options)), + fc.constant(tree), fc.constant(options), - fc.nat({ max: leaves.length - 1 }).map(index => ({ value: leaves[index]!, index })), + fc.nat({ max: tree.length - 1 }).map(index => ({ value: tree.at(index)!, index })), ), ); -const treeAndLeaves = fc.tuple(leaves, options).chain(([leaves, options]) => +const treeAndLeaves = tree.chain(([tree, options]) => fc.tuple( - fc.constant(SimpleMerkleTree.of(leaves, options)), + fc.constant(tree), fc.constant(options), fc - .uniqueArray(fc.nat({ max: leaves.length - 1 })) - .map(indices => indices.map(index => ({ value: leaves[index]!, index }))), + .uniqueArray(fc.nat({ max: tree.length - 1 })) + .map(indices => indices.map(index => ({ value: tree.at(index)!, index }))), ), ); -fc.configureGlobal({ numRuns: process.env.CI ? 10000 : 100 }); - testProp('generates a valid tree', [tree], (t, [tree]) => { t.notThrows(() => tree.validate()); + + // check leaves enumeration + for (const [index, value] of tree.entries()) { + t.is(value, tree.at(index)!); + } + t.is(tree.at(tree.length), undefined); }); testProp( @@ -118,10 +125,14 @@ testProp('dump and load', [tree], (t, [tree, options]) => { const recoveredTree = SimpleMerkleTree.load(dump, options.nodeHash); recoveredTree.validate(); // already done in load + // check dump & reconstructed tree + t.is(dump.format, 'simple-v1'); t.is(dump.hash, options.nodeHash ? 'custom' : undefined); + t.true(dump.values.every(({ value }, index) => value === toHex(tree.at(index)!))); + t.true(dump.values.every(({ value }, index) => value === toHex(recoveredTree.at(index)!))); t.is(tree.root, recoveredTree.root); + t.is(tree.length, recoveredTree.length); t.is(tree.render(), recoveredTree.render()); - t.deepEqual(tree.entries(), recoveredTree.entries()); t.deepEqual(tree.dump(), recoveredTree.dump()); }); diff --git a/src/simple.test.ts.md b/src/simple.test.ts.md index ec437f4..fb7e66e 100644 --- a/src/simple.test.ts.md +++ b/src/simple.test.ts.md @@ -8,107 +8,107 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 - `0) 0x6e12fdaf4d30f09cb298cbae1fefca45e012f15c4cbe029971591354cb02fb93␊ - ├─ 1) 0xec92620e0f47fd0c9d042839fefe36d967f496d3d35ac93cea868b19cd2e02ee␊ - │ ├─ 3) 0xd2d16a5e6aa61d811bf4f049c73845650d6abc8fd29b6b726096cd2ee34cf482␊ - │ │ ├─ 7) 0x9a72efa4d2200424a7b61e19fd40699b56b415872a852a93ba511122d3bce37d␊ - │ │ │ ├─ 15) 0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795␊ - │ │ │ └─ 16) 0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657␊ - │ │ └─ 8) 0x43a8922b07ce5529215a142cf6a825fb52e436b9e624cf8433816d1f5633918f␊ - │ │ ├─ 17) 0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a␊ - │ │ └─ 18) 0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422␊ - │ └─ 4) 0x2b9d51fc39c7a26d512fb53b02af937e8f59b8bb97bf0452000b740c4ce26176␊ - │ ├─ 9) 0xd6032017bee1596c5fb773f5e068cbecf331fec7f8352d6289c6358144e269b2␊ - │ │ ├─ 19) 0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8␊ - │ │ └─ 20) 0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10␊ - │ └─ 10) 0x5974921a3d745b1ca3d0fe4be9cb0d5aa83462b51be44bb81ec52b6c89899260␊ - │ ├─ 21) 0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa␊ - │ └─ 22) 0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1␊ - └─ 2) 0x7d21ca77f257ea4fdcbdb873e4c3a7b7023504685c9ac265bebe6638ce27da0b␊ - ├─ 5) 0x66ab29b8b8158a26f4abd58c00293cd8f39e68f359038c92625d011b07dd1131␊ - │ ├─ 11) 0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76␊ - │ └─ 12) 0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96␊ - └─ 6) 0x2666455df8a6e89a98b6559a85ed2b8b8756bdbcbdb425ddcb7a53b44f3749a4␊ - ├─ 13) 0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec␊ - └─ 14) 0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b` + `0) 0xeae2aa2e2d28fb278a21b19e9d9206c1196812f349dcf38f13e1e27d602b222f␊ + ├─ 1) 0xced35204b1057700c755a8912aa245f544e92f110988b5db7cd8ddfd0dae57d7␊ + │ ├─ 3) 0xdfce2b44a3d743e69213cea317e06938b1b167608793b0d2710a6f628c3d4544␊ + │ │ ├─ 7) 0x14ba244894581391e55029cfc5c642e90827a44f045a9522b361c1fa46d0dfec␊ + │ │ │ ├─ 15) 0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00␊ + │ │ │ └─ 16) 0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7␊ + │ │ └─ 8) 0xab7dd3630f5f715d2103cd5c355cbdce927f82ac7678534292d83f414202a960␊ + │ │ ├─ 17) 0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040␊ + │ │ └─ 18) 0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b␊ + │ └─ 4) 0x43b257992360b28c123974cbd937f638367bf806677b139917f87609cb968dc8␊ + │ ├─ 9) 0xfc1507515215531c72fcbee4d9a7ffb73b20830a3db654658710f701fb598cf8␊ + │ │ ├─ 19) 0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c␊ + │ │ └─ 20) 0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa␊ + │ └─ 10) 0x89d5ff39a78e99cab8cd1fa078a0915f3f5b80a698836d619416d4a28af20f5b␊ + │ ├─ 21) 0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16␊ + │ └─ 22) 0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3␊ + └─ 2) 0xb6a406673abf1c0167470af616eb0f4dfcd0b5f7c2b6645d4cee6a7e5eea757d␊ + ├─ 5) 0x76808f4cca778eb8396d513fab2b600d5c89700b525bfadcd020a4f4ba198ada␊ + │ ├─ 11) 0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780␊ + │ └─ 12) 0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a␊ + └─ 6) 0x0fa6a20c15254bf7e248fc283b92b34cc27a8d1a36ddafc68f04aaf14b570bcb␊ + ├─ 13) 0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e␊ + └─ 14) 0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e` > Snapshot 2 - `0) 0xe63fd9d6327adc6f47acceb58d2d9842ecd428ec4d6dda7904e6b828bae3c636␊ - ├─ 1) 0xf05c245c04fb0566cc96741aefb7bfb3b56029f920d5e310e45a96139c32fd67␊ - │ ├─ 3) 0xecb6d25b86ba91881829508dad368761fd1d4eea38262c3628f8d633b9367a4a␊ - │ │ ├─ 7) 0x7dd8feee91b50986708bc7ef1d67990699f574caf6cf1330769d5486a623a9a1␊ - │ │ │ ├─ 15) 0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795␊ - │ │ │ └─ 16) 0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96␊ - │ │ └─ 8) 0x579f487c164da5122caaefe3dae7271a9950d3b43c4291f172e52596c0520ae7␊ - │ │ ├─ 17) 0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b␊ - │ │ └─ 18) 0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a␊ - │ └─ 4) 0xd65c2278fae1d79f04f2fbb98b5b0c77b998a60d79b40a92a8271be5986ba363␊ - │ ├─ 9) 0xa1323737209d41c02223f1cc9f0a7a7f98f41c1e9f322c0157ee652792dd37f0␊ - │ │ ├─ 19) 0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657␊ - │ │ └─ 20) 0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1␊ - │ └─ 10) 0xd01ee00b871a17233c1bea3430c03dce9192aa48f4dbe01049e1a36b3c776f78␊ - │ ├─ 21) 0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422␊ + `0) 0x01c045e29149ea17e5710eb1d0e98be90f4bc5994deaf66f799e98f83133ff17␊ + ├─ 1) 0xd2e2ffb7f2056f9f36baeeecd0f0543d676a4014b4487755f5c670926a472521␊ + │ ├─ 3) 0x2955b2517c850af6b2326b88a00603faa5d16de54e65f93f67830c70a6f2d406␊ + │ │ ├─ 7) 0x653a93b10349d33ba63288eda8418a1395b8d71f0a40bd0fed90ea5b868f0a87␊ + │ │ │ ├─ 15) 0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b␊ + │ │ │ └─ 16) 0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a␊ + │ │ └─ 8) 0x95b28a92b600ab681493fc7958f63ab495a87a227bd99f6e37abd1adce619900␊ + │ │ ├─ 17) 0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e␊ + │ │ └─ 18) 0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040␊ + │ └─ 4) 0x39dbedaed2d0048e9a0377c985c2e73c88e068e5a5bb93d2be9ba5ab79da02e8␊ + │ ├─ 9) 0x79ff52c8a2419f1f89af7e9074dc76424283acdcca7ad3331a8b43de5353d37c␊ + │ │ ├─ 19) 0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7␊ + │ │ └─ 20) 0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c␊ + │ └─ 10) 0x9a22a39d9a184b2086ed82b81495b8afe801fe4b222123f60b7e6199e4fbd9ca␊ + │ ├─ 21) 0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e␊ │ └─ 22) 0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa␊ - └─ 2) 0x41e07ff981b5cbeb9029e61aa3fb1065c569aea5d85e5b9d6125a67aa3396817␊ - ├─ 5) 0x51151058fcf25893c6cf28d8fa018050cf0fc98a242c8605a75238b169b85379␊ - │ ├─ 11) 0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec␊ - │ └─ 12) 0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8␊ - └─ 6) 0x66295f7036a4fe03984558731b53d9df7cda88c2479bf57ff8763c6b498c19af␊ - ├─ 13) 0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76␊ - └─ 14) 0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10` + └─ 2) 0x642c88ba82a805138ab353569e7afc9da95020ec96b7276561dbc5be35bdac98␊ + ├─ 5) 0x0e0be6dd8f5951b8fe56f6d2b648756065d75cdffa15a4abcb24164130046f80␊ + │ ├─ 11) 0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16␊ + │ └─ 12) 0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780␊ + └─ 6) 0x9050dd5487ebc845e4e3d7f50d1fba27917bc8ca6be9605b59d8689cc0143b84␊ + ├─ 13) 0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00␊ + └─ 14) 0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3` > Snapshot 3 - `0) 0xd37427b3c449bf13d7e7d79cf805d2c0cabc7d23f7af86e8c24342a65a38117f␊ - ├─ 1) 0x23ef2b407ee96466ab7c1a264a943f0c6472fea32e2b954988e875cec381fc37␊ - │ ├─ 3) 0x3c80438df7d87a81d85c2cc336c339bf6eb1b7a4de3f40d1049a69df5ad27508␊ - │ │ ├─ 7) 0x3424aa6830d46cca88e092afbf281f0ee77e434130ee44d01427d47b31a43a85␊ - │ │ │ ├─ 15) 0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795␊ - │ │ │ └─ 16) 0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657␊ - │ │ └─ 8) 0x1b9b2b9ef84eba851dafa78967746275701a1cc21a36a83b99595b44a197da6f␊ - │ │ ├─ 17) 0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a␊ - │ │ └─ 18) 0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422␊ - │ └─ 4) 0x3b1d26649340543d5b5a6155c84e67f44fa55809b0f362f66bf2ade281a07ea5␊ - │ ├─ 9) 0x18650562a2744d49344010252b3e3104da144aa6737c4e730d59712909631fc7␊ - │ │ ├─ 19) 0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8␊ - │ │ └─ 20) 0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10␊ - │ └─ 10) 0x1faef214093f94529d3d8238dc6597ca6068c9d22a6ecfd3f7ccc25ed7b726df␊ - │ ├─ 21) 0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa␊ - │ └─ 22) 0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1␊ - └─ 2) 0x28b144b0df394fbee7f318e0d0747f5b20cfa05fe2b6aa20437a9c4fc1c65ceb␊ - ├─ 5) 0xcb4307038b5d39b0653ac9fb0bba4a43601307bc4844b72694dde953435db74d␊ - │ ├─ 11) 0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76␊ - │ └─ 12) 0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96␊ - └─ 6) 0xdcaac046ba8c026de89bdcaeb2d8b5ddf762ec899f86060a802a00371fd7d4f2␊ - ├─ 13) 0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec␊ - └─ 14) 0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b` + `0) 0xf69955a2bf369516ecdf1bc935b048923ee4f7bfb6c75d8630d451f90dce8441␊ + ├─ 1) 0xd01660cd0374763bc342fc325859f4d1a0b5277e5091795691af3a48f34924b0␊ + │ ├─ 3) 0x2920df9379d7cd018a13d7f55dbb0156ff05a7fef63c6756c3dbb3593424bcc2␊ + │ │ ├─ 7) 0xafc1e7b447bc1ab258aa3f0ec0e87f99e323011b1d62e7ece302ada53bbf32ff␊ + │ │ │ ├─ 15) 0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00␊ + │ │ │ └─ 16) 0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7␊ + │ │ └─ 8) 0x88d8ca1bd114833403c1100f0fc5527b653ac702e8de6fadf69b83a7121a543c␊ + │ │ ├─ 17) 0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040␊ + │ │ └─ 18) 0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b␊ + │ └─ 4) 0xcac043f261e616c82c71fc3c008867a8524eb9f6943fc667df76f6104d73c5f1␊ + │ ├─ 9) 0x37eca307fc87f4acb0b5efd190e32e84249d2ace31531966bb925c2e3274cc57␊ + │ │ ├─ 19) 0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c␊ + │ │ └─ 20) 0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa␊ + │ └─ 10) 0xb35196a13c2b085687696c2f7c3d3c54cf6ffd7e0cf3c19b011a246b3e498bec␊ + │ ├─ 21) 0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16␊ + │ └─ 22) 0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3␊ + └─ 2) 0xc781a87601c9e63bb75358ac8ae6590f6939578d4ac9d6cb995381b6256d095a␊ + ├─ 5) 0x6567a00bfe38ac308318a1c443a38e40631814269424c2c62db5fcf1b1507561␊ + │ ├─ 11) 0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780␊ + │ └─ 12) 0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a␊ + └─ 6) 0x527f722807fc8338e3eb0dda1651b412e3076805e7e7a63a1e0b1d81d439d1d2␊ + ├─ 13) 0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e␊ + └─ 14) 0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e` > Snapshot 4 - `0) 0xfdcc17bd4cc4ebba0cc671d3c52b68cd13e695f9dc3c4e7e4c8faf7ce0f8e371␊ - ├─ 1) 0x4a8b703c889b2fd6cceb57d51a2960c4c7c283707f8d8080d93d08ad9dea922e␊ - │ ├─ 3) 0x5dc10e6d5380d7c6dc6f5f042eda9974cbb412236f79686e40a052fabc12c049␊ - │ │ ├─ 7) 0x5d23ab436576466a1fc3cd310e096e1cade67473d398c6a43c9952ff31e1e75a␊ - │ │ │ ├─ 15) 0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795␊ - │ │ │ └─ 16) 0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96␊ - │ │ └─ 8) 0xa1d2e032a606b18bbb030451c6664ea03e4ab569f7318aa126a2a0002b1178b2␊ - │ │ ├─ 17) 0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b␊ - │ │ └─ 18) 0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a␊ - │ └─ 4) 0xd9eaefae907251e252eb2ed5c8963cb568aef567615ea3e006233374997eba5a␊ - │ ├─ 9) 0x553394a4ded1e4b00817083b9fdeecd889ea3b7d9c19046afcf1e4eb9199d55d␊ - │ │ ├─ 19) 0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657␊ - │ │ └─ 20) 0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1␊ - │ └─ 10) 0xdc812b2fa70fff382e84e45bee14d08893c2ff6279019ee95b04ce76be6f95f8␊ - │ ├─ 21) 0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422␊ + `0) 0x4a33b1862b5aa884a2a1bd82bbcec41d6c1b62fb141b15c668808bf4f197162e␊ + ├─ 1) 0x27b4234eac96ba21d7a848d81cd3a0bfa8de70b111655e013f66f6a206f4c61a␊ + │ ├─ 3) 0x5aa881cff9b5a77131d894dcf7f4ef9bfa0ee646dc0739b017c425e5f3b6a718␊ + │ │ ├─ 7) 0xd58472e1830e36bd43a7d4ab6ecfed6e3b4720aec4bdb0ea0c18cf3dba683a28␊ + │ │ │ ├─ 15) 0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b␊ + │ │ │ └─ 16) 0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a␊ + │ │ └─ 8) 0xd6e95548e6640322c1d4f9bcf6167f8653d455cd6f748b40b97db140b3dd54b3␊ + │ │ ├─ 17) 0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e␊ + │ │ └─ 18) 0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040␊ + │ └─ 4) 0x6a202056637b5035c9c8681dde478d51111b234a2c2efcfa90649e94bd743aca␊ + │ ├─ 9) 0x80a5646929b53639dfc6eb4e694daad483f3837f35981485803796f2a42026e5␊ + │ │ ├─ 19) 0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7␊ + │ │ └─ 20) 0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c␊ + │ └─ 10) 0x39587bc4b0d9c44b656b8bb58f8f2898a2a6669ec92d9e6dc5339380d3384b8b␊ + │ ├─ 21) 0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e␊ │ └─ 22) 0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa␊ - └─ 2) 0xf31eacd3933ab8ffac3fe2218dd35f33773df8b0b883d4466421c60b2c5b499d␊ - ├─ 5) 0xe2728c3f6cfeeed85f6b1276ac1076feafaa56464605e0fdeb3a189ed02e77e3␊ - │ ├─ 11) 0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec␊ - │ └─ 12) 0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8␊ - └─ 6) 0x08e34c58c9ac0aba2ad2e76375558139169fbc57883d8895841499566b41df21␊ - ├─ 13) 0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76␊ - └─ 14) 0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10` + └─ 2) 0xac9494c1135e4f30df4b02ec19ee89911464e111bf15579218b6f333c989e93b␊ + ├─ 5) 0x7c9a5635d4357d0033d7d9121f2e615ba275e12faafc4dcc9d812a3adbbd56c8␊ + │ ├─ 11) 0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16␊ + │ └─ 12) 0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780␊ + └─ 6) 0xd7489b96df4e29fa82b3b5aed9c65068ee4670d44f1ff68f15b5982e551028c3␊ + ├─ 13) 0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00␊ + └─ 14) 0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3` ## dump (with seed=0) @@ -117,78 +117,78 @@ Generated by [AVA](https://avajs.dev). { format: 'simple-v1', tree: [ - '0x6e12fdaf4d30f09cb298cbae1fefca45e012f15c4cbe029971591354cb02fb93', - '0xec92620e0f47fd0c9d042839fefe36d967f496d3d35ac93cea868b19cd2e02ee', - '0x7d21ca77f257ea4fdcbdb873e4c3a7b7023504685c9ac265bebe6638ce27da0b', - '0xd2d16a5e6aa61d811bf4f049c73845650d6abc8fd29b6b726096cd2ee34cf482', - '0x2b9d51fc39c7a26d512fb53b02af937e8f59b8bb97bf0452000b740c4ce26176', - '0x66ab29b8b8158a26f4abd58c00293cd8f39e68f359038c92625d011b07dd1131', - '0x2666455df8a6e89a98b6559a85ed2b8b8756bdbcbdb425ddcb7a53b44f3749a4', - '0x9a72efa4d2200424a7b61e19fd40699b56b415872a852a93ba511122d3bce37d', - '0x43a8922b07ce5529215a142cf6a825fb52e436b9e624cf8433816d1f5633918f', - '0xd6032017bee1596c5fb773f5e068cbecf331fec7f8352d6289c6358144e269b2', - '0x5974921a3d745b1ca3d0fe4be9cb0d5aa83462b51be44bb81ec52b6c89899260', - '0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76', - '0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96', - '0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec', - '0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b', - '0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795', - '0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657', - '0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a', - '0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422', - '0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8', - '0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10', + '0xeae2aa2e2d28fb278a21b19e9d9206c1196812f349dcf38f13e1e27d602b222f', + '0xced35204b1057700c755a8912aa245f544e92f110988b5db7cd8ddfd0dae57d7', + '0xb6a406673abf1c0167470af616eb0f4dfcd0b5f7c2b6645d4cee6a7e5eea757d', + '0xdfce2b44a3d743e69213cea317e06938b1b167608793b0d2710a6f628c3d4544', + '0x43b257992360b28c123974cbd937f638367bf806677b139917f87609cb968dc8', + '0x76808f4cca778eb8396d513fab2b600d5c89700b525bfadcd020a4f4ba198ada', + '0x0fa6a20c15254bf7e248fc283b92b34cc27a8d1a36ddafc68f04aaf14b570bcb', + '0x14ba244894581391e55029cfc5c642e90827a44f045a9522b361c1fa46d0dfec', + '0xab7dd3630f5f715d2103cd5c355cbdce927f82ac7678534292d83f414202a960', + '0xfc1507515215531c72fcbee4d9a7ffb73b20830a3db654658710f701fb598cf8', + '0x89d5ff39a78e99cab8cd1fa078a0915f3f5b80a698836d619416d4a28af20f5b', + '0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780', + '0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a', + '0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e', + '0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e', + '0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00', + '0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7', + '0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040', + '0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b', + '0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c', '0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa', - '0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1', + '0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16', + '0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3', ], values: [ { - treeIndex: 21, + treeIndex: 20, value: '0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa', }, { - treeIndex: 18, - value: '0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422', + treeIndex: 13, + value: '0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e', }, { - treeIndex: 22, - value: '0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1', + treeIndex: 19, + value: '0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c', }, { treeIndex: 16, - value: '0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657', + value: '0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7', }, { treeIndex: 17, - value: '0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a', + value: '0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040', }, { treeIndex: 14, - value: '0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b', + value: '0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e', }, { treeIndex: 12, - value: '0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96', + value: '0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a', }, { - treeIndex: 15, - value: '0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795', + treeIndex: 18, + value: '0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b', }, { - treeIndex: 20, - value: '0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10', + treeIndex: 22, + value: '0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3', }, { - treeIndex: 11, - value: '0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76', + treeIndex: 15, + value: '0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00', }, { - treeIndex: 19, - value: '0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8', + treeIndex: 11, + value: '0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780', }, { - treeIndex: 13, - value: '0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec', + treeIndex: 21, + value: '0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16', }, ], } @@ -198,28 +198,28 @@ Generated by [AVA](https://avajs.dev). { format: 'simple-v1', tree: [ - '0xe63fd9d6327adc6f47acceb58d2d9842ecd428ec4d6dda7904e6b828bae3c636', - '0xf05c245c04fb0566cc96741aefb7bfb3b56029f920d5e310e45a96139c32fd67', - '0x41e07ff981b5cbeb9029e61aa3fb1065c569aea5d85e5b9d6125a67aa3396817', - '0xecb6d25b86ba91881829508dad368761fd1d4eea38262c3628f8d633b9367a4a', - '0xd65c2278fae1d79f04f2fbb98b5b0c77b998a60d79b40a92a8271be5986ba363', - '0x51151058fcf25893c6cf28d8fa018050cf0fc98a242c8605a75238b169b85379', - '0x66295f7036a4fe03984558731b53d9df7cda88c2479bf57ff8763c6b498c19af', - '0x7dd8feee91b50986708bc7ef1d67990699f574caf6cf1330769d5486a623a9a1', - '0x579f487c164da5122caaefe3dae7271a9950d3b43c4291f172e52596c0520ae7', - '0xa1323737209d41c02223f1cc9f0a7a7f98f41c1e9f322c0157ee652792dd37f0', - '0xd01ee00b871a17233c1bea3430c03dce9192aa48f4dbe01049e1a36b3c776f78', - '0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec', - '0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8', - '0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76', - '0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10', - '0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795', - '0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96', - '0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b', - '0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a', - '0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657', - '0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1', - '0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422', + '0x01c045e29149ea17e5710eb1d0e98be90f4bc5994deaf66f799e98f83133ff17', + '0xd2e2ffb7f2056f9f36baeeecd0f0543d676a4014b4487755f5c670926a472521', + '0x642c88ba82a805138ab353569e7afc9da95020ec96b7276561dbc5be35bdac98', + '0x2955b2517c850af6b2326b88a00603faa5d16de54e65f93f67830c70a6f2d406', + '0x39dbedaed2d0048e9a0377c985c2e73c88e068e5a5bb93d2be9ba5ab79da02e8', + '0x0e0be6dd8f5951b8fe56f6d2b648756065d75cdffa15a4abcb24164130046f80', + '0x9050dd5487ebc845e4e3d7f50d1fba27917bc8ca6be9605b59d8689cc0143b84', + '0x653a93b10349d33ba63288eda8418a1395b8d71f0a40bd0fed90ea5b868f0a87', + '0x95b28a92b600ab681493fc7958f63ab495a87a227bd99f6e37abd1adce619900', + '0x79ff52c8a2419f1f89af7e9074dc76424283acdcca7ad3331a8b43de5353d37c', + '0x9a22a39d9a184b2086ed82b81495b8afe801fe4b222123f60b7e6199e4fbd9ca', + '0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16', + '0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780', + '0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00', + '0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3', + '0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b', + '0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a', + '0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e', + '0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040', + '0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7', + '0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c', + '0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e', '0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa', ], values: [ @@ -229,47 +229,47 @@ Generated by [AVA](https://avajs.dev). }, { treeIndex: 21, - value: '0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422', + value: '0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e', }, { treeIndex: 20, - value: '0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1', + value: '0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c', }, { treeIndex: 19, - value: '0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657', + value: '0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7', }, { treeIndex: 18, - value: '0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a', + value: '0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040', }, { treeIndex: 17, - value: '0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b', + value: '0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e', }, { treeIndex: 16, - value: '0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96', + value: '0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a', }, { treeIndex: 15, - value: '0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795', + value: '0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b', }, { treeIndex: 14, - value: '0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10', + value: '0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3', }, { treeIndex: 13, - value: '0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76', + value: '0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00', }, { treeIndex: 12, - value: '0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8', + value: '0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780', }, { treeIndex: 11, - value: '0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec', + value: '0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16', }, ], } @@ -280,78 +280,78 @@ Generated by [AVA](https://avajs.dev). format: 'simple-v1', hash: 'custom', tree: [ - '0xd37427b3c449bf13d7e7d79cf805d2c0cabc7d23f7af86e8c24342a65a38117f', - '0x23ef2b407ee96466ab7c1a264a943f0c6472fea32e2b954988e875cec381fc37', - '0x28b144b0df394fbee7f318e0d0747f5b20cfa05fe2b6aa20437a9c4fc1c65ceb', - '0x3c80438df7d87a81d85c2cc336c339bf6eb1b7a4de3f40d1049a69df5ad27508', - '0x3b1d26649340543d5b5a6155c84e67f44fa55809b0f362f66bf2ade281a07ea5', - '0xcb4307038b5d39b0653ac9fb0bba4a43601307bc4844b72694dde953435db74d', - '0xdcaac046ba8c026de89bdcaeb2d8b5ddf762ec899f86060a802a00371fd7d4f2', - '0x3424aa6830d46cca88e092afbf281f0ee77e434130ee44d01427d47b31a43a85', - '0x1b9b2b9ef84eba851dafa78967746275701a1cc21a36a83b99595b44a197da6f', - '0x18650562a2744d49344010252b3e3104da144aa6737c4e730d59712909631fc7', - '0x1faef214093f94529d3d8238dc6597ca6068c9d22a6ecfd3f7ccc25ed7b726df', - '0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76', - '0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96', - '0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec', - '0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b', - '0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795', - '0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657', - '0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a', - '0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422', - '0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8', - '0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10', + '0xf69955a2bf369516ecdf1bc935b048923ee4f7bfb6c75d8630d451f90dce8441', + '0xd01660cd0374763bc342fc325859f4d1a0b5277e5091795691af3a48f34924b0', + '0xc781a87601c9e63bb75358ac8ae6590f6939578d4ac9d6cb995381b6256d095a', + '0x2920df9379d7cd018a13d7f55dbb0156ff05a7fef63c6756c3dbb3593424bcc2', + '0xcac043f261e616c82c71fc3c008867a8524eb9f6943fc667df76f6104d73c5f1', + '0x6567a00bfe38ac308318a1c443a38e40631814269424c2c62db5fcf1b1507561', + '0x527f722807fc8338e3eb0dda1651b412e3076805e7e7a63a1e0b1d81d439d1d2', + '0xafc1e7b447bc1ab258aa3f0ec0e87f99e323011b1d62e7ece302ada53bbf32ff', + '0x88d8ca1bd114833403c1100f0fc5527b653ac702e8de6fadf69b83a7121a543c', + '0x37eca307fc87f4acb0b5efd190e32e84249d2ace31531966bb925c2e3274cc57', + '0xb35196a13c2b085687696c2f7c3d3c54cf6ffd7e0cf3c19b011a246b3e498bec', + '0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780', + '0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a', + '0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e', + '0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e', + '0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00', + '0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7', + '0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040', + '0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b', + '0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c', '0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa', - '0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1', + '0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16', + '0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3', ], values: [ { - treeIndex: 21, + treeIndex: 20, value: '0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa', }, { - treeIndex: 18, - value: '0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422', + treeIndex: 13, + value: '0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e', }, { - treeIndex: 22, - value: '0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1', + treeIndex: 19, + value: '0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c', }, { treeIndex: 16, - value: '0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657', + value: '0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7', }, { treeIndex: 17, - value: '0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a', + value: '0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040', }, { treeIndex: 14, - value: '0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b', + value: '0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e', }, { treeIndex: 12, - value: '0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96', + value: '0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a', }, { - treeIndex: 15, - value: '0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795', + treeIndex: 18, + value: '0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b', }, { - treeIndex: 20, - value: '0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10', + treeIndex: 22, + value: '0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3', }, { - treeIndex: 11, - value: '0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76', + treeIndex: 15, + value: '0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00', }, { - treeIndex: 19, - value: '0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8', + treeIndex: 11, + value: '0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780', }, { - treeIndex: 13, - value: '0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec', + treeIndex: 21, + value: '0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16', }, ], } @@ -362,28 +362,28 @@ Generated by [AVA](https://avajs.dev). format: 'simple-v1', hash: 'custom', tree: [ - '0xfdcc17bd4cc4ebba0cc671d3c52b68cd13e695f9dc3c4e7e4c8faf7ce0f8e371', - '0x4a8b703c889b2fd6cceb57d51a2960c4c7c283707f8d8080d93d08ad9dea922e', - '0xf31eacd3933ab8ffac3fe2218dd35f33773df8b0b883d4466421c60b2c5b499d', - '0x5dc10e6d5380d7c6dc6f5f042eda9974cbb412236f79686e40a052fabc12c049', - '0xd9eaefae907251e252eb2ed5c8963cb568aef567615ea3e006233374997eba5a', - '0xe2728c3f6cfeeed85f6b1276ac1076feafaa56464605e0fdeb3a189ed02e77e3', - '0x08e34c58c9ac0aba2ad2e76375558139169fbc57883d8895841499566b41df21', - '0x5d23ab436576466a1fc3cd310e096e1cade67473d398c6a43c9952ff31e1e75a', - '0xa1d2e032a606b18bbb030451c6664ea03e4ab569f7318aa126a2a0002b1178b2', - '0x553394a4ded1e4b00817083b9fdeecd889ea3b7d9c19046afcf1e4eb9199d55d', - '0xdc812b2fa70fff382e84e45bee14d08893c2ff6279019ee95b04ce76be6f95f8', - '0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec', - '0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8', - '0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76', - '0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10', - '0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795', - '0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96', - '0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b', - '0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a', - '0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657', - '0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1', - '0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422', + '0x4a33b1862b5aa884a2a1bd82bbcec41d6c1b62fb141b15c668808bf4f197162e', + '0x27b4234eac96ba21d7a848d81cd3a0bfa8de70b111655e013f66f6a206f4c61a', + '0xac9494c1135e4f30df4b02ec19ee89911464e111bf15579218b6f333c989e93b', + '0x5aa881cff9b5a77131d894dcf7f4ef9bfa0ee646dc0739b017c425e5f3b6a718', + '0x6a202056637b5035c9c8681dde478d51111b234a2c2efcfa90649e94bd743aca', + '0x7c9a5635d4357d0033d7d9121f2e615ba275e12faafc4dcc9d812a3adbbd56c8', + '0xd7489b96df4e29fa82b3b5aed9c65068ee4670d44f1ff68f15b5982e551028c3', + '0xd58472e1830e36bd43a7d4ab6ecfed6e3b4720aec4bdb0ea0c18cf3dba683a28', + '0xd6e95548e6640322c1d4f9bcf6167f8653d455cd6f748b40b97db140b3dd54b3', + '0x80a5646929b53639dfc6eb4e694daad483f3837f35981485803796f2a42026e5', + '0x39587bc4b0d9c44b656b8bb58f8f2898a2a6669ec92d9e6dc5339380d3384b8b', + '0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16', + '0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780', + '0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00', + '0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3', + '0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b', + '0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a', + '0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e', + '0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040', + '0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7', + '0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c', + '0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e', '0x1d3d2f27573475675df2df1fb427256b05d4fb3c1b60baa7f58e479719daa0aa', ], values: [ @@ -393,47 +393,47 @@ Generated by [AVA](https://avajs.dev). }, { treeIndex: 21, - value: '0x46cfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e5422', + value: '0xcfb9f0d1f86847e17e8975657bb314b1a3b6bb89e4a55f7d6f4c2fdf0e54226e', }, { treeIndex: 20, - value: '0x0229437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1', + value: '0x437bdff01e90d3cd2c5dc9d3253d2c13bcb59c0b1caf0862bac2bd829db1408c', }, { treeIndex: 19, - value: '0x8c11d27a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c114657', + value: '0x7a6e9c74765e13271dc8aeae29070438ee6ee872b94347de321c1146570888a7', }, { treeIndex: 18, - value: '0x88a73a1171ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a', + value: '0x71ee3428809bb0a61a2e3c5d1cbf719910d939ae243ec2859fdad36a9baa5040', }, { treeIndex: 17, - value: '0xaa504056e189fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b', + value: '0x89fd775322d63793b5a16fa1207441aa1a32439deb249fcdf54c3b56e6c6ce5e', }, { treeIndex: 16, - value: '0xe6c6ce5eb372e601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96', + value: '0xe601197002c965ee5d050cb2925dbb89822c5c8f27585a9b5a96fe9f71c4166a', }, { treeIndex: 15, - value: '0x9f71c4166a5f935a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b694795', + value: '0x5a4bb399392a0e19c8f6f6d70f9a57a5f49b76fd723b69479520223dc038a27b', }, { treeIndex: 14, - value: '0x223dc038a27b04f90f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10', + value: '0x0f865157aefbee4e661bdcf6a35cf443f57daae5e6eb3e10e1f26f6ac933beb3', }, { treeIndex: 13, - value: '0xf26f6ac933beb3e3608203578396131902729b62338aae6b4e1a767ae30c8b76', + value: '0x8203578396131902729b62338aae6b4e1a767ae30c8b765b2fac6f51addc8d00', }, { treeIndex: 12, - value: '0x2fac6f51addc8d004b3ff871d87c51837a4d881adb95b2a27820dbcafa94e7b8', + value: '0xf871d87c51837a4d881adb95b2a27820dbcafa94e7b8c7c36697399f86481780', }, { treeIndex: 11, - value: '0xc36697399f86481780854e17b7cbc50072efd74da5bfe81a712db493185c82ec', + value: '0x17b7cbc50072efd74da5bfe81a712db493185c82ece15e60f4eafc58d88a8e16', }, ], } diff --git a/src/simple.test.ts.snap b/src/simple.test.ts.snap index 9383c9f..ec816c2 100644 Binary files a/src/simple.test.ts.snap and b/src/simple.test.ts.snap differ diff --git a/src/standard.test.ts b/src/standard.test.ts index 164f3e2..6d7f404 100644 --- a/src/standard.test.ts +++ b/src/standard.test.ts @@ -4,34 +4,46 @@ import { keccak256 } from '@ethersproject/keccak256'; import { StandardMerkleTree } from './standard'; import { InvalidArgumentError, InvariantError } from './utils/errors'; +fc.configureGlobal({ numRuns: process.env.CI ? 5000 : 100 }); + const leafEncoding = ['uint256', 'string[]']; const leaf = fc.tuple(fc.bigUintN(256), fc.array(fc.string())); -const leaves = fc.array(leaf, { minLength: 1 }); +const leaves = fc.array(leaf, { minLength: 1, maxLength: 1000 }); const options = fc.record({ sortLeaves: fc.oneof(fc.constant(undefined), fc.boolean()) }); -const tree = fc.tuple(leaves, options).map(([leaves, options]) => StandardMerkleTree.of(leaves, leafEncoding, options)); -const treeAndLeaf = fc.tuple(leaves, options).chain(([leaves, options]) => +const tree = fc + .tuple(leaves, options) + .chain(([leaves, options]) => + fc.tuple(fc.constant(StandardMerkleTree.of(leaves, leafEncoding, options)), fc.constant(options)), + ); +const treeAndLeaf = tree.chain(([tree, options]) => fc.tuple( - fc.constant(StandardMerkleTree.of(leaves, leafEncoding, options)), - fc.nat({ max: leaves.length - 1 }).map(index => ({ value: leaves[index]!, index })), + fc.constant(tree), + fc.constant(options), + fc.nat({ max: tree.length - 1 }).map(index => ({ value: tree.at(index)!, index })), ), ); -const treeAndLeaves = fc.tuple(leaves, options).chain(([leaves, options]) => +const treeAndLeaves = tree.chain(([tree, options]) => fc.tuple( - fc.constant(StandardMerkleTree.of(leaves, leafEncoding, options)), + fc.constant(tree), + fc.constant(options), fc - .uniqueArray(fc.nat({ max: leaves.length - 1 })) - .map(indices => indices.map(index => ({ value: leaves[index]!, index }))), + .uniqueArray(fc.nat({ max: tree.length - 1 })) + .map(indices => indices.map(index => ({ value: tree.at(index)!, index }))), ), ); -fc.configureGlobal({ numRuns: process.env.CI ? 10000 : 100 }); - -testProp('generates a valid tree', [tree], (t, tree) => { +testProp('generates a valid tree', [tree], (t, [tree]) => { t.notThrows(() => tree.validate()); + + // check leaves enumeration + for (const [index, value] of tree.entries()) { + t.is(value, tree.at(index)!); + } + t.is(tree.at(tree.length), undefined); }); -testProp('generates valid single proofs for all leaves', [treeAndLeaf], (t, [tree, { value: leaf, index }]) => { +testProp('generates valid single proofs for all leaves', [treeAndLeaf], (t, [tree, , { value: leaf, index }]) => { const proof1 = tree.getProof(index); const proof2 = tree.getProof(leaf); @@ -41,13 +53,13 @@ testProp('generates valid single proofs for all leaves', [treeAndLeaf], (t, [tre t.true(StandardMerkleTree.verify(tree.root, leafEncoding, leaf, proof1)); }); -testProp('rejects invalid proofs', [treeAndLeaf, tree], (t, [tree, { value: leaf }], otherTree) => { +testProp('rejects invalid proofs', [treeAndLeaf, tree], (t, [tree, , { value: leaf }], [otherTree]) => { const proof = tree.getProof(leaf); t.false(otherTree.verify(leaf, proof)); t.false(StandardMerkleTree.verify(otherTree.root, leafEncoding, leaf, proof)); }); -testProp('generates valid multiproofs', [treeAndLeaves], (t, [tree, indices]) => { +testProp('generates valid multiproofs', [treeAndLeaves], (t, [tree, , indices]) => { const proof1 = tree.getMultiProof(indices.map(e => e.index)); const proof2 = tree.getMultiProof(indices.map(e => e.value)); @@ -56,7 +68,7 @@ testProp('generates valid multiproofs', [treeAndLeaves], (t, [tree, indices]) => t.true(StandardMerkleTree.verifyMultiProof(tree.root, leafEncoding, proof1)); }); -testProp('rejects invalid multiproofs', [treeAndLeaves, tree], (t, [tree, indices], otherTree) => { +testProp('rejects invalid multiproofs', [treeAndLeaves, tree], (t, [tree, , indices], [otherTree]) => { const multiProof = tree.getMultiProof(indices.map(e => e.index)); t.false(otherTree.verifyMultiProof(multiProof)); @@ -83,17 +95,22 @@ testProp( { numRuns: 1, seed: 0 }, ); -testProp('dump and load', [tree], (t, tree) => { - const recoveredTree = StandardMerkleTree.load(tree.dump()); +testProp('dump and load', [tree], (t, [tree]) => { + const dump = tree.dump(); + const recoveredTree = StandardMerkleTree.load(dump); recoveredTree.validate(); // already done in load + // check dump & reconstructed tree + t.is(dump.format, 'standard-v1'); + t.true(dump.values.every(({ value }, index) => value === tree.at(index)!)); + t.true(dump.values.every(({ value }, index) => value === recoveredTree.at(index)!)); t.is(tree.root, recoveredTree.root); + t.is(tree.length, recoveredTree.length); t.is(tree.render(), recoveredTree.render()); - t.deepEqual(tree.entries(), recoveredTree.entries()); t.deepEqual(tree.dump(), recoveredTree.dump()); }); -testProp('reject out of bounds value index', [tree], (t, tree) => { +testProp('reject out of bounds value index', [tree], (t, [tree]) => { t.throws(() => tree.getProof(-1), new InvalidArgumentError('Index out of bounds')); });