@permissionless-technologies/upp-sdk 0.2.1 → 0.3.0

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.
Files changed (67) hide show
  1. package/dist/chunk-3YZSIYJC.cjs +154 -0
  2. package/dist/chunk-3YZSIYJC.cjs.map +1 -0
  3. package/dist/{chunk-43U5RGYE.cjs → chunk-4N5BH43P.cjs} +2 -2
  4. package/dist/{chunk-43U5RGYE.cjs.map → chunk-4N5BH43P.cjs.map} +1 -1
  5. package/dist/{chunk-C7QQOJ7T.cjs → chunk-52PPS4AT.cjs} +4 -22
  6. package/dist/chunk-52PPS4AT.cjs.map +1 -0
  7. package/dist/{chunk-NUIQHTSA.js → chunk-7F75NGNB.js} +76 -3
  8. package/dist/chunk-7F75NGNB.js.map +1 -0
  9. package/dist/{chunk-SGZZL5AC.js → chunk-GS4UCMW4.js} +4 -20
  10. package/dist/chunk-GS4UCMW4.js.map +1 -0
  11. package/dist/{chunk-64RTC5ML.js → chunk-IU5P5VDV.js} +2 -2
  12. package/dist/{chunk-64RTC5ML.js.map → chunk-IU5P5VDV.js.map} +1 -1
  13. package/dist/{chunk-GXZ3MTCQ.cjs → chunk-IYOR5TCO.cjs} +77 -2
  14. package/dist/chunk-IYOR5TCO.cjs.map +1 -0
  15. package/dist/{chunk-GQV47S3N.cjs → chunk-PTDVGWHU.cjs} +2 -2
  16. package/dist/{chunk-GQV47S3N.cjs.map → chunk-PTDVGWHU.cjs.map} +1 -1
  17. package/dist/{chunk-CZ23JMAQ.js → chunk-QBCLFGMV.js} +3 -3
  18. package/dist/{chunk-CZ23JMAQ.js.map → chunk-QBCLFGMV.js.map} +1 -1
  19. package/dist/{chunk-NCW4AE7L.js → chunk-UAVWYXDN.js} +2 -2
  20. package/dist/chunk-UAVWYXDN.js.map +1 -0
  21. package/dist/{chunk-46GGZ3TC.cjs → chunk-X4DLTVOG.cjs} +3 -3
  22. package/dist/{chunk-46GGZ3TC.cjs.map → chunk-X4DLTVOG.cjs.map} +1 -1
  23. package/dist/chunk-XBNYAAMU.js +140 -0
  24. package/dist/chunk-XBNYAAMU.js.map +1 -0
  25. package/dist/core/index.cjs +67 -61
  26. package/dist/core/index.d.cts +3 -2
  27. package/dist/core/index.d.ts +3 -2
  28. package/dist/core/index.js +5 -3
  29. package/dist/{index-BGvapsJy.d.cts → index-B45-okum.d.cts} +19 -3
  30. package/dist/{index-ChGaGPzP.d.ts → index-BIcvNMPt.d.ts} +19 -3
  31. package/dist/{index-BBzvvrhG.d.ts → index-DwAJBoU7.d.ts} +122 -96
  32. package/dist/{index-C-jSNw6j.d.cts → index-o-Ds3YAq.d.cts} +122 -96
  33. package/dist/index.cjs +123 -70
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +4 -3
  36. package/dist/index.d.ts +4 -3
  37. package/dist/index.js +6 -5
  38. package/dist/index.js.map +1 -1
  39. package/dist/indexer/index.cjs +6 -6
  40. package/dist/indexer/index.d.cts +6 -5
  41. package/dist/indexer/index.d.ts +6 -5
  42. package/dist/indexer/index.js +1 -1
  43. package/dist/react/index.cjs +107 -102
  44. package/dist/react/index.cjs.map +1 -1
  45. package/dist/react/index.d.cts +2 -2
  46. package/dist/react/index.d.ts +2 -2
  47. package/dist/react/index.js +100 -95
  48. package/dist/react/index.js.map +1 -1
  49. package/dist/stark-BcTD1OaJ.d.cts +185 -0
  50. package/dist/stark-BcTD1OaJ.d.ts +185 -0
  51. package/dist/{transfer-SA4NHNJ7.cjs → transfer-6ZIVZ6JY.cjs} +9 -9
  52. package/dist/{transfer-SA4NHNJ7.cjs.map → transfer-6ZIVZ6JY.cjs.map} +1 -1
  53. package/dist/{transfer-DKZuJnRM.d.cts → transfer-BzyernBd.d.cts} +1 -3
  54. package/dist/{transfer-4OF2JWXX.js → transfer-CDXC3OQW.js} +3 -3
  55. package/dist/{transfer-4OF2JWXX.js.map → transfer-CDXC3OQW.js.map} +1 -1
  56. package/dist/{transfer-BlmbO-Rd.d.ts → transfer-sqS6mJko.d.ts} +1 -3
  57. package/dist/utils/index.cjs +54 -1
  58. package/dist/utils/index.d.cts +2 -0
  59. package/dist/utils/index.d.ts +2 -0
  60. package/dist/utils/index.js +2 -1
  61. package/package.json +1 -1
  62. package/src/deployments/31337.json +1 -1
  63. package/dist/chunk-C7QQOJ7T.cjs.map +0 -1
  64. package/dist/chunk-GXZ3MTCQ.cjs.map +0 -1
  65. package/dist/chunk-NCW4AE7L.js.map +0 -1
  66. package/dist/chunk-NUIQHTSA.js.map +0 -1
  67. package/dist/chunk-SGZZL5AC.js.map +0 -1
@@ -0,0 +1,154 @@
1
+ 'use strict';
2
+
3
+ var chunkBH24DZ5S_cjs = require('./chunk-BH24DZ5S.cjs');
4
+ var viem = require('viem');
5
+
6
+ var STARK_AMOUNT_SCALE = 10n ** 15n;
7
+ var STARK_STATE_TREE_DEPTH = 32;
8
+ var STARK_ASP_TREE_DEPTH = 20;
9
+ function isStarkAligned(amount) {
10
+ if (amount <= 0n) return false;
11
+ const scaled = amount / STARK_AMOUNT_SCALE;
12
+ return scaled * STARK_AMOUNT_SCALE === amount && scaled < chunkBH24DZ5S_cjs.M31_P;
13
+ }
14
+ function scaleAmountForStark(weiAmount) {
15
+ const scaled = weiAmount / STARK_AMOUNT_SCALE;
16
+ if (scaled * STARK_AMOUNT_SCALE !== weiAmount) {
17
+ throw new Error(`Amount ${weiAmount} not aligned to STARK scale (${STARK_AMOUNT_SCALE})`);
18
+ }
19
+ if (scaled >= chunkBH24DZ5S_cjs.M31_P) {
20
+ throw new Error(`Scaled amount ${scaled} exceeds M31 max (${chunkBH24DZ5S_cjs.M31_P})`);
21
+ }
22
+ return Number(scaled);
23
+ }
24
+ function truncateToM31(value) {
25
+ return Number(value % chunkBH24DZ5S_cjs.M31_P);
26
+ }
27
+ function addressToM31(addr) {
28
+ return Number(BigInt(addr) % chunkBH24DZ5S_cjs.M31_P);
29
+ }
30
+ function splitSecretToM31Limbs(secret) {
31
+ const limbs = [];
32
+ let remaining = secret;
33
+ for (let i = 0; i < chunkBH24DZ5S_cjs.SECRET_LIMBS; i++) {
34
+ limbs.push(Number(remaining % chunkBH24DZ5S_cjs.M31_P));
35
+ remaining = remaining / chunkBH24DZ5S_cjs.M31_P;
36
+ }
37
+ return limbs;
38
+ }
39
+ function packM31Digest(digest) {
40
+ return BigInt(digest[0]) | BigInt(digest[1]) << 32n | BigInt(digest[2]) << 64n | BigInt(digest[3]) << 96n;
41
+ }
42
+ function computeWithdrawPublicInputsSeed(params) {
43
+ return viem.keccak256(
44
+ viem.encodePacked(
45
+ ["bytes32", "uint256", "uint256", "uint256", "address", "uint256", "address", "bool"],
46
+ [
47
+ params.nullifier,
48
+ params.stateRoot,
49
+ params.aspRoot,
50
+ params.aspId,
51
+ params.token,
52
+ params.amount,
53
+ params.recipient,
54
+ params.isRagequit
55
+ ]
56
+ )
57
+ );
58
+ }
59
+ function computeTransferPublicInputsSeed(params) {
60
+ return viem.keccak256(
61
+ viem.encodePacked(
62
+ ["bytes32", "uint256", "uint256", "address", "bytes32", "bytes32"],
63
+ [
64
+ params.nullifier,
65
+ params.stateRoot,
66
+ params.aspRoot,
67
+ params.token,
68
+ params.outputCommitment1,
69
+ params.outputCommitment2
70
+ ]
71
+ )
72
+ );
73
+ }
74
+ function toBytes32Hex(value) {
75
+ if (typeof value === "bigint") {
76
+ return viem.pad(viem.numberToHex(value), { size: 32 });
77
+ }
78
+ return value;
79
+ }
80
+ function toAddress20Hex(addr) {
81
+ return addr.toLowerCase();
82
+ }
83
+ function buildStarkWithdrawWitness(params) {
84
+ return {
85
+ owner_secret: params.ownerSecret,
86
+ input_amount: params.inputAmount,
87
+ input_blinding: params.inputBlinding,
88
+ input_origin: params.inputOrigin,
89
+ token: params.token,
90
+ leaf_index: params.leafIndex,
91
+ state_path_elements: new Array(STARK_STATE_TREE_DEPTH).fill(0),
92
+ state_path_indices: new Array(STARK_STATE_TREE_DEPTH).fill(0),
93
+ asp_path_elements: new Array(STARK_ASP_TREE_DEPTH).fill(0),
94
+ asp_path_indices: new Array(STARK_ASP_TREE_DEPTH).fill(0),
95
+ withdraw_amount: params.withdrawAmount,
96
+ change_amount: params.changeAmount,
97
+ change_blinding: params.changeBlinding,
98
+ recipient: params.recipient,
99
+ is_ragequit: params.isRagequit,
100
+ nullifier_hex: params.nullifierHex,
101
+ state_root_hex: toBytes32Hex(params.stateRootBigInt),
102
+ asp_root_hex: toBytes32Hex(params.aspRootBigInt),
103
+ asp_id_hex: toBytes32Hex(params.aspIdBigInt),
104
+ token_address_hex: toAddress20Hex(params.tokenAddress),
105
+ amount_hex: toBytes32Hex(params.amountWei),
106
+ recipient_address_hex: toAddress20Hex(params.recipientAddress),
107
+ is_ragequit_bool: params.isRagequitBool
108
+ };
109
+ }
110
+ function buildStarkTransferWitness(params) {
111
+ return {
112
+ owner_secret: params.ownerSecret,
113
+ input_amount: params.inputAmount,
114
+ input_blinding: params.inputBlinding,
115
+ input_origin: params.inputOrigin,
116
+ token: params.token,
117
+ leaf_index: params.leafIndex,
118
+ state_path_elements: new Array(STARK_STATE_TREE_DEPTH).fill(0),
119
+ state_path_indices: new Array(STARK_STATE_TREE_DEPTH).fill(0),
120
+ asp_path_elements: new Array(STARK_ASP_TREE_DEPTH).fill(0),
121
+ asp_path_indices: new Array(STARK_ASP_TREE_DEPTH).fill(0),
122
+ output1_amount: params.output1Amount,
123
+ output1_owner_hash: params.output1OwnerHash,
124
+ output1_blinding: params.output1Blinding,
125
+ output1_origin: params.output1Origin,
126
+ output2_amount: params.output2Amount,
127
+ output2_owner_hash: params.output2OwnerHash,
128
+ output2_blinding: params.output2Blinding,
129
+ output2_origin: params.output2Origin,
130
+ is_ragequit: params.isRagequit,
131
+ nullifier_hex: params.nullifierHex,
132
+ state_root_hex: toBytes32Hex(params.stateRootBigInt),
133
+ asp_root_hex: toBytes32Hex(params.aspRootBigInt),
134
+ token_address_hex: toAddress20Hex(params.tokenAddress),
135
+ output_commitment_1_hex: params.outputCommitment1Hex,
136
+ output_commitment_2_hex: params.outputCommitment2Hex
137
+ };
138
+ }
139
+
140
+ exports.STARK_AMOUNT_SCALE = STARK_AMOUNT_SCALE;
141
+ exports.STARK_ASP_TREE_DEPTH = STARK_ASP_TREE_DEPTH;
142
+ exports.STARK_STATE_TREE_DEPTH = STARK_STATE_TREE_DEPTH;
143
+ exports.addressToM31 = addressToM31;
144
+ exports.buildStarkTransferWitness = buildStarkTransferWitness;
145
+ exports.buildStarkWithdrawWitness = buildStarkWithdrawWitness;
146
+ exports.computeTransferPublicInputsSeed = computeTransferPublicInputsSeed;
147
+ exports.computeWithdrawPublicInputsSeed = computeWithdrawPublicInputsSeed;
148
+ exports.isStarkAligned = isStarkAligned;
149
+ exports.packM31Digest = packM31Digest;
150
+ exports.scaleAmountForStark = scaleAmountForStark;
151
+ exports.splitSecretToM31Limbs = splitSecretToM31Limbs;
152
+ exports.truncateToM31 = truncateToM31;
153
+ //# sourceMappingURL=chunk-3YZSIYJC.cjs.map
154
+ //# sourceMappingURL=chunk-3YZSIYJC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/stark.ts"],"names":["M31_P","SECRET_LIMBS","keccak256","encodePacked","pad","numberToHex"],"mappings":"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","file":"chunk-3YZSIYJC.cjs","sourcesContent":["/**\n * STARK Utilities — Amount scaling, witness building, Fiat-Shamir\n *\n * These functions must produce identical outputs to the Rust Stwo prover\n * (stwo-prover/src/) and the Solidity verifier.\n *\n * M31 field: p = 2^31 - 1 = 2,147,483,647\n * Amount precision: 0.001 tokens (1e15 wei scale factor)\n */\n\nimport type { Address, Hex } from 'viem'\nimport { keccak256, encodePacked, pad, numberToHex } from 'viem'\nimport { M31_P, SECRET_LIMBS } from './keccak-m31.js'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Matches Solidity STARK_AMOUNT_SCALE = 1e15 */\nexport const STARK_AMOUNT_SCALE = 10n ** 15n\n\n/** State tree depth (Merkle tree for commitments) */\nexport const STARK_STATE_TREE_DEPTH = 32\n\n/** ASP tree depth */\nexport const STARK_ASP_TREE_DEPTH = 20\n\n// ============================================================================\n// Amount Scaling\n// ============================================================================\n\n/** Check if a wei amount is STARK-scale aligned and fits in M31. */\nexport function isStarkAligned(amount: bigint): boolean {\n if (amount <= 0n) return false\n const scaled = amount / STARK_AMOUNT_SCALE\n return scaled * STARK_AMOUNT_SCALE === amount && scaled < M31_P\n}\n\n/**\n * Scale a wei amount down for the STARK circuit.\n * Precision: 0.001 tokens (1e15 wei). Max: ~2.1M tokens.\n *\n * @returns The scaled amount as a number (fits in M31)\n * @throws If not aligned to STARK_AMOUNT_SCALE or exceeds M31\n */\nexport function scaleAmountForStark(weiAmount: bigint): number {\n const scaled = weiAmount / STARK_AMOUNT_SCALE\n if (scaled * STARK_AMOUNT_SCALE !== weiAmount) {\n throw new Error(`Amount ${weiAmount} not aligned to STARK scale (${STARK_AMOUNT_SCALE})`)\n }\n if (scaled >= M31_P) {\n throw new Error(`Scaled amount ${scaled} exceeds M31 max (${M31_P})`)\n }\n return Number(scaled)\n}\n\n/** Truncate a bigint to fit in M31 (modular reduction). */\nexport function truncateToM31(value: bigint): number {\n return Number(value % M31_P)\n}\n\n// ============================================================================\n// Field Conversions\n// ============================================================================\n\n/** Convert an Ethereum address to an M31 field element (truncated). */\nexport function addressToM31(addr: Address): number {\n return Number(BigInt(addr) % M31_P)\n}\n\n/**\n * Split a 254-bit spending secret into 8 M31 limbs (248 bits of entropy).\n *\n * Each limb holds 31 bits (reduced mod M31_P). The secret is split\n * little-endian: limb[0] = lowest 31 bits, limb[7] = highest bits.\n *\n * This matches the Rust prover's expectation of `[M31; 8]` for owner_secret.\n */\nexport function splitSecretToM31Limbs(secret: bigint): number[] {\n const limbs: number[] = []\n let remaining = secret\n for (let i = 0; i < SECRET_LIMBS; i++) {\n limbs.push(Number(remaining % M31_P))\n remaining = remaining / M31_P\n }\n return limbs\n}\n\n/**\n * Pack an M31 digest (4 M31 elements) into a uint128 for Solidity.\n * Each element occupies 32 bits (little-endian packing).\n */\nexport function packM31Digest(digest: [number, number, number, number]): bigint {\n return BigInt(digest[0])\n | (BigInt(digest[1]) << 32n)\n | (BigInt(digest[2]) << 64n)\n | (BigInt(digest[3]) << 96n)\n}\n\n// ============================================================================\n// Fiat-Shamir Public Input Seeds\n// ============================================================================\n\n/**\n * Compute the Fiat-Shamir public inputs seed for a STARK withdrawal.\n * Must produce the same hash as Solidity and Rust.\n */\nexport function computeWithdrawPublicInputsSeed(params: {\n nullifier: Hex\n stateRoot: bigint\n aspRoot: bigint\n aspId: bigint\n token: Address\n amount: bigint\n recipient: Address\n isRagequit: boolean\n}): Hex {\n return keccak256(\n encodePacked(\n ['bytes32', 'uint256', 'uint256', 'uint256', 'address', 'uint256', 'address', 'bool'],\n [\n params.nullifier,\n params.stateRoot,\n params.aspRoot,\n params.aspId,\n params.token,\n params.amount,\n params.recipient,\n params.isRagequit,\n ],\n ),\n )\n}\n\n/**\n * Compute the Fiat-Shamir public inputs seed for a STARK transfer.\n * Must produce the same hash as Solidity and Rust.\n */\nexport function computeTransferPublicInputsSeed(params: {\n nullifier: Hex\n stateRoot: bigint\n aspRoot: bigint\n token: Address\n outputCommitment1: Hex\n outputCommitment2: Hex\n}): Hex {\n return keccak256(\n encodePacked(\n ['bytes32', 'uint256', 'uint256', 'address', 'bytes32', 'bytes32'],\n [\n params.nullifier,\n params.stateRoot,\n params.aspRoot,\n params.token,\n params.outputCommitment1,\n params.outputCommitment2,\n ],\n ),\n )\n}\n\n// ============================================================================\n// Witness Types\n// ============================================================================\n\n/**\n * Witness inputs for the STARK withdrawal prover.\n * All numeric values are u32 (must fit in M31 field, i.e. < 2^31 - 1).\n * Hex string fields are for Fiat-Shamir seed binding.\n */\nexport interface StarkWithdrawWitness {\n owner_secret: number[]\n input_amount: number\n input_blinding: number\n input_origin: number\n token: number\n leaf_index: number\n state_path_elements: number[]\n state_path_indices: number[]\n asp_path_elements: number[]\n asp_path_indices: number[]\n withdraw_amount: number\n change_amount: number\n change_blinding: number\n recipient: number\n is_ragequit: number\n // Ethereum-native hex values for Fiat-Shamir seed binding\n nullifier_hex: string\n state_root_hex: string\n asp_root_hex: string\n asp_id_hex: string\n token_address_hex: string\n amount_hex: string\n recipient_address_hex: string\n is_ragequit_bool: boolean\n}\n\n/**\n * Witness inputs for the STARK transfer prover (1-in-2-out).\n * All numeric values are u32 (must fit in M31 field).\n */\nexport interface StarkTransferWitness {\n owner_secret: number[]\n input_amount: number\n input_blinding: number\n input_origin: number\n token: number\n leaf_index: number\n state_path_elements: number[]\n state_path_indices: number[]\n asp_path_elements: number[]\n asp_path_indices: number[]\n // Output 1\n output1_amount: number\n output1_owner_hash: [number, number, number, number]\n output1_blinding: number\n output1_origin: number\n // Output 2\n output2_amount: number\n output2_owner_hash: [number, number, number, number]\n output2_blinding: number\n output2_origin: number\n // Ragequit flag\n is_ragequit: number\n // Ethereum-native hex values for Fiat-Shamir seed binding\n nullifier_hex: string\n state_root_hex: string\n asp_root_hex: string\n token_address_hex: string\n output_commitment_1_hex: string\n output_commitment_2_hex: string\n}\n\n// ============================================================================\n// Witness Builders\n// ============================================================================\n\nfunction toBytes32Hex(value: bigint | Hex): string {\n if (typeof value === 'bigint') {\n return pad(numberToHex(value), { size: 32 })\n }\n return value as string\n}\n\nfunction toAddress20Hex(addr: Address): string {\n return addr.toLowerCase()\n}\n\n/**\n * Build a complete STARK withdrawal witness from note data.\n */\nexport function buildStarkWithdrawWitness(params: {\n ownerSecret: number[]\n inputAmount: number\n inputBlinding: number\n inputOrigin: number\n token: number\n leafIndex: number\n withdrawAmount: number\n changeAmount: number\n changeBlinding: number\n recipient: number\n isRagequit: number\n // Full Ethereum values for seed binding\n nullifierHex: Hex\n stateRootBigInt: bigint\n aspRootBigInt: bigint\n aspIdBigInt: bigint\n tokenAddress: Address\n amountWei: bigint\n recipientAddress: Address\n isRagequitBool: boolean\n}): StarkWithdrawWitness {\n return {\n owner_secret: params.ownerSecret,\n input_amount: params.inputAmount,\n input_blinding: params.inputBlinding,\n input_origin: params.inputOrigin,\n token: params.token,\n leaf_index: params.leafIndex,\n state_path_elements: new Array(STARK_STATE_TREE_DEPTH).fill(0),\n state_path_indices: new Array(STARK_STATE_TREE_DEPTH).fill(0),\n asp_path_elements: new Array(STARK_ASP_TREE_DEPTH).fill(0),\n asp_path_indices: new Array(STARK_ASP_TREE_DEPTH).fill(0),\n withdraw_amount: params.withdrawAmount,\n change_amount: params.changeAmount,\n change_blinding: params.changeBlinding,\n recipient: params.recipient,\n is_ragequit: params.isRagequit,\n nullifier_hex: params.nullifierHex,\n state_root_hex: toBytes32Hex(params.stateRootBigInt),\n asp_root_hex: toBytes32Hex(params.aspRootBigInt),\n asp_id_hex: toBytes32Hex(params.aspIdBigInt),\n token_address_hex: toAddress20Hex(params.tokenAddress),\n amount_hex: toBytes32Hex(params.amountWei),\n recipient_address_hex: toAddress20Hex(params.recipientAddress),\n is_ragequit_bool: params.isRagequitBool,\n }\n}\n\n/**\n * Build a complete STARK transfer witness (1-in-2-out).\n */\nexport function buildStarkTransferWitness(params: {\n ownerSecret: number[]\n inputAmount: number\n inputBlinding: number\n inputOrigin: number\n token: number\n leafIndex: number\n output1Amount: number\n output1OwnerHash: [number, number, number, number]\n output1Blinding: number\n output1Origin: number\n output2Amount: number\n output2OwnerHash: [number, number, number, number]\n output2Blinding: number\n output2Origin: number\n isRagequit: number\n // Full Ethereum values for seed binding\n nullifierHex: Hex\n stateRootBigInt: bigint\n aspRootBigInt: bigint\n tokenAddress: Address\n outputCommitment1Hex: Hex\n outputCommitment2Hex: Hex\n}): StarkTransferWitness {\n return {\n owner_secret: params.ownerSecret,\n input_amount: params.inputAmount,\n input_blinding: params.inputBlinding,\n input_origin: params.inputOrigin,\n token: params.token,\n leaf_index: params.leafIndex,\n state_path_elements: new Array(STARK_STATE_TREE_DEPTH).fill(0),\n state_path_indices: new Array(STARK_STATE_TREE_DEPTH).fill(0),\n asp_path_elements: new Array(STARK_ASP_TREE_DEPTH).fill(0),\n asp_path_indices: new Array(STARK_ASP_TREE_DEPTH).fill(0),\n output1_amount: params.output1Amount,\n output1_owner_hash: params.output1OwnerHash,\n output1_blinding: params.output1Blinding,\n output1_origin: params.output1Origin,\n output2_amount: params.output2Amount,\n output2_owner_hash: params.output2OwnerHash,\n output2_blinding: params.output2Blinding,\n output2_origin: params.output2Origin,\n is_ragequit: params.isRagequit,\n nullifier_hex: params.nullifierHex,\n state_root_hex: toBytes32Hex(params.stateRootBigInt),\n asp_root_hex: toBytes32Hex(params.aspRootBigInt),\n token_address_hex: toAddress20Hex(params.tokenAddress),\n output_commitment_1_hex: params.outputCommitment1Hex,\n output_commitment_2_hex: params.outputCommitment2Hex,\n }\n}\n"]}
@@ -1004,5 +1004,5 @@ exports.makeRpcIndexer = makeRpcIndexer;
1004
1004
  exports.matchesSearchTag = matchesSearchTag;
1005
1005
  exports.tryDecryptNote = tryDecryptNote;
1006
1006
  exports.unpackNoteData = unpackNoteData;
1007
- //# sourceMappingURL=chunk-43U5RGYE.cjs.map
1008
- //# sourceMappingURL=chunk-43U5RGYE.cjs.map
1007
+ //# sourceMappingURL=chunk-4N5BH43P.cjs.map
1008
+ //# sourceMappingURL=chunk-4N5BH43P.cjs.map