@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,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
8
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
9
|
+
}) : x)(function(x) {
|
|
10
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
11
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
|
+
});
|
|
13
|
+
var __esm = (fn, res) => function __init() {
|
|
14
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
15
|
+
};
|
|
16
|
+
var __export = (target, all) => {
|
|
17
|
+
for (var name in all)
|
|
18
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
19
|
+
};
|
|
20
|
+
var __copyProps = (to, from, except, desc) => {
|
|
21
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
22
|
+
for (let key of __getOwnPropNames(from))
|
|
23
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
24
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
25
|
+
}
|
|
26
|
+
return to;
|
|
27
|
+
};
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
exports.__esm = __esm;
|
|
31
|
+
exports.__export = __export;
|
|
32
|
+
exports.__require = __require;
|
|
33
|
+
exports.__toCommonJS = __toCommonJS;
|
|
34
|
+
//# sourceMappingURL=chunk-G7VZBCD6.cjs.map
|
|
35
|
+
//# sourceMappingURL=chunk-G7VZBCD6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-G7VZBCD6.cjs"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk3HQ7A6ZM_cjs = require('./chunk-3HQ7A6ZM.cjs');
|
|
4
|
+
var chunkJWNXBALH_cjs = require('./chunk-JWNXBALH.cjs');
|
|
5
|
+
|
|
6
|
+
// src/utils/index.ts
|
|
7
|
+
chunkJWNXBALH_cjs.init_poseidon();
|
|
8
|
+
chunk3HQ7A6ZM_cjs.init_crypto();
|
|
9
|
+
//# sourceMappingURL=chunk-GQV47S3N.cjs.map
|
|
10
|
+
//# sourceMappingURL=chunk-GQV47S3N.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/index.ts"],"names":["init_poseidon","init_crypto"],"mappings":";;;;;;AAKAA,+BAAA,EAAA;AAwCAC,6BAAA,EAAA","file":"chunk-GQV47S3N.cjs","sourcesContent":["/**\n * Utility functions for UPP SDK\n */\n\n// Poseidon hash\nexport {\n poseidon,\n poseidonHash,\n poseidonScalar,\n FIELD_PRIME,\n BABYJUBJUB_SUBORDER,\n addressToField,\n fieldToAddress,\n isValidFieldElement,\n toFieldElement,\n} from './poseidon.js'\n\n// BabyJubJub curve operations\nexport {\n type Point,\n getSubOrder,\n getBasePoint,\n isOnCurve,\n mulPointScalar,\n addPoints,\n privateToPublic,\n computeSharedSecret,\n packPoint,\n pointToTuple,\n tupleToPoint,\n deriveEncryptionViewingKey,\n deriveDecryptionViewingKey,\n} from './babyjubjub.js'\n\n// Merkle tree\nexport {\n MerkleTree,\n buildMerkleTree,\n getMerkleProof,\n verifyMerkleProof,\n type MerkleProof,\n MAX_TREE_DEPTH,\n} from './merkle.js'\n\n// Crypto utilities\nexport {\n randomBytes,\n randomFieldElement,\n bytesToHex,\n hexToBytes,\n bigintToBytes,\n bytesToBigint,\n} from './crypto.js'\n\n// Keccak-M31 hashing (STARK)\nexport {\n keccakM31,\n keccakHashTwo,\n computeStarkOwnerHash,\n computeStarkCommitment,\n computeStarkNullifier,\n splitToM31Limbs,\n M31_P,\n DIGEST_SIZE,\n SECRET_LIMBS,\n type M31Digest,\n type M31Secret,\n} from './keccak-m31.js'\n"]}
|
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk3HQ7A6ZM_cjs = require('./chunk-3HQ7A6ZM.cjs');
|
|
4
|
+
var chunkG7VZBCD6_cjs = require('./chunk-G7VZBCD6.cjs');
|
|
5
|
+
var bech32 = require('bech32');
|
|
6
|
+
var viem = require('viem');
|
|
7
|
+
|
|
8
|
+
// src/core/stealth.ts
|
|
9
|
+
var stealth_exports = {};
|
|
10
|
+
chunkG7VZBCD6_cjs.__export(stealth_exports, {
|
|
11
|
+
ADDRESS_VERSION: () => exports.ADDRESS_VERSION,
|
|
12
|
+
STARK_ADDRESS_VERSION: () => exports.STARK_ADDRESS_VERSION,
|
|
13
|
+
STARK_STEALTH_ADDRESS_PREFIX: () => exports.STARK_STEALTH_ADDRESS_PREFIX,
|
|
14
|
+
STEALTH_ADDRESS_PREFIX: () => exports.STEALTH_ADDRESS_PREFIX,
|
|
15
|
+
computeNoteEncryptionKey: () => computeNoteEncryptionKey,
|
|
16
|
+
createOneTimeKeys: () => createOneTimeKeys,
|
|
17
|
+
decodeStarkStealthAddress: () => decodeStarkStealthAddress,
|
|
18
|
+
decodeStealthAddress: () => decodeStealthAddress,
|
|
19
|
+
detectAddressType: () => detectAddressType,
|
|
20
|
+
encodeStarkStealthAddress: () => encodeStarkStealthAddress,
|
|
21
|
+
encodeStealthAddress: () => encodeStealthAddress,
|
|
22
|
+
generateStarkStealthAddress: () => generateStarkStealthAddress,
|
|
23
|
+
generateStealthAddress: () => generateStealthAddress,
|
|
24
|
+
isValidStarkStealthAddress: () => isValidStarkStealthAddress,
|
|
25
|
+
isValidStealthAddress: () => isValidStealthAddress,
|
|
26
|
+
verifyOwnership: () => verifyOwnership
|
|
27
|
+
});
|
|
28
|
+
function encodeStealthAddress(ownerHash, viewingHash, chainId = 0) {
|
|
29
|
+
const data = new Uint8Array(1 + 4 + 32 * 2);
|
|
30
|
+
let offset = 0;
|
|
31
|
+
data[offset++] = exports.ADDRESS_VERSION;
|
|
32
|
+
data[offset++] = chainId >> 24 & 255;
|
|
33
|
+
data[offset++] = chainId >> 16 & 255;
|
|
34
|
+
data[offset++] = chainId >> 8 & 255;
|
|
35
|
+
data[offset++] = chainId & 255;
|
|
36
|
+
const ownerBytes = chunk3HQ7A6ZM_cjs.bigintToBytes(ownerHash, 32);
|
|
37
|
+
data.set(ownerBytes, offset);
|
|
38
|
+
offset += 32;
|
|
39
|
+
const viewingBytes = chunk3HQ7A6ZM_cjs.bigintToBytes(viewingHash, 32);
|
|
40
|
+
data.set(viewingBytes, offset);
|
|
41
|
+
const words = bech32.bech32m.toWords(data);
|
|
42
|
+
return bech32.bech32m.encode(exports.STEALTH_ADDRESS_PREFIX, words, BECH32M_LIMIT);
|
|
43
|
+
}
|
|
44
|
+
function decodeStealthAddress(address) {
|
|
45
|
+
const decoded = bech32.bech32m.decode(address, BECH32M_LIMIT);
|
|
46
|
+
if (decoded.prefix !== exports.STEALTH_ADDRESS_PREFIX) {
|
|
47
|
+
throw new Error(`Invalid stealth address prefix: expected '${exports.STEALTH_ADDRESS_PREFIX}', got '${decoded.prefix}'`);
|
|
48
|
+
}
|
|
49
|
+
const data = new Uint8Array(bech32.bech32m.fromWords(decoded.words));
|
|
50
|
+
let offset = 0;
|
|
51
|
+
const version = data[offset++];
|
|
52
|
+
if (version !== exports.ADDRESS_VERSION) {
|
|
53
|
+
throw new Error(`Unsupported address version: ${version}. Expected v${exports.ADDRESS_VERSION} (hash-based).`);
|
|
54
|
+
}
|
|
55
|
+
const chainId = data[offset++] << 24 | data[offset++] << 16 | data[offset++] << 8 | data[offset++];
|
|
56
|
+
const ownerHash = chunk3HQ7A6ZM_cjs.bytesToBigint(data.slice(offset, offset + 32));
|
|
57
|
+
offset += 32;
|
|
58
|
+
const viewingHash = chunk3HQ7A6ZM_cjs.bytesToBigint(data.slice(offset, offset + 32));
|
|
59
|
+
return {
|
|
60
|
+
version,
|
|
61
|
+
chainId,
|
|
62
|
+
ownerHash,
|
|
63
|
+
viewingHash
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function isValidStealthAddress(address) {
|
|
67
|
+
try {
|
|
68
|
+
decodeStealthAddress(address);
|
|
69
|
+
return true;
|
|
70
|
+
} catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function generateStealthAddress(keys, chainId = 0) {
|
|
75
|
+
return encodeStealthAddress(keys.ownerHash, keys.viewingHash, chainId);
|
|
76
|
+
}
|
|
77
|
+
async function createOneTimeKeys(_recipientOwnerHash, selfSecret) {
|
|
78
|
+
const { poseidon } = await import('./poseidon-WHJSZSNP.cjs');
|
|
79
|
+
if (selfSecret !== void 0) {
|
|
80
|
+
const ownerHash2 = await poseidon([selfSecret]);
|
|
81
|
+
return {
|
|
82
|
+
oneTimeSecret: selfSecret,
|
|
83
|
+
ownerHash: ownerHash2
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const oneTimeSecret = chunk3HQ7A6ZM_cjs.randomFieldElement();
|
|
87
|
+
const ownerHash = await poseidon([oneTimeSecret]);
|
|
88
|
+
return {
|
|
89
|
+
oneTimeSecret,
|
|
90
|
+
ownerHash
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
async function verifyOwnership(secret, expectedOwnerHash) {
|
|
94
|
+
const { poseidon } = await import('./poseidon-WHJSZSNP.cjs');
|
|
95
|
+
const computedHash = await poseidon([secret]);
|
|
96
|
+
return computedHash === expectedOwnerHash;
|
|
97
|
+
}
|
|
98
|
+
async function computeNoteEncryptionKey(viewingSecret, nonce) {
|
|
99
|
+
const { poseidon } = await import('./poseidon-WHJSZSNP.cjs');
|
|
100
|
+
if (nonce !== void 0) {
|
|
101
|
+
return poseidon([viewingSecret, nonce]);
|
|
102
|
+
}
|
|
103
|
+
return poseidon([viewingSecret]);
|
|
104
|
+
}
|
|
105
|
+
function encodeStarkStealthAddress(ownerHash, viewingHash, chainId = 0) {
|
|
106
|
+
const data = new Uint8Array(1 + 4 + 16 + 16);
|
|
107
|
+
let offset = 0;
|
|
108
|
+
data[offset++] = exports.STARK_ADDRESS_VERSION;
|
|
109
|
+
data[offset++] = chainId >> 24 & 255;
|
|
110
|
+
data[offset++] = chainId >> 16 & 255;
|
|
111
|
+
data[offset++] = chainId >> 8 & 255;
|
|
112
|
+
data[offset++] = chainId & 255;
|
|
113
|
+
for (let i = 0; i < 4; i++) {
|
|
114
|
+
const val = Number(ownerHash[i]);
|
|
115
|
+
data[offset++] = val & 255;
|
|
116
|
+
data[offset++] = val >> 8 & 255;
|
|
117
|
+
data[offset++] = val >> 16 & 255;
|
|
118
|
+
data[offset++] = val >> 24 & 255;
|
|
119
|
+
}
|
|
120
|
+
for (let i = 0; i < 4; i++) {
|
|
121
|
+
const val = Number(viewingHash[i]);
|
|
122
|
+
data[offset++] = val & 255;
|
|
123
|
+
data[offset++] = val >> 8 & 255;
|
|
124
|
+
data[offset++] = val >> 16 & 255;
|
|
125
|
+
data[offset++] = val >> 24 & 255;
|
|
126
|
+
}
|
|
127
|
+
const words = bech32.bech32m.toWords(data);
|
|
128
|
+
return bech32.bech32m.encode(exports.STARK_STEALTH_ADDRESS_PREFIX, words, BECH32M_LIMIT);
|
|
129
|
+
}
|
|
130
|
+
function decodeStarkStealthAddress(address) {
|
|
131
|
+
const decoded = bech32.bech32m.decode(address, BECH32M_LIMIT);
|
|
132
|
+
if (decoded.prefix !== exports.STARK_STEALTH_ADDRESS_PREFIX) {
|
|
133
|
+
throw new Error(
|
|
134
|
+
`Invalid STARK stealth address prefix: expected '${exports.STARK_STEALTH_ADDRESS_PREFIX}', got '${decoded.prefix}'`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
const data = new Uint8Array(bech32.bech32m.fromWords(decoded.words));
|
|
138
|
+
let offset = 0;
|
|
139
|
+
const version = data[offset++];
|
|
140
|
+
if (version !== exports.STARK_ADDRESS_VERSION) {
|
|
141
|
+
throw new Error(
|
|
142
|
+
`Unsupported STARK address version: ${version}. Expected v${exports.STARK_ADDRESS_VERSION}.`
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
const chainId = data[offset++] << 24 | data[offset++] << 16 | data[offset++] << 8 | data[offset++];
|
|
146
|
+
const ownerHash = [];
|
|
147
|
+
for (let i = 0; i < 4; i++) {
|
|
148
|
+
const val = data[offset] | data[offset + 1] << 8 | data[offset + 2] << 16 | data[offset + 3] << 24;
|
|
149
|
+
ownerHash.push(BigInt(val >>> 0));
|
|
150
|
+
offset += 4;
|
|
151
|
+
}
|
|
152
|
+
const viewingHash = [];
|
|
153
|
+
for (let i = 0; i < 4; i++) {
|
|
154
|
+
const val = data[offset] | data[offset + 1] << 8 | data[offset + 2] << 16 | data[offset + 3] << 24;
|
|
155
|
+
viewingHash.push(BigInt(val >>> 0));
|
|
156
|
+
offset += 4;
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
version,
|
|
160
|
+
chainId,
|
|
161
|
+
ownerHash,
|
|
162
|
+
viewingHash
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function isValidStarkStealthAddress(address) {
|
|
166
|
+
try {
|
|
167
|
+
decodeStarkStealthAddress(address);
|
|
168
|
+
return true;
|
|
169
|
+
} catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function generateStarkStealthAddress(keys, chainId = 0) {
|
|
174
|
+
return encodeStarkStealthAddress(keys.starkOwnerHash, keys.starkViewingHash, chainId);
|
|
175
|
+
}
|
|
176
|
+
function detectAddressType(address) {
|
|
177
|
+
if (address.startsWith(exports.STEALTH_ADDRESS_PREFIX + "1")) return "snark";
|
|
178
|
+
if (address.startsWith(exports.STARK_STEALTH_ADDRESS_PREFIX + "1")) return "stark";
|
|
179
|
+
return "unknown";
|
|
180
|
+
}
|
|
181
|
+
exports.STEALTH_ADDRESS_PREFIX = void 0; exports.ADDRESS_VERSION = void 0; var BECH32M_LIMIT; exports.STARK_STEALTH_ADDRESS_PREFIX = void 0; exports.STARK_ADDRESS_VERSION = void 0;
|
|
182
|
+
var init_stealth = chunkG7VZBCD6_cjs.__esm({
|
|
183
|
+
"src/core/stealth.ts"() {
|
|
184
|
+
chunk3HQ7A6ZM_cjs.init_crypto();
|
|
185
|
+
exports.STEALTH_ADDRESS_PREFIX = "0zk";
|
|
186
|
+
exports.ADDRESS_VERSION = 2;
|
|
187
|
+
BECH32M_LIMIT = 1023;
|
|
188
|
+
exports.STARK_STEALTH_ADDRESS_PREFIX = "0zs";
|
|
189
|
+
exports.STARK_ADDRESS_VERSION = 1;
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
var RATE_PRECISION = 10n ** 18n;
|
|
193
|
+
var SWAP_ORDER_PLACED_EVENT = {
|
|
194
|
+
type: "event",
|
|
195
|
+
name: "SwapOrderPlaced",
|
|
196
|
+
inputs: [
|
|
197
|
+
{ name: "orderId", type: "bytes32", indexed: true },
|
|
198
|
+
{ name: "sellToken", type: "address", indexed: true },
|
|
199
|
+
{ name: "buyToken", type: "address", indexed: true },
|
|
200
|
+
{ name: "sellAmount", type: "uint256", indexed: false },
|
|
201
|
+
{ name: "rate", type: "uint256", indexed: false },
|
|
202
|
+
{ name: "makerAspId", type: "uint256", indexed: false },
|
|
203
|
+
{ name: "requiredFillerAspId", type: "uint256", indexed: false },
|
|
204
|
+
{ name: "expiry", type: "uint256", indexed: false }
|
|
205
|
+
]
|
|
206
|
+
};
|
|
207
|
+
var SWAP_ORDER_FILLED_EVENT = {
|
|
208
|
+
type: "event",
|
|
209
|
+
name: "SwapOrderFilled",
|
|
210
|
+
inputs: [
|
|
211
|
+
{ name: "orderId", type: "bytes32", indexed: true },
|
|
212
|
+
{ name: "fillerNullifier", type: "bytes32", indexed: true },
|
|
213
|
+
{ name: "takeAmount", type: "uint256", indexed: false },
|
|
214
|
+
{ name: "giveAmount", type: "uint256", indexed: false },
|
|
215
|
+
{ name: "fillerAspId", type: "uint256", indexed: false }
|
|
216
|
+
]
|
|
217
|
+
};
|
|
218
|
+
var SWAP_ORDER_CLAIMED_EVENT = {
|
|
219
|
+
type: "event",
|
|
220
|
+
name: "SwapOrderClaimed",
|
|
221
|
+
inputs: [
|
|
222
|
+
{ name: "orderId", type: "bytes32", indexed: true },
|
|
223
|
+
{ name: "accumulatedBuyAmount", type: "uint256", indexed: false },
|
|
224
|
+
{ name: "refundedSellAmount", type: "uint256", indexed: false }
|
|
225
|
+
]
|
|
226
|
+
};
|
|
227
|
+
var SWAP_ORDER_CANCELLED_EVENT = {
|
|
228
|
+
type: "event",
|
|
229
|
+
name: "SwapOrderCancelled",
|
|
230
|
+
inputs: [
|
|
231
|
+
{ name: "orderId", type: "bytes32", indexed: true },
|
|
232
|
+
{ name: "refundedSellAmount", type: "uint256", indexed: false }
|
|
233
|
+
]
|
|
234
|
+
};
|
|
235
|
+
var SWAP_EVENTS_ABI = [
|
|
236
|
+
SWAP_ORDER_PLACED_EVENT,
|
|
237
|
+
SWAP_ORDER_FILLED_EVENT,
|
|
238
|
+
SWAP_ORDER_CLAIMED_EVENT,
|
|
239
|
+
SWAP_ORDER_CANCELLED_EVENT
|
|
240
|
+
];
|
|
241
|
+
function computeGiveAmount(takeAmount, rate) {
|
|
242
|
+
return takeAmount * rate / RATE_PRECISION;
|
|
243
|
+
}
|
|
244
|
+
function computeTakeAmount(giveAmount, rate) {
|
|
245
|
+
if (rate === 0n) throw new Error("Rate cannot be zero");
|
|
246
|
+
return giveAmount * RATE_PRECISION / rate;
|
|
247
|
+
}
|
|
248
|
+
function computeRate(sellAmount, buyAmount) {
|
|
249
|
+
if (sellAmount === 0n) throw new Error("Sell amount cannot be zero");
|
|
250
|
+
return buyAmount * RATE_PRECISION / sellAmount;
|
|
251
|
+
}
|
|
252
|
+
function formatRate(rate, decimals = 6) {
|
|
253
|
+
const whole = rate / RATE_PRECISION;
|
|
254
|
+
const frac = rate % RATE_PRECISION;
|
|
255
|
+
const fracStr = frac.toString().padStart(18, "0").slice(0, decimals);
|
|
256
|
+
return `${whole}.${fracStr}`;
|
|
257
|
+
}
|
|
258
|
+
function computeCancelKeyHash(cancelSecret) {
|
|
259
|
+
return viem.keccak256(viem.encodeAbiParameters(
|
|
260
|
+
viem.parseAbiParameters("bytes32"),
|
|
261
|
+
[cancelSecret]
|
|
262
|
+
));
|
|
263
|
+
}
|
|
264
|
+
function generateCancelSecret() {
|
|
265
|
+
const bytes = new Uint8Array(32);
|
|
266
|
+
crypto.getRandomValues(bytes);
|
|
267
|
+
return viem.toHex(bytes);
|
|
268
|
+
}
|
|
269
|
+
function filterOrdersByASP(orders, acceptableAspIds) {
|
|
270
|
+
const aspSet = new Set(acceptableAspIds.map((id) => id.toString()));
|
|
271
|
+
return orders.filter((o) => aspSet.has(o.makerAspId.toString()));
|
|
272
|
+
}
|
|
273
|
+
function filterOrdersByTokenPair(orders, sellToken, buyToken) {
|
|
274
|
+
const sell = sellToken.toLowerCase();
|
|
275
|
+
const buy = buyToken.toLowerCase();
|
|
276
|
+
return orders.filter(
|
|
277
|
+
(o) => o.sellToken.toLowerCase() === sell && o.buyToken.toLowerCase() === buy
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
function isFillerASPAccepted(order, fillerAspId) {
|
|
281
|
+
const required = "requiredFillerAspId" in order ? order.requiredFillerAspId : 0n;
|
|
282
|
+
return required === 0n || required === fillerAspId;
|
|
283
|
+
}
|
|
284
|
+
var CANCEL_SECRET_PREFIX = "upp_swap_cancel_";
|
|
285
|
+
function cancelKey(account, orderId) {
|
|
286
|
+
return `${CANCEL_SECRET_PREFIX}${account.toLowerCase()}_${orderId}`;
|
|
287
|
+
}
|
|
288
|
+
function storeCancelSecret(orderId, cancelSecret, account) {
|
|
289
|
+
if (typeof localStorage === "undefined") return;
|
|
290
|
+
if (account) {
|
|
291
|
+
localStorage.setItem(cancelKey(account, orderId), cancelSecret);
|
|
292
|
+
}
|
|
293
|
+
localStorage.setItem(`${CANCEL_SECRET_PREFIX}${orderId}`, cancelSecret);
|
|
294
|
+
}
|
|
295
|
+
function getCancelSecret(orderId, account) {
|
|
296
|
+
if (typeof localStorage === "undefined") return null;
|
|
297
|
+
if (account) {
|
|
298
|
+
const scoped = localStorage.getItem(cancelKey(account, orderId));
|
|
299
|
+
if (scoped) return scoped;
|
|
300
|
+
}
|
|
301
|
+
return localStorage.getItem(`${CANCEL_SECRET_PREFIX}${orderId}`);
|
|
302
|
+
}
|
|
303
|
+
function removeCancelSecret(orderId, account) {
|
|
304
|
+
if (typeof localStorage === "undefined") return;
|
|
305
|
+
if (account) {
|
|
306
|
+
localStorage.removeItem(cancelKey(account, orderId));
|
|
307
|
+
}
|
|
308
|
+
localStorage.removeItem(`${CANCEL_SECRET_PREFIX}${orderId}`);
|
|
309
|
+
}
|
|
310
|
+
function getOwnOrderIds(account) {
|
|
311
|
+
if (typeof localStorage === "undefined") return [];
|
|
312
|
+
const prefix = account ? `${CANCEL_SECRET_PREFIX}${account.toLowerCase()}_` : CANCEL_SECRET_PREFIX;
|
|
313
|
+
const ids = [];
|
|
314
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
315
|
+
const key = localStorage.key(i);
|
|
316
|
+
if (key?.startsWith(prefix)) {
|
|
317
|
+
ids.push(key.slice(prefix.length));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return ids;
|
|
321
|
+
}
|
|
322
|
+
function isOrderActive(order, currentBlock) {
|
|
323
|
+
return !order.claimed && !order.cancelled && currentBlock <= order.expiry && order.remainingSellAmount > 0n;
|
|
324
|
+
}
|
|
325
|
+
function computeTotalBuyAmount(sellAmount, rate) {
|
|
326
|
+
return computeGiveAmount(sellAmount, rate);
|
|
327
|
+
}
|
|
328
|
+
function computeFillPercentage(order) {
|
|
329
|
+
if (order.sellAmount === 0n) return 0;
|
|
330
|
+
const filled = order.sellAmount - order.remainingSellAmount;
|
|
331
|
+
return Number(filled * 10000n / order.sellAmount) / 100;
|
|
332
|
+
}
|
|
333
|
+
var NoteStore = class {
|
|
334
|
+
constructor(storage, storageKey = "notes") {
|
|
335
|
+
this.storage = storage;
|
|
336
|
+
this.storageKey = storageKey;
|
|
337
|
+
}
|
|
338
|
+
notes = [];
|
|
339
|
+
commitmentSet = /* @__PURE__ */ new Set();
|
|
340
|
+
listeners = /* @__PURE__ */ new Set();
|
|
341
|
+
dirty = false;
|
|
342
|
+
// ---------- Queries ----------
|
|
343
|
+
getNotes() {
|
|
344
|
+
return [...this.notes];
|
|
345
|
+
}
|
|
346
|
+
getUnspentNotes(proofSystem) {
|
|
347
|
+
let result = this.notes.filter((n) => n.status !== "spent");
|
|
348
|
+
if (proofSystem) {
|
|
349
|
+
result = result.filter((n) => (n.proofSystem ?? "snark") === proofSystem);
|
|
350
|
+
}
|
|
351
|
+
return result;
|
|
352
|
+
}
|
|
353
|
+
getBalance(token, proofSystem) {
|
|
354
|
+
let notes = this.getUnspentNotes(proofSystem);
|
|
355
|
+
if (token) {
|
|
356
|
+
const normalized = token.toLowerCase();
|
|
357
|
+
notes = notes.filter((n) => n.token.toLowerCase() === normalized);
|
|
358
|
+
}
|
|
359
|
+
return notes.reduce((sum, n) => sum + n.amount, 0n);
|
|
360
|
+
}
|
|
361
|
+
// ---------- Mutations ----------
|
|
362
|
+
/**
|
|
363
|
+
* Add a note. Returns false if duplicate (by commitment).
|
|
364
|
+
* Normalizes token and origin addresses.
|
|
365
|
+
*/
|
|
366
|
+
addNote(note) {
|
|
367
|
+
const key = note.commitment.toLowerCase();
|
|
368
|
+
if (this.commitmentSet.has(key)) return false;
|
|
369
|
+
const normalized = {
|
|
370
|
+
...note,
|
|
371
|
+
commitment: note.commitment.toLowerCase(),
|
|
372
|
+
origin: safeGetAddress(note.origin),
|
|
373
|
+
token: safeGetAddress(note.token)
|
|
374
|
+
};
|
|
375
|
+
this.notes.push(normalized);
|
|
376
|
+
this.commitmentSet.add(key);
|
|
377
|
+
this.dirty = true;
|
|
378
|
+
this.notify();
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Add multiple notes. Returns count of actually added (non-duplicate).
|
|
383
|
+
*/
|
|
384
|
+
addNotes(notes) {
|
|
385
|
+
let added = 0;
|
|
386
|
+
for (const note of notes) {
|
|
387
|
+
if (this.addNote(note)) added++;
|
|
388
|
+
}
|
|
389
|
+
return added;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Mark a note as spent (optimistic — syncNotes reconciles via nullifier check).
|
|
393
|
+
*/
|
|
394
|
+
markSpent(commitment) {
|
|
395
|
+
const key = commitment.toLowerCase();
|
|
396
|
+
const note = this.notes.find((n) => n.commitment.toLowerCase() === key);
|
|
397
|
+
if (note && note.status !== "spent") {
|
|
398
|
+
note.status = "spent";
|
|
399
|
+
this.dirty = true;
|
|
400
|
+
this.notify();
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Un-mark a note as spent (reconciliation: nullifier not found on-chain).
|
|
405
|
+
*/
|
|
406
|
+
unmarkSpent(commitment) {
|
|
407
|
+
const key = commitment.toLowerCase();
|
|
408
|
+
const note = this.notes.find((n) => n.commitment.toLowerCase() === key);
|
|
409
|
+
if (note && note.status === "spent") {
|
|
410
|
+
note.status = "confirmed";
|
|
411
|
+
this.dirty = true;
|
|
412
|
+
this.notify();
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Update the leafIndex for a note (e.g., after confirming on-chain).
|
|
417
|
+
*/
|
|
418
|
+
updateLeafIndex(commitment, leafIndex) {
|
|
419
|
+
const key = commitment.toLowerCase();
|
|
420
|
+
const note = this.notes.find((n) => n.commitment.toLowerCase() === key);
|
|
421
|
+
if (note && note.leafIndex !== leafIndex) {
|
|
422
|
+
note.leafIndex = leafIndex;
|
|
423
|
+
this.dirty = true;
|
|
424
|
+
this.notify();
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
// ---------- Persistence ----------
|
|
428
|
+
async load() {
|
|
429
|
+
const serialized = await this.storage.get(this.storageKey);
|
|
430
|
+
if (!serialized || !Array.isArray(serialized)) {
|
|
431
|
+
this.notes = [];
|
|
432
|
+
this.commitmentSet.clear();
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
this.notes = serialized.map(deserializeNote);
|
|
436
|
+
this.commitmentSet.clear();
|
|
437
|
+
for (const note of this.notes) {
|
|
438
|
+
this.commitmentSet.add(note.commitment.toLowerCase());
|
|
439
|
+
}
|
|
440
|
+
this.dirty = false;
|
|
441
|
+
}
|
|
442
|
+
async persist() {
|
|
443
|
+
if (!this.dirty) return;
|
|
444
|
+
const serialized = this.notes.map(serializeNote);
|
|
445
|
+
await this.storage.set(this.storageKey, serialized);
|
|
446
|
+
this.dirty = false;
|
|
447
|
+
}
|
|
448
|
+
async clear() {
|
|
449
|
+
this.notes = [];
|
|
450
|
+
this.commitmentSet.clear();
|
|
451
|
+
this.dirty = false;
|
|
452
|
+
await this.storage.delete(this.storageKey);
|
|
453
|
+
this.notify();
|
|
454
|
+
}
|
|
455
|
+
// ---------- Events ----------
|
|
456
|
+
onChange(callback) {
|
|
457
|
+
this.listeners.add(callback);
|
|
458
|
+
return () => this.listeners.delete(callback);
|
|
459
|
+
}
|
|
460
|
+
notify() {
|
|
461
|
+
for (const listener of this.listeners) {
|
|
462
|
+
listener();
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
function serializeNote(note) {
|
|
467
|
+
return {
|
|
468
|
+
...note,
|
|
469
|
+
amount: note.amount.toString(),
|
|
470
|
+
blinding: note.blinding.toString()
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
function deserializeNote(s) {
|
|
474
|
+
return {
|
|
475
|
+
...s,
|
|
476
|
+
amount: BigInt(s.amount),
|
|
477
|
+
blinding: BigInt(s.blinding),
|
|
478
|
+
proofSystem: s.proofSystem ?? "snark"
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
function safeGetAddress(addr) {
|
|
482
|
+
try {
|
|
483
|
+
return viem.getAddress(addr);
|
|
484
|
+
} catch {
|
|
485
|
+
return addr;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
exports.NoteStore = NoteStore;
|
|
490
|
+
exports.RATE_PRECISION = RATE_PRECISION;
|
|
491
|
+
exports.SWAP_EVENTS_ABI = SWAP_EVENTS_ABI;
|
|
492
|
+
exports.SWAP_ORDER_CANCELLED_EVENT = SWAP_ORDER_CANCELLED_EVENT;
|
|
493
|
+
exports.SWAP_ORDER_CLAIMED_EVENT = SWAP_ORDER_CLAIMED_EVENT;
|
|
494
|
+
exports.SWAP_ORDER_FILLED_EVENT = SWAP_ORDER_FILLED_EVENT;
|
|
495
|
+
exports.SWAP_ORDER_PLACED_EVENT = SWAP_ORDER_PLACED_EVENT;
|
|
496
|
+
exports.computeCancelKeyHash = computeCancelKeyHash;
|
|
497
|
+
exports.computeFillPercentage = computeFillPercentage;
|
|
498
|
+
exports.computeGiveAmount = computeGiveAmount;
|
|
499
|
+
exports.computeNoteEncryptionKey = computeNoteEncryptionKey;
|
|
500
|
+
exports.computeRate = computeRate;
|
|
501
|
+
exports.computeTakeAmount = computeTakeAmount;
|
|
502
|
+
exports.computeTotalBuyAmount = computeTotalBuyAmount;
|
|
503
|
+
exports.createOneTimeKeys = createOneTimeKeys;
|
|
504
|
+
exports.decodeStarkStealthAddress = decodeStarkStealthAddress;
|
|
505
|
+
exports.decodeStealthAddress = decodeStealthAddress;
|
|
506
|
+
exports.detectAddressType = detectAddressType;
|
|
507
|
+
exports.encodeStarkStealthAddress = encodeStarkStealthAddress;
|
|
508
|
+
exports.encodeStealthAddress = encodeStealthAddress;
|
|
509
|
+
exports.filterOrdersByASP = filterOrdersByASP;
|
|
510
|
+
exports.filterOrdersByTokenPair = filterOrdersByTokenPair;
|
|
511
|
+
exports.formatRate = formatRate;
|
|
512
|
+
exports.generateCancelSecret = generateCancelSecret;
|
|
513
|
+
exports.generateStarkStealthAddress = generateStarkStealthAddress;
|
|
514
|
+
exports.generateStealthAddress = generateStealthAddress;
|
|
515
|
+
exports.getCancelSecret = getCancelSecret;
|
|
516
|
+
exports.getOwnOrderIds = getOwnOrderIds;
|
|
517
|
+
exports.init_stealth = init_stealth;
|
|
518
|
+
exports.isFillerASPAccepted = isFillerASPAccepted;
|
|
519
|
+
exports.isOrderActive = isOrderActive;
|
|
520
|
+
exports.isValidStarkStealthAddress = isValidStarkStealthAddress;
|
|
521
|
+
exports.isValidStealthAddress = isValidStealthAddress;
|
|
522
|
+
exports.removeCancelSecret = removeCancelSecret;
|
|
523
|
+
exports.stealth_exports = stealth_exports;
|
|
524
|
+
exports.storeCancelSecret = storeCancelSecret;
|
|
525
|
+
exports.verifyOwnership = verifyOwnership;
|
|
526
|
+
//# sourceMappingURL=chunk-GXZ3MTCQ.cjs.map
|
|
527
|
+
//# sourceMappingURL=chunk-GXZ3MTCQ.cjs.map
|