@ledgerhq/hw-app-btc
Version:
Ledger Hardware Wallet Bitcoin Application API
70 lines (64 loc) • 2.42 kB
text/typescript
import { Merkle } from "../../src/newops/merkle";
function testHasher(buf: Buffer): Buffer {
return Buffer.from(buf);
}
function leaf(n: number) {
return Buffer.from([0, n]);
}
function merkleOf(count: number): Merkle {
const leaves: Buffer[] = [];
for (let i = 0; i < count; i++) {
leaves.push(leaf(i));
}
return new Merkle(leaves, testHasher);
}
function rootOfLeaves(...leaves: number[]): Buffer {
return new Merkle(
leaves.map(v => leaf(v)),
testHasher,
).getRoot();
}
function rootOf(count: number): Buffer {
const manuals = [
"0000000000000000000000000000000000000000000000000000000000000000",
"0000",
"0100000001",
"0101000000010002",
"0101000000010100020003",
"0101010000000101000200030004",
];
return Buffer.from(manuals[count], "hex");
}
test("Merkle root of N", () => {
for (let i = 0; i <= 5; i++) {
const root = merkleOf(i).getRoot();
const expectedRoot = rootOf(i);
expect(root).toEqual(expectedRoot);
}
});
test("Merkle proof of single", () => {
const proof = merkleOf(1).getProof(0);
expect(proof).toEqual([]);
});
test("Merkle proof of two", () => {
expect(merkleOf(2).getProof(0)).toEqual([rootOfLeaves(1)]);
expect(merkleOf(2).getProof(1)).toEqual([rootOfLeaves(0)]);
});
test("Merkle proof of three", () => {
expect(merkleOf(3).getProof(0)).toEqual([rootOfLeaves(1), rootOfLeaves(2)]);
expect(merkleOf(3).getProof(1)).toEqual([rootOfLeaves(0), rootOfLeaves(2)]);
expect(merkleOf(3).getProof(2)).toEqual([rootOfLeaves(0, 1)]);
});
test("Merkle proof of four", () => {
expect(merkleOf(4).getProof(0)).toEqual([rootOfLeaves(1), rootOfLeaves(2, 3)]);
expect(merkleOf(4).getProof(1)).toEqual([rootOfLeaves(0), rootOfLeaves(2, 3)]);
expect(merkleOf(4).getProof(2)).toEqual([rootOfLeaves(3), rootOfLeaves(0, 1)]);
expect(merkleOf(4).getProof(3)).toEqual([rootOfLeaves(2), rootOfLeaves(0, 1)]);
});
test("Merkle proof of five", () => {
expect(merkleOf(5).getProof(0)).toEqual([rootOfLeaves(1), rootOfLeaves(2, 3), rootOfLeaves(4)]);
expect(merkleOf(5).getProof(1)).toEqual([rootOfLeaves(0), rootOfLeaves(2, 3), rootOfLeaves(4)]);
expect(merkleOf(5).getProof(2)).toEqual([rootOfLeaves(3), rootOfLeaves(0, 1), rootOfLeaves(4)]);
expect(merkleOf(5).getProof(3)).toEqual([rootOfLeaves(2), rootOfLeaves(0, 1), rootOfLeaves(4)]);
expect(merkleOf(5).getProof(4)).toEqual([rootOfLeaves(0, 1, 2, 3)]);
});