{"_id":"@ada-anvil/merkle","_rev":"4-80f60f1d363dde02abb6300eef731645","name":"@ada-anvil/merkle","dist-tags":{"configure-trusted-publisher":"0.0.0-configure-trusted-publisher","latest":"0.0.1"},"versions":{"0.0.0":{"name":"@ada-anvil/merkle","version":"0.0.0","keywords":["javascript","typescript","typesafe","merkle","tree","anvil","cardano","forge","crypto"],"author":{"name":"Ada Anvil"},"license":"MIT","_id":"@ada-anvil/merkle@0.0.0","maintainers":[{"name":"pabz-anvil","email":"pabz@ada-anvil.io"},{"name":"tqueri","email":"tqueri@ada-anvil.io"},{"name":"dodilanne","email":"vincaudet@gmail.com"},{"name":"mrabdibdi-anvil","email":"mrabdibdi@ada-anvil.io"}],"homepage":"https://github.com/cardano-forge/anvil-merkle","bugs":{"url":"https://github.com/cardano-forge/anvil-merkle/issues"},"dist":{"shasum":"84aa0242fa04b77e63ffb981a46787156d10d1e5","tarball":"https://registry.npmjs.org/@ada-anvil/merkle/-/merkle-0.0.0.tgz","fileCount":18,"integrity":"sha512-s2h61iodSR507m3yY5cPPvklSLpUBUfJyyGs7LhqtGOccF2Xl3/MYR6RSLaMsLtMzi+FFaqSuOtjLvNuVCpS4g==","signatures":[{"sig":"MEYCIQD5vydcNZAysMS0flxMiti44ZwOriTVzN0f+FJbDwqMHAIhAKD6Z9HAPXNiaSbvLCRmwl/zvTVlKPMOJbrQbiwhZ9VL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":61292},"main":"./core.js","types":"./core.d.mts","module":"./core.mjs","exports":{".":{"import":{"types":"./core.d.mts","import":"./core.mjs"},"require":{"types":"./core.d.ts","require":"./core.js"}},"./csl":{"import":{"types":"./csl.d.mts","import":"./csl.mjs"},"require":{"types":"./csl.d.ts","require":"./csl.js"}},"./crypto":{"import":{"types":"./crypto.d.mts","import":"./crypto.mjs"},"require":{"types":"./crypto.d.ts","require":"./crypto.js"}},"./package.json":"./package.json"},"gitHead":"4ce294564b87d55495405bf5336681064cc62ff8","scripts":{"pre":"npm run lint && npm run check && npm run build && npm run test","lint":"biome check --write .","test":"vitest --run","bench":"vitest bench --run","build":"tsup","check":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"pabz-anvil","email":"pabz@ada-anvil.io"},"repository":{"url":"git+https://github.com/cardano-forge/anvil-merkle.git","type":"git"},"_npmVersion":"10.9.2","description":"TypeScript utilities for working with Merkle trees","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"trynot":"^0.0.2"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.13.4","@biomejs/biome":"2.0.6","@faker-js/faker":"^10.1.0","@emurgo/cardano-serialization-lib-nodejs-gc":"^15.0.1"},"peerDependencies":{"@emurgo/cardano-serialization-lib-nodejs-gc":">=14.0.0"},"peerDependenciesMeta":{"@emurgo/cardano-serialization-lib-nodejs-gc":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/merkle_0.0.0_1764625644819_0.6855599914018013","host":"s3://npm-registry-packages-npm-production"}},"0.0.0-configure-trusted-publisher":{"name":"@ada-anvil/merkle","version":"0.0.0-configure-trusted-publisher","keywords":["javascript","typescript","typesafe","merkle","tree","anvil","cardano","forge","crypto"],"author":{"name":"Ada Anvil"},"license":"MIT","_id":"@ada-anvil/merkle@0.0.0-configure-trusted-publisher","maintainers":[{"name":"pabz-anvil","email":"pabz@ada-anvil.io"},{"name":"tqueri","email":"tqueri@ada-anvil.io"},{"name":"dodilanne","email":"vincaudet@gmail.com"},{"name":"mrabdibdi-anvil","email":"mrabdibdi@ada-anvil.io"}],"homepage":"https://github.com/Cardano-Forge/anvil-merkle","bugs":{"url":"https://github.com/Cardano-Forge/anvil-merkle/issues"},"dist":{"shasum":"2a304e1c19abf5de1bc0cbf801d6ef9334ba4b36","tarball":"https://registry.npmjs.org/@ada-anvil/merkle/-/merkle-0.0.0-configure-trusted-publisher.tgz","fileCount":18,"integrity":"sha512-wPdLDbowNVjctvHY3HDhdyXBebgY3r+pVwtz8IeqKCL83niiItxEGUpbtpvY6GIUIftI9pjVqom9q3y4PExETg==","signatures":[{"sig":"MEUCIQDMdu9QauF//kDSw/iFAY5/NS2rtoxtovUY9uLfNYaCHwIgCFI5m+uAuZAVoUuv0M+JD6FcCiRlAofLM3SLoOfslPY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ada-anvil%2fmerkle@0.0.0-configure-trusted-publisher","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":61320},"main":"./core.js","types":"./core.d.mts","module":"./core.mjs","exports":{".":{"import":{"types":"./core.d.mts","import":"./core.mjs"},"require":{"types":"./core.d.ts","require":"./core.js"}},"./csl":{"import":{"types":"./csl.d.mts","import":"./csl.mjs"},"require":{"types":"./csl.d.ts","require":"./csl.js"}},"./crypto":{"import":{"types":"./crypto.d.mts","import":"./crypto.mjs"},"require":{"types":"./crypto.d.ts","require":"./crypto.js"}},"./package.json":"./package.json"},"gitHead":"c9356693aeaca8b4934b8baf27284d5dc2a9117c","scripts":{"pre":"npm run lint && npm run check && npm run build && npm run test","lint":"biome check --write .","test":"vitest --run","bench":"vitest bench --run","build":"tsup","check":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6b21c894-8963-494f-8d35-36e103f22c38"}},"repository":{"url":"git+https://github.com/Cardano-Forge/anvil-merkle.git","type":"git"},"_npmVersion":"11.8.0","description":"TypeScript utilities for working with Merkle trees","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"trynot":"^0.0.2"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.13.4","@biomejs/biome":"2.0.6","@faker-js/faker":"^10.1.0","@emurgo/cardano-serialization-lib-nodejs-gc":"^15.0.1"},"peerDependencies":{"@emurgo/cardano-serialization-lib-nodejs-gc":">=14.0.0"},"peerDependenciesMeta":{"@emurgo/cardano-serialization-lib-nodejs-gc":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/merkle_0.0.0-configure-trusted-publisher_1769631453418_0.9038148069433525","host":"s3://npm-registry-packages-npm-production"}},"0.0.1":{"name":"@ada-anvil/merkle","version":"0.0.1","keywords":["javascript","typescript","typesafe","merkle","tree","anvil","cardano","forge","crypto"],"author":{"name":"Ada Anvil"},"license":"MIT","_id":"@ada-anvil/merkle@0.0.1","maintainers":[{"name":"pabz-anvil","email":"pabz@ada-anvil.io"},{"name":"tqueri","email":"tqueri@ada-anvil.io"},{"name":"dodilanne","email":"vincaudet@gmail.com"},{"name":"mrabdibdi-anvil","email":"mrabdibdi@ada-anvil.io"}],"homepage":"https://github.com/Cardano-Forge/anvil-merkle","bugs":{"url":"https://github.com/Cardano-Forge/anvil-merkle/issues"},"dist":{"shasum":"10fdbd0c687cf2a69b004763be7f0de15269ec85","tarball":"https://registry.npmjs.org/@ada-anvil/merkle/-/merkle-0.0.1.tgz","fileCount":18,"integrity":"sha512-6KLOdM5zpg2Dz0azf9nzU7JWYzqXwQUwuyoe9Srp6+QqDriylHZIlFBdBeJyggzVbX9w3008bU2X0/O+RDhMUA==","signatures":[{"sig":"MEQCICF2D7GqjtfehxVpei6wDOo7MQBf4rlJCbfE1LxBicinAiBr9SaNEZ/rXfsYdioRPv9I9knx/w0X1AULsv/I3EOAzA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ada-anvil%2fmerkle@0.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60336},"main":"./core.js","types":"./core.d.mts","module":"./core.mjs","exports":{".":{"import":{"types":"./core.d.mts","import":"./core.mjs"},"require":{"types":"./core.d.ts","require":"./core.js"}},"./csl":{"import":{"types":"./csl.d.mts","import":"./csl.mjs"},"require":{"types":"./csl.d.ts","require":"./csl.js"}},"./crypto":{"import":{"types":"./crypto.d.mts","import":"./crypto.mjs"},"require":{"types":"./crypto.d.ts","require":"./crypto.js"}},"./package.json":"./package.json"},"gitHead":"1d4d65e05988975e6a5a1941498e87ee38351526","scripts":{"pre":"npm run lint && npm run check && npm run build && npm run test","lint":"biome check --write .","test":"vitest --run","bench":"vitest bench --run","build":"tsx build.ts","check":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6b21c894-8963-494f-8d35-36e103f22c38"}},"repository":{"url":"git+https://github.com/Cardano-Forge/anvil-merkle.git","type":"git"},"_npmVersion":"11.8.0","description":"TypeScript utilities for working with Merkle trees","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"trynot":"^0.0.2"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.13.4","@biomejs/biome":"2.0.6","@faker-js/faker":"^10.1.0","@emurgo/cardano-serialization-lib-nodejs-gc":"^15.0.1"},"peerDependencies":{"@emurgo/cardano-serialization-lib-nodejs-gc":">=14.0.0"},"peerDependenciesMeta":{"@emurgo/cardano-serialization-lib-nodejs-gc":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/merkle_0.0.1_1769632221905_0.6137655089468568","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-12-01T21:47:24.762Z","modified":"2026-05-08T20:30:48.505Z","0.0.0":"2025-12-01T21:47:25.003Z","0.0.0-configure-trusted-publisher":"2026-01-28T20:17:33.574Z","0.0.1":"2026-01-28T20:30:22.145Z"},"bugs":{"url":"https://github.com/Cardano-Forge/anvil-merkle/issues"},"author":{"name":"Ada Anvil"},"license":"MIT","homepage":"https://github.com/Cardano-Forge/anvil-merkle","keywords":["javascript","typescript","typesafe","merkle","tree","anvil","cardano","forge","crypto"],"repository":{"url":"git+https://github.com/Cardano-Forge/anvil-merkle.git","type":"git"},"description":"TypeScript utilities for working with Merkle trees","maintainers":[{"email":"tqueri@ada-anvil.io","name":"tqueri"},{"email":"vincaudet@gmail.com","name":"dodilanne"},{"email":"mrabdibdi@ada-anvil.io","name":"mrabdibdi-anvil"}],"readme":"# `@ada-anvil/merkle`\n\nTypeScript utilities for working with Merkle trees.\n\n## Installation\n\n```bash\nnpm install @ada-anvil/merkle\n```\n\n### Optional peer dependency\n\nIf using the CSL implementation:\n\n```bash\nnpm install @emurgo/cardano-serialization-lib-nodejs-gc\n```\n\n## Entry points\n\n### `@ada-anvil/merkle`\n\nCore functions and factory primitives. No peer dependencies.\n\n```typescript\nimport {\n  createMerkleTree,\n  buildTree,\n  getProof,\n  verifyProof,\n} from \"@ada-anvil/merkle\";\n```\n\n### `@ada-anvil/merkle/crypto`\n\nMerkle tree implementations using `node:crypto` (Node.js only).\n\n```typescript\nimport {\n  createCryptoMerkleTree,\n  createCryptoSerialMerkleTree,\n} from \"@ada-anvil/merkle/crypto\";\n```\n\n### `@ada-anvil/merkle/csl`\n\nMerkle tree implementations using `@emurgo/cardano-serialization-lib-nodejs-gc`. Requires the Emurgo library as an optional peer dependency.\n\n```typescript\nimport {\n  createCslMerkleTree,\n  createCslSerialMerkleTree,\n} from \"@ada-anvil/merkle/csl\";\n```\n\n## Usage\n\n### Merkle tree (arbitrary elements)\n\n```typescript\nimport { createCryptoMerkleTree } from \"@ada-anvil/merkle/crypto\";\n\n// Create tree from UUIDs\nconst uuids = [\n  \"550e8400-e29b-41d4-a716-446655440000\",\n  \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\",\n  \"6ba7b811-9dad-11d1-80b4-00c04fd430c8\",\n  \"6ba7b812-9dad-11d1-80b4-00c04fd430c8\",\n];\n\nconst tree = createCryptoMerkleTree(uuids);\n\n// Get root\nconst root = tree.getRoot();\n\n// Generate proof for element\nconst proof = tree.getProof(uuids[1]);\n\n// Verify proof\nif (proof) {\n  const isValid = tree.verifyProof(uuids[1], proof);\n  console.log(isValid); // true\n}\n\n// Get leaf node\nconst leaf = tree.getLeaf(uuids[0]);\nconsole.log(leaf); // { node: Buffer, index: 0 }\n\n// Get sibling\nconst sibling = tree.getSibling(leaf.index);\n```\n\n### Serial Merkle tree (consecutive integers)\n\n```typescript\nimport { createCryptoSerialMerkleTree } from \"@ada-anvil/merkle/crypto\";\n\n// Create tree from consecutive integers\nconst ids = [1, 2, 3, 4, 5, 6, 7, 8];\n\nconst tree = createCryptoSerialMerkleTree(ids);\n\nif (tree) {\n  // Get root\n  const root = tree.getRoot();\n\n  // Generate range proof\n  const rangeProof = tree.getRangeProof([3, 6]);\n\n  // Verify range proof\n  const isValid = tree.verifyRangeProof([3, 6], rangeProof);\n  console.log(isValid); // true\n\n  // Single element proof\n  const singleProof = tree.getProof(5);\n  if (singleProof) {\n    console.log(tree.verifyProof(5, singleProof)); // true\n  }\n}\n```\n\n### Custom implementation\n\nUse the core library to build your own Merkle tree with custom hash functions:\n\n```typescript\nimport { createMerkleTree, type MerkleTreeConfig } from \"@ada-anvil/merkle\";\n\ntype CustomNode = { hash: string };\ntype CustomElement = { id: string; data: string };\n\nconst config: MerkleTreeConfig<CustomNode, CustomElement> = {\n  elementToNode: (element) => ({\n    hash: customHash(element.id + element.data),\n  }),\n  combineNodes: (left, right) => ({\n    hash: customHash(left.hash + right.hash),\n  }),\n  compareNodes: (left, right) => left.hash === right.hash,\n};\n\nconst elements = [\n  { id: \"1\", data: \"foo\" },\n  { id: \"2\", data: \"bar\" },\n];\n\nconst tree = createMerkleTree(elements, config);\n```\n\n## API\n\n### Tree instance methods\n\n- `getRoot()` - Returns the root node\n- `getLeaf(element)` - Returns leaf node and index for element\n- `getLeaves()` - Returns all leaf nodes\n- `getSibling(index, layerIndex?)` - Returns sibling node at index\n- `getProof(element)` - Generates inclusion proof for element\n- `verifyProof(element, proof)` - Verifies inclusion proof\n\n### Serial tree additional methods\n\n- `getRangeProof([start, end])` - Generates proof for range of consecutive elements\n- `verifyRangeProof([start, end], proof)` - Verifies range proof\n","readmeFilename":"README.md"}