@permissionless-technologies/upp-sdk 0.3.6 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{asp-ZA3RGN7G.js → asp-72WUGTQE.js} +3 -3
- package/dist/asp-72WUGTQE.js.map +1 -0
- package/dist/{asp-TXSAFFD3.cjs → asp-CUE3NMBN.cjs} +14 -14
- package/dist/asp-CUE3NMBN.cjs.map +1 -0
- package/dist/{chunk-KXPZUBPI.cjs → chunk-23B5XSS4.cjs} +12 -12
- package/dist/{chunk-KXPZUBPI.cjs.map → chunk-23B5XSS4.cjs.map} +1 -1
- package/dist/{chunk-SQKBT2SH.cjs → chunk-2G22R7AJ.cjs} +18 -7
- package/dist/chunk-2G22R7AJ.cjs.map +1 -0
- package/dist/chunk-5QSSX3KR.js +64 -0
- package/dist/chunk-5QSSX3KR.js.map +1 -0
- package/dist/{chunk-P37MRZ73.js → chunk-6IEYWJVS.js} +8 -8
- package/dist/chunk-6IEYWJVS.js.map +1 -0
- package/dist/{chunk-5V5HSN6Y.js → chunk-6TFDBBAQ.js} +3 -3
- package/dist/{chunk-5V5HSN6Y.js.map → chunk-6TFDBBAQ.js.map} +1 -1
- package/dist/{chunk-ZKZV6OI3.cjs → chunk-7BNJV2ZS.cjs} +21 -21
- package/dist/{chunk-ZKZV6OI3.cjs.map → chunk-7BNJV2ZS.cjs.map} +1 -1
- package/dist/{chunk-XBNYAAMU.js → chunk-7T4CUE6E.js} +3 -3
- package/dist/{chunk-XBNYAAMU.js.map → chunk-7T4CUE6E.js.map} +1 -1
- package/dist/{chunk-NI62M3W3.cjs → chunk-BZD5KJL3.cjs} +2 -2
- package/dist/{chunk-NI62M3W3.cjs.map → chunk-BZD5KJL3.cjs.map} +1 -1
- package/dist/{chunk-OD2SDC4L.js → chunk-CEJN5ZE5.js} +3 -3
- package/dist/{chunk-OD2SDC4L.js.map → chunk-CEJN5ZE5.js.map} +1 -1
- package/dist/{chunk-2JQISXBD.js → chunk-DTEAFJG7.js} +8 -8
- package/dist/{chunk-2JQISXBD.js.map → chunk-DTEAFJG7.js.map} +1 -1
- package/dist/chunk-EHGH6TAW.js +100 -0
- package/dist/chunk-EHGH6TAW.js.map +1 -0
- package/dist/{chunk-ZU6J7KMY.js → chunk-GPF72JFR.js} +3 -3
- package/dist/{chunk-ZU6J7KMY.js.map → chunk-GPF72JFR.js.map} +1 -1
- package/dist/chunk-HEHXSV47.cjs +77 -0
- package/dist/chunk-HEHXSV47.cjs.map +1 -0
- package/dist/chunk-I5EKGD4P.cjs +113 -0
- package/dist/chunk-I5EKGD4P.cjs.map +1 -0
- package/dist/{chunk-EUP7MBAH.cjs → chunk-IIUKM5VE.cjs} +7 -7
- package/dist/{chunk-EUP7MBAH.cjs.map → chunk-IIUKM5VE.cjs.map} +1 -1
- package/dist/{chunk-7Q4RSSHM.js → chunk-MDF37354.js} +2 -2
- package/dist/{chunk-7Q4RSSHM.js.map → chunk-MDF37354.js.map} +1 -1
- package/dist/{chunk-CWSUBAV3.js → chunk-OBBSIPEK.js} +30 -35
- package/dist/chunk-OBBSIPEK.js.map +1 -0
- package/dist/{chunk-FVT2XRRL.cjs → chunk-Q2E432UK.cjs} +41 -46
- package/dist/chunk-Q2E432UK.cjs.map +1 -0
- package/dist/{chunk-QKI4QWLT.js → chunk-RNUG3EFC.js} +6 -6
- package/dist/{chunk-QKI4QWLT.js.map → chunk-RNUG3EFC.js.map} +1 -1
- package/dist/{chunk-3YZSIYJC.cjs → chunk-SWTNJPK5.cjs} +11 -11
- package/dist/{chunk-3YZSIYJC.cjs.map → chunk-SWTNJPK5.cjs.map} +1 -1
- package/dist/{chunk-BH24DZ5S.cjs → chunk-U3YFYMWF.cjs} +5 -5
- package/dist/{chunk-BH24DZ5S.cjs.map → chunk-U3YFYMWF.cjs.map} +1 -1
- package/dist/{chunk-3HQ7A6ZM.cjs → chunk-UFEDJJSH.cjs} +5 -5
- package/dist/{chunk-3HQ7A6ZM.cjs.map → chunk-UFEDJJSH.cjs.map} +1 -1
- package/dist/{chunk-W77GRBO4.js → chunk-UQIM2KT3.js} +3 -3
- package/dist/{chunk-W77GRBO4.js.map → chunk-UQIM2KT3.js.map} +1 -1
- package/dist/{chunk-SJDPDHSD.cjs → chunk-UTAJSERA.cjs} +4 -4
- package/dist/{chunk-SJDPDHSD.cjs.map → chunk-UTAJSERA.cjs.map} +1 -1
- package/dist/{chunk-S4B7GYLN.js → chunk-W3HLIKC2.js} +18 -8
- package/dist/chunk-W3HLIKC2.js.map +1 -0
- package/dist/{chunk-NDM5EJEV.cjs → chunk-XVIICZKW.cjs} +7 -7
- package/dist/chunk-XVIICZKW.cjs.map +1 -0
- package/dist/core/index.cjs +85 -85
- package/dist/core/index.d.cts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +10 -10
- package/dist/{index-B45-okum.d.cts → index-BgPdYxFS.d.cts} +18 -18
- package/dist/{index-o-Ds3YAq.d.cts → index-CL4vb3ej.d.cts} +1 -1
- package/dist/{index-BIcvNMPt.d.ts → index-CtcXgof_.d.ts} +18 -18
- package/dist/{index-DwAJBoU7.d.ts → index-D6nvfm59.d.ts} +1 -1
- package/dist/index.cjs +279 -280
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +29 -30
- package/dist/index.js.map +1 -1
- package/dist/indexer/index.cjs +6 -6
- package/dist/indexer/index.d.cts +5 -5
- package/dist/indexer/index.d.ts +5 -5
- package/dist/indexer/index.js +1 -1
- package/dist/keys/index.cjs +18 -18
- package/dist/keys/index.js +4 -4
- package/dist/merkle-DZHEOPH3.cjs +30 -0
- package/dist/{merkle-HGDC6OB4.cjs.map → merkle-DZHEOPH3.cjs.map} +1 -1
- package/dist/merkle-IF2RMWCF.js +5 -0
- package/dist/{merkle-7KS2EHRF.js.map → merkle-IF2RMWCF.js.map} +1 -1
- package/dist/poseidon-ACM7E2OH.js +7 -0
- package/dist/{poseidon-UHTJLWQM.js.map → poseidon-ACM7E2OH.js.map} +1 -1
- package/dist/poseidon-PUSGUIVZ.cjs +61 -0
- package/dist/{poseidon-WHJSZSNP.cjs.map → poseidon-PUSGUIVZ.cjs.map} +1 -1
- package/dist/proof-JME3IZTX.js +4 -0
- package/dist/{proof-C4YBP6RY.js.map → proof-JME3IZTX.js.map} +1 -1
- package/dist/proof-XR6XE5PJ.cjs +49 -0
- package/dist/{proof-5OECB3RQ.cjs.map → proof-XR6XE5PJ.cjs.map} +1 -1
- package/dist/react/index.cjs +62 -116
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +27 -12
- package/dist/react/index.d.ts +27 -12
- package/dist/react/index.js +35 -89
- package/dist/react/index.js.map +1 -1
- package/dist/{transfer-BzyernBd.d.cts → transfer-D111ihqN.d.cts} +108 -56
- package/dist/{transfer-sqS6mJko.d.ts → transfer-DvIXqHCr.d.ts} +108 -56
- package/dist/transfer-MQMGSXTH.js +8 -0
- package/dist/{transfer-F6YOQTUL.js.map → transfer-MQMGSXTH.js.map} +1 -1
- package/dist/transfer-PB6D5VCW.cjs +37 -0
- package/dist/{transfer-42C4DXYA.cjs.map → transfer-PB6D5VCW.cjs.map} +1 -1
- package/dist/utils/index.cjs +60 -61
- package/dist/utils/index.d.cts +37 -14
- package/dist/utils/index.d.ts +37 -14
- package/dist/utils/index.js +6 -7
- package/package.json +4 -2
- package/src/contracts/interfaces/IUniversalPrivatePool.sol +10 -8
- package/src/contracts/interfaces/IVerifiers.sol +16 -52
- package/src/deployments/11155111.json +15 -12
- package/dist/asp-TXSAFFD3.cjs.map +0 -1
- package/dist/asp-ZA3RGN7G.js.map +0 -1
- package/dist/babyjubjub-2MGQVCKB.js +0 -5
- package/dist/babyjubjub-2MGQVCKB.js.map +0 -1
- package/dist/babyjubjub-MWZLJOVZ.cjs +0 -66
- package/dist/babyjubjub-MWZLJOVZ.cjs.map +0 -1
- package/dist/chunk-CWSUBAV3.js.map +0 -1
- package/dist/chunk-FVT2XRRL.cjs.map +0 -1
- package/dist/chunk-JWNXBALH.cjs +0 -57
- package/dist/chunk-JWNXBALH.cjs.map +0 -1
- package/dist/chunk-NDM5EJEV.cjs.map +0 -1
- package/dist/chunk-P37MRZ73.js.map +0 -1
- package/dist/chunk-PTDVGWHU.cjs +0 -10
- package/dist/chunk-PTDVGWHU.cjs.map +0 -1
- package/dist/chunk-S4B7GYLN.js.map +0 -1
- package/dist/chunk-SQKBT2SH.cjs.map +0 -1
- package/dist/chunk-TSF6HEVS.cjs +0 -201
- package/dist/chunk-TSF6HEVS.cjs.map +0 -1
- package/dist/chunk-UAVWYXDN.js +0 -8
- package/dist/chunk-UAVWYXDN.js.map +0 -1
- package/dist/chunk-V23OSL25.js +0 -48
- package/dist/chunk-V23OSL25.js.map +0 -1
- package/dist/chunk-YOWDERVC.js +0 -186
- package/dist/chunk-YOWDERVC.js.map +0 -1
- package/dist/merkle-7KS2EHRF.js +0 -5
- package/dist/merkle-HGDC6OB4.cjs +0 -30
- package/dist/poseidon-UHTJLWQM.js +0 -7
- package/dist/poseidon-WHJSZSNP.cjs +0 -45
- package/dist/proof-5OECB3RQ.cjs +0 -45
- package/dist/proof-C4YBP6RY.js +0 -4
- package/dist/transfer-42C4DXYA.cjs +0 -37
- package/dist/transfer-F6YOQTUL.js +0 -8
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk23B5XSS4_cjs = require('./chunk-23B5XSS4.cjs');
|
|
4
4
|
|
|
5
5
|
// src/core/client.ts
|
|
6
6
|
function createUPPClient(_config) {
|
|
@@ -38,12 +38,12 @@ function generateRandomBlinding() {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
// src/core/index.ts
|
|
41
|
-
|
|
41
|
+
chunk23B5XSS4_cjs.init_stealth();
|
|
42
42
|
|
|
43
43
|
exports.NOTE_VERSION = NOTE_VERSION;
|
|
44
44
|
exports.createNote = createNote;
|
|
45
45
|
exports.createUPPClient = createUPPClient;
|
|
46
46
|
exports.decryptNote = decryptNote;
|
|
47
47
|
exports.encryptNote = encryptNote;
|
|
48
|
-
//# sourceMappingURL=chunk-
|
|
49
|
-
//# sourceMappingURL=chunk-
|
|
48
|
+
//# sourceMappingURL=chunk-UTAJSERA.cjs.map
|
|
49
|
+
//# sourceMappingURL=chunk-UTAJSERA.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/client.ts","../src/core/types.ts","../src/core/note.ts","../src/core/index.ts"],"names":["init_stealth"],"mappings":";;;;;AAoFO,SAAS,gBAAgB,OAAA,EAAqC;AAEnE,EAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AACnC;;;AC9EO,IAAM,YAAA,GAAe;;;ACiCrB,SAAS,WAAW,MAAA,EAAgC;AACzD,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,IAAA,EAAM,UAAS,GAAI,MAAA;AAG1D,EAAA,MAAM,YAAA,GAAe,YAAY,sBAAA,EAAuB;AAExD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAA;AAAA,IACT,MAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,MAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,GACzC;AACF;AASO,SAAS,WAAA,CAAY,OAAa,aAAA,EAA0C;AAEjF,EAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AACnC;AASO,SAAS,WAAA,CAAY,YAA2B,aAAA,EAAwC;AAE7F,EAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AACnC;AAyBA,SAAS,sBAAA,GAAiC;AAExC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,EAAA,OAAO,OAAO,IAAA,GAAO,KAAA,CAAM,KAAK,KAAK,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAC3F;;;ACtGAA,8BAAA,EAAA","file":"chunk-SJDPDHSD.cjs","sourcesContent":["/**\n * Main UPP Client\n *\n * Provides high-level API for interacting with the Universal Private Pool.\n */\n\nimport type { Address, PublicClient, WalletClient } from 'viem'\nimport type {\n ShieldParams,\n TransferParams,\n MergeParams,\n WithdrawParams,\n Note,\n} from './types.js'\n\n/**\n * UPP Client configuration\n */\nexport interface UPPClientConfig {\n /** Viem public client for reading chain state */\n publicClient: PublicClient\n /** Viem wallet client for sending transactions */\n walletClient: WalletClient\n /** Universal Private Pool contract address */\n poolAddress: Address\n /** ASP Registry Hub contract address */\n aspHubAddress: Address\n /** Chain ID (optional, derived from clients if not provided) */\n chainId?: number\n}\n\n/**\n * UPP Client interface\n */\nexport interface UPPClient {\n /** Shield tokens into the private pool */\n shield(params: ShieldParams): Promise<{ commitment: `0x${string}`; note: Note }>\n\n /** Transfer tokens privately */\n transfer(params: TransferParams): Promise<{ nullifier: `0x${string}`; changeNote?: Note }>\n\n /** Merge multiple notes into one */\n merge(params: MergeParams): Promise<{ commitment: `0x${string}`; note: Note }>\n\n /** Withdraw tokens from the private pool */\n withdraw(params: WithdrawParams): Promise<{ txHash: `0x${string}` }>\n\n /** Scan for notes belonging to a viewing key */\n scanNotes(viewingKey: `0x${string}`): Promise<Note[]>\n\n /** Get the current state root */\n getStateRoot(): Promise<bigint>\n\n /** Check if a nullifier has been spent */\n isNullifierSpent(nullifier: `0x${string}`): Promise<boolean>\n}\n\n/**\n * Create a UPP client instance\n *\n * @example\n * ```ts\n * import { createUPPClient } from '@upp/sdk'\n * import { createPublicClient, createWalletClient, http } from 'viem'\n * import { sepolia } from 'viem/chains'\n *\n * const publicClient = createPublicClient({\n * chain: sepolia,\n * transport: http(),\n * })\n *\n * const walletClient = createWalletClient({\n * chain: sepolia,\n * transport: http(),\n * })\n *\n * const client = createUPPClient({\n * publicClient,\n * walletClient,\n * poolAddress: '0x...',\n * aspHubAddress: '0x...',\n * })\n * ```\n */\nexport function createUPPClient(_config: UPPClientConfig): UPPClient {\n // TODO: Implement client\n throw new Error('Not implemented')\n}\n","/**\n * Core type definitions for UPP SDK\n */\n\nimport type { Address, Hex } from 'viem'\n\n/**\n * Note version - increment when note structure changes\n */\nexport const NOTE_VERSION = 5\n\n/**\n * A private note in the Universal Private Pool\n */\nexport interface Note {\n /** Note format version */\n version: number\n /** Token amount (in wei) */\n amount: bigint\n /** Random blinding factor */\n blinding: bigint\n /** Current origin - who is responsible for these funds (updated on merge) */\n origin: Address\n /** Sender - who sent this specific note (for payment attribution) */\n sender: Address\n /** ERC20 token address */\n token: Address\n /** Optional memo/message */\n memo?: string\n /** Timestamp when note was created */\n timestamp?: number\n}\n\n/**\n * Encrypted note data stored on-chain (post-quantum, hash-based)\n */\nexport interface EncryptedNote {\n /** AES-GCM encrypted note data */\n ciphertext: Hex\n /** AES-GCM nonce */\n nonce: Hex\n}\n\n/**\n * Stealth meta-address (hash-based, post-quantum)\n * Published once, used by senders to encrypt notes to the recipient\n */\nexport interface StealthMetaAddress {\n /** Owner hash = Poseidon(spendingSecret) */\n ownerHash: bigint\n /** Viewing hash = Poseidon(viewingSecret) */\n viewingHash: bigint\n}\n\n/**\n * One-time address for a specific transaction (simplified for hash-based system)\n */\nexport interface StealthAddress {\n /** Owner hash for this note */\n ownerHash: bigint\n /** Search tag for efficient scanning */\n searchTag?: bigint\n}\n\n/**\n * On-chain merge record for audit trail\n */\nexport interface MergeRecord {\n /** Output commitment (the merged note) */\n outputCommitment: Hex\n /** First input nullifier */\n nullifier1: Hex\n /** Second input nullifier */\n nullifier2: Hex\n /** Who performed the merge (new origin) */\n merger: Address\n /** Token that was merged */\n token: Address\n /** Block timestamp */\n timestamp: number\n}\n\n/**\n * ASP (Association Set Provider) root\n */\nexport interface ASPRoot {\n /** Merkle root of approved addresses */\n root: bigint\n /** IPFS hash for off-chain data */\n ipfsHash: Hex\n /** When this root was published */\n timestamp: number\n /** Number of addresses in the set */\n leafCount: number\n}\n\n/**\n * Shield operation parameters\n */\nexport interface ShieldParams {\n /** ERC20 token to shield */\n token: Address\n /** Amount to shield (in wei) */\n amount: bigint\n /** Optional: recipient owner hash (defaults to self) */\n recipientOwnerHash?: bigint\n /** Optional: memo to include in note */\n memo?: string\n}\n\n/**\n * Transfer operation parameters\n */\nexport interface TransferParams {\n /** Note to spend */\n note: Note\n /** Recipient stealth address */\n recipient: StealthAddress\n /** Amount to send (remainder goes back to sender as change) */\n amount: bigint\n /** Optional: memo to include */\n memo?: string\n}\n\n/**\n * Merge operation parameters\n */\nexport interface MergeParams {\n /** Notes to merge (must be same token) */\n notes: [Note, Note]\n /** Optional: memo for the merged note */\n memo?: string\n}\n\n/**\n * Withdraw operation parameters\n */\nexport interface WithdrawParams {\n /** Note to withdraw */\n note: Note\n /** Amount to withdraw */\n amount: bigint\n /** Recipient address for the tokens */\n recipient: Address\n /** ASP ID to use for compliance check */\n aspId?: number\n /** Use ragequit (origin withdrawing own funds) */\n ragequit?: boolean\n}\n\n/**\n * Proof for ZK operations\n */\nexport interface Proof {\n /** Proof points */\n proof: {\n pi_a: [string, string]\n pi_b: [[string, string], [string, string]]\n pi_c: [string, string]\n }\n /** Public signals */\n publicSignals: string[]\n}\n\n/**\n * Note commitment (hash)\n */\nexport type Commitment = Hex\n\n/**\n * Nullifier (spent note identifier)\n */\nexport type Nullifier = Hex\n\n// =========================================================================\n// STARK Note Types (M31/Keccak-based, post-quantum)\n// =========================================================================\n\nimport type { M31Digest } from '../utils/keccak-m31.js'\n\n// STARK_AMOUNT_SCALE moved to utils/stark.ts\nexport { STARK_AMOUNT_SCALE } from '../utils/stark.js'\n\n/**\n * A private STARK note in the Universal Private Pool.\n *\n * All field values are M31 elements (< 2^31 - 1).\n * Commitment = keccak_m31(amount, ownerHash[0..4], blinding, origin, token).\n */\nexport interface StarkNote {\n /** Amount in STARK units (actual wei = amount * STARK_AMOUNT_SCALE) */\n amount: bigint\n /** Owner hash = keccak_m31(starkSecret) — 4 M31 elements */\n ownerHash: M31Digest\n /** Random blinding factor (M31) */\n blinding: bigint\n /** Origin address encoded as M31 (lower 31 bits of address) */\n origin: bigint\n /** Token address encoded as M31 (lower 31 bits of address) */\n token: bigint\n /** The leaf index in the STARK Keccak Merkle tree (set after shielding) */\n leafIndex?: number\n /** The commitment digest (set after computation) */\n commitment?: M31Digest\n /** Optional memo */\n memo?: string\n /** Timestamp when note was created */\n timestamp?: number\n}\n\n/**\n * STARK stealth meta-address (M31/Keccak-based)\n * Published once, used by senders to encrypt notes to the recipient\n */\nexport interface StarkStealthMetaAddress {\n /** Owner hash = keccak_m31(starkSecret) — 4 M31 elements */\n ownerHash: M31Digest\n /** Viewing hash = keccak_m31(starkViewingSecret) — 4 M31 elements */\n viewingHash: M31Digest\n}\n\n/**\n * STARK proof for ZK operations (serialized Circle STARK proof)\n */\nexport interface StarkProof {\n /** Raw serialized Stwo Circle STARK proof bytes */\n proofBytes: Hex\n /** Public inputs seed (keccak256 of public parameters) */\n publicInputsSeed: Hex\n}\n","/**\n * Note management utilities\n *\n * Create, encrypt, and decrypt private notes.\n */\n\nimport type { Address, Hex } from 'viem'\nimport type { Note, EncryptedNote } from './types.js'\nimport { NOTE_VERSION } from './types.js'\n\n/**\n * Parameters for creating a new note\n */\nexport interface CreateNoteParams {\n /** Token amount */\n amount: bigint\n /** ERC20 token address */\n token: Address\n /** Origin address (who is responsible) */\n origin: Address\n /** Sender address */\n sender: Address\n /** Optional memo */\n memo?: string\n /** Optional blinding factor (generated if not provided) */\n blinding?: bigint\n}\n\n/**\n * Create a new private note\n *\n * @example\n * ```ts\n * const note = createNote({\n * amount: 1000n * 10n ** 18n,\n * token: '0x...',\n * origin: '0xMyAddress...',\n * sender: '0xMyAddress...',\n * memo: 'Payment for services',\n * })\n * ```\n */\nexport function createNote(params: CreateNoteParams): Note {\n const { amount, token, origin, sender, memo, blinding } = params\n\n // Generate random blinding factor if not provided\n const noteBlinding = blinding ?? generateRandomBlinding()\n\n return {\n version: NOTE_VERSION,\n amount,\n blinding: noteBlinding,\n origin,\n sender,\n token,\n memo,\n timestamp: Math.floor(Date.now() / 1000),\n }\n}\n\n/**\n * Encrypt a note for a recipient\n *\n * @param note - The note to encrypt\n * @param sharedSecret - ECDH shared secret with recipient\n * @returns Encrypted note data\n */\nexport function encryptNote(_note: Note, _sharedSecret: Uint8Array): EncryptedNote {\n // TODO: Implement AES-GCM encryption\n throw new Error('Not implemented')\n}\n\n/**\n * Decrypt a received note\n *\n * @param encrypted - The encrypted note data\n * @param sharedSecret - ECDH shared secret\n * @returns Decrypted note or null if decryption fails\n */\nexport function decryptNote(_encrypted: EncryptedNote, _sharedSecret: Uint8Array): Note | null {\n // TODO: Implement AES-GCM decryption\n throw new Error('Not implemented')\n}\n\n/**\n * Compute the commitment hash for a note\n *\n * commitment = Poseidon(amount, blinding, origin, token)\n */\nexport function computeCommitment(_note: Note): Hex {\n // TODO: Implement Poseidon hash\n throw new Error('Not implemented')\n}\n\n/**\n * Compute the nullifier for spending a note\n *\n * nullifier = Poseidon(blinding, leafIndex)\n */\nexport function computeNullifier(_note: Note, _leafIndex: bigint): Hex {\n // TODO: Implement nullifier computation\n throw new Error('Not implemented')\n}\n\n/**\n * Generate a random blinding factor\n */\nfunction generateRandomBlinding(): bigint {\n // TODO: Use crypto.getRandomValues for secure randomness\n const bytes = new Uint8Array(31) // 31 bytes to stay in field\n crypto.getRandomValues(bytes)\n return BigInt('0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join(''))\n}\n","/**\n * Core UPP SDK functionality\n */\n\nexport { createUPPClient } from './client.js'\nexport type { UPPClient, UPPClientConfig } from './client.js'\n\nexport { createNote, encryptNote, decryptNote } from './note.js'\n\n// Stealth address utilities (post-quantum, hash-based)\nexport {\n STEALTH_ADDRESS_PREFIX,\n ADDRESS_VERSION,\n encodeStealthAddress,\n decodeStealthAddress,\n isValidStealthAddress,\n generateStealthAddress,\n createOneTimeKeys,\n verifyOwnership,\n computeNoteEncryptionKey,\n // STARK stealth addresses (0zs prefix)\n STARK_STEALTH_ADDRESS_PREFIX,\n STARK_ADDRESS_VERSION,\n encodeStarkStealthAddress,\n decodeStarkStealthAddress,\n isValidStarkStealthAddress,\n generateStarkStealthAddress,\n detectAddressType,\n} from './stealth.js'\n\n// Proof generation (UPP circuits)\nexport {\n generateUPPProof,\n formatProofForContract,\n getUPPCircuitArtifacts,\n STATE_TREE_DEPTH,\n ASP_TREE_DEPTH,\n} from './proof.js'\nexport type {\n UPPCircuitType,\n UPPTransferCircuitInputs,\n UPPWithdrawCircuitInputs,\n UPPCircuitInputs,\n CircuitArtifacts,\n ProofResult,\n} from './proof.js'\n\n// Legacy stealth proof exports (deprecated)\nexport {\n generateProof,\n verifyProof,\n generateStealthProof,\n getStealthCircuitArtifacts,\n} from './proof.js'\nexport type {\n CircuitType,\n StealthCircuitType,\n StealthCircuitInputs,\n Stealth1x2CircuitInputs,\n Stealth2x2CircuitInputs,\n} from './proof.js'\n\nexport * from './types.js'\n\n// Swap order book module\nexport {\n computeGiveAmount,\n computeTakeAmount,\n computeRate,\n formatRate,\n computeCancelKeyHash,\n generateCancelSecret,\n filterOrdersByASP,\n filterOrdersByTokenPair,\n isFillerASPAccepted,\n isOrderActive,\n computeTotalBuyAmount,\n computeFillPercentage,\n storeCancelSecret,\n getCancelSecret,\n removeCancelSecret,\n getOwnOrderIds,\n RATE_PRECISION,\n SWAP_EVENTS_ABI,\n SWAP_ORDER_PLACED_EVENT,\n SWAP_ORDER_FILLED_EVENT,\n SWAP_ORDER_CLAIMED_EVENT,\n SWAP_ORDER_CANCELLED_EVENT,\n} from './swap.js'\nexport type {\n SwapOrder,\n SwapOrderParams,\n SwapFillParams,\n SwapOrderEvent,\n SwapFillEvent,\n} from './swap.js'\n\n// Account adapter (pluggable key source + persistence)\nexport { DirectAccountAdapter, StorableAccountAdapter } from './account.js'\nexport type { IAccountAdapter } from './account.js'\n\n// ASP provider (pluggable compliance)\nexport type { IASPProvider, ASPMembershipProof } from './asp-provider.js'\n\n// Note store (single source of truth for note state)\nexport { NoteStore } from './note-store.js'\nexport type { INoteStore, ShieldedNote, NoteStatus, ProofSystem } from './note-store.js'\n\n// ASP (Association Set Provider) module\nexport {\n computeSingleOriginASPRoot,\n generateSingleOriginASPProof,\n verifyASPProof,\n DEMO_ASP_ID,\n DEMO_ASP_NAME,\n createDemoASPRoot,\n // Multi-origin ASP tree\n buildASPTree,\n computeMultiOriginASPRoot,\n generateMultiOriginASPProof,\n generateASPProof,\n} from './asp.js'\nexport type { ASPProof } from './asp.js'\n\n// Transfer module\nexport {\n syncMerkleTree,\n getMerkleProofsForNotes,\n computeNullifier,\n buildUPPTransferCircuitInputs,\n buildTransfer,\n formatOutputForContract,\n} from './transfer.js'\nexport type {\n TransferStage,\n SpendableNote,\n MerkleProofWithNote,\n TransferContext,\n TransferBuildResult,\n NoteWithAmount,\n} from './transfer.js'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/client.ts","../src/core/types.ts","../src/core/note.ts","../src/core/index.ts"],"names":["init_stealth"],"mappings":";;;;;AAoFO,SAAS,gBAAgB,OAAA,EAAqC;AAEnE,EAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AACnC;;;AC9EO,IAAM,YAAA,GAAe;;;ACiCrB,SAAS,WAAW,MAAA,EAAgC;AACzD,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,IAAA,EAAM,UAAS,GAAI,MAAA;AAG1D,EAAA,MAAM,YAAA,GAAe,YAAY,sBAAA,EAAuB;AAExD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAA;AAAA,IACT,MAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,MAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,GACzC;AACF;AASO,SAAS,WAAA,CAAY,OAAa,aAAA,EAA0C;AAEjF,EAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AACnC;AASO,SAAS,WAAA,CAAY,YAA2B,aAAA,EAAwC;AAE7F,EAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AACnC;AAyBA,SAAS,sBAAA,GAAiC;AAExC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,EAAA,OAAO,OAAO,IAAA,GAAO,KAAA,CAAM,KAAK,KAAK,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAC3F;;;ACtGAA,8BAAA,EAAA","file":"chunk-UTAJSERA.cjs","sourcesContent":["/**\n * Main UPP Client\n *\n * Provides high-level API for interacting with the Universal Private Pool.\n */\n\nimport type { Address, PublicClient, WalletClient } from 'viem'\nimport type {\n ShieldParams,\n TransferParams,\n MergeParams,\n WithdrawParams,\n Note,\n} from './types.js'\n\n/**\n * UPP Client configuration\n */\nexport interface UPPClientConfig {\n /** Viem public client for reading chain state */\n publicClient: PublicClient\n /** Viem wallet client for sending transactions */\n walletClient: WalletClient\n /** Universal Private Pool contract address */\n poolAddress: Address\n /** ASP Registry Hub contract address */\n aspHubAddress: Address\n /** Chain ID (optional, derived from clients if not provided) */\n chainId?: number\n}\n\n/**\n * UPP Client interface\n */\nexport interface UPPClient {\n /** Shield tokens into the private pool */\n shield(params: ShieldParams): Promise<{ commitment: `0x${string}`; note: Note }>\n\n /** Transfer tokens privately */\n transfer(params: TransferParams): Promise<{ nullifier: `0x${string}`; changeNote?: Note }>\n\n /** Merge multiple notes into one */\n merge(params: MergeParams): Promise<{ commitment: `0x${string}`; note: Note }>\n\n /** Withdraw tokens from the private pool */\n withdraw(params: WithdrawParams): Promise<{ txHash: `0x${string}` }>\n\n /** Scan for notes belonging to a viewing key */\n scanNotes(viewingKey: `0x${string}`): Promise<Note[]>\n\n /** Get the current state root */\n getStateRoot(): Promise<bigint>\n\n /** Check if a nullifier has been spent */\n isNullifierSpent(nullifier: `0x${string}`): Promise<boolean>\n}\n\n/**\n * Create a UPP client instance\n *\n * @example\n * ```ts\n * import { createUPPClient } from '@upp/sdk'\n * import { createPublicClient, createWalletClient, http } from 'viem'\n * import { sepolia } from 'viem/chains'\n *\n * const publicClient = createPublicClient({\n * chain: sepolia,\n * transport: http(),\n * })\n *\n * const walletClient = createWalletClient({\n * chain: sepolia,\n * transport: http(),\n * })\n *\n * const client = createUPPClient({\n * publicClient,\n * walletClient,\n * poolAddress: '0x...',\n * aspHubAddress: '0x...',\n * })\n * ```\n */\nexport function createUPPClient(_config: UPPClientConfig): UPPClient {\n // TODO: Implement client\n throw new Error('Not implemented')\n}\n","/**\n * Core type definitions for UPP SDK\n */\n\nimport type { Address, Hex } from 'viem'\n\n/**\n * Note version - increment when note structure changes\n */\nexport const NOTE_VERSION = 5\n\n/**\n * A private note in the Universal Private Pool\n */\nexport interface Note {\n /** Note format version */\n version: number\n /** Token amount (in wei) */\n amount: bigint\n /** Random blinding factor */\n blinding: bigint\n /** Current origin - who is responsible for these funds (updated on merge) */\n origin: Address\n /** Sender - who sent this specific note (for payment attribution) */\n sender: Address\n /** ERC20 token address */\n token: Address\n /** Optional memo/message */\n memo?: string\n /** Timestamp when note was created */\n timestamp?: number\n}\n\n/**\n * Encrypted note data stored on-chain (post-quantum, hash-based)\n */\nexport interface EncryptedNote {\n /** AES-GCM encrypted note data */\n ciphertext: Hex\n /** AES-GCM nonce */\n nonce: Hex\n}\n\n/**\n * Stealth meta-address (hash-based, post-quantum)\n * Published once, used by senders to encrypt notes to the recipient\n */\nexport interface StealthMetaAddress {\n /** Owner hash = Poseidon(spendingSecret) */\n ownerHash: bigint\n /** Viewing hash = Poseidon(viewingSecret) */\n viewingHash: bigint\n}\n\n/**\n * One-time address for a specific transaction (simplified for hash-based system)\n */\nexport interface StealthAddress {\n /** Owner hash for this note */\n ownerHash: bigint\n /** Search tag for efficient scanning */\n searchTag?: bigint\n}\n\n/**\n * On-chain merge record for audit trail\n */\nexport interface MergeRecord {\n /** Output commitment (the merged note) */\n outputCommitment: Hex\n /** First input nullifier */\n nullifier1: Hex\n /** Second input nullifier */\n nullifier2: Hex\n /** Who performed the merge (new origin) */\n merger: Address\n /** Token that was merged */\n token: Address\n /** Block timestamp */\n timestamp: number\n}\n\n/**\n * ASP (Association Set Provider) root\n */\nexport interface ASPRoot {\n /** Merkle root of approved addresses */\n root: bigint\n /** IPFS hash for off-chain data */\n ipfsHash: Hex\n /** When this root was published */\n timestamp: number\n /** Number of addresses in the set */\n leafCount: number\n}\n\n/**\n * Shield operation parameters\n */\nexport interface ShieldParams {\n /** ERC20 token to shield */\n token: Address\n /** Amount to shield (in wei) */\n amount: bigint\n /** Optional: recipient owner hash (defaults to self) */\n recipientOwnerHash?: bigint\n /** Optional: memo to include in note */\n memo?: string\n}\n\n/**\n * Transfer operation parameters\n */\nexport interface TransferParams {\n /** Note to spend */\n note: Note\n /** Recipient stealth address */\n recipient: StealthAddress\n /** Amount to send (remainder goes back to sender as change) */\n amount: bigint\n /** Optional: memo to include */\n memo?: string\n}\n\n/**\n * Merge operation parameters\n */\nexport interface MergeParams {\n /** Notes to merge (must be same token) */\n notes: [Note, Note]\n /** Optional: memo for the merged note */\n memo?: string\n}\n\n/**\n * Withdraw operation parameters\n */\nexport interface WithdrawParams {\n /** Note to withdraw */\n note: Note\n /** Amount to withdraw */\n amount: bigint\n /** Recipient address for the tokens */\n recipient: Address\n /** ASP ID to use for compliance check */\n aspId?: number\n /** Use ragequit (origin withdrawing own funds) */\n ragequit?: boolean\n}\n\n/**\n * Proof for ZK operations\n */\nexport interface Proof {\n /** Proof points */\n proof: {\n pi_a: [string, string]\n pi_b: [[string, string], [string, string]]\n pi_c: [string, string]\n }\n /** Public signals */\n publicSignals: string[]\n}\n\n/**\n * Note commitment (hash)\n */\nexport type Commitment = Hex\n\n/**\n * Nullifier (spent note identifier)\n */\nexport type Nullifier = Hex\n\n// =========================================================================\n// STARK Note Types (M31/Keccak-based, post-quantum)\n// =========================================================================\n\nimport type { M31Digest } from '../utils/keccak-m31.js'\n\n// STARK_AMOUNT_SCALE moved to utils/stark.ts\nexport { STARK_AMOUNT_SCALE } from '../utils/stark.js'\n\n/**\n * A private STARK note in the Universal Private Pool.\n *\n * All field values are M31 elements (< 2^31 - 1).\n * Commitment = keccak_m31(amount, ownerHash[0..4], blinding, origin, token).\n */\nexport interface StarkNote {\n /** Amount in STARK units (actual wei = amount * STARK_AMOUNT_SCALE) */\n amount: bigint\n /** Owner hash = keccak_m31(starkSecret) — 4 M31 elements */\n ownerHash: M31Digest\n /** Random blinding factor (M31) */\n blinding: bigint\n /** Origin address encoded as M31 (lower 31 bits of address) */\n origin: bigint\n /** Token address encoded as M31 (lower 31 bits of address) */\n token: bigint\n /** The leaf index in the STARK Keccak Merkle tree (set after shielding) */\n leafIndex?: number\n /** The commitment digest (set after computation) */\n commitment?: M31Digest\n /** Optional memo */\n memo?: string\n /** Timestamp when note was created */\n timestamp?: number\n}\n\n/**\n * STARK stealth meta-address (M31/Keccak-based)\n * Published once, used by senders to encrypt notes to the recipient\n */\nexport interface StarkStealthMetaAddress {\n /** Owner hash = keccak_m31(starkSecret) — 4 M31 elements */\n ownerHash: M31Digest\n /** Viewing hash = keccak_m31(starkViewingSecret) — 4 M31 elements */\n viewingHash: M31Digest\n}\n\n/**\n * STARK proof for ZK operations (serialized Circle STARK proof)\n */\nexport interface StarkProof {\n /** Raw serialized Stwo Circle STARK proof bytes */\n proofBytes: Hex\n /** Public inputs seed (keccak256 of public parameters) */\n publicInputsSeed: Hex\n}\n","/**\n * Note management utilities\n *\n * Create, encrypt, and decrypt private notes.\n */\n\nimport type { Address, Hex } from 'viem'\nimport type { Note, EncryptedNote } from './types.js'\nimport { NOTE_VERSION } from './types.js'\n\n/**\n * Parameters for creating a new note\n */\nexport interface CreateNoteParams {\n /** Token amount */\n amount: bigint\n /** ERC20 token address */\n token: Address\n /** Origin address (who is responsible) */\n origin: Address\n /** Sender address */\n sender: Address\n /** Optional memo */\n memo?: string\n /** Optional blinding factor (generated if not provided) */\n blinding?: bigint\n}\n\n/**\n * Create a new private note\n *\n * @example\n * ```ts\n * const note = createNote({\n * amount: 1000n * 10n ** 18n,\n * token: '0x...',\n * origin: '0xMyAddress...',\n * sender: '0xMyAddress...',\n * memo: 'Payment for services',\n * })\n * ```\n */\nexport function createNote(params: CreateNoteParams): Note {\n const { amount, token, origin, sender, memo, blinding } = params\n\n // Generate random blinding factor if not provided\n const noteBlinding = blinding ?? generateRandomBlinding()\n\n return {\n version: NOTE_VERSION,\n amount,\n blinding: noteBlinding,\n origin,\n sender,\n token,\n memo,\n timestamp: Math.floor(Date.now() / 1000),\n }\n}\n\n/**\n * Encrypt a note for a recipient\n *\n * @param note - The note to encrypt\n * @param sharedSecret - ECDH shared secret with recipient\n * @returns Encrypted note data\n */\nexport function encryptNote(_note: Note, _sharedSecret: Uint8Array): EncryptedNote {\n // TODO: Implement AES-GCM encryption\n throw new Error('Not implemented')\n}\n\n/**\n * Decrypt a received note\n *\n * @param encrypted - The encrypted note data\n * @param sharedSecret - ECDH shared secret\n * @returns Decrypted note or null if decryption fails\n */\nexport function decryptNote(_encrypted: EncryptedNote, _sharedSecret: Uint8Array): Note | null {\n // TODO: Implement AES-GCM decryption\n throw new Error('Not implemented')\n}\n\n/**\n * Compute the commitment hash for a note\n *\n * commitment = Poseidon(amount, blinding, origin, token)\n */\nexport function computeCommitment(_note: Note): Hex {\n // TODO: Implement Poseidon hash\n throw new Error('Not implemented')\n}\n\n/**\n * Compute the nullifier for spending a note\n *\n * nullifier = Poseidon(blinding, leafIndex)\n */\nexport function computeNullifier(_note: Note, _leafIndex: bigint): Hex {\n // TODO: Implement nullifier computation\n throw new Error('Not implemented')\n}\n\n/**\n * Generate a random blinding factor\n */\nfunction generateRandomBlinding(): bigint {\n // TODO: Use crypto.getRandomValues for secure randomness\n const bytes = new Uint8Array(31) // 31 bytes to stay in field\n crypto.getRandomValues(bytes)\n return BigInt('0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join(''))\n}\n","/**\n * Core UPP SDK functionality\n */\n\nexport { createUPPClient } from './client.js'\nexport type { UPPClient, UPPClientConfig } from './client.js'\n\nexport { createNote, encryptNote, decryptNote } from './note.js'\n\n// Stealth address utilities (post-quantum, hash-based)\nexport {\n STEALTH_ADDRESS_PREFIX,\n ADDRESS_VERSION,\n encodeStealthAddress,\n decodeStealthAddress,\n isValidStealthAddress,\n generateStealthAddress,\n createOneTimeKeys,\n verifyOwnership,\n computeNoteEncryptionKey,\n // STARK stealth addresses (0zs prefix)\n STARK_STEALTH_ADDRESS_PREFIX,\n STARK_ADDRESS_VERSION,\n encodeStarkStealthAddress,\n decodeStarkStealthAddress,\n isValidStarkStealthAddress,\n generateStarkStealthAddress,\n detectAddressType,\n} from './stealth.js'\n\n// Proof generation (UPP circuits)\nexport {\n generateUPPProof,\n formatProofForContract,\n getUPPCircuitArtifacts,\n STATE_TREE_DEPTH,\n ASP_TREE_DEPTH,\n} from './proof.js'\nexport type {\n UPPCircuitType,\n UPPTransferCircuitInputs,\n UPPWithdrawCircuitInputs,\n UPPCircuitInputs,\n CircuitArtifacts,\n ProofResult,\n} from './proof.js'\n\n// Legacy stealth proof exports (deprecated)\nexport {\n generateProof,\n verifyProof,\n generateStealthProof,\n getStealthCircuitArtifacts,\n} from './proof.js'\nexport type {\n CircuitType,\n StealthCircuitType,\n StealthCircuitInputs,\n Stealth1x2CircuitInputs,\n Stealth2x2CircuitInputs,\n} from './proof.js'\n\nexport * from './types.js'\n\n// Swap order book module\nexport {\n computeGiveAmount,\n computeTakeAmount,\n computeRate,\n formatRate,\n computeCancelKeyHash,\n generateCancelSecret,\n filterOrdersByASP,\n filterOrdersByTokenPair,\n isFillerASPAccepted,\n isOrderActive,\n computeTotalBuyAmount,\n computeFillPercentage,\n storeCancelSecret,\n getCancelSecret,\n removeCancelSecret,\n getOwnOrderIds,\n RATE_PRECISION,\n SWAP_EVENTS_ABI,\n SWAP_ORDER_PLACED_EVENT,\n SWAP_ORDER_FILLED_EVENT,\n SWAP_ORDER_CLAIMED_EVENT,\n SWAP_ORDER_CANCELLED_EVENT,\n} from './swap.js'\nexport type {\n SwapOrder,\n SwapOrderParams,\n SwapFillParams,\n SwapOrderEvent,\n SwapFillEvent,\n} from './swap.js'\n\n// Account adapter (pluggable key source + persistence)\nexport { DirectAccountAdapter, StorableAccountAdapter } from './account.js'\nexport type { IAccountAdapter } from './account.js'\n\n// ASP provider (pluggable compliance)\nexport type { IASPProvider, ASPMembershipProof } from './asp-provider.js'\n\n// Note store (single source of truth for note state)\nexport { NoteStore } from './note-store.js'\nexport type { INoteStore, ShieldedNote, NoteStatus, ProofSystem } from './note-store.js'\n\n// ASP (Association Set Provider) module\nexport {\n computeSingleOriginASPRoot,\n generateSingleOriginASPProof,\n verifyASPProof,\n DEMO_ASP_ID,\n DEMO_ASP_NAME,\n createDemoASPRoot,\n // Multi-origin ASP tree\n buildASPTree,\n computeMultiOriginASPRoot,\n generateMultiOriginASPProof,\n generateASPProof,\n} from './asp.js'\nexport type { ASPProof } from './asp.js'\n\n// Transfer module\nexport {\n syncMerkleTree,\n getMerkleProofsForNotes,\n computeNullifier,\n buildUPPTransferCircuitInputs,\n buildTransfer,\n formatOutputForContract,\n} from './transfer.js'\nexport type {\n TransferStage,\n SpendableNote,\n MerkleProofWithNote,\n TransferContext,\n TransferBuildResult,\n NoteWithAmount,\n} from './transfer.js'\n"]}
|
|
@@ -56,18 +56,16 @@ async function generateUPPProof(circuitType, inputs, baseUrl = "/circuits/") {
|
|
|
56
56
|
const artifacts = getUPPCircuitArtifacts(circuitType, baseUrl);
|
|
57
57
|
if (circuitType === "transfer") {
|
|
58
58
|
const i = inputs;
|
|
59
|
-
console.log("[generateUPPProof] === CIRCUIT INPUTS ===");
|
|
59
|
+
console.log("[generateUPPProof] === PLONK CIRCUIT INPUTS ===");
|
|
60
60
|
console.log(` circuitType: ${circuitType}`);
|
|
61
61
|
console.log(` stateRoot: ${i.stateRoot}`);
|
|
62
62
|
console.log(` aspRoot: ${i.aspRoot}`);
|
|
63
63
|
console.log(` inputOrigin: ${i.inputOrigin}`);
|
|
64
|
-
console.log(` aspRoot === inputOrigin: ${i.aspRoot === i.inputOrigin}`);
|
|
65
64
|
console.log(` aspPathElements[0..2]: ${i.aspPathElements?.slice(0, 3).join(", ")}`);
|
|
66
|
-
console.log(` aspPathIndices[0..2]: ${i.aspPathIndices?.slice(0, 3).join(", ")}`);
|
|
67
65
|
console.log(` artifacts.wasm: ${artifacts.wasm}`);
|
|
68
66
|
console.log(` artifacts.zkey: ${artifacts.zkey}`);
|
|
69
67
|
}
|
|
70
|
-
const result = await snarkjs2.
|
|
68
|
+
const result = await snarkjs2.plonk.fullProve(inputs, artifacts.wasm, artifacts.zkey);
|
|
71
69
|
return {
|
|
72
70
|
proof: {
|
|
73
71
|
proof: result.proof,
|
|
@@ -94,19 +92,31 @@ async function generateStealthProof(circuit, inputs, baseUrl = "/circuits/") {
|
|
|
94
92
|
async function verifyProof(_circuitType, _proof) {
|
|
95
93
|
throw new Error("Not implemented");
|
|
96
94
|
}
|
|
95
|
+
async function formatPlonkProofForContract(proof) {
|
|
96
|
+
const snarkjs2 = await loadSnarkjs();
|
|
97
|
+
const calldata = await snarkjs2.plonk.exportSolidityCallData(
|
|
98
|
+
proof.proof,
|
|
99
|
+
proof.publicSignals
|
|
100
|
+
);
|
|
101
|
+
const [proofHex, signalsStr] = calldata.split(',["');
|
|
102
|
+
const signals = signalsStr ? signalsStr.replace('"]', "").split('","').map((s) => BigInt(s)) : proof.publicSignals.map((s) => BigInt(s));
|
|
103
|
+
return {
|
|
104
|
+
proofBytes: proofHex,
|
|
105
|
+
publicSignals: signals
|
|
106
|
+
};
|
|
107
|
+
}
|
|
97
108
|
function formatProofForContract(proof) {
|
|
98
109
|
const { pi_a, pi_b, pi_c } = proof.proof;
|
|
99
110
|
return {
|
|
100
111
|
a: [BigInt(pi_a[0]), BigInt(pi_a[1])],
|
|
101
112
|
b: [
|
|
102
113
|
[BigInt(pi_b[0][1]), BigInt(pi_b[0][0])],
|
|
103
|
-
// Note: reversed for Solidity
|
|
104
114
|
[BigInt(pi_b[1][1]), BigInt(pi_b[1][0])]
|
|
105
115
|
],
|
|
106
116
|
c: [BigInt(pi_c[0]), BigInt(pi_c[1])]
|
|
107
117
|
};
|
|
108
118
|
}
|
|
109
119
|
|
|
110
|
-
export { ASP_TREE_DEPTH, STATE_TREE_DEPTH, formatProofForContract, generateProof, generateStealthProof, generateUPPProof, getStealthCircuitArtifacts, getUPPCircuitArtifacts, verifyProof };
|
|
111
|
-
//# sourceMappingURL=chunk-
|
|
112
|
-
//# sourceMappingURL=chunk-
|
|
120
|
+
export { ASP_TREE_DEPTH, STATE_TREE_DEPTH, formatPlonkProofForContract, formatProofForContract, generateProof, generateStealthProof, generateUPPProof, getStealthCircuitArtifacts, getUPPCircuitArtifacts, verifyProof };
|
|
121
|
+
//# sourceMappingURL=chunk-W3HLIKC2.js.map
|
|
122
|
+
//# sourceMappingURL=chunk-W3HLIKC2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/proof.ts"],"names":["snarkjs"],"mappings":";AAUA,IAAI,OAAA,GAAe,IAAA;AAKnB,eAAe,WAAA,GAA4B;AACzC,EAAA,IAAI,SAAS,OAAO,OAAA;AACpB,EAAA,OAAA,GAAU,MAAM,OAAO,SAAS,CAAA;AAChC,EAAA,OAAO,OAAA;AACT;AAOO,IAAM,gBAAA,GAAmB;AAGzB,IAAM,cAAA,GAAiB;AA+SvB,SAAS,sBAAA,CACd,OAAA,EACA,OAAA,GAAkB,YAAA,EACA;AAClB,EAAA,MAAM,OAAO,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,OAAA,GAAU,GAAG,OAAO,CAAA,CAAA,CAAA;AAEzD,EAAA,MAAM,UAAA,GAAuD;AAAA,IAC3D,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,GAAG,IAAI,CAAA,aAAA,CAAA;AAAA,MACb,IAAA,EAAM,GAAG,IAAI,CAAA,aAAA;AAAA,KACf;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,GAAG,IAAI,CAAA,UAAA,CAAA;AAAA,MACb,IAAA,EAAM,GAAG,IAAI,CAAA,UAAA;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,GAAG,IAAI,CAAA,aAAA,CAAA;AAAA,MACb,IAAA,EAAM,GAAG,IAAI,CAAA,aAAA;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,GAAG,IAAI,CAAA,cAAA,CAAA;AAAA,MACb,IAAA,EAAM,GAAG,IAAI,CAAA,cAAA;AAAA,KACf;AAAA,IACA,kBAAA,EAAoB;AAAA,MAClB,IAAA,EAAM,GAAG,IAAI,CAAA,uBAAA,CAAA;AAAA,MACb,IAAA,EAAM,GAAG,IAAI,CAAA,uBAAA;AAAA,KACf;AAAA,IACA,kBAAA,EAAoB;AAAA,MAClB,IAAA,EAAM,GAAG,IAAI,CAAA,uBAAA,CAAA;AAAA,MACb,IAAA,EAAM,GAAG,IAAI,CAAA,uBAAA;AAAA;AACf,GACF;AAEA,EAAA,OAAO,WAAW,OAAO,CAAA;AAC3B;AAKO,SAAS,0BAAA,CACd,OAAA,EACA,OAAA,GAAkB,YAAA,EACA;AAClB,EAAA,MAAM,OAAO,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,OAAA,GAAU,GAAG,OAAO,CAAA,CAAA,CAAA;AAEzD,EAAA,MAAM,UAAA,GAA2D;AAAA,IAC/D,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,GAAG,IAAI,CAAA,qBAAA,CAAA;AAAA,MACb,IAAA,EAAM,GAAG,IAAI,CAAA,2BAAA;AAAA,KACf;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,GAAG,IAAI,CAAA,gBAAA,CAAA;AAAA,MACb,IAAA,EAAM,GAAG,IAAI,CAAA,sBAAA;AAAA;AACf,GACF;AAEA,EAAA,OAAO,WAAW,OAAO,CAAA;AAC3B;AA4BA,eAAsB,gBAAA,CACpB,WAAA,EACA,MAAA,EACA,OAAA,GAAkB,YAAA,EACI;AACtB,EAAA,MAAMA,QAAAA,GAAU,MAAM,WAAA,EAAY;AAClC,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,WAAA,EAAa,OAAO,CAAA;AAG7D,EAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,OAAA,CAAQ,IAAI,iDAAiD,CAAA;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAE,CAAA;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,CAAA,CAAE,SAAS,CAAA,CAAE,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,CAAA,CAAE,WAAW,CAAA,CAAE,CAAA;AAC7C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,CAAA,CAAE,eAAA,EAAiB,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACnF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AACjD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AAAA,EACnD;AAGA,EAAA,MAAM,MAAA,GAAS,MAAMA,QAAAA,CAAQ,KAAA,CAAM,UAAU,MAAA,EAAQ,SAAA,CAAU,IAAA,EAAM,SAAA,CAAU,IAAI,CAAA;AAEnF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,eAAe,MAAA,CAAO;AAAA,KACxB;AAAA,IACA,eAAe,MAAA,CAAO;AAAA,GACxB;AACF;AAKA,eAAsB,aAAA,CACpB,cACA,OAAA,EACgB;AAChB,EAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAC5D;AAaA,eAAsB,oBAAA,CACpB,OAAA,EACA,MAAA,EACA,OAAA,GAAkB,YAAA,EACI;AACtB,EAAA,MAAMA,QAAAA,GAAU,MAAM,WAAA,EAAY;AAClC,EAAA,MAAM,SAAA,GAAY,0BAAA,CAA2B,OAAA,EAAS,OAAO,CAAA;AAE7D,EAAA,MAAM,MAAA,GAAS,MAAMA,QAAAA,CAAQ,OAAA,CAAQ,UAAU,MAAA,EAAQ,SAAA,CAAU,IAAA,EAAM,SAAA,CAAU,IAAI,CAAA;AAErF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,eAAe,MAAA,CAAO;AAAA,KACxB;AAAA,IACA,eAAe,MAAA,CAAO;AAAA,GACxB;AACF;AAKA,eAAsB,WAAA,CACpB,cACA,MAAA,EACkB;AAClB,EAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AACnC;AAWA,eAAsB,4BAA4B,KAAA,EAG/C;AACD,EAAA,MAAMA,QAAAA,GAAU,MAAM,WAAA,EAAY;AAClC,EAAA,MAAM,QAAA,GAAW,MAAMA,QAAAA,CAAQ,KAAA,CAAM,sBAAA;AAAA,IACnC,KAAA,CAAM,KAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AAGA,EAAA,MAAM,CAAC,QAAA,EAAU,UAAU,CAAA,GAAI,QAAA,CAAS,MAAM,KAAK,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,UAAA,GACZ,UAAA,CAAW,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,MAAc,MAAA,CAAO,CAAC,CAAC,CAAA,GACtE,KAAA,CAAM,aAAA,CAAc,IAAI,CAAC,CAAA,KAAc,MAAA,CAAO,CAAC,CAAC,CAAA;AAEpD,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,QAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AACF;AAOO,SAAS,uBAAuB,KAAA,EAIrC;AACA,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,KAAS,KAAA,CAAM,KAAA;AAEnC,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAAA,IACpC,CAAA,EAAG;AAAA,MACD,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAAA,MACvC,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAAA,KACzC;AAAA,IACA,CAAA,EAAG,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAC;AAAA,GACtC;AACF","file":"chunk-W3HLIKC2.js","sourcesContent":["/**\n * ZK Proof Generation and Verification (BLS12-381 PLONK)\n *\n * Uses snarkjs for PLONK proof generation over the BLS12-381 curve.\n * PLONK provides a universal trusted setup (no per-circuit ceremony).\n */\n\nimport type { Proof } from './types.js'\n\n// Lazy-loaded snarkjs reference\nlet snarkjs: any = null\n\n/**\n * Load snarkjs dynamically\n */\nasync function loadSnarkjs(): Promise<any> {\n if (snarkjs) return snarkjs\n snarkjs = await import('snarkjs')\n return snarkjs\n}\n\n// ============================================================================\n// UPP Circuit Constants\n// ============================================================================\n\n/** State tree depth (32 levels = ~4B notes) */\nexport const STATE_TREE_DEPTH = 32\n\n/** ASP tree depth (20 levels = ~1M addresses) */\nexport const ASP_TREE_DEPTH = 20\n\n// ============================================================================\n// UPP Circuit Types\n// ============================================================================\n\n/**\n * Circuit types available in UPP (full protocol)\n */\nexport type UPPCircuitType = 'transfer' | 'merge' | 'withdraw' | 'joinsplit' | 'merge_transfer_2x2' | 'merge_transfer_4x2'\n\n/**\n * @deprecated Use UPPCircuitType instead\n */\nexport type CircuitType = 'shield' | 'transfer' | 'merge' | 'withdraw'\n\n/**\n * @deprecated Stealth circuits are being replaced by UPP circuits\n */\nexport type StealthCircuitType = '1x2' | '2x2'\n\n/**\n * Input signals for UPP transfer circuit (1-in-2-out, BLS12-381 PLONK)\n *\n * Matches transfer.circom: Transfer(32, 20)\n * Public: stateRoot, aspRoot, nullifier, outputCommitment1, outputCommitment2, token\n *\n * Note: Uses hash-based ownership (ownerHash) instead of BabyJubJub pubkeys.\n */\nexport interface UPPTransferCircuitInputs {\n // Public inputs\n stateRoot: string\n aspRoot: string\n nullifier: string\n outputCommitment1: string\n outputCommitment2: string\n token: string\n\n // Private inputs - Input Note\n inputAmount: string\n inputOneTimeSecret: string\n inputBlinding: string\n inputOrigin: string\n inputLeafIndex: string\n inputPathElements: string[] // 32 elements\n inputPathIndices: string[] // 32 elements\n\n // Private inputs - ASP Membership Proof\n aspPathElements: string[] // 20 elements\n aspPathIndices: string[] // 20 elements\n\n // Private inputs - Output Notes (hash-based ownership)\n outputAmount1: string\n outputOwnerHash1: string\n outputBlinding1: string\n\n outputAmount2: string\n outputOwnerHash2: string\n outputBlinding2: string\n}\n\n/**\n * Input signals for UPP withdraw circuit (BLS12-381 PLONK)\n *\n * Matches withdraw.circom with optional ASP check (ragequit support)\n */\nexport interface UPPWithdrawCircuitInputs {\n // Public inputs\n stateRoot: string\n aspRoot: string\n nullifier: string\n amount: string\n recipient: string\n token: string\n isRagequit: string // '0' or '1'\n\n // Private inputs - Input Note\n inputAmount: string\n inputOneTimeSecret: string\n inputBlinding: string\n inputOrigin: string\n inputLeafIndex: string\n inputPathElements: string[] // 32 elements\n inputPathIndices: string[] // 32 elements\n\n // Private inputs - ASP Membership Proof (can be zeros if ragequit)\n aspPathElements: string[] // 20 elements\n aspPathIndices: string[] // 20 elements\n}\n\n/**\n * Input signals for UPP merge circuit (2-in-1-out, BLS12-381 PLONK)\n */\nexport interface UPPMergeCircuitInputs {\n // Public inputs\n stateRoot: string\n nullifier1: string\n nullifier2: string\n outputCommitment: string\n merger: string\n token: string\n\n // Private inputs - Input Note 1\n inputAmount1: string\n inputOneTimeSecret1: string\n inputBlinding1: string\n inputOrigin1: string\n inputLeafIndex1: string\n inputPathElements1: string[]\n inputPathIndices1: string[]\n\n // Private inputs - Input Note 2\n inputAmount2: string\n inputOneTimeSecret2: string\n inputBlinding2: string\n inputOrigin2: string\n inputLeafIndex2: string\n inputPathElements2: string[]\n inputPathIndices2: string[]\n\n // Private inputs - Output Note\n outputAmount: string\n outputOwnerHash: string\n outputBlinding: string\n}\n\n/**\n * Input signals for UPP joinsplit circuit (4-in-2-out, BLS12-381 PLONK)\n */\nexport interface UPPJoinSplitCircuitInputs {\n // Public inputs\n stateRoot: string\n aspRoot: string\n nullifier1: string\n nullifier2: string\n nullifier3: string\n nullifier4: string\n outputCommitment1: string\n outputCommitment2: string\n token: string\n\n // Private inputs - 4 Input Notes\n inputAmount1: string; inputOneTimeSecret1: string; inputBlinding1: string\n inputOrigin1: string; inputLeafIndex1: string\n inputPathElements1: string[]; inputPathIndices1: string[]\n\n inputAmount2: string; inputOneTimeSecret2: string; inputBlinding2: string\n inputOrigin2: string; inputLeafIndex2: string\n inputPathElements2: string[]; inputPathIndices2: string[]\n\n inputAmount3: string; inputOneTimeSecret3: string; inputBlinding3: string\n inputOrigin3: string; inputLeafIndex3: string\n inputPathElements3: string[]; inputPathIndices3: string[]\n\n inputAmount4: string; inputOneTimeSecret4: string; inputBlinding4: string\n inputOrigin4: string; inputLeafIndex4: string\n inputPathElements4: string[]; inputPathIndices4: string[]\n\n // Private inputs - ASP Membership Proof\n aspPathElements: string[]\n aspPathIndices: string[]\n\n // Private inputs - Output Notes\n outputAmount1: string; outputOwnerHash1: string; outputBlinding1: string\n outputAmount2: string; outputOwnerHash2: string; outputBlinding2: string\n}\n\n/**\n * @deprecated Use UPPTransferCircuitInputs instead\n */\nexport interface TransferCircuitInputs {\n stateRoot: bigint\n aspRoot: bigint\n nullifier: bigint\n outputCommitment1: bigint\n outputCommitment2: bigint\n token: bigint\n amount: bigint\n blinding: bigint\n origin: bigint\n statePathElements: bigint[]\n statePathIndices: bigint\n aspPathElements: bigint[]\n outAmount1: bigint\n outBlinding1: bigint\n outOrigin1: bigint\n outAmount2: bigint\n outBlinding2: bigint\n outOrigin2: bigint\n}\n\n/**\n * Input signals for shield circuit\n */\nexport interface ShieldCircuitInputs {\n commitment: bigint\n token: bigint\n amount: bigint\n blinding: bigint\n origin: bigint\n}\n\n/**\n * Input signals for merge circuit\n */\nexport interface MergeCircuitInputs {\n stateRoot: bigint\n nullifier1: bigint\n nullifier2: bigint\n outputCommitment: bigint\n newOrigin: bigint\n token: bigint\n amount1: bigint\n blinding1: bigint\n origin1: bigint\n token1: bigint\n pathElements1: bigint[]\n pathIndices1: bigint\n amount2: bigint\n blinding2: bigint\n origin2: bigint\n token2: bigint\n pathElements2: bigint[]\n pathIndices2: bigint\n outputAmount: bigint\n outputBlinding: bigint\n}\n\n/**\n * Input signals for withdraw circuit\n */\nexport interface WithdrawCircuitInputs {\n stateRoot: bigint\n aspRoot: bigint\n nullifier: bigint\n withdrawAmount: bigint\n recipient: bigint\n token: bigint\n isRagequit: bigint\n amount: bigint\n blinding: bigint\n origin: bigint\n statePathElements: bigint[]\n statePathIndices: bigint\n aspPathElements: bigint[]\n}\n\n/**\n * Circuit inputs union type\n */\nexport type CircuitInputs =\n | ShieldCircuitInputs\n | TransferCircuitInputs\n | MergeCircuitInputs\n | WithdrawCircuitInputs\n\n// ============================================================================\n// Stealth Circuit Types (deprecated)\n// ============================================================================\n\n/**\n * @deprecated\n */\nexport interface Stealth1x2CircuitInputs {\n root: string; nullifierHash: string; publicAmount: string\n recipient: string; extDataHash: string\n inputAmount: string; inputOneTimeSecret: string; inputBlinding: string\n inputLeafIndex: string; inputPathElements: string[]; inputPathIndices: string[]\n outputAmount1: string; outputPubkeyX1: string; outputPubkeyY1: string; outputBlinding1: string\n outputAmount2: string; outputPubkeyX2: string; outputPubkeyY2: string; outputBlinding2: string\n}\n\n/**\n * @deprecated\n */\nexport interface Stealth2x2CircuitInputs {\n root: string; nullifierHash1: string; nullifierHash2: string\n publicAmount: string; recipient: string; extDataHash: string\n inputAmount1: string; inputOneTimeSecret1: string; inputBlinding1: string\n inputLeafIndex1: string; inputPathElements1: string[]; inputPathIndices1: string[]\n inputAmount2: string; inputOneTimeSecret2: string; inputBlinding2: string\n inputLeafIndex2: string; inputPathElements2: string[]; inputPathIndices2: string[]\n outputAmount1: string; outputPubkeyX1: string; outputPubkeyY1: string; outputBlinding1: string\n outputAmount2: string; outputPubkeyX2: string; outputPubkeyY2: string; outputBlinding2: string\n}\n\n/** @deprecated */\nexport type StealthCircuitInputs = Stealth1x2CircuitInputs | Stealth2x2CircuitInputs\n\n/**\n * Circuit artifact paths\n */\nexport interface CircuitArtifacts {\n wasm: string\n zkey: string\n}\n\n/**\n * Get circuit artifacts for a UPP circuit\n *\n * @param circuit - UPP circuit type\n * @param baseUrl - Base URL for circuit files (default: '/circuits/')\n */\nexport function getUPPCircuitArtifacts(\n circuit: UPPCircuitType,\n baseUrl: string = '/circuits/'\n): CircuitArtifacts {\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`\n\n const circuitMap: Record<UPPCircuitType, CircuitArtifacts> = {\n transfer: {\n wasm: `${base}transfer.wasm`,\n zkey: `${base}transfer.zkey`,\n },\n merge: {\n wasm: `${base}merge.wasm`,\n zkey: `${base}merge.zkey`,\n },\n withdraw: {\n wasm: `${base}withdraw.wasm`,\n zkey: `${base}withdraw.zkey`,\n },\n joinsplit: {\n wasm: `${base}joinsplit.wasm`,\n zkey: `${base}joinsplit.zkey`,\n },\n merge_transfer_2x2: {\n wasm: `${base}merge_transfer_2x2.wasm`,\n zkey: `${base}merge_transfer_2x2.zkey`,\n },\n merge_transfer_4x2: {\n wasm: `${base}merge_transfer_4x2.wasm`,\n zkey: `${base}merge_transfer_4x2.zkey`,\n },\n }\n\n return circuitMap[circuit]\n}\n\n/**\n * @deprecated Use getUPPCircuitArtifacts instead\n */\nexport function getStealthCircuitArtifacts(\n circuit: StealthCircuitType,\n baseUrl: string = '/circuits/'\n): CircuitArtifacts {\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`\n\n const circuitMap: Record<StealthCircuitType, CircuitArtifacts> = {\n '1x2': {\n wasm: `${base}shielded_stealth.wasm`,\n zkey: `${base}shielded_stealth_final.zkey`,\n },\n '2x2': {\n wasm: `${base}stealth_2x2.wasm`,\n zkey: `${base}stealth_2x2_final.zkey`,\n },\n }\n\n return circuitMap[circuit]\n}\n\n/**\n * UPP circuit inputs union type\n */\nexport type UPPCircuitInputs =\n | UPPTransferCircuitInputs\n | UPPWithdrawCircuitInputs\n | UPPMergeCircuitInputs\n | UPPJoinSplitCircuitInputs\n\n/**\n * Generate a ZK proof for a UPP circuit (BLS12-381 PLONK)\n *\n * @param circuitType - Which UPP circuit to use\n * @param inputs - Circuit input signals\n * @param baseUrl - Base URL for circuit artifacts (default: '/circuits/')\n * @returns Generated proof and public signals\n *\n * @example\n * ```ts\n * const { proof, publicSignals } = await generateUPPProof('transfer', {\n * stateRoot: String(currentRoot),\n * aspRoot: String(aspRoot),\n * // ... other inputs\n * })\n * ```\n */\nexport async function generateUPPProof(\n circuitType: UPPCircuitType,\n inputs: UPPCircuitInputs,\n baseUrl: string = '/circuits/'\n): Promise<ProofResult> {\n const snarkjs = await loadSnarkjs()\n const artifacts = getUPPCircuitArtifacts(circuitType, baseUrl)\n\n // Debug: log key circuit inputs\n if (circuitType === 'transfer') {\n const i = inputs as UPPTransferCircuitInputs\n console.log('[generateUPPProof] === PLONK CIRCUIT INPUTS ===')\n console.log(` circuitType: ${circuitType}`)\n console.log(` stateRoot: ${i.stateRoot}`)\n console.log(` aspRoot: ${i.aspRoot}`)\n console.log(` inputOrigin: ${i.inputOrigin}`)\n console.log(` aspPathElements[0..2]: ${i.aspPathElements?.slice(0, 3).join(', ')}`)\n console.log(` artifacts.wasm: ${artifacts.wasm}`)\n console.log(` artifacts.zkey: ${artifacts.zkey}`)\n }\n\n // Use PLONK prover (not Groth16)\n const result = await snarkjs.plonk.fullProve(inputs, artifacts.wasm, artifacts.zkey)\n\n return {\n proof: {\n proof: result.proof,\n publicSignals: result.publicSignals,\n },\n publicSignals: result.publicSignals,\n }\n}\n\n/**\n * @deprecated Use generateUPPProof instead\n */\nexport async function generateProof(\n _circuitType: CircuitType,\n _inputs: CircuitInputs\n): Promise<Proof> {\n throw new Error('Deprecated: Use generateUPPProof instead')\n}\n\n/**\n * Result from proof generation\n */\nexport interface ProofResult {\n proof: Proof\n publicSignals: string[]\n}\n\n/**\n * @deprecated Stealth circuits use old Groth16 format\n */\nexport async function generateStealthProof(\n circuit: StealthCircuitType,\n inputs: StealthCircuitInputs,\n baseUrl: string = '/circuits/'\n): Promise<ProofResult> {\n const snarkjs = await loadSnarkjs()\n const artifacts = getStealthCircuitArtifacts(circuit, baseUrl)\n\n const result = await snarkjs.groth16.fullProve(inputs, artifacts.wasm, artifacts.zkey)\n\n return {\n proof: {\n proof: result.proof,\n publicSignals: result.publicSignals,\n },\n publicSignals: result.publicSignals,\n }\n}\n\n/**\n * Verify a ZK proof\n */\nexport async function verifyProof(\n _circuitType: CircuitType,\n _proof: Proof\n): Promise<boolean> {\n throw new Error('Not implemented')\n}\n\n/**\n * Format PLONK proof for on-chain verification\n *\n * PLONK proofs use a different format than Groth16:\n * - Groth16: uint256[8] (pi_a, pi_b, pi_c)\n * - PLONK: bytes (encoded proof with commitments and evaluations)\n *\n * Use snarkjs.plonk.exportSolidityCallData() for the exact encoding.\n */\nexport async function formatPlonkProofForContract(proof: Proof): Promise<{\n proofBytes: `0x${string}`\n publicSignals: bigint[]\n}> {\n const snarkjs = await loadSnarkjs()\n const calldata = await snarkjs.plonk.exportSolidityCallData(\n proof.proof,\n proof.publicSignals\n )\n\n // snarkjs returns a comma-separated string: \"0xproof,[sig1,sig2,...]\"\n const [proofHex, signalsStr] = calldata.split(',[\"')\n const signals = signalsStr\n ? signalsStr.replace('\"]', '').split('\",\"').map((s: string) => BigInt(s))\n : proof.publicSignals.map((s: string) => BigInt(s))\n\n return {\n proofBytes: proofHex as `0x${string}`,\n publicSignals: signals,\n }\n}\n\n/**\n * @deprecated Use formatPlonkProofForContract for PLONK proofs.\n *\n * Format Groth16 proof for on-chain verification (old format).\n */\nexport function formatProofForContract(proof: Proof): {\n a: [bigint, bigint]\n b: [[bigint, bigint], [bigint, bigint]]\n c: [bigint, bigint]\n} {\n const { pi_a, pi_b, pi_c } = proof.proof\n\n return {\n a: [BigInt(pi_a[0]), BigInt(pi_a[1])],\n b: [\n [BigInt(pi_b[0][1]), BigInt(pi_b[0][0])],\n [BigInt(pi_b[1][1]), BigInt(pi_b[1][0])],\n ],\n c: [BigInt(pi_c[0]), BigInt(pi_c[1])],\n }\n}\n"]}
|
|
@@ -4,7 +4,7 @@ var chunkG7VZBCD6_cjs = require('./chunk-G7VZBCD6.cjs');
|
|
|
4
4
|
var upcSdk = require('@permissionless-technologies/upc-sdk');
|
|
5
5
|
|
|
6
6
|
var ASP_TREE_DEPTH = upcSdk.DEFAULT_TREE_DEPTH;
|
|
7
|
-
var
|
|
7
|
+
var bls12381 = new upcSdk.PoseidonBLS12381();
|
|
8
8
|
async function computeSingleOriginASPRoot(origin) {
|
|
9
9
|
return origin;
|
|
10
10
|
}
|
|
@@ -21,7 +21,7 @@ async function verifyASPProof(origin, proof) {
|
|
|
21
21
|
return upcSdk.verifyMembershipProof(
|
|
22
22
|
origin,
|
|
23
23
|
{ root: proof.aspRoot, pathElements: proof.aspPathElements, pathIndices: proof.aspPathIndices },
|
|
24
|
-
|
|
24
|
+
bls12381
|
|
25
25
|
);
|
|
26
26
|
}
|
|
27
27
|
var DEMO_ASP_ID = 1n;
|
|
@@ -31,16 +31,16 @@ async function createDemoASPRoot(origin) {
|
|
|
31
31
|
}
|
|
32
32
|
function buildASPTree(origins) {
|
|
33
33
|
const { buildMerkleTree } = chunkG7VZBCD6_cjs.__require("@permissionless-technologies/upc-sdk");
|
|
34
|
-
return buildMerkleTree(origins, ASP_TREE_DEPTH,
|
|
34
|
+
return buildMerkleTree(origins, ASP_TREE_DEPTH, bls12381);
|
|
35
35
|
}
|
|
36
36
|
async function computeMultiOriginASPRoot(origins) {
|
|
37
|
-
return upcSdk.computeMerkleRoot(origins, ASP_TREE_DEPTH,
|
|
37
|
+
return upcSdk.computeMerkleRoot(origins, ASP_TREE_DEPTH, bls12381);
|
|
38
38
|
}
|
|
39
39
|
async function generateMultiOriginASPProof(aspId, origin, allOrigins) {
|
|
40
40
|
if (allOrigins.length <= 1) {
|
|
41
41
|
return generateSingleOriginASPProof(aspId, origin);
|
|
42
42
|
}
|
|
43
|
-
const proof = await upcSdk.generateMembershipProof(origin, allOrigins, ASP_TREE_DEPTH,
|
|
43
|
+
const proof = await upcSdk.generateMembershipProof(origin, allOrigins, ASP_TREE_DEPTH, bls12381);
|
|
44
44
|
return {
|
|
45
45
|
aspId,
|
|
46
46
|
aspRoot: proof.root,
|
|
@@ -66,5 +66,5 @@ exports.generateASPProof = generateASPProof;
|
|
|
66
66
|
exports.generateMultiOriginASPProof = generateMultiOriginASPProof;
|
|
67
67
|
exports.generateSingleOriginASPProof = generateSingleOriginASPProof;
|
|
68
68
|
exports.verifyASPProof = verifyASPProof;
|
|
69
|
-
//# sourceMappingURL=chunk-
|
|
70
|
-
//# sourceMappingURL=chunk-
|
|
69
|
+
//# sourceMappingURL=chunk-XVIICZKW.cjs.map
|
|
70
|
+
//# sourceMappingURL=chunk-XVIICZKW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/asp.ts"],"names":["DEFAULT_TREE_DEPTH","PoseidonBLS12381","generateSingleMemberProof","verifyMembershipProof","__require","computeMerkleRoot","generateMembershipProof"],"mappings":";;;;;AAuBO,IAAM,cAAA,GAAiBA;AAG9B,IAAM,QAAA,GAAW,IAAIC,uBAAA,EAAiB;AAmBtC,eAAsB,2BAA2B,MAAA,EAAiC;AAChF,EAAA,OAAO,MAAA;AACT;AAKA,eAAsB,4BAAA,CACpB,OACA,MAAA,EACmB;AACnB,EAAA,MAAM,KAAA,GAAQC,gCAAA,CAA0B,MAAA,EAAQ,cAAc,CAAA;AAC9D,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,SAAS,KAAA,CAAM,IAAA;AAAA,IACf,iBAAiB,KAAA,CAAM,YAAA;AAAA,IACvB,gBAAgB,KAAA,CAAM;AAAA,GACxB;AACF;AAKA,eAAsB,cAAA,CAAe,QAAgB,KAAA,EAAmC;AACtF,EAAA,OAAOC,4BAAA;AAAA,IACL,MAAA;AAAA,IACA,EAAE,MAAM,KAAA,CAAM,OAAA,EAAS,cAAc,KAAA,CAAM,eAAA,EAAiB,WAAA,EAAa,KAAA,CAAM,cAAA,EAAe;AAAA,IAC9F;AAAA,GACF;AACF;AAKO,IAAM,WAAA,GAAc;AACpB,IAAM,aAAA,GAAgB;AAK7B,eAAsB,kBAAkB,MAAA,EAAiC;AACvE,EAAA,OAAO,2BAA2B,MAAM,CAAA;AAC1C;AAKO,SAAS,aAAa,OAAA,EAAmB;AAC9C,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAIC,2BAAA,CAAQ,sCAAsC,CAAA;AAC1E,EAAA,OAAO,eAAA,CAAgB,OAAA,EAAS,cAAA,EAAgB,QAAQ,CAAA;AAC1D;AAKA,eAAsB,0BAA0B,OAAA,EAAoC;AAClF,EAAA,OAAOC,wBAAA,CAAkB,OAAA,EAAS,cAAA,EAAgB,QAAQ,CAAA;AAC5D;AAKA,eAAsB,2BAAA,CACpB,KAAA,EACA,MAAA,EACA,UAAA,EACmB;AACnB,EAAA,IAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,IAAA,OAAO,4BAAA,CAA6B,OAAO,MAAM,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,QAAQ,MAAMC,8BAAA,CAAwB,MAAA,EAAQ,UAAA,EAAY,gBAAgB,QAAQ,CAAA;AAExF,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,SAAS,KAAA,CAAM,IAAA;AAAA,IACf,iBAAiB,KAAA,CAAM,YAAA;AAAA,IACvB,gBAAgB,KAAA,CAAM;AAAA,GACxB;AACF;AAKA,eAAsB,gBAAA,CACpB,KAAA,EACA,MAAA,EACA,eAAA,EACmB;AACnB,EAAA,IAAI,eAAA,IAAmB,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACjD,IAAA,OAAO,2BAAA,CAA4B,KAAA,EAAO,MAAA,EAAQ,eAAe,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,4BAAA,CAA6B,OAAO,MAAM,CAAA;AACnD","file":"chunk-XVIICZKW.cjs","sourcesContent":["/**\n * ASP (Association Set Provider) Utilities\n *\n * Thin wrapper around @permissionless-technologies/upc-sdk.\n * Provides pool-specific types (ASPProof with aspId) while delegating\n * Merkle tree operations to the compliance SDK.\n *\n * In UPP, every transfer must prove the origin is in an approved ASP's allowlist.\n *\n * Uses BLS12-381 Poseidon (128-bit security) for Merkle tree operations,\n * matching the circuit hash function.\n */\n\nimport {\n generateMembershipProof,\n generateSingleMemberProof,\n computeMerkleRoot,\n verifyMembershipProof,\n DEFAULT_TREE_DEPTH,\n PoseidonBLS12381,\n} from '@permissionless-technologies/upc-sdk'\n\n// Re-export tree depth from UPC\nexport const ASP_TREE_DEPTH = DEFAULT_TREE_DEPTH\n\n// Use BLS12-381 Poseidon (128-bit security) — matches circuit hash function\nconst bls12381 = new PoseidonBLS12381()\n\n/**\n * ASP Merkle proof structure (pool-specific: includes aspId)\n */\nexport interface ASPProof {\n /** ASP ID */\n aspId: bigint\n /** ASP's published root */\n aspRoot: bigint\n /** Path elements (siblings) - 20 levels */\n aspPathElements: bigint[]\n /** Path indices - 20 levels */\n aspPathIndices: number[]\n}\n\n/**\n * Compute the ASP root for a single-leaf tree\n */\nexport async function computeSingleOriginASPRoot(origin: bigint): Promise<bigint> {\n return origin // LeanIMT single-leaf optimization: root = leaf\n}\n\n/**\n * Generate ASP proof for a single-origin tree\n */\nexport async function generateSingleOriginASPProof(\n aspId: bigint,\n origin: bigint\n): Promise<ASPProof> {\n const proof = generateSingleMemberProof(origin, ASP_TREE_DEPTH)\n return {\n aspId,\n aspRoot: proof.root,\n aspPathElements: proof.pathElements,\n aspPathIndices: proof.pathIndices,\n }\n}\n\n/**\n * Verify an ASP proof locally (for debugging)\n */\nexport async function verifyASPProof(origin: bigint, proof: ASPProof): Promise<boolean> {\n return verifyMembershipProof(\n origin,\n { root: proof.aspRoot, pathElements: proof.aspPathElements, pathIndices: proof.aspPathIndices },\n bls12381\n )\n}\n\n/**\n * Demo ASP configuration\n */\nexport const DEMO_ASP_ID = 1n\nexport const DEMO_ASP_NAME = 'Demo ASP (Single-Origin)'\n\n/**\n * Create a \"universal approval\" ASP root\n */\nexport async function createDemoASPRoot(origin: bigint): Promise<bigint> {\n return computeSingleOriginASPRoot(origin)\n}\n\n/**\n * Build an ASP Merkle tree from multiple origin addresses\n */\nexport function buildASPTree(origins: bigint[]) {\n const { buildMerkleTree } = require('@permissionless-technologies/upc-sdk') as typeof import('@permissionless-technologies/upc-sdk')\n return buildMerkleTree(origins, ASP_TREE_DEPTH, bls12381)\n}\n\n/**\n * Compute the Merkle root for a set of approved origins\n */\nexport async function computeMultiOriginASPRoot(origins: bigint[]): Promise<bigint> {\n return computeMerkleRoot(origins, ASP_TREE_DEPTH, bls12381)\n}\n\n/**\n * Generate an ASP membership proof for one origin within a multi-origin tree\n */\nexport async function generateMultiOriginASPProof(\n aspId: bigint,\n origin: bigint,\n allOrigins: bigint[]\n): Promise<ASPProof> {\n if (allOrigins.length <= 1) {\n return generateSingleOriginASPProof(aspId, origin)\n }\n\n const proof = await generateMembershipProof(origin, allOrigins, ASP_TREE_DEPTH, bls12381)\n\n return {\n aspId,\n aspRoot: proof.root,\n aspPathElements: proof.pathElements,\n aspPathIndices: proof.pathIndices,\n }\n}\n\n/**\n * Generate an ASP proof, automatically choosing single-origin or multi-origin\n */\nexport async function generateASPProof(\n aspId: bigint,\n origin: bigint,\n approvedOrigins?: bigint[]\n): Promise<ASPProof> {\n if (approvedOrigins && approvedOrigins.length > 0) {\n return generateMultiOriginASPProof(aspId, origin, approvedOrigins)\n }\n return generateSingleOriginASPProof(aspId, origin)\n}\n"]}
|