A deposit to a wormhole address is spent when its nullifier, poseidon2(poseidon2(salt || secret || transfer_count)), is in Wormhole::UsedNullifiers. Working out a wormhole balance means computing one for each deposit. That needs the address's secret, which never leaves WASM. wormholeNullifiers(mnemonic, password, account, branch, start, addresses, first, count) returns them for a run of addresses and a run of transfer counts. The BIP39 seed is stretched once per call; 40 addresses x 256 counts takes 194 ms in node. A call is capped at 100,000 nullifiers. This is ported onto qp-poseidon-core, not qp-wormhole-circuit, which would bring plonky2 into the WASM. The circuit crate is a dev-dependency only, as the reference: a known-answer test compares the port with Nullifier::from_preimage across secrets at and above the Goldilocks-prime limb edge and transfer counts across both 32-bit limbs, and asserts that enough cases were actually compared rather than skipped. The doc comments say to check nullifiers against a local copy of the spent set, never by key: exits publish nullifiers, so a lookup names the exit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
25 lines
710 B
JSON
25 lines
710 B
JSON
{
|
|
"author": "Quantus Network Developers <hello@quantus.com>",
|
|
"bugs": "https://git.lair.cafe/quantus/wasm/issues",
|
|
"description": "Quantus post-quantum crypto (ML-DSA, Poseidon2, HD derivation) for the browser",
|
|
"engines": {
|
|
"node": ">=18"
|
|
},
|
|
"homepage": "https://git.lair.cafe/quantus/wasm/src/branch/main/packages/quantus-crypto#readme",
|
|
"license": "Apache-2.0",
|
|
"name": "@quantus/crypto",
|
|
"repository": {
|
|
"directory": "packages/quantus-crypto",
|
|
"type": "git",
|
|
"url": "https://git.lair.cafe/quantus/wasm.git"
|
|
},
|
|
"sideEffects": false,
|
|
"type": "module",
|
|
"version": "0.3.0",
|
|
"main": "index.js",
|
|
"dependencies": {
|
|
"fflate": "^0.8.2",
|
|
"tslib": "^2.7.0"
|
|
}
|
|
}
|