@permissionless-technologies/upp-sdk 0.1.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.
- package/LICENSE +661 -0
- package/README.md +194 -0
- package/dist/asp-TXSAFFD3.cjs +53 -0
- package/dist/asp-TXSAFFD3.cjs.map +1 -0
- package/dist/asp-ZA3RGN7G.js +4 -0
- package/dist/asp-ZA3RGN7G.js.map +1 -0
- package/dist/babyjubjub-2MGQVCKB.js +5 -0
- package/dist/babyjubjub-2MGQVCKB.js.map +1 -0
- package/dist/babyjubjub-MWZLJOVZ.cjs +66 -0
- package/dist/babyjubjub-MWZLJOVZ.cjs.map +1 -0
- package/dist/chunk-2JQISXBD.js +150 -0
- package/dist/chunk-2JQISXBD.js.map +1 -0
- package/dist/chunk-3HQ7A6ZM.cjs +61 -0
- package/dist/chunk-3HQ7A6ZM.cjs.map +1 -0
- package/dist/chunk-5AKBSMEQ.cjs +1008 -0
- package/dist/chunk-5AKBSMEQ.cjs.map +1 -0
- package/dist/chunk-5V5HSN6Y.js +81 -0
- package/dist/chunk-5V5HSN6Y.js.map +1 -0
- package/dist/chunk-BH24DZ5S.cjs +91 -0
- package/dist/chunk-BH24DZ5S.cjs.map +1 -0
- package/dist/chunk-C7QQOJ7T.cjs +67 -0
- package/dist/chunk-C7QQOJ7T.cjs.map +1 -0
- package/dist/chunk-ERQE57IA.cjs +404 -0
- package/dist/chunk-ERQE57IA.cjs.map +1 -0
- package/dist/chunk-EUP7MBAH.cjs +165 -0
- package/dist/chunk-EUP7MBAH.cjs.map +1 -0
- package/dist/chunk-G7VZBCD6.cjs +35 -0
- package/dist/chunk-G7VZBCD6.cjs.map +1 -0
- package/dist/chunk-GQV47S3N.cjs +10 -0
- package/dist/chunk-GQV47S3N.cjs.map +1 -0
- package/dist/chunk-GXZ3MTCQ.cjs +527 -0
- package/dist/chunk-GXZ3MTCQ.cjs.map +1 -0
- package/dist/chunk-JWNXBALH.cjs +57 -0
- package/dist/chunk-JWNXBALH.cjs.map +1 -0
- package/dist/chunk-KIKBPJXJ.cjs +348 -0
- package/dist/chunk-KIKBPJXJ.cjs.map +1 -0
- package/dist/chunk-NCW4AE7L.js +8 -0
- package/dist/chunk-NCW4AE7L.js.map +1 -0
- package/dist/chunk-NDM5EJEV.cjs +70 -0
- package/dist/chunk-NDM5EJEV.cjs.map +1 -0
- package/dist/chunk-NUIQHTSA.js +489 -0
- package/dist/chunk-NUIQHTSA.js.map +1 -0
- package/dist/chunk-OQDSHMXU.js +1002 -0
- package/dist/chunk-OQDSHMXU.js.map +1 -0
- package/dist/chunk-P37MRZ73.js +58 -0
- package/dist/chunk-P37MRZ73.js.map +1 -0
- package/dist/chunk-PWHOUQOZ.js +335 -0
- package/dist/chunk-PWHOUQOZ.js.map +1 -0
- package/dist/chunk-S4B7GYLN.js +112 -0
- package/dist/chunk-S4B7GYLN.js.map +1 -0
- package/dist/chunk-SGZZL5AC.js +59 -0
- package/dist/chunk-SGZZL5AC.js.map +1 -0
- package/dist/chunk-SQKBT2SH.cjs +122 -0
- package/dist/chunk-SQKBT2SH.cjs.map +1 -0
- package/dist/chunk-TSF6HEVS.cjs +201 -0
- package/dist/chunk-TSF6HEVS.cjs.map +1 -0
- package/dist/chunk-V23OSL25.js +48 -0
- package/dist/chunk-V23OSL25.js.map +1 -0
- package/dist/chunk-W77GRBO4.js +53 -0
- package/dist/chunk-W77GRBO4.js.map +1 -0
- package/dist/chunk-XV72HNHN.js +399 -0
- package/dist/chunk-XV72HNHN.js.map +1 -0
- package/dist/chunk-YOWDERVC.js +186 -0
- package/dist/chunk-YOWDERVC.js.map +1 -0
- package/dist/chunk-Z6ZWNWWR.js +30 -0
- package/dist/chunk-Z6ZWNWWR.js.map +1 -0
- package/dist/chunk-ZKZV6OI3.cjs +165 -0
- package/dist/chunk-ZKZV6OI3.cjs.map +1 -0
- package/dist/chunk-ZU6J7KMY.js +159 -0
- package/dist/chunk-ZU6J7KMY.js.map +1 -0
- package/dist/core/index.cjs +300 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +9 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index-BBzvvrhG.d.ts +757 -0
- package/dist/index-BGvapsJy.d.cts +2811 -0
- package/dist/index-C-jSNw6j.d.cts +757 -0
- package/dist/index-ChGaGPzP.d.ts +2811 -0
- package/dist/index.cjs +3652 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +3112 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/index.cjs +58 -0
- package/dist/indexer/index.cjs.map +1 -0
- package/dist/indexer/index.d.cts +206 -0
- package/dist/indexer/index.d.ts +206 -0
- package/dist/indexer/index.js +5 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/keccak-m31-B_AqBbRF.d.cts +70 -0
- package/dist/keccak-m31-B_AqBbRF.d.ts +70 -0
- package/dist/keys/index.cjs +68 -0
- package/dist/keys/index.cjs.map +1 -0
- package/dist/keys/index.d.cts +158 -0
- package/dist/keys/index.d.ts +158 -0
- package/dist/keys/index.js +7 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/merkle-7KS2EHRF.js +5 -0
- package/dist/merkle-7KS2EHRF.js.map +1 -0
- package/dist/merkle-HGDC6OB4.cjs +30 -0
- package/dist/merkle-HGDC6OB4.cjs.map +1 -0
- package/dist/merkle-mteVOlDf.d.cts +188 -0
- package/dist/merkle-mteVOlDf.d.ts +188 -0
- package/dist/poseidon-UHTJLWQM.js +7 -0
- package/dist/poseidon-UHTJLWQM.js.map +1 -0
- package/dist/poseidon-WHJSZSNP.cjs +45 -0
- package/dist/poseidon-WHJSZSNP.cjs.map +1 -0
- package/dist/proof-5OECB3RQ.cjs +45 -0
- package/dist/proof-5OECB3RQ.cjs.map +1 -0
- package/dist/proof-C4YBP6RY.js +4 -0
- package/dist/proof-C4YBP6RY.js.map +1 -0
- package/dist/react/index.cjs +2641 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +757 -0
- package/dist/react/index.d.ts +757 -0
- package/dist/react/index.js +2598 -0
- package/dist/react/index.js.map +1 -0
- package/dist/transfer-2UDHDS7Q.cjs +37 -0
- package/dist/transfer-2UDHDS7Q.cjs.map +1 -0
- package/dist/transfer-BlmbO-Rd.d.ts +1270 -0
- package/dist/transfer-DKZuJnRM.d.cts +1270 -0
- package/dist/transfer-KTCXKHS4.js +8 -0
- package/dist/transfer-KTCXKHS4.js.map +1 -0
- package/dist/types-CJSbxv4q.d.cts +143 -0
- package/dist/types-mLybMxNR.d.ts +143 -0
- package/dist/utils/index.cjs +178 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +88 -0
- package/dist/utils/index.d.ts +88 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +119 -0
- package/src/contracts/interfaces/IASPRegistry.sol +36 -0
- package/src/contracts/interfaces/IUniversalPrivatePool.sol +260 -0
- package/src/contracts/interfaces/IVerifiers.sol +68 -0
- package/src/deployments/11155111.json +19 -0
- package/src/deployments/31337.json +19 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkG7VZBCD6_cjs = require('./chunk-G7VZBCD6.cjs');
|
|
4
|
+
var upcSdk = require('@permissionless-technologies/upc-sdk');
|
|
5
|
+
|
|
6
|
+
var ASP_TREE_DEPTH = upcSdk.DEFAULT_TREE_DEPTH;
|
|
7
|
+
var bn254 = new upcSdk.PoseidonBN254();
|
|
8
|
+
async function computeSingleOriginASPRoot(origin) {
|
|
9
|
+
return origin;
|
|
10
|
+
}
|
|
11
|
+
async function generateSingleOriginASPProof(aspId, origin) {
|
|
12
|
+
const proof = upcSdk.generateSingleMemberProof(origin, ASP_TREE_DEPTH);
|
|
13
|
+
return {
|
|
14
|
+
aspId,
|
|
15
|
+
aspRoot: proof.root,
|
|
16
|
+
aspPathElements: proof.pathElements,
|
|
17
|
+
aspPathIndices: proof.pathIndices
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
async function verifyASPProof(origin, proof) {
|
|
21
|
+
return upcSdk.verifyMembershipProof(
|
|
22
|
+
origin,
|
|
23
|
+
{ root: proof.aspRoot, pathElements: proof.aspPathElements, pathIndices: proof.aspPathIndices },
|
|
24
|
+
bn254
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
var DEMO_ASP_ID = 1n;
|
|
28
|
+
var DEMO_ASP_NAME = "Demo ASP (Single-Origin)";
|
|
29
|
+
async function createDemoASPRoot(origin) {
|
|
30
|
+
return computeSingleOriginASPRoot(origin);
|
|
31
|
+
}
|
|
32
|
+
function buildASPTree(origins) {
|
|
33
|
+
const { buildMerkleTree } = chunkG7VZBCD6_cjs.__require("@permissionless-technologies/upc-sdk");
|
|
34
|
+
return buildMerkleTree(origins, ASP_TREE_DEPTH, bn254);
|
|
35
|
+
}
|
|
36
|
+
async function computeMultiOriginASPRoot(origins) {
|
|
37
|
+
return upcSdk.computeMerkleRoot(origins, ASP_TREE_DEPTH, bn254);
|
|
38
|
+
}
|
|
39
|
+
async function generateMultiOriginASPProof(aspId, origin, allOrigins) {
|
|
40
|
+
if (allOrigins.length <= 1) {
|
|
41
|
+
return generateSingleOriginASPProof(aspId, origin);
|
|
42
|
+
}
|
|
43
|
+
const proof = await upcSdk.generateMembershipProof(origin, allOrigins, ASP_TREE_DEPTH, bn254);
|
|
44
|
+
return {
|
|
45
|
+
aspId,
|
|
46
|
+
aspRoot: proof.root,
|
|
47
|
+
aspPathElements: proof.pathElements,
|
|
48
|
+
aspPathIndices: proof.pathIndices
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async function generateASPProof(aspId, origin, approvedOrigins) {
|
|
52
|
+
if (approvedOrigins && approvedOrigins.length > 0) {
|
|
53
|
+
return generateMultiOriginASPProof(aspId, origin, approvedOrigins);
|
|
54
|
+
}
|
|
55
|
+
return generateSingleOriginASPProof(aspId, origin);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.ASP_TREE_DEPTH = ASP_TREE_DEPTH;
|
|
59
|
+
exports.DEMO_ASP_ID = DEMO_ASP_ID;
|
|
60
|
+
exports.DEMO_ASP_NAME = DEMO_ASP_NAME;
|
|
61
|
+
exports.buildASPTree = buildASPTree;
|
|
62
|
+
exports.computeMultiOriginASPRoot = computeMultiOriginASPRoot;
|
|
63
|
+
exports.computeSingleOriginASPRoot = computeSingleOriginASPRoot;
|
|
64
|
+
exports.createDemoASPRoot = createDemoASPRoot;
|
|
65
|
+
exports.generateASPProof = generateASPProof;
|
|
66
|
+
exports.generateMultiOriginASPProof = generateMultiOriginASPProof;
|
|
67
|
+
exports.generateSingleOriginASPProof = generateSingleOriginASPProof;
|
|
68
|
+
exports.verifyASPProof = verifyASPProof;
|
|
69
|
+
//# sourceMappingURL=chunk-NDM5EJEV.cjs.map
|
|
70
|
+
//# sourceMappingURL=chunk-NDM5EJEV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/asp.ts"],"names":["DEFAULT_TREE_DEPTH","PoseidonBN254","generateSingleMemberProof","verifyMembershipProof","__require","computeMerkleRoot","generateMembershipProof"],"mappings":";;;;;AAoBO,IAAM,cAAA,GAAiBA;AAI9B,IAAM,KAAA,GAAQ,IAAIC,oBAAA,EAAc;AAmBhC,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,KAAK,CAAA;AACvD;AAKA,eAAsB,0BAA0B,OAAA,EAAoC;AAClF,EAAA,OAAOC,wBAAA,CAAkB,OAAA,EAAS,cAAA,EAAgB,KAAK,CAAA;AACzD;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,KAAK,CAAA;AAErF,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-NDM5EJEV.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\nimport {\n generateMembershipProof,\n generateSingleMemberProof,\n computeMerkleRoot,\n verifyMembershipProof,\n DEFAULT_TREE_DEPTH,\n PoseidonBN254,\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 BN254 for backward compat with existing deployed circuits\n// (circuits were compiled for BN254; new deployments should use BLS12-381)\nconst bn254 = new PoseidonBN254()\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 bn254\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, bn254)\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, bn254)\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, bn254)\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"]}
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import { bigintToBytes, bytesToBigint, randomFieldElement, init_crypto } from './chunk-W77GRBO4.js';
|
|
2
|
+
import { __export, __esm } from './chunk-Z6ZWNWWR.js';
|
|
3
|
+
import { bech32m } from 'bech32';
|
|
4
|
+
import { keccak256, encodeAbiParameters, parseAbiParameters, toHex, getAddress } from 'viem';
|
|
5
|
+
|
|
6
|
+
// src/core/stealth.ts
|
|
7
|
+
var stealth_exports = {};
|
|
8
|
+
__export(stealth_exports, {
|
|
9
|
+
ADDRESS_VERSION: () => ADDRESS_VERSION,
|
|
10
|
+
STARK_ADDRESS_VERSION: () => STARK_ADDRESS_VERSION,
|
|
11
|
+
STARK_STEALTH_ADDRESS_PREFIX: () => STARK_STEALTH_ADDRESS_PREFIX,
|
|
12
|
+
STEALTH_ADDRESS_PREFIX: () => STEALTH_ADDRESS_PREFIX,
|
|
13
|
+
computeNoteEncryptionKey: () => computeNoteEncryptionKey,
|
|
14
|
+
createOneTimeKeys: () => createOneTimeKeys,
|
|
15
|
+
decodeStarkStealthAddress: () => decodeStarkStealthAddress,
|
|
16
|
+
decodeStealthAddress: () => decodeStealthAddress,
|
|
17
|
+
detectAddressType: () => detectAddressType,
|
|
18
|
+
encodeStarkStealthAddress: () => encodeStarkStealthAddress,
|
|
19
|
+
encodeStealthAddress: () => encodeStealthAddress,
|
|
20
|
+
generateStarkStealthAddress: () => generateStarkStealthAddress,
|
|
21
|
+
generateStealthAddress: () => generateStealthAddress,
|
|
22
|
+
isValidStarkStealthAddress: () => isValidStarkStealthAddress,
|
|
23
|
+
isValidStealthAddress: () => isValidStealthAddress,
|
|
24
|
+
verifyOwnership: () => verifyOwnership
|
|
25
|
+
});
|
|
26
|
+
function encodeStealthAddress(ownerHash, viewingHash, chainId = 0) {
|
|
27
|
+
const data = new Uint8Array(1 + 4 + 32 * 2);
|
|
28
|
+
let offset = 0;
|
|
29
|
+
data[offset++] = ADDRESS_VERSION;
|
|
30
|
+
data[offset++] = chainId >> 24 & 255;
|
|
31
|
+
data[offset++] = chainId >> 16 & 255;
|
|
32
|
+
data[offset++] = chainId >> 8 & 255;
|
|
33
|
+
data[offset++] = chainId & 255;
|
|
34
|
+
const ownerBytes = bigintToBytes(ownerHash, 32);
|
|
35
|
+
data.set(ownerBytes, offset);
|
|
36
|
+
offset += 32;
|
|
37
|
+
const viewingBytes = bigintToBytes(viewingHash, 32);
|
|
38
|
+
data.set(viewingBytes, offset);
|
|
39
|
+
const words = bech32m.toWords(data);
|
|
40
|
+
return bech32m.encode(STEALTH_ADDRESS_PREFIX, words, BECH32M_LIMIT);
|
|
41
|
+
}
|
|
42
|
+
function decodeStealthAddress(address) {
|
|
43
|
+
const decoded = bech32m.decode(address, BECH32M_LIMIT);
|
|
44
|
+
if (decoded.prefix !== STEALTH_ADDRESS_PREFIX) {
|
|
45
|
+
throw new Error(`Invalid stealth address prefix: expected '${STEALTH_ADDRESS_PREFIX}', got '${decoded.prefix}'`);
|
|
46
|
+
}
|
|
47
|
+
const data = new Uint8Array(bech32m.fromWords(decoded.words));
|
|
48
|
+
let offset = 0;
|
|
49
|
+
const version = data[offset++];
|
|
50
|
+
if (version !== ADDRESS_VERSION) {
|
|
51
|
+
throw new Error(`Unsupported address version: ${version}. Expected v${ADDRESS_VERSION} (hash-based).`);
|
|
52
|
+
}
|
|
53
|
+
const chainId = data[offset++] << 24 | data[offset++] << 16 | data[offset++] << 8 | data[offset++];
|
|
54
|
+
const ownerHash = bytesToBigint(data.slice(offset, offset + 32));
|
|
55
|
+
offset += 32;
|
|
56
|
+
const viewingHash = bytesToBigint(data.slice(offset, offset + 32));
|
|
57
|
+
return {
|
|
58
|
+
version,
|
|
59
|
+
chainId,
|
|
60
|
+
ownerHash,
|
|
61
|
+
viewingHash
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function isValidStealthAddress(address) {
|
|
65
|
+
try {
|
|
66
|
+
decodeStealthAddress(address);
|
|
67
|
+
return true;
|
|
68
|
+
} catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function generateStealthAddress(keys, chainId = 0) {
|
|
73
|
+
return encodeStealthAddress(keys.ownerHash, keys.viewingHash, chainId);
|
|
74
|
+
}
|
|
75
|
+
async function createOneTimeKeys(_recipientOwnerHash, selfSecret) {
|
|
76
|
+
const { poseidon } = await import('./poseidon-UHTJLWQM.js');
|
|
77
|
+
if (selfSecret !== void 0) {
|
|
78
|
+
const ownerHash2 = await poseidon([selfSecret]);
|
|
79
|
+
return {
|
|
80
|
+
oneTimeSecret: selfSecret,
|
|
81
|
+
ownerHash: ownerHash2
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const oneTimeSecret = randomFieldElement();
|
|
85
|
+
const ownerHash = await poseidon([oneTimeSecret]);
|
|
86
|
+
return {
|
|
87
|
+
oneTimeSecret,
|
|
88
|
+
ownerHash
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async function verifyOwnership(secret, expectedOwnerHash) {
|
|
92
|
+
const { poseidon } = await import('./poseidon-UHTJLWQM.js');
|
|
93
|
+
const computedHash = await poseidon([secret]);
|
|
94
|
+
return computedHash === expectedOwnerHash;
|
|
95
|
+
}
|
|
96
|
+
async function computeNoteEncryptionKey(viewingSecret, nonce) {
|
|
97
|
+
const { poseidon } = await import('./poseidon-UHTJLWQM.js');
|
|
98
|
+
if (nonce !== void 0) {
|
|
99
|
+
return poseidon([viewingSecret, nonce]);
|
|
100
|
+
}
|
|
101
|
+
return poseidon([viewingSecret]);
|
|
102
|
+
}
|
|
103
|
+
function encodeStarkStealthAddress(ownerHash, viewingHash, chainId = 0) {
|
|
104
|
+
const data = new Uint8Array(1 + 4 + 16 + 16);
|
|
105
|
+
let offset = 0;
|
|
106
|
+
data[offset++] = STARK_ADDRESS_VERSION;
|
|
107
|
+
data[offset++] = chainId >> 24 & 255;
|
|
108
|
+
data[offset++] = chainId >> 16 & 255;
|
|
109
|
+
data[offset++] = chainId >> 8 & 255;
|
|
110
|
+
data[offset++] = chainId & 255;
|
|
111
|
+
for (let i = 0; i < 4; i++) {
|
|
112
|
+
const val = Number(ownerHash[i]);
|
|
113
|
+
data[offset++] = val & 255;
|
|
114
|
+
data[offset++] = val >> 8 & 255;
|
|
115
|
+
data[offset++] = val >> 16 & 255;
|
|
116
|
+
data[offset++] = val >> 24 & 255;
|
|
117
|
+
}
|
|
118
|
+
for (let i = 0; i < 4; i++) {
|
|
119
|
+
const val = Number(viewingHash[i]);
|
|
120
|
+
data[offset++] = val & 255;
|
|
121
|
+
data[offset++] = val >> 8 & 255;
|
|
122
|
+
data[offset++] = val >> 16 & 255;
|
|
123
|
+
data[offset++] = val >> 24 & 255;
|
|
124
|
+
}
|
|
125
|
+
const words = bech32m.toWords(data);
|
|
126
|
+
return bech32m.encode(STARK_STEALTH_ADDRESS_PREFIX, words, BECH32M_LIMIT);
|
|
127
|
+
}
|
|
128
|
+
function decodeStarkStealthAddress(address) {
|
|
129
|
+
const decoded = bech32m.decode(address, BECH32M_LIMIT);
|
|
130
|
+
if (decoded.prefix !== STARK_STEALTH_ADDRESS_PREFIX) {
|
|
131
|
+
throw new Error(
|
|
132
|
+
`Invalid STARK stealth address prefix: expected '${STARK_STEALTH_ADDRESS_PREFIX}', got '${decoded.prefix}'`
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
const data = new Uint8Array(bech32m.fromWords(decoded.words));
|
|
136
|
+
let offset = 0;
|
|
137
|
+
const version = data[offset++];
|
|
138
|
+
if (version !== STARK_ADDRESS_VERSION) {
|
|
139
|
+
throw new Error(
|
|
140
|
+
`Unsupported STARK address version: ${version}. Expected v${STARK_ADDRESS_VERSION}.`
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
const chainId = data[offset++] << 24 | data[offset++] << 16 | data[offset++] << 8 | data[offset++];
|
|
144
|
+
const ownerHash = [];
|
|
145
|
+
for (let i = 0; i < 4; i++) {
|
|
146
|
+
const val = data[offset] | data[offset + 1] << 8 | data[offset + 2] << 16 | data[offset + 3] << 24;
|
|
147
|
+
ownerHash.push(BigInt(val >>> 0));
|
|
148
|
+
offset += 4;
|
|
149
|
+
}
|
|
150
|
+
const viewingHash = [];
|
|
151
|
+
for (let i = 0; i < 4; i++) {
|
|
152
|
+
const val = data[offset] | data[offset + 1] << 8 | data[offset + 2] << 16 | data[offset + 3] << 24;
|
|
153
|
+
viewingHash.push(BigInt(val >>> 0));
|
|
154
|
+
offset += 4;
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
version,
|
|
158
|
+
chainId,
|
|
159
|
+
ownerHash,
|
|
160
|
+
viewingHash
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function isValidStarkStealthAddress(address) {
|
|
164
|
+
try {
|
|
165
|
+
decodeStarkStealthAddress(address);
|
|
166
|
+
return true;
|
|
167
|
+
} catch {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function generateStarkStealthAddress(keys, chainId = 0) {
|
|
172
|
+
return encodeStarkStealthAddress(keys.starkOwnerHash, keys.starkViewingHash, chainId);
|
|
173
|
+
}
|
|
174
|
+
function detectAddressType(address) {
|
|
175
|
+
if (address.startsWith(STEALTH_ADDRESS_PREFIX + "1")) return "snark";
|
|
176
|
+
if (address.startsWith(STARK_STEALTH_ADDRESS_PREFIX + "1")) return "stark";
|
|
177
|
+
return "unknown";
|
|
178
|
+
}
|
|
179
|
+
var STEALTH_ADDRESS_PREFIX, ADDRESS_VERSION, BECH32M_LIMIT, STARK_STEALTH_ADDRESS_PREFIX, STARK_ADDRESS_VERSION;
|
|
180
|
+
var init_stealth = __esm({
|
|
181
|
+
"src/core/stealth.ts"() {
|
|
182
|
+
init_crypto();
|
|
183
|
+
STEALTH_ADDRESS_PREFIX = "0zk";
|
|
184
|
+
ADDRESS_VERSION = 2;
|
|
185
|
+
BECH32M_LIMIT = 1023;
|
|
186
|
+
STARK_STEALTH_ADDRESS_PREFIX = "0zs";
|
|
187
|
+
STARK_ADDRESS_VERSION = 1;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
var RATE_PRECISION = 10n ** 18n;
|
|
191
|
+
var SWAP_ORDER_PLACED_EVENT = {
|
|
192
|
+
type: "event",
|
|
193
|
+
name: "SwapOrderPlaced",
|
|
194
|
+
inputs: [
|
|
195
|
+
{ name: "orderId", type: "bytes32", indexed: true },
|
|
196
|
+
{ name: "sellToken", type: "address", indexed: true },
|
|
197
|
+
{ name: "buyToken", type: "address", indexed: true },
|
|
198
|
+
{ name: "sellAmount", type: "uint256", indexed: false },
|
|
199
|
+
{ name: "rate", type: "uint256", indexed: false },
|
|
200
|
+
{ name: "makerAspId", type: "uint256", indexed: false },
|
|
201
|
+
{ name: "requiredFillerAspId", type: "uint256", indexed: false },
|
|
202
|
+
{ name: "expiry", type: "uint256", indexed: false }
|
|
203
|
+
]
|
|
204
|
+
};
|
|
205
|
+
var SWAP_ORDER_FILLED_EVENT = {
|
|
206
|
+
type: "event",
|
|
207
|
+
name: "SwapOrderFilled",
|
|
208
|
+
inputs: [
|
|
209
|
+
{ name: "orderId", type: "bytes32", indexed: true },
|
|
210
|
+
{ name: "fillerNullifier", type: "bytes32", indexed: true },
|
|
211
|
+
{ name: "takeAmount", type: "uint256", indexed: false },
|
|
212
|
+
{ name: "giveAmount", type: "uint256", indexed: false },
|
|
213
|
+
{ name: "fillerAspId", type: "uint256", indexed: false }
|
|
214
|
+
]
|
|
215
|
+
};
|
|
216
|
+
var SWAP_ORDER_CLAIMED_EVENT = {
|
|
217
|
+
type: "event",
|
|
218
|
+
name: "SwapOrderClaimed",
|
|
219
|
+
inputs: [
|
|
220
|
+
{ name: "orderId", type: "bytes32", indexed: true },
|
|
221
|
+
{ name: "accumulatedBuyAmount", type: "uint256", indexed: false },
|
|
222
|
+
{ name: "refundedSellAmount", type: "uint256", indexed: false }
|
|
223
|
+
]
|
|
224
|
+
};
|
|
225
|
+
var SWAP_ORDER_CANCELLED_EVENT = {
|
|
226
|
+
type: "event",
|
|
227
|
+
name: "SwapOrderCancelled",
|
|
228
|
+
inputs: [
|
|
229
|
+
{ name: "orderId", type: "bytes32", indexed: true },
|
|
230
|
+
{ name: "refundedSellAmount", type: "uint256", indexed: false }
|
|
231
|
+
]
|
|
232
|
+
};
|
|
233
|
+
var SWAP_EVENTS_ABI = [
|
|
234
|
+
SWAP_ORDER_PLACED_EVENT,
|
|
235
|
+
SWAP_ORDER_FILLED_EVENT,
|
|
236
|
+
SWAP_ORDER_CLAIMED_EVENT,
|
|
237
|
+
SWAP_ORDER_CANCELLED_EVENT
|
|
238
|
+
];
|
|
239
|
+
function computeGiveAmount(takeAmount, rate) {
|
|
240
|
+
return takeAmount * rate / RATE_PRECISION;
|
|
241
|
+
}
|
|
242
|
+
function computeTakeAmount(giveAmount, rate) {
|
|
243
|
+
if (rate === 0n) throw new Error("Rate cannot be zero");
|
|
244
|
+
return giveAmount * RATE_PRECISION / rate;
|
|
245
|
+
}
|
|
246
|
+
function computeRate(sellAmount, buyAmount) {
|
|
247
|
+
if (sellAmount === 0n) throw new Error("Sell amount cannot be zero");
|
|
248
|
+
return buyAmount * RATE_PRECISION / sellAmount;
|
|
249
|
+
}
|
|
250
|
+
function formatRate(rate, decimals = 6) {
|
|
251
|
+
const whole = rate / RATE_PRECISION;
|
|
252
|
+
const frac = rate % RATE_PRECISION;
|
|
253
|
+
const fracStr = frac.toString().padStart(18, "0").slice(0, decimals);
|
|
254
|
+
return `${whole}.${fracStr}`;
|
|
255
|
+
}
|
|
256
|
+
function computeCancelKeyHash(cancelSecret) {
|
|
257
|
+
return keccak256(encodeAbiParameters(
|
|
258
|
+
parseAbiParameters("bytes32"),
|
|
259
|
+
[cancelSecret]
|
|
260
|
+
));
|
|
261
|
+
}
|
|
262
|
+
function generateCancelSecret() {
|
|
263
|
+
const bytes = new Uint8Array(32);
|
|
264
|
+
crypto.getRandomValues(bytes);
|
|
265
|
+
return toHex(bytes);
|
|
266
|
+
}
|
|
267
|
+
function filterOrdersByASP(orders, acceptableAspIds) {
|
|
268
|
+
const aspSet = new Set(acceptableAspIds.map((id) => id.toString()));
|
|
269
|
+
return orders.filter((o) => aspSet.has(o.makerAspId.toString()));
|
|
270
|
+
}
|
|
271
|
+
function filterOrdersByTokenPair(orders, sellToken, buyToken) {
|
|
272
|
+
const sell = sellToken.toLowerCase();
|
|
273
|
+
const buy = buyToken.toLowerCase();
|
|
274
|
+
return orders.filter(
|
|
275
|
+
(o) => o.sellToken.toLowerCase() === sell && o.buyToken.toLowerCase() === buy
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
function isFillerASPAccepted(order, fillerAspId) {
|
|
279
|
+
const required = "requiredFillerAspId" in order ? order.requiredFillerAspId : 0n;
|
|
280
|
+
return required === 0n || required === fillerAspId;
|
|
281
|
+
}
|
|
282
|
+
var CANCEL_SECRET_PREFIX = "upp_swap_cancel_";
|
|
283
|
+
function cancelKey(account, orderId) {
|
|
284
|
+
return `${CANCEL_SECRET_PREFIX}${account.toLowerCase()}_${orderId}`;
|
|
285
|
+
}
|
|
286
|
+
function storeCancelSecret(orderId, cancelSecret, account) {
|
|
287
|
+
if (typeof localStorage === "undefined") return;
|
|
288
|
+
if (account) {
|
|
289
|
+
localStorage.setItem(cancelKey(account, orderId), cancelSecret);
|
|
290
|
+
}
|
|
291
|
+
localStorage.setItem(`${CANCEL_SECRET_PREFIX}${orderId}`, cancelSecret);
|
|
292
|
+
}
|
|
293
|
+
function getCancelSecret(orderId, account) {
|
|
294
|
+
if (typeof localStorage === "undefined") return null;
|
|
295
|
+
if (account) {
|
|
296
|
+
const scoped = localStorage.getItem(cancelKey(account, orderId));
|
|
297
|
+
if (scoped) return scoped;
|
|
298
|
+
}
|
|
299
|
+
return localStorage.getItem(`${CANCEL_SECRET_PREFIX}${orderId}`);
|
|
300
|
+
}
|
|
301
|
+
function removeCancelSecret(orderId, account) {
|
|
302
|
+
if (typeof localStorage === "undefined") return;
|
|
303
|
+
if (account) {
|
|
304
|
+
localStorage.removeItem(cancelKey(account, orderId));
|
|
305
|
+
}
|
|
306
|
+
localStorage.removeItem(`${CANCEL_SECRET_PREFIX}${orderId}`);
|
|
307
|
+
}
|
|
308
|
+
function getOwnOrderIds(account) {
|
|
309
|
+
if (typeof localStorage === "undefined") return [];
|
|
310
|
+
const prefix = account ? `${CANCEL_SECRET_PREFIX}${account.toLowerCase()}_` : CANCEL_SECRET_PREFIX;
|
|
311
|
+
const ids = [];
|
|
312
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
313
|
+
const key = localStorage.key(i);
|
|
314
|
+
if (key?.startsWith(prefix)) {
|
|
315
|
+
ids.push(key.slice(prefix.length));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return ids;
|
|
319
|
+
}
|
|
320
|
+
function isOrderActive(order, currentBlock) {
|
|
321
|
+
return !order.claimed && !order.cancelled && currentBlock <= order.expiry && order.remainingSellAmount > 0n;
|
|
322
|
+
}
|
|
323
|
+
function computeTotalBuyAmount(sellAmount, rate) {
|
|
324
|
+
return computeGiveAmount(sellAmount, rate);
|
|
325
|
+
}
|
|
326
|
+
function computeFillPercentage(order) {
|
|
327
|
+
if (order.sellAmount === 0n) return 0;
|
|
328
|
+
const filled = order.sellAmount - order.remainingSellAmount;
|
|
329
|
+
return Number(filled * 10000n / order.sellAmount) / 100;
|
|
330
|
+
}
|
|
331
|
+
var NoteStore = class {
|
|
332
|
+
constructor(storage, storageKey = "notes") {
|
|
333
|
+
this.storage = storage;
|
|
334
|
+
this.storageKey = storageKey;
|
|
335
|
+
}
|
|
336
|
+
notes = [];
|
|
337
|
+
commitmentSet = /* @__PURE__ */ new Set();
|
|
338
|
+
listeners = /* @__PURE__ */ new Set();
|
|
339
|
+
dirty = false;
|
|
340
|
+
// ---------- Queries ----------
|
|
341
|
+
getNotes() {
|
|
342
|
+
return [...this.notes];
|
|
343
|
+
}
|
|
344
|
+
getUnspentNotes(proofSystem) {
|
|
345
|
+
let result = this.notes.filter((n) => n.status !== "spent");
|
|
346
|
+
if (proofSystem) {
|
|
347
|
+
result = result.filter((n) => (n.proofSystem ?? "snark") === proofSystem);
|
|
348
|
+
}
|
|
349
|
+
return result;
|
|
350
|
+
}
|
|
351
|
+
getBalance(token, proofSystem) {
|
|
352
|
+
let notes = this.getUnspentNotes(proofSystem);
|
|
353
|
+
if (token) {
|
|
354
|
+
const normalized = token.toLowerCase();
|
|
355
|
+
notes = notes.filter((n) => n.token.toLowerCase() === normalized);
|
|
356
|
+
}
|
|
357
|
+
return notes.reduce((sum, n) => sum + n.amount, 0n);
|
|
358
|
+
}
|
|
359
|
+
// ---------- Mutations ----------
|
|
360
|
+
/**
|
|
361
|
+
* Add a note. Returns false if duplicate (by commitment).
|
|
362
|
+
* Normalizes token and origin addresses.
|
|
363
|
+
*/
|
|
364
|
+
addNote(note) {
|
|
365
|
+
const key = note.commitment.toLowerCase();
|
|
366
|
+
if (this.commitmentSet.has(key)) return false;
|
|
367
|
+
const normalized = {
|
|
368
|
+
...note,
|
|
369
|
+
commitment: note.commitment.toLowerCase(),
|
|
370
|
+
origin: safeGetAddress(note.origin),
|
|
371
|
+
token: safeGetAddress(note.token)
|
|
372
|
+
};
|
|
373
|
+
this.notes.push(normalized);
|
|
374
|
+
this.commitmentSet.add(key);
|
|
375
|
+
this.dirty = true;
|
|
376
|
+
this.notify();
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Add multiple notes. Returns count of actually added (non-duplicate).
|
|
381
|
+
*/
|
|
382
|
+
addNotes(notes) {
|
|
383
|
+
let added = 0;
|
|
384
|
+
for (const note of notes) {
|
|
385
|
+
if (this.addNote(note)) added++;
|
|
386
|
+
}
|
|
387
|
+
return added;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Mark a note as spent (optimistic — syncNotes reconciles via nullifier check).
|
|
391
|
+
*/
|
|
392
|
+
markSpent(commitment) {
|
|
393
|
+
const key = commitment.toLowerCase();
|
|
394
|
+
const note = this.notes.find((n) => n.commitment.toLowerCase() === key);
|
|
395
|
+
if (note && note.status !== "spent") {
|
|
396
|
+
note.status = "spent";
|
|
397
|
+
this.dirty = true;
|
|
398
|
+
this.notify();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Un-mark a note as spent (reconciliation: nullifier not found on-chain).
|
|
403
|
+
*/
|
|
404
|
+
unmarkSpent(commitment) {
|
|
405
|
+
const key = commitment.toLowerCase();
|
|
406
|
+
const note = this.notes.find((n) => n.commitment.toLowerCase() === key);
|
|
407
|
+
if (note && note.status === "spent") {
|
|
408
|
+
note.status = "confirmed";
|
|
409
|
+
this.dirty = true;
|
|
410
|
+
this.notify();
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Update the leafIndex for a note (e.g., after confirming on-chain).
|
|
415
|
+
*/
|
|
416
|
+
updateLeafIndex(commitment, leafIndex) {
|
|
417
|
+
const key = commitment.toLowerCase();
|
|
418
|
+
const note = this.notes.find((n) => n.commitment.toLowerCase() === key);
|
|
419
|
+
if (note && note.leafIndex !== leafIndex) {
|
|
420
|
+
note.leafIndex = leafIndex;
|
|
421
|
+
this.dirty = true;
|
|
422
|
+
this.notify();
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// ---------- Persistence ----------
|
|
426
|
+
async load() {
|
|
427
|
+
const serialized = await this.storage.get(this.storageKey);
|
|
428
|
+
if (!serialized || !Array.isArray(serialized)) {
|
|
429
|
+
this.notes = [];
|
|
430
|
+
this.commitmentSet.clear();
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
this.notes = serialized.map(deserializeNote);
|
|
434
|
+
this.commitmentSet.clear();
|
|
435
|
+
for (const note of this.notes) {
|
|
436
|
+
this.commitmentSet.add(note.commitment.toLowerCase());
|
|
437
|
+
}
|
|
438
|
+
this.dirty = false;
|
|
439
|
+
}
|
|
440
|
+
async persist() {
|
|
441
|
+
if (!this.dirty) return;
|
|
442
|
+
const serialized = this.notes.map(serializeNote);
|
|
443
|
+
await this.storage.set(this.storageKey, serialized);
|
|
444
|
+
this.dirty = false;
|
|
445
|
+
}
|
|
446
|
+
async clear() {
|
|
447
|
+
this.notes = [];
|
|
448
|
+
this.commitmentSet.clear();
|
|
449
|
+
this.dirty = false;
|
|
450
|
+
await this.storage.delete(this.storageKey);
|
|
451
|
+
this.notify();
|
|
452
|
+
}
|
|
453
|
+
// ---------- Events ----------
|
|
454
|
+
onChange(callback) {
|
|
455
|
+
this.listeners.add(callback);
|
|
456
|
+
return () => this.listeners.delete(callback);
|
|
457
|
+
}
|
|
458
|
+
notify() {
|
|
459
|
+
for (const listener of this.listeners) {
|
|
460
|
+
listener();
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
function serializeNote(note) {
|
|
465
|
+
return {
|
|
466
|
+
...note,
|
|
467
|
+
amount: note.amount.toString(),
|
|
468
|
+
blinding: note.blinding.toString()
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
function deserializeNote(s) {
|
|
472
|
+
return {
|
|
473
|
+
...s,
|
|
474
|
+
amount: BigInt(s.amount),
|
|
475
|
+
blinding: BigInt(s.blinding),
|
|
476
|
+
proofSystem: s.proofSystem ?? "snark"
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
function safeGetAddress(addr) {
|
|
480
|
+
try {
|
|
481
|
+
return getAddress(addr);
|
|
482
|
+
} catch {
|
|
483
|
+
return addr;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
export { ADDRESS_VERSION, NoteStore, RATE_PRECISION, STARK_ADDRESS_VERSION, STARK_STEALTH_ADDRESS_PREFIX, STEALTH_ADDRESS_PREFIX, SWAP_EVENTS_ABI, SWAP_ORDER_CANCELLED_EVENT, SWAP_ORDER_CLAIMED_EVENT, SWAP_ORDER_FILLED_EVENT, SWAP_ORDER_PLACED_EVENT, computeCancelKeyHash, computeFillPercentage, computeGiveAmount, computeNoteEncryptionKey, computeRate, computeTakeAmount, computeTotalBuyAmount, createOneTimeKeys, decodeStarkStealthAddress, decodeStealthAddress, detectAddressType, encodeStarkStealthAddress, encodeStealthAddress, filterOrdersByASP, filterOrdersByTokenPair, formatRate, generateCancelSecret, generateStarkStealthAddress, generateStealthAddress, getCancelSecret, getOwnOrderIds, init_stealth, isFillerASPAccepted, isOrderActive, isValidStarkStealthAddress, isValidStealthAddress, removeCancelSecret, stealth_exports, storeCancelSecret, verifyOwnership };
|
|
488
|
+
//# sourceMappingURL=chunk-NUIQHTSA.js.map
|
|
489
|
+
//# sourceMappingURL=chunk-NUIQHTSA.js.map
|