diff --git a/package.json b/package.json index 883afc6..967bf2b 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,11 @@ "@cosmos-kit/leap": "^2.4.3", "@cosmos-kit/leap-metamask-cosmos-snap": "^0.3.3", "@cosmos-kit/react": "^2.9.3", + "crypto-js": "4.1.1", + "@types/crypto-js": "4.2.1", "@fontsource/jetbrains-mono": "^4", "@fontsource/roboto": "^4", + "merkletreejs": "0.3.11", "@leapwallet/cosmos-snap-provider": "0.1.24", "@pinata/sdk": "^1.1.26", "@popperjs/core": "^2", diff --git a/utils/merkleTree.ts b/utils/merkleTree.ts new file mode 100644 index 0000000..6883dc4 --- /dev/null +++ b/utils/merkleTree.ts @@ -0,0 +1,31 @@ +import sha256 from 'crypto-js/sha256' +import { MerkleTree } from 'merkletreejs' + +export class WhitelistMerkleTree { + tree: MerkleTree + constructor(members: string[]) { + this.tree = new MerkleTree( + members.map((member) => sha256(member)), + sha256, + { + // sort: true, + // hashLeaves: false, + // sortLeaves: true, + sortPairs: true, + }, + ) + } + + getMerkleRoot() { + return this.tree.getRoot().toString('hex') + } + + getMerkleProof(member: string) { + console.log('this.tree.getProof(sha256(member).toString()): ', this.tree.getProof(sha256(member).toString())) + return this.tree.getProof(sha256(member).toString()).map((item) => item.data.toString('hex')) + } + + verify(proof: string[], member: string) { + return this.tree.verify(proof, sha256(member).toString(), this.tree.getRoot()) + } +}