import { StandardMerkleTree } from '@openzeppelin/merkle-tree'; import { encodeAbiParameters, getAddress } from 'viem'; const buildMerkleTree = (addresses: string[]) => { return StandardMerkleTree.of( addresses.map((address) => [getAddress(address)]), ['address'], { sortLeaves: true } ); }; const buildConfiguration = ( manager: `0x${string}`, addresses: string[] ): `0x${string}` => { const tree = buildMerkleTree(addresses); const root = tree.root as `0x${string}`; return encodeAbiParameters( [{ type: 'address' }, { type: 'bytes' }], [manager, encodeAbiParameters([{ type: 'bytes32' }], [root])] ); }; const getProof = ( candidate: `0x${string}`, addresses: string[] ): `0x${string}` => { const tree = buildMerkleTree(addresses); const proof = tree.getProof([getAddress(candidate)]) as `0x${string}`[]; return encodeAbiParameters([{ type: 'bytes32[]' }], [proof]); }; export const AllowlistGate = { buildConfiguration, getProof, };