{"_id":"@d4mr/t2z-wasm","_rev":"7-b5cc4e051ed099a47dbe6e887d3c3258","name":"@d4mr/t2z-wasm","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"@d4mr/t2z-wasm","version":"0.0.1","license":"MIT OR Apache-2.0","_id":"@d4mr/t2z-wasm@0.0.1","maintainers":[{"name":"d4mr","email":"deformercoding@gmail.com"}],"homepage":"https://github.com/d4mr/t2z#readme","bugs":{"url":"https://github.com/d4mr/t2z/issues"},"dist":{"shasum":"2d112a91d364276e63e188c96f88bcafd94eebc4","tarball":"https://registry.npmjs.org/@d4mr/t2z-wasm/-/t2z-wasm-0.0.1.tgz","fileCount":8,"integrity":"sha512-u0DoN5K0QPhtbws/0pC3VJHagJ+Lp3iO7UnsVVCb6A0HgdBUd1DRiuNSxH3THzvyz2K2iJNVBoRayfkBe0X2JQ==","signatures":[{"sig":"MEUCIQDV6VkJcUgDsD9++UIXeABaL1kUlfxwvVNBH1wXa7uezwIgbUEKlmpdfHLQlB8SHip/AH8b3uSc4Lj8MLspB26fujU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3816104},"main":"t2z_wasm.js","type":"module","types":"t2z_wasm.d.ts","gitHead":"fb2d088e742aa7b492e7804aeff55ee1d056ed16","_npmUser":{"name":"d4mr","email":"deformercoding@gmail.com"},"repository":{"url":"git+https://github.com/d4mr/t2z.git","type":"git"},"_npmVersion":"11.6.1","description":"WebAssembly bindings for T2Z - Transparent to Zero-knowledge Zcash transactions","directories":{},"sideEffects":["./t2z_wasm.js","./snippets/*"],"_nodeVersion":"24.10.0","collaborators":["Prithvish <deformercoding@gmail.com>"],"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/t2z-wasm_0.0.1_1764795101754_0.16708253601949852","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@d4mr/t2z-wasm","type":"module","collaborators":["Prithvish <deformercoding@gmail.com>"],"description":"WebAssembly bindings for T2Z - Transparent to Zero-knowledge Zcash transactions","version":"0.0.2","license":"MIT OR Apache-2.0","repository":{"type":"git","url":"git+https://github.com/d4mr/t2z.git"},"main":"t2z_wasm.js","types":"t2z_wasm.d.ts","sideEffects":["./t2z_wasm.js","./snippets/*"],"gitHead":"5d979dfdd3362bfe7d9e0899e6388f2c00504608","_id":"@d4mr/t2z-wasm@0.0.2","bugs":{"url":"https://github.com/d4mr/t2z/issues"},"homepage":"https://github.com/d4mr/t2z#readme","_nodeVersion":"24.10.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-OGHIF46ctE1O5ayd6ZAkTYKW557vAaMUQuKS1pV15RwdaYiDE2RlXOg+SM0TJeR1h1/Px2wuGj5Vd8VK0Myjfw==","shasum":"4c56ad754c514bb3b6644ea4926c71eadf8163da","tarball":"https://registry.npmjs.org/@d4mr/t2z-wasm/-/t2z-wasm-0.0.2.tgz","fileCount":8,"unpackedSize":5133876,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIC6IIqIuTETC214EHkpjQQSFWLf7Tnktn1HSM6pHb6P3AiEA5hOfaBIjBl23bhZNsLRrNebp5tWHT96I3Z485gmxoKk="}]},"_npmUser":{"name":"d4mr","email":"deformercoding@gmail.com"},"directories":{},"maintainers":[{"name":"d4mr","email":"deformercoding@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/t2z-wasm_0.0.2_1764822606546_0.4246020625379041"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-03T20:51:41.661Z","modified":"2025-12-04T04:30:07.051Z","0.1.0":"2025-12-03T20:05:00.971Z","0.1.1":"2025-12-03T20:35:29.733Z","0.0.1":"2025-12-03T20:51:42.023Z","0.0.2":"2025-12-04T04:30:06.851Z"},"bugs":{"url":"https://github.com/d4mr/t2z/issues"},"license":"MIT OR Apache-2.0","homepage":"https://github.com/d4mr/t2z#readme","repository":{"type":"git","url":"git+https://github.com/d4mr/t2z.git"},"description":"WebAssembly bindings for T2Z - Transparent to Zero-knowledge Zcash transactions","maintainers":[{"name":"d4mr","email":"deformercoding@gmail.com"}],"readme":"<div align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/d4mr/t2z/master/demo/public/t2z_icon.png\" alt=\"t2z\" width=\"120\" />\n  \n  <h1>t2z-wasm</h1>\n  \n  <p><strong>Transparent → Shielded Zcash Transactions in JavaScript/TypeScript</strong></p>\n  \n  <p>\n    <a href=\"https://www.npmjs.com/package/@d4mr/t2z-wasm\"><img src=\"https://img.shields.io/npm/v/@d4mr/t2z-wasm.svg?style=flat-square&color=f59e0b\" alt=\"npm version\" /></a>\n    <a href=\"https://github.com/d4mr/t2z/blob/main/LICENSE-MIT\"><img src=\"https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg?style=flat-square\" alt=\"License\" /></a>\n  </p>\n  \n  <p>\n    <a href=\"https://t2z.d4mr.com\">Documentation</a> •\n    <a href=\"https://github.com/d4mr/t2z\">GitHub</a> •\n    <a href=\"https://zips.z.cash/zip-0374\">ZIP 374</a>\n  </p>\n</div>\n\n---\n\nBuild Zcash transactions that send from **transparent inputs** to **shielded Orchard outputs** using the [PCZT](https://zips.z.cash/zip-0374) (Partially Constructed Zcash Transaction) format.\n\n## Features\n\n- 🔐 **Transparent → Shielded**: Send from t-addresses to Orchard shielded addresses\n- 📦 **PCZT Format**: Full ZIP 374 support for multi-party transaction construction\n- 🌐 **Browser & Node.js**: Works in modern browsers and Node.js via WebAssembly\n- 🔑 **External Signing**: Supports hardware wallets and HSMs via `get_sighash` + `append_signature`\n- ⚡ **Halo 2 Proofs**: No trusted setup, no 50MB downloads - proving key built on demand\n- 🦀 **Rust Core**: Battle-tested Zcash libraries under the hood\n\n## Installation\n\n```bash\nnpm install @d4mr/t2z-wasm\n# or\npnpm add @d4mr/t2z-wasm\n# or\nyarn add @d4mr/t2z-wasm\n```\n\n## Quick Start\n\n```typescript\nimport * as t2z from '@d4mr/t2z-wasm';\n\n// 1. Create the transaction\nconst pczt = t2z.propose_transaction(\n  [new t2z.WasmTransparentInput(\n    pubkeyHex,      // 33-byte compressed pubkey\n    prevoutTxid,    // Previous tx ID (little-endian hex)\n    0,              // Output index\n    1000000n,       // Value in zatoshis (0.01 ZEC)\n    scriptPubkey,   // P2PKH script\n    null            // Sequence (default: 0xffffffff)\n  )],\n  [new t2z.WasmPayment(\n    'u1...',        // Unified address with Orchard receiver\n    900000n,        // Amount in zatoshis\n    null,           // Optional memo (hex)\n    null            // Optional label\n  )],\n  'u1...',          // Change address (Orchard recommended)\n  'testnet',        // 'mainnet' or 'testnet'\n  3720100           // Expiry height (must be post-Nu5)\n);\n\n// 2. Sign transparent inputs\nconst sighash = t2z.get_sighash(pczt, 0);\n// Sign externally (e.g., hardware wallet)\nconst signature = await yourSigner.sign(sighash);\npczt = t2z.append_signature(pczt, 0, pubkeyHex, signatureHex);\n\n// 3. Generate Orchard proofs (~10s first time, cached after)\npczt = t2z.prove_transaction(pczt);\n\n// 4. Finalize and broadcast\nconst txHex = t2z.finalize_and_extract_hex(pczt);\n// Submit txHex to the Zcash network\n```\n\n## API Reference\n\n### Transaction Construction\n\n| Function | Description |\n|----------|-------------|\n| `propose_transaction(inputs, payments, change_address, network, expiry_height)` | Create a PCZT from transparent inputs and payment outputs |\n| `inspect_pczt(pczt_hex)` | Get detailed info about a PCZT (inputs, outputs, fee, signing status) |\n\n### Signing (ZIP 244)\n\n| Function | Description |\n|----------|-------------|\n| `get_sighash(pczt, input_index)` | Get the 32-byte sighash for external signing |\n| `append_signature(pczt, input_index, pubkey, signature)` | Add a DER signature to the PCZT |\n| `sign_transparent_input(pczt, input_index, private_key)` | Convenience: sign internally with a private key |\n\n### Proving (Halo 2)\n\n| Function | Description |\n|----------|-------------|\n| `prove_transaction(pczt)` | Generate Orchard zero-knowledge proofs |\n| `prebuild_proving_key()` | Pre-build the proving key (~10s, cached globally) |\n| `is_proving_key_ready()` | Check if proving key is cached |\n\n### Finalization\n\n| Function | Description |\n|----------|-------------|\n| `verify_before_signing(pczt, payments, expected_change)` | Verify PCZT matches original request |\n| `finalize_and_extract(pczt)` | Extract raw transaction bytes |\n| `finalize_and_extract_hex(pczt)` | Extract transaction as hex string |\n\n### Utilities\n\n| Function | Description |\n|----------|-------------|\n| `parse_pczt(bytes)` | Parse PCZT from bytes |\n| `serialize_pczt(pczt)` | Serialize PCZT to bytes |\n| `generate_test_address(network)` | Generate a random Orchard test address |\n| `generate_test_keypair(network)` | Generate address + spending key + viewing key |\n| `version()` | Get library version |\n\n## Browser Setup\n\nFor multithreaded WASM (faster proving), set these headers:\n\n```\nCross-Origin-Opener-Policy: same-origin\nCross-Origin-Embedder-Policy: require-corp\n```\n\n### Vite Configuration\n\n```typescript\n// vite.config.ts\nimport wasm from 'vite-plugin-wasm';\nimport topLevelAwait from 'vite-plugin-top-level-await';\n\nexport default defineConfig({\n  plugins: [wasm(), topLevelAwait()],\n  server: {\n    headers: {\n      'Cross-Origin-Opener-Policy': 'same-origin',\n      'Cross-Origin-Embedder-Policy': 'require-corp',\n    },\n  },\n});\n```\n\n## Important Notes\n\n### Expiry Height\n\nThe `expiry_height` must be:\n1. **After Nu5 activation** (mainnet: 1,687,104 / testnet: 1,842,420)\n2. **At least current_height + 40** to avoid \"tx-expiring-soon\" errors\n\n```typescript\n// In production, fetch current height from lightwalletd\nconst currentHeight = await fetchCurrentBlockHeight();\nconst expiryHeight = currentHeight + 100; // ~2.5 hour buffer\n```\n\n### Transaction IDs\n\nBlock explorers show txids in **big-endian** (display order), but Zcash internally uses **little-endian**. When using a txid from an explorer:\n\n```typescript\n// Reverse bytes for internal use\nconst internalTxid = explorerTxid.match(/../g).reverse().join('');\n```\n\n## Demo\n\nTry the interactive demo at [t2z.d4mr.com/demo](https://t2z.d4mr.com/demo) to see the full transaction flow.\n\n## Related\n\n- [ZIP 374](https://zips.z.cash/zip-0374) - PCZT specification\n- [ZIP 244](https://zips.z.cash/zip-0244) - Transaction signature validation\n- [ZIP 317](https://zips.z.cash/zip-0317) - Fee calculation\n- [ZIP 321](https://zips.z.cash/zip-0321) - Payment request format\n\n## License\n\nLicensed under either of [Apache License, Version 2.0](LICENSE-APACHE) or [MIT license](LICENSE-MIT) at your option.\n","readmeFilename":"README.md"}