mirror of
https://github.com/selfxyz/self.git
synced 2026-01-14 00:58:07 -05:00
* 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
47 lines
1.3 KiB
TypeScript
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));
|
|
}
|
|
}
|