Files
self/contracts/test/utils/example/balance-tree.ts
Kevin Lin 5a3bd28e7b Feature/add prettier formatter (#568)
* Add Prettier configuration and ignore files for code formatting

- Created .prettierignore to exclude specific directories and files from formatting.
- Added .prettierrc.yml with custom settings for print width and trailing commas.
- Updated package.json to include Prettier and its Solidity plugin as dependencies, along with scripts for formatting and checking code.

* Run prettier formatting
2025-05-23 15:52:59 +09:00

47 lines
1.3 KiB
TypeScript

import MerkleTree from "./merkle-tree";
import { ethers } from "ethers";
import { Buffer } from "buffer";
export default class BalanceTree {
private readonly tree: MerkleTree;
constructor(balances: { account: string; amount: bigint }[]) {
this.tree = new MerkleTree(
balances.map(({ account, amount }, index) => {
return BalanceTree.toNode(index, account, amount);
}),
);
}
public static verifyProof(
index: number | bigint,
account: string,
amount: bigint,
proof: Buffer[],
root: Buffer,
): boolean {
let pair = BalanceTree.toNode(index, account, amount);
for (const item of proof) {
pair = MerkleTree.combinedHash(pair, item);
}
return pair.equals(root);
}
// keccak256(abi.encode(index, account, amount))
public static toNode(index: number | bigint, account: string, amount: bigint): Buffer {
return Buffer.from(
ethers.solidityPackedKeccak256(["uint256", "address", "uint256"], [index, account, amount]).slice(2),
"hex",
);
}
public getHexRoot(): string {
return this.tree.getHexRoot();
}
// returns the hex bytes32 values of the proof
public getProof(index: number | bigint, account: string, amount: bigint): string[] {
return this.tree.getHexProof(BalanceTree.toNode(index, account, amount));
}
}