@invisi-labs/sdk 1.1.7 → 1.2.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/README.md +5 -0
- package/dist/broadcaster-3KTB4JO2.cjs +21 -0
- package/dist/broadcaster-3KTB4JO2.cjs.map +1 -0
- package/dist/broadcaster-7ZKKSTZQ.js +21 -0
- package/dist/broadcaster-preparation-PJ263WBL.cjs +15 -0
- package/dist/broadcaster-preparation-PJ263WBL.cjs.map +1 -0
- package/dist/broadcaster-preparation-ZQAPZAUG.js +15 -0
- package/dist/broadcaster-preparation-ZQAPZAUG.js.map +1 -0
- package/dist/{chunk-LOU7AP2B.cjs → chunk-2URICDPW.cjs} +72 -33
- package/dist/chunk-2URICDPW.cjs.map +1 -0
- package/dist/chunk-3D24ABYR.js +86 -0
- package/dist/chunk-3D24ABYR.js.map +1 -0
- package/dist/chunk-3KTQQZOW.cjs +71 -0
- package/dist/chunk-3KTQQZOW.cjs.map +1 -0
- package/dist/chunk-4SDP53YQ.cjs +765 -0
- package/dist/chunk-4SDP53YQ.cjs.map +1 -0
- package/dist/{chunk-XHKQ2BO2.js → chunk-4VI6LYGH.js} +25 -2
- package/dist/chunk-4VI6LYGH.js.map +1 -0
- package/dist/chunk-BBSRP4MH.cjs +287 -0
- package/dist/chunk-BBSRP4MH.cjs.map +1 -0
- package/dist/chunk-DGMVGFKM.js +41 -0
- package/dist/chunk-DGMVGFKM.js.map +1 -0
- package/dist/chunk-DHQEB6JR.cjs +1616 -0
- package/dist/chunk-DHQEB6JR.cjs.map +1 -0
- package/dist/chunk-FKF67XE6.js +1616 -0
- package/dist/chunk-FKF67XE6.js.map +1 -0
- package/dist/chunk-GUD3LAUO.js +765 -0
- package/dist/chunk-GUD3LAUO.js.map +1 -0
- package/dist/chunk-HCB7RQ3S.cjs +79 -0
- package/dist/chunk-HCB7RQ3S.cjs.map +1 -0
- package/dist/{chunk-GTPUYPQL.js → chunk-HKGJXQVN.js} +69 -30
- package/dist/chunk-HKGJXQVN.js.map +1 -0
- package/dist/chunk-HLH5JZD4.js +287 -0
- package/dist/chunk-HLH5JZD4.js.map +1 -0
- package/dist/chunk-J6TZZVAM.cjs +230 -0
- package/dist/chunk-J6TZZVAM.cjs.map +1 -0
- package/dist/{chunk-7F7ZZW3L.cjs → chunk-LOR6PYH5.cjs} +25 -2
- package/dist/chunk-LOR6PYH5.cjs.map +1 -0
- package/dist/chunk-MA2QZEF5.cjs +399 -0
- package/dist/chunk-MA2QZEF5.cjs.map +1 -0
- package/dist/chunk-MI4IP4ZD.cjs +86 -0
- package/dist/chunk-MI4IP4ZD.cjs.map +1 -0
- package/dist/chunk-OCZLJKIA.cjs +41 -0
- package/dist/chunk-OCZLJKIA.cjs.map +1 -0
- package/dist/chunk-R5YAOJKB.js +71 -0
- package/dist/chunk-R5YAOJKB.js.map +1 -0
- package/dist/chunk-RY4M2CIQ.js +399 -0
- package/dist/chunk-RY4M2CIQ.js.map +1 -0
- package/dist/chunk-THMD5QO2.js +79 -0
- package/dist/chunk-THMD5QO2.js.map +1 -0
- package/dist/chunk-ZD2652WH.js +230 -0
- package/dist/chunk-ZD2652WH.js.map +1 -0
- package/dist/credit.cjs +1 -0
- package/dist/credit.cjs.map +1 -0
- package/dist/credit.d.cts +12 -0
- package/dist/credit.d.ts +12 -0
- package/dist/credit.js +1 -0
- package/dist/credit.js.map +1 -0
- package/dist/ethers.cjs +2 -2
- package/dist/ethers.cjs.map +1 -1
- package/dist/ethers.d.cts +15 -4
- package/dist/ethers.d.ts +15 -4
- package/dist/ethers.js +1 -1
- package/dist/index-CLhGwLxZ.d.cts +42 -0
- package/dist/index-Crp-ZFiM.d.ts +42 -0
- package/dist/index.cjs +69 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -14
- package/dist/index.d.ts +21 -14
- package/dist/index.js +64 -33
- package/dist/index.js.map +1 -1
- package/dist/note.cjs +11 -0
- package/dist/note.cjs.map +1 -0
- package/dist/note.d.cts +29 -0
- package/dist/note.d.ts +29 -0
- package/dist/note.js +11 -0
- package/dist/note.js.map +1 -0
- package/dist/{broadcaster-preparation-DMxxZ_1Q.d.cts → operation-bridge-CoECSxfi.d.cts} +130 -245
- package/dist/{broadcaster-preparation-DMxxZ_1Q.d.ts → operation-bridge-CoECSxfi.d.ts} +130 -245
- package/dist/preparation-HUBTVCZE.js +404 -0
- package/dist/preparation-HUBTVCZE.js.map +1 -0
- package/dist/preparation-QD3ZSYV5.cjs +404 -0
- package/dist/preparation-QD3ZSYV5.cjs.map +1 -0
- package/dist/provenance-preparation-43DN2WK7.cjs +16 -0
- package/dist/provenance-preparation-43DN2WK7.cjs.map +1 -0
- package/dist/provenance-preparation-HEZE4L5H.js +16 -0
- package/dist/provenance-preparation-HEZE4L5H.js.map +1 -0
- package/dist/provenance.cjs +59 -0
- package/dist/provenance.cjs.map +1 -0
- package/dist/provenance.d.cts +34 -0
- package/dist/provenance.d.ts +34 -0
- package/dist/provenance.js +59 -0
- package/dist/provenance.js.map +1 -0
- package/dist/{receipt-logs-m0-bhaxW.d.ts → receipt-logs-DQRJK0l8.d.cts} +84 -78
- package/dist/{receipt-logs-CvC951p7.d.cts → receipt-logs-fMR6Bwql.d.ts} +84 -78
- package/dist/session-support.cjs +28 -7
- package/dist/session-support.cjs.map +1 -1
- package/dist/session-support.d.cts +71 -39
- package/dist/session-support.d.ts +71 -39
- package/dist/session-support.js +58 -37
- package/dist/session-support.js.map +1 -1
- package/package.json +22 -6
- package/dist/broadcaster-preparation-RMWQFYNL.js +0 -11
- package/dist/broadcaster-preparation-UGOTO4SX.cjs +0 -11
- package/dist/broadcaster-preparation-UGOTO4SX.cjs.map +0 -1
- package/dist/chunk-7F7ZZW3L.cjs.map +0 -1
- package/dist/chunk-EHP5TBC6.js +0 -3565
- package/dist/chunk-EHP5TBC6.js.map +0 -1
- package/dist/chunk-GTPUYPQL.js.map +0 -1
- package/dist/chunk-ITTGBIG2.js +0 -1877
- package/dist/chunk-ITTGBIG2.js.map +0 -1
- package/dist/chunk-J2JH6HIG.cjs +0 -1877
- package/dist/chunk-J2JH6HIG.cjs.map +0 -1
- package/dist/chunk-LOU7AP2B.cjs.map +0 -1
- package/dist/chunk-RHNIHI4P.cjs +0 -3565
- package/dist/chunk-RHNIHI4P.cjs.map +0 -1
- package/dist/chunk-XHKQ2BO2.js.map +0 -1
- /package/dist/{broadcaster-preparation-RMWQFYNL.js.map → broadcaster-7ZKKSTZQ.js.map} +0 -0
package/dist/index.cjs
CHANGED
|
@@ -5,8 +5,12 @@
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
var _chunkDHQEB6JRcjs = require('./chunk-DHQEB6JR.cjs');
|
|
9
|
+
require('./chunk-BBSRP4MH.cjs');
|
|
10
|
+
require('./chunk-HCB7RQ3S.cjs');
|
|
8
11
|
|
|
9
12
|
|
|
13
|
+
var _chunkOCZLJKIAcjs = require('./chunk-OCZLJKIA.cjs');
|
|
10
14
|
|
|
11
15
|
|
|
12
16
|
|
|
@@ -15,22 +19,22 @@
|
|
|
15
19
|
|
|
16
20
|
|
|
17
21
|
|
|
18
|
-
var _chunkRHNIHI4Pcjs = require('./chunk-RHNIHI4P.cjs');
|
|
19
22
|
|
|
23
|
+
var _chunk3KTQQZOWcjs = require('./chunk-3KTQQZOW.cjs');
|
|
24
|
+
require('./chunk-MA2QZEF5.cjs');
|
|
20
25
|
|
|
21
26
|
|
|
22
27
|
|
|
23
28
|
|
|
24
29
|
|
|
25
30
|
|
|
26
|
-
var _chunkJ2JH6HIGcjs = require('./chunk-J2JH6HIG.cjs');
|
|
27
31
|
|
|
32
|
+
var _chunk4SDP53YQcjs = require('./chunk-4SDP53YQ.cjs');
|
|
28
33
|
|
|
29
|
-
var _chunk7F7ZZW3Lcjs = require('./chunk-7F7ZZW3L.cjs');
|
|
30
|
-
|
|
31
|
-
// src/index.ts
|
|
32
34
|
|
|
35
|
+
var _chunkLOR6PYH5cjs = require('./chunk-LOR6PYH5.cjs');
|
|
33
36
|
|
|
37
|
+
// src/index.ts
|
|
34
38
|
|
|
35
39
|
|
|
36
40
|
|
|
@@ -46,8 +50,8 @@ var _chunk7F7ZZW3Lcjs = require('./chunk-7F7ZZW3L.cjs');
|
|
|
46
50
|
|
|
47
51
|
|
|
48
52
|
|
|
49
|
-
var
|
|
50
|
-
var
|
|
53
|
+
var _primitives = require('@invisi-labs/primitives');
|
|
54
|
+
var _rpc = require('@invisi-labs/rpc');
|
|
51
55
|
|
|
52
56
|
// src/disclosure/DisclosureVerifier.ts
|
|
53
57
|
function check(value, message) {
|
|
@@ -82,7 +86,7 @@ var DisclosureVerifier = class {
|
|
|
82
86
|
"invalid disclosure confirmations"
|
|
83
87
|
);
|
|
84
88
|
this.#protocol = options.protocol;
|
|
85
|
-
this.#reader = "provider" in options ? new (0,
|
|
89
|
+
this.#reader = "provider" in options ? new (0, _chunkLOR6PYH5cjs.EthersChainReader)(options.provider) : options.reader;
|
|
86
90
|
this.#confirmations = BigInt(confirmations);
|
|
87
91
|
Object.freeze(this);
|
|
88
92
|
}
|
|
@@ -121,8 +125,8 @@ var DisclosureVerifier = class {
|
|
|
121
125
|
"invalid disclosure receipt block"
|
|
122
126
|
);
|
|
123
127
|
const { context } = this.#protocol;
|
|
124
|
-
const logs =
|
|
125
|
-
const candidates =
|
|
128
|
+
const logs = _chunkDHQEB6JRcjs.readProtocolLogs.call(void 0, receipt, context.protocolAddress);
|
|
129
|
+
const candidates = _chunkDHQEB6JRcjs.extractDeliveryCandidates.call(void 0, logs, context, receipt.block.number).filter(
|
|
126
130
|
(candidate2) => candidate2.treeId === selected.treeId && candidate2.leafIndex === selected.leafIndex && candidate2.role === selected.role && candidate2.tokenAddress.toLowerCase() === context.tokenAddress.toLowerCase()
|
|
127
131
|
);
|
|
128
132
|
check(
|
|
@@ -180,9 +184,9 @@ function protocolConnection(protocol) {
|
|
|
180
184
|
|
|
181
185
|
var _ethers = require('ethers');
|
|
182
186
|
var sources = /* @__PURE__ */ new WeakMap();
|
|
183
|
-
var Protocol = class _Protocol extends
|
|
187
|
+
var Protocol = class _Protocol extends _rpc.Protocol {
|
|
184
188
|
static async fromRpc(rpc, provider, options = {}) {
|
|
185
|
-
const verified = await
|
|
189
|
+
const verified = await _rpc.Protocol.fromRpc(rpc, provider, options);
|
|
186
190
|
const protocol = new _Protocol({ deployment: verified.deployment });
|
|
187
191
|
if (rpc.getBroadcasters)
|
|
188
192
|
sources.set(protocol, rpc);
|
|
@@ -194,9 +198,11 @@ var Protocol = class _Protocol extends _protocol.Protocol {
|
|
|
194
198
|
);
|
|
195
199
|
return protocol;
|
|
196
200
|
}
|
|
197
|
-
/**
|
|
201
|
+
/** Discover token support without disclosing a transaction or requesting a price. */
|
|
198
202
|
async getBroadcasters(options) {
|
|
203
|
+
_optionalChain([options, 'access', _ => _.signal, 'optionalAccess', _2 => _2.throwIfAborted, 'call', _3 => _3()]);
|
|
199
204
|
const token = _ethers.getAddress.call(void 0, options.tokenAddress);
|
|
205
|
+
if (BigInt(token) === 0n) throw Error("Invalid Broadcaster token address");
|
|
200
206
|
if (!this.deployment.broadcasterRegistry)
|
|
201
207
|
throw new Error("broadcaster registry is not configured");
|
|
202
208
|
const rpc = sources.get(this);
|
|
@@ -206,9 +212,11 @@ var Protocol = class _Protocol extends _protocol.Protocol {
|
|
|
206
212
|
let block;
|
|
207
213
|
const seen = /* @__PURE__ */ new Set();
|
|
208
214
|
do {
|
|
215
|
+
_optionalChain([options, 'access', _4 => _4.signal, 'optionalAccess', _5 => _5.throwIfAborted, 'call', _6 => _6()]);
|
|
209
216
|
const page = await rpc.getBroadcasters({
|
|
210
217
|
enabled: true,
|
|
211
218
|
limit: 100,
|
|
219
|
+
...options.signal ? { signal: options.signal } : {},
|
|
212
220
|
...after ? { after } : {},
|
|
213
221
|
...block ? { block } : {}
|
|
214
222
|
});
|
|
@@ -217,14 +225,28 @@ var Protocol = class _Protocol extends _protocol.Protocol {
|
|
|
217
225
|
page.broadcasters.map(async (entry) => {
|
|
218
226
|
if (!entry.enabled) return void 0;
|
|
219
227
|
try {
|
|
220
|
-
const client = new (0,
|
|
221
|
-
|
|
228
|
+
const client = new (0, _chunk3KTQQZOWcjs.BroadcasterClient)({
|
|
229
|
+
endpoint: entry.endpoint,
|
|
230
|
+
quoteSigner: entry.quoteSigner,
|
|
231
|
+
feeRecipient: entry.feeRecipient
|
|
232
|
+
});
|
|
233
|
+
if (!await client.supportsToken(
|
|
234
|
+
token,
|
|
235
|
+
{
|
|
236
|
+
chainId: this.context.chainId,
|
|
237
|
+
protocol: this.context.protocolAddress
|
|
238
|
+
},
|
|
239
|
+
options
|
|
240
|
+
))
|
|
241
|
+
return void 0;
|
|
222
242
|
return client;
|
|
223
243
|
} catch (e) {
|
|
244
|
+
_optionalChain([options, 'access', _7 => _7.signal, 'optionalAccess', _8 => _8.throwIfAborted, 'call', _9 => _9()]);
|
|
224
245
|
return void 0;
|
|
225
246
|
}
|
|
226
247
|
})
|
|
227
248
|
);
|
|
249
|
+
_optionalChain([options, 'access', _10 => _10.signal, 'optionalAccess', _11 => _11.throwIfAborted, 'call', _12 => _12()]);
|
|
228
250
|
clients.push(
|
|
229
251
|
...compatible.filter((client) => client !== void 0)
|
|
230
252
|
);
|
|
@@ -237,7 +259,7 @@ var Protocol = class _Protocol extends _protocol.Protocol {
|
|
|
237
259
|
};
|
|
238
260
|
|
|
239
261
|
// src/index.ts
|
|
240
|
-
|
|
262
|
+
|
|
241
263
|
|
|
242
264
|
// src/protocol/BroadcasterRegistry.ts
|
|
243
265
|
var _contracts = require('@invisi-labs/protocol/contracts');
|
|
@@ -310,7 +332,7 @@ var BroadcasterRegistry = class {
|
|
|
310
332
|
/** Discover event operators, then read their latest entry; disabled services remain explicit. */
|
|
311
333
|
async discover(options = {}) {
|
|
312
334
|
const { provider, fromBlock, blockRange } = this.#options;
|
|
313
|
-
_optionalChain([options, 'access',
|
|
335
|
+
_optionalChain([options, 'access', _13 => _13.signal, 'optionalAccess', _14 => _14.throwIfAborted, 'call', _15 => _15()]);
|
|
314
336
|
await this.validate();
|
|
315
337
|
const toBlock = await _asyncNullishCoalesce(options.toBlock, async () => ( await provider.getBlockNumber()));
|
|
316
338
|
if (!Number.isSafeInteger(toBlock) || toBlock < fromBlock) {
|
|
@@ -318,7 +340,7 @@ var BroadcasterRegistry = class {
|
|
|
318
340
|
}
|
|
319
341
|
const operators = /* @__PURE__ */ new Set();
|
|
320
342
|
for (let start = fromBlock; start <= toBlock; ) {
|
|
321
|
-
_optionalChain([options, 'access',
|
|
343
|
+
_optionalChain([options, 'access', _16 => _16.signal, 'optionalAccess', _17 => _17.throwIfAborted, 'call', _18 => _18()]);
|
|
322
344
|
const end = Math.min(start + blockRange - 1, toBlock);
|
|
323
345
|
const logs = await provider.getLogs({
|
|
324
346
|
address: this.address,
|
|
@@ -338,7 +360,7 @@ var BroadcasterRegistry = class {
|
|
|
338
360
|
}
|
|
339
361
|
const entries = [];
|
|
340
362
|
for (const operator of operators) {
|
|
341
|
-
_optionalChain([options, 'access',
|
|
363
|
+
_optionalChain([options, 'access', _19 => _19.signal, 'optionalAccess', _20 => _20.throwIfAborted, 'call', _21 => _21()]);
|
|
342
364
|
entries.push(await this.read(operator));
|
|
343
365
|
}
|
|
344
366
|
return entries;
|
|
@@ -349,10 +371,13 @@ var BroadcasterRegistry = class {
|
|
|
349
371
|
|
|
350
372
|
var ProtocolRpcClient = class extends _rpc.ProtocolRpcClient {
|
|
351
373
|
withProvider(provider) {
|
|
352
|
-
return this.withReader(new (0,
|
|
374
|
+
return this.withReader(new (0, _chunkLOR6PYH5cjs.EthersChainReader)(provider));
|
|
353
375
|
}
|
|
354
376
|
};
|
|
355
377
|
|
|
378
|
+
// src/index.ts
|
|
379
|
+
var _protocol = require('@invisi-labs/protocol');
|
|
380
|
+
|
|
356
381
|
// src/payment-note/PaymentNote.ts
|
|
357
382
|
|
|
358
383
|
|
|
@@ -391,17 +416,10 @@ async function verifyPaymentNote(data, protocol, options, wallet) {
|
|
|
391
416
|
const confirmations = _nullishCoalesce(options.confirmations, () => ( 1));
|
|
392
417
|
if (!Number.isSafeInteger(confirmations) || confirmations < 1)
|
|
393
418
|
throw new RangeError("confirmations must be positive");
|
|
394
|
-
const reader = _nullishCoalesce(options.chainReader, () => ( new (0,
|
|
419
|
+
const reader = _nullishCoalesce(options.chainReader, () => ( new (0, _chunkLOR6PYH5cjs.EthersChainReader)(options.provider)));
|
|
395
420
|
await protocol.validateDeployment(reader);
|
|
396
421
|
if (wallet && _ethers.getAddress.call(void 0, wallet.ownerAddress) !== _ethers.getAddress.call(void 0, data.ownerAddress))
|
|
397
422
|
throw new Error("Payment note owner mismatch");
|
|
398
|
-
if (wallet) {
|
|
399
|
-
if (typeof wallet.exportAuthorization !== "function")
|
|
400
|
-
throw new Error("Wallet spending authorization capability required");
|
|
401
|
-
const authorization = wallet.exportAuthorization();
|
|
402
|
-
if (_ethers.getAddress.call(void 0, authorization.ownerAddress) !== _ethers.getAddress.call(void 0, data.ownerAddress))
|
|
403
|
-
throw new Error("Wallet authorization owner mismatch");
|
|
404
|
-
}
|
|
405
423
|
const latest = await reader.getLatestBlockNumber();
|
|
406
424
|
const number = latest - BigInt(confirmations - 1);
|
|
407
425
|
if (number < protocol.deployment.protocol.fromBlock)
|
|
@@ -418,13 +436,13 @@ async function verifyPaymentNote(data, protocol, options, wallet) {
|
|
|
418
436
|
const result = await rpc.getNote(protocol.context, data.commitment, checkedAt);
|
|
419
437
|
if (!result) throw new Error("Payment note is not indexed at the requested confirmed block");
|
|
420
438
|
const { output, membership } = result;
|
|
421
|
-
if (output.commitment !== data.commitment || _ethers.getAddress.call(void 0, output.tokenAddress) !== _ethers.getAddress.call(void 0, data.tokenAddress) || membership.leaf !== data.commitment || membership.treeId !== output.treeId || membership.leafIndex !== output.leafIndex || membership.block.number > checkedAt.number || output.block.number > checkedAt.number || membership.path.length !==
|
|
439
|
+
if (output.commitment !== data.commitment || _ethers.getAddress.call(void 0, output.tokenAddress) !== _ethers.getAddress.call(void 0, data.tokenAddress) || membership.leaf !== data.commitment || membership.treeId !== output.treeId || membership.leafIndex !== output.leafIndex || membership.block.number > checkedAt.number || output.block.number > checkedAt.number || membership.path.length !== _primitives.TREE_DEPTH || !Number.isSafeInteger(output.leafIndex) || output.leafIndex < 0 || output.leafIndex >= 2 ** _primitives.TREE_DEPTH)
|
|
422
440
|
throw new Error("Payment note membership metadata mismatch");
|
|
423
441
|
let root = BigInt(data.commitment);
|
|
424
442
|
for (let level = 0; level < membership.path.length; level++) {
|
|
425
443
|
const sibling = membership.path[level];
|
|
426
444
|
root = BigInt(
|
|
427
|
-
await
|
|
445
|
+
await _primitives.poseidonHash.call(void 0, output.leafIndex >> level & 1 ? [sibling, root] : [root, sibling])
|
|
428
446
|
);
|
|
429
447
|
}
|
|
430
448
|
if (root !== BigInt(membership.root) || !await reader.isKnownRoot(protocol.context, membership.treeId, membership.root, checkedAt))
|
|
@@ -434,7 +452,12 @@ async function verifyPaymentNote(data, protocol, options, wallet) {
|
|
|
434
452
|
let spendabilityCheckedAt;
|
|
435
453
|
if (wallet) {
|
|
436
454
|
const current = await reader.getBlock(await reader.getLatestBlockNumber());
|
|
437
|
-
const nullifier = await
|
|
455
|
+
const nullifier = await _primitives.computeNoteNullifier.call(void 0,
|
|
456
|
+
data.chainId,
|
|
457
|
+
BigInt(data.protocolAddress),
|
|
458
|
+
data.nonce,
|
|
459
|
+
data.commitment
|
|
460
|
+
);
|
|
438
461
|
const spent = await reader.isSpent(protocol.context, [nullifier], current);
|
|
439
462
|
if (spent.length !== 1 || spent[0] !== false)
|
|
440
463
|
throw new Error("Payment note is already spent");
|
|
@@ -518,16 +541,17 @@ var PaymentNote = class _PaymentNote {
|
|
|
518
541
|
Object.freeze(this);
|
|
519
542
|
}
|
|
520
543
|
static async from(ipn) {
|
|
521
|
-
const data =
|
|
522
|
-
const identity = await
|
|
523
|
-
const commitment = await
|
|
544
|
+
const data = _chunk4SDP53YQcjs.decodePaymentNote.call(void 0, ipn);
|
|
545
|
+
const identity = await _primitives.computeNoteIdentity.call(void 0, BigInt(data.ownerAddress), data.nonce);
|
|
546
|
+
const commitment = await _primitives.computeNoteCommitment.call(void 0,
|
|
524
547
|
data.chainId,
|
|
548
|
+
BigInt(data.protocolAddress),
|
|
525
549
|
identity,
|
|
526
550
|
BigInt(data.tokenAddress),
|
|
527
551
|
data.amount
|
|
528
552
|
);
|
|
529
553
|
if (commitment !== data.commitment) throw new Error("Payment note commitment mismatch");
|
|
530
|
-
return new _PaymentNote(data,
|
|
554
|
+
return new _PaymentNote(data, _chunk4SDP53YQcjs.encodePaymentNote.call(void 0, data));
|
|
531
555
|
}
|
|
532
556
|
async verify(protocol, options = {}) {
|
|
533
557
|
const result = await verifyPaymentNote(
|
|
@@ -540,8 +564,7 @@ var PaymentNote = class _PaymentNote {
|
|
|
540
564
|
return verified;
|
|
541
565
|
}
|
|
542
566
|
async verifySpendable(protocol, wallet, options = {}) {
|
|
543
|
-
if (!(wallet instanceof
|
|
544
|
-
throw new Error("Wallet spending authorization capability required");
|
|
567
|
+
if (!(wallet instanceof _primitives.Wallet)) throw new Error("A public Wallet is required");
|
|
545
568
|
const result = await verifyPaymentNote(
|
|
546
569
|
this.data(),
|
|
547
570
|
protocol,
|
|
@@ -562,6 +585,14 @@ var PaymentNote = class _PaymentNote {
|
|
|
562
585
|
}
|
|
563
586
|
};
|
|
564
587
|
|
|
588
|
+
// src/index.ts
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
|
|
565
596
|
|
|
566
597
|
|
|
567
598
|
|
|
@@ -609,5 +640,5 @@ var PaymentNote = class _PaymentNote {
|
|
|
609
640
|
|
|
610
641
|
|
|
611
642
|
|
|
612
|
-
exports.AddressRegistry =
|
|
643
|
+
exports.AddressRegistry = _chunkDHQEB6JRcjs.AddressRegistry; exports.BroadcasterClient = _chunk3KTQQZOWcjs.BroadcasterClient; exports.BroadcasterRegistry = BroadcasterRegistry; exports.BroadcasterRpcError = _chunk3KTQQZOWcjs.BroadcasterRpcError; exports.DeliveryAuthenticationError = _primitives.DeliveryAuthenticationError; exports.DeliveryDecryptionError = _primitives.DeliveryDecryptionError; exports.Detector = _primitives.Detector; exports.Disclosure = _primitives.Disclosure; exports.DisclosureVerifier = DisclosureVerifier; exports.Invisi = _chunkDHQEB6JRcjs.Invisi; exports.InvisiError = _chunk4SDP53YQcjs.InvisiError; exports.MAX_MEMO_BYTES = _primitives.MAX_MEMO_BYTES; exports.MAX_UPDATE_BLOCKS = _rpc.MAX_UPDATE_BLOCKS; exports.MissingCapabilityError = _primitives.MissingCapabilityError; exports.NoteOutput = _chunk4SDP53YQcjs.NoteOutput; exports.NullifierCapability = _primitives.NullifierCapability; exports.PaymentNote = PaymentNote; exports.PreparedTransaction = _chunkDHQEB6JRcjs.PreparedTransaction; exports.Protocol = Protocol; exports.ProtocolRpcClient = ProtocolRpcClient; exports.ProtocolRpcError = _rpc.ProtocolRpcError; exports.RegistrationOperation = _rpc.RegistrationOperation; exports.SpendablePaymentNote = SpendablePaymentNote; exports.TransactionOutput = _chunkOCZLJKIAcjs.TransactionOutput; exports.VerifiedPaymentNote = VerifiedPaymentNote; exports.ViewingCapability = _primitives.ViewingCapability; exports.Wallet = _primitives.Wallet; exports.authenticatedDecryptor = _primitives.authenticatedDecryptor; exports.broadcasterQuoteDomain = _chunk3KTQQZOWcjs.broadcasterQuoteDomain; exports.broadcasterQuoteTypes = _chunk3KTQQZOWcjs.broadcasterQuoteTypes; exports.broadcasterRequestHash = _chunk3KTQQZOWcjs.broadcasterRequestHash; exports.broadcasterTransactInterface = _chunk3KTQQZOWcjs.broadcasterTransactInterface; exports.computeCreditNullifier = _primitives.computeCreditNullifier; exports.creditPeriods = _primitives.creditPeriods; exports.creditV1 = _primitives.creditV1; exports.decodeBroadcasterIntent = _chunk3KTQQZOWcjs.decodeBroadcasterIntent; exports.decodeDeliveryHeader = _primitives.decodeDeliveryHeader; exports.decodeMemoText = _primitives.decodeMemoText; exports.decodePaymentNote = _chunk4SDP53YQcjs.decodePaymentNote; exports.decodePaymentRequest = _chunk4SDP53YQcjs.decodePaymentRequest; exports.decryptCandidates = _chunkDHQEB6JRcjs.decryptCandidates; exports.encodeMemo = _primitives.encodeMemo; exports.encodePaymentNote = _chunk4SDP53YQcjs.encodePaymentNote; exports.encodePaymentRequest = _chunk4SDP53YQcjs.encodePaymentRequest; exports.fundsV1 = _primitives.fundsV1; exports.getDocumentedGasReference = _protocol.getDocumentedGasReference; exports.readProtocolLogs = _chunkDHQEB6JRcjs.readProtocolLogs; exports.verifyBroadcasterQuote = _chunk3KTQQZOWcjs.verifyBroadcasterQuote;
|
|
613
644
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/invisi-sdk-ts/invisi-sdk-ts/packages/sdk/dist/index.cjs","../src/index.ts","../src/disclosure/DisclosureVerifier.ts","../src/protocol/connections.ts","../src/protocol/Protocol.ts","../src/protocol/BroadcasterRegistry.ts","../src/protocol/ProtocolRpcClient.ts","../src/payment-note/PaymentNote.ts","../src/payment-note/verification.ts"],"names":["candidate","getAddress"],"mappings":"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","file":"/home/runner/work/invisi-sdk-ts/invisi-sdk-ts/packages/sdk/dist/index.cjs","sourcesContent":[null,"export {\n Detector,\n Disclosure,\n MAX_MEMO_BYTES,\n MissingCapabilityError,\n NullifierCapability,\n PublicWallet,\n ViewingCapability,\n Wallet,\n WalletAuthorization,\n computeCreditNullifier,\n creditPeriods,\n creditV1,\n decodeDeliveryHeader,\n decodeMemoText,\n encodeMemo,\n fundsV1,\n} from \"@invisi-labs/core\";\nexport type {\n Address,\n CreditDataV1,\n CreditDeliveryState,\n CreditNote,\n CreditOpening,\n CreditPolicy,\n DisclosureExport,\n DisclosureOutput,\n DisclosureResult,\n FundsDataV1,\n Hex,\n Memo,\n Note,\n ReceivingKeys,\n WalletAuthorizationProvider,\n} from \"@invisi-labs/core\";\nexport { RegistrationOperation } from \"@invisi-labs/protocol\";\nexport type {\n AddressRegistryOptions,\n CanonicalBlock,\n CanonicalReceipt,\n ChainReader,\n FactoryReader,\n Membership,\n ProtocolDataProvider,\n ProtocolDataStatus,\n ProtocolOptions,\n ProtocolUpdateRange,\n ProtocolUpdates,\n RegistryContext,\n RegistryReader,\n TokenProtocol,\n TokenProtocolOptions,\n TransactionCall,\n TransactionContext,\n} from \"@invisi-labs/protocol\";\nexport type {\n AggregateMember,\n AggregatorCapability,\n ProofBundle,\n ProofStatement,\n Prover,\n ProverOptions,\n} from \"@invisi-labs/prover\";\nexport { Invisi } from \"./client/Invisi\";\nexport type { InvisiOptions, RegistrationPreparationOptions } from \"./client/Invisi\";\nexport { DisclosureVerifier } from \"./disclosure/DisclosureVerifier\";\nexport type {\n DisclosureEvidence,\n DisclosureReader,\n DisclosureReference,\n DisclosureVerifierOptions,\n VerifiedDisclosure,\n} from \"./disclosure/DisclosureVerifier\";\nexport { InvisiError } from \"./errors\";\nexport type { InvisiErrorCode, InvisiErrorDetails } from \"./errors\";\nexport { NoteOutput } from \"./notes/NoteOutput\";\nexport type { NoteOutputContext, PaymentRequest, NoteOutputRecipient } from \"./notes/NoteOutput\";\nexport { Protocol } from \"./protocol/Protocol\";\nexport type {\n CancelCreditPreparation,\n CreateCreditPreparation,\n DrawCreditPreparation,\n FundingAuthorizationVerifier,\n FundingSigner,\n FundingSource,\n FundingTypedData,\n OperationAggregateMember,\n ShieldPreparation,\n TopUpCreditPreparation,\n TransactionExecution,\n TransactionProveOptions,\n TransferPreparation,\n} from \"./transactions/operation-types\";\n\nexport { MAX_UPDATE_BLOCKS, ProtocolRpcError } from \"@invisi-labs/rpc\";\nexport type {\n ProtocolDeployment,\n ProtocolRpcChain,\n ProtocolRpcClientOptions,\n ProtocolRpcConnectionOptions,\n ProtocolRpcReader,\n RegisteredReceivingAddress,\n} from \"@invisi-labs/rpc\";\nexport { AddressRegistry } from \"./protocol/AddressRegistry\";\nexport { BroadcasterRegistry } from \"./protocol/BroadcasterRegistry\";\nexport type {\n BroadcasterRegistration,\n BroadcasterRegistryOptions,\n RegisteredBroadcaster,\n} from \"./protocol/BroadcasterRegistry\";\nexport { ProtocolRpcClient } from \"./protocol/ProtocolRpcClient\";\n\nexport { PreparedTransaction } from \"./transactions/execution/PreparedTransaction\";\nexport type {\n CreditInput,\n ExplicitCancelCreditPreparation,\n ExplicitCreateCreditPreparation,\n ExplicitDrawCreditPreparation,\n ExplicitShieldPreparation,\n ExplicitTopUpCreditPreparation,\n ExplicitTransferPreparation,\n NoteInput,\n TransactionIdentity,\n} from \"./transactions/explicit-types\";\n\nexport type {\n GasBenchmarkCircuit,\n GasBenchmarkDeployment,\n GasBenchmarkProfile,\n GasBenchmarkSample,\n GasBenchmarkShape,\n GasReference,\n} from \"./gas/gas-estimation\";\n\nexport { defineGasBenchmarks } from \"./gas/gas-estimation\";\n\nexport type { SigningRequest } from \"@invisi-labs/core\";\n\n// Stateless recovery for applications that supply canonical receipts without a wallet store.\nexport { decryptCandidates } from \"./discovery/discovery\";\nexport type { DeliveryEventLog, DiscoveredCredit, DiscoveredNote } from \"./discovery/discovery\";\nexport { readProtocolLogs } from \"./discovery/receipt-logs\";\n\nexport type {\n ProtocolCreditTransition,\n ProtocolOutput,\n ProtocolTransactionUpdates,\n} from \"@invisi-labs/rpc\";\n\nexport * from \"./broadcaster/index\";\n\nexport type {\n BroadcasterFeeSource,\n WithBroadcasterOptions,\n} from \"./broadcaster/broadcaster-preparation\";\n\nexport { encodePaymentRequest, decodePaymentRequest } from \"./payment-request/codec\";\nexport type { NoteOutputExecutionOptions } from \"./payment-request/types\";\n\nexport { PaymentNote, VerifiedPaymentNote, SpendablePaymentNote } from \"./payment-note/PaymentNote\";\nexport { encodePaymentNote, decodePaymentNote } from \"./payment-note/codec\";\nexport type { PaymentNoteData } from \"./payment-note/types\";\nexport type {\n PaymentNoteVerificationOptions,\n PaymentNoteVerificationSettings,\n} from \"./payment-note/verification\";\nexport { TransactionOutput } from \"./notes/TransactionOutput\";\n","import type { Hex } from \"@invisi-labs/protocol/contracts\";\nimport type { Provider } from \"ethers\";\nimport { readProtocolLogs } from \"../discovery/receipt-logs\";\nimport { EthersChainReader } from \"../integrations/ethers\";\n\nimport { Disclosure, type DisclosureOutput, type DisclosureResult } from \"@invisi-labs/core\";\nimport { TokenProtocol, type CanonicalBlock, type ChainReader } from \"@invisi-labs/protocol\";\nimport { extractDeliveryCandidates } from \"../discovery/discovery\";\n\nexport interface DisclosureReference {\n transactionHash: Hex;\n treeId: bigint;\n leafIndex: number;\n role: \"funds\" | \"owner\" | \"spender\";\n}\n\nexport type DisclosureReader = Pick<\n ChainReader,\n \"getChainId\" | \"getCode\" | \"getReceipt\" | \"getBlock\" | \"getLatestBlockNumber\"\n>;\n\nexport interface DisclosureVerifierOptions {\n protocol: TokenProtocol;\n reader: DisclosureReader;\n /** Minimum confirmations including the inclusion block; defaults to one. */\n confirmations?: number;\n}\n\nexport interface DisclosureEvidence {\n reference: Readonly<DisclosureReference>;\n block: Readonly<CanonicalBlock>;\n confirmations: bigint;\n output: Readonly<DisclosureOutput>;\n}\n\nexport interface VerifiedDisclosure {\n result: DisclosureResult;\n block: Readonly<CanonicalBlock>;\n confirmations: bigint;\n output: Readonly<DisclosureReference & { commitment: Hex }>;\n}\n\nfunction check(value: unknown, message: string): asserts value {\n if (!value) throw new Error(message);\n}\n\nfunction reference(value: DisclosureReference): DisclosureReference {\n check(/^0x[0-9a-fA-F]{64}$/.test(value.transactionHash), \"invalid disclosure transaction hash\");\n check(\n typeof value.treeId === \"bigint\" && value.treeId > 0n && value.treeId < 1n << 64n,\n \"invalid disclosure tree ID\"\n );\n check(\n Number.isSafeInteger(value.leafIndex) && value.leafIndex >= 0 && value.leafIndex < 65536,\n \"invalid disclosure leaf index\"\n );\n check([\"funds\", \"owner\", \"spender\"].includes(value.role), \"invalid disclosure reference role\");\n return {\n transactionHash: value.transactionHash.toLowerCase() as Hex,\n treeId: value.treeId,\n leafIndex: value.leafIndex,\n role: value.role,\n };\n}\n\n/** Read-only verification against a trusted RPC and authenticated protocol deployment.\n * Results establish output content/inclusion at a block, not payer identity, spent state or wallet completeness.\n */\nexport class DisclosureVerifier {\n readonly #protocol: TokenProtocol;\n readonly #reader: DisclosureReader;\n readonly #confirmations: bigint;\n\n constructor(\n options:\n | DisclosureVerifierOptions\n | (Omit<DisclosureVerifierOptions, \"reader\"> & { provider: Provider })\n ) {\n const confirmations = options.confirmations ?? 1;\n check(\n Number.isSafeInteger(confirmations) && confirmations >= 1,\n \"invalid disclosure confirmations\"\n );\n this.#protocol = options.protocol;\n this.#reader =\n \"provider\" in options ? new EthersChainReader(options.provider) : options.reader;\n this.#confirmations = BigInt(confirmations);\n Object.freeze(this);\n }\n\n private async barrier(block: Readonly<CanonicalBlock>): Promise<bigint> {\n await this.#protocol.validateDeployment(this.#reader);\n const canonical = await this.#reader.getBlock(block.number);\n check(\n canonical.number === block.number &&\n canonical.hash.toLowerCase() === block.hash.toLowerCase(),\n \"disclosure canonical block changed; reorg verification required\"\n );\n const head = await this.#reader.getLatestBlockNumber();\n check(\n head >= block.number && head - block.number + 1n >= this.#confirmations,\n \"insufficient disclosure confirmations\"\n );\n check(\n (await this.#reader.getChainId()) === this.#protocol.context.chainId,\n \"disclosure chain changed during verification\"\n );\n return head - block.number + 1n;\n }\n\n /** Resolve the exact inserted output and its delivery from a successful canonical receipt. */\n async readOutput(value: DisclosureReference): Promise<DisclosureEvidence> {\n const selected = reference(value);\n await this.#protocol.validateDeployment(this.#reader);\n const received = await this.#reader.getReceipt(selected.transactionHash);\n check(received, \"disclosure transaction receipt is unavailable\");\n const receipt = structuredClone(received);\n check(receipt.status === \"success\", \"disclosure requires a successful transaction receipt\");\n check(\n receipt.transactionHash.toLowerCase() === selected.transactionHash,\n \"disclosure receipt transaction mismatch\"\n );\n check(\n typeof receipt.block.number === \"bigint\" &&\n receipt.block.number >= 0n &&\n /^0x[0-9a-fA-F]{64}$/.test(receipt.block.hash),\n \"invalid disclosure receipt block\"\n );\n const { context } = this.#protocol;\n const logs = readProtocolLogs(receipt, context.protocolAddress);\n const candidates = extractDeliveryCandidates(logs, context, receipt.block.number).filter(\n (candidate) =>\n candidate.treeId === selected.treeId &&\n candidate.leafIndex === selected.leafIndex &&\n candidate.role === selected.role &&\n candidate.tokenAddress.toLowerCase() === context.tokenAddress.toLowerCase()\n );\n check(\n candidates.length === 1,\n \"disclosure output has no unique canonical insertion and delivery\"\n );\n const candidate = candidates[0]!;\n const confirmations = await this.barrier(receipt.block);\n return Object.freeze({\n reference: Object.freeze(selected),\n block: Object.freeze({ ...receipt.block }),\n confirmations,\n output: Object.freeze({\n chainId: context.chainId,\n protocolAddress: BigInt(context.protocolAddress),\n tokenAddress: BigInt(context.tokenAddress),\n outputCommitment: candidate.commitment,\n role: selected.role,\n ciphertext: candidate.delivery.ciphertext,\n }),\n });\n }\n\n async verify(disclosure: Disclosure, value: DisclosureReference): Promise<VerifiedDisclosure> {\n const evidence = await this.readOutput(value);\n const result = await disclosure.verify(evidence.output);\n const confirmations = await this.barrier(evidence.block);\n return Object.freeze({\n result: Object.freeze(result),\n block: evidence.block,\n confirmations,\n output: Object.freeze({\n ...evidence.reference,\n commitment: evidence.output.outputCommitment,\n }),\n });\n }\n\n toJSON() {\n return { disclosureVerifier: true, confirmations: this.#confirmations.toString() };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","import type { Protocol } from \"@invisi-labs/protocol\";\nimport type { ProtocolRpcClient } from \"@invisi-labs/rpc\";\nimport type { Provider } from \"ethers\";\n\n/** Public network connections only; never holds wallet keys or a signer. */\nconst connections = new WeakMap<\n Protocol,\n { provider: Provider; protocolRpc: Pick<ProtocolRpcClient, \"withReader\"> }\n>();\nexport function rememberProtocolConnection(\n protocol: Protocol,\n provider: Provider,\n protocolRpc: Pick<ProtocolRpcClient, \"withReader\">\n): void {\n connections.set(protocol, { provider, protocolRpc });\n}\nexport function protocolConnection(protocol: Protocol) {\n return connections.get(protocol);\n}\n","import { rememberProtocolConnection } from \"./connections\";\nimport { Protocol as BaseProtocol } from \"@invisi-labs/protocol\";\nimport type { ProtocolRpcClient } from \"@invisi-labs/rpc\";\nimport { getAddress, type Provider } from \"ethers\";\nimport { BroadcasterClient } from \"../broadcaster/index\";\n\nconst sources = new WeakMap<Protocol, Pick<ProtocolRpcClient, \"getBroadcasters\">>();\n\n/** Deployment operations and token-compatible broadcaster discovery. */\nexport class Protocol extends BaseProtocol {\n static override async fromRpc(\n rpc: Pick<ProtocolRpcClient, \"getDeployment\"> &\n Partial<Pick<ProtocolRpcClient, \"getBroadcasters\" | \"withReader\">>,\n provider: Provider,\n options: { signal?: AbortSignal } = {}\n ): Promise<Protocol> {\n const verified = await BaseProtocol.fromRpc(rpc, provider, options);\n const protocol = new Protocol({ deployment: verified.deployment });\n if (rpc.getBroadcasters)\n sources.set(protocol, rpc as Pick<ProtocolRpcClient, \"getBroadcasters\">);\n if (rpc.withReader)\n rememberProtocolConnection(\n protocol,\n provider,\n rpc as Pick<ProtocolRpcClient, \"withReader\">\n );\n return protocol;\n }\n\n /** Returns enabled services that answer a token fee probe; final quotes are checked by prepared. */\n async getBroadcasters(options: { tokenAddress: string }): Promise<BroadcasterClient[]> {\n const token = getAddress(options.tokenAddress);\n if (!this.deployment.broadcasterRegistry)\n throw new Error(\"broadcaster registry is not configured\");\n const rpc = sources.get(this);\n if (!rpc) throw new Error(\"broadcaster discovery requires Protocol.fromRpc\");\n const clients: BroadcasterClient[] = [];\n let after: `0x${string}` | undefined;\n let block: Awaited<ReturnType<ProtocolRpcClient[\"getBroadcasters\"]>>[\"block\"] | undefined;\n const seen = new Set<string>();\n do {\n const page = await rpc.getBroadcasters({\n enabled: true,\n limit: 100,\n ...(after ? { after } : {}),\n ...(block ? { block } : {}),\n });\n block ??= page.block;\n const compatible = await Promise.all(\n page.broadcasters.map(async (entry) => {\n if (!entry.enabled) return undefined;\n try {\n const client = new BroadcasterClient(entry);\n await client.fee(token);\n return client;\n } catch {\n return undefined;\n }\n })\n );\n clients.push(\n ...compatible.filter((client): client is BroadcasterClient => client !== undefined)\n );\n after = page.next;\n if (after && seen.has(after)) throw new Error(\"repeated broadcaster pagination cursor\");\n if (after) seen.add(after);\n } while (after);\n return clients;\n }\n}\n","import type { TransactionCall } from \"@invisi-labs/protocol\";\nimport { broadcasterRegistryAbi, type Address, type Hex } from \"@invisi-labs/protocol/contracts\";\nimport { getAddress, Interface, keccak256, type Provider } from \"ethers\";\n\nexport interface BroadcasterRegistration {\n endpoint: string;\n metadataURI?: string;\n quoteSigner: Address;\n feeRecipient: Address;\n}\n\nexport interface RegisteredBroadcaster extends Required<BroadcasterRegistration> {\n operator: Address;\n enabled: boolean;\n}\n\nexport interface BroadcasterRegistryOptions {\n provider: Provider;\n address: Address;\n chainId: bigint;\n fromBlock: number;\n runtimeCodeHash: string;\n /** Maximum blocks per getLogs request. Defaults to 2,000. */\n blockRange?: number;\n}\n\nconst abi = new Interface(broadcasterRegistryAbi);\n\nfunction address(value: string): Address {\n const normalized = getAddress(value) as Address;\n if (BigInt(normalized) === 0n) throw new Error(\"zero broadcaster address\");\n return normalized;\n}\n\n/** Optional on-chain discovery. Registry entries do not authorize spending or endorse operators. */\nexport class BroadcasterRegistry {\n readonly address: Address;\n readonly #options: Readonly<BroadcasterRegistryOptions>;\n\n constructor(options: BroadcasterRegistryOptions) {\n this.address = address(options.address);\n const blockRange = options.blockRange ?? 2_000;\n if (\n options.chainId <= 0n ||\n !Number.isSafeInteger(options.fromBlock) ||\n options.fromBlock < 0 ||\n !Number.isSafeInteger(blockRange) ||\n blockRange < 1 ||\n blockRange > 100_000 ||\n !/^0x[0-9a-fA-F]{64}$/.test(options.runtimeCodeHash)\n )\n throw new Error(\"invalid broadcaster registry configuration\");\n this.#options = Object.freeze({ ...options, blockRange });\n }\n\n prepareRegistration(registration: BroadcasterRegistration): TransactionCall {\n const { endpoint, metadataURI = \"\" } = registration;\n if (\n !endpoint.startsWith(\"https://\") ||\n endpoint.length <= 8 ||\n endpoint.length > 2048 ||\n /[^\\x21-\\x7e]/.test(endpoint)\n )\n throw new Error(\"broadcaster endpoint must be a printable HTTPS URI\");\n // Parse locally for a useful error; the registry additionally enforces its byte limits.\n const url = new URL(endpoint);\n if (!url.hostname || url.username || url.password) {\n throw new Error(\"broadcaster HTTPS endpoint must not include credentials\");\n }\n if (metadataURI.length > 2048 || /[^\\x21-\\x7e]/.test(metadataURI)) {\n throw new Error(\"invalid broadcaster metadata URI\");\n }\n return this.call(\"setBroadcaster\", [\n endpoint,\n metadataURI,\n address(registration.quoteSigner),\n address(registration.feeRecipient),\n ]);\n }\n\n prepareAvailability(enabled: boolean): TransactionCall {\n return this.call(\"setEnabled\", [enabled]);\n }\n\n private call(name: string, args: readonly unknown[]): TransactionCall {\n return { to: this.address, data: abi.encodeFunctionData(name, args) as Hex, value: 0n };\n }\n\n private async validate(): Promise<void> {\n const { provider, chainId, runtimeCodeHash } = this.#options;\n if ((await provider.getNetwork()).chainId !== chainId) {\n throw new Error(\"broadcaster registry chain mismatch\");\n }\n if (\n keccak256(await provider.getCode(this.address)).toLowerCase() !==\n runtimeCodeHash.toLowerCase()\n ) {\n throw new Error(\"broadcaster registry runtime code mismatch\");\n }\n }\n\n async get(operator: Address): Promise<RegisteredBroadcaster> {\n await this.validate();\n return this.read(address(operator));\n }\n\n private async read(operator: Address): Promise<RegisteredBroadcaster> {\n const result = await this.#options.provider.call(this.call(\"broadcasterOf\", [operator]));\n const [entry] = abi.decodeFunctionResult(\"broadcasterOf\", result);\n return {\n operator,\n endpoint: entry.endpoint,\n metadataURI: entry.metadataURI,\n quoteSigner: address(entry.quoteSigner),\n feeRecipient: address(entry.feeRecipient),\n enabled: entry.enabled,\n };\n }\n\n /** Discover event operators, then read their latest entry; disabled services remain explicit. */\n async discover(\n options: { toBlock?: number; signal?: AbortSignal } = {}\n ): Promise<RegisteredBroadcaster[]> {\n const { provider, fromBlock, blockRange } = this.#options;\n options.signal?.throwIfAborted();\n await this.validate();\n const toBlock = options.toBlock ?? (await provider.getBlockNumber());\n if (!Number.isSafeInteger(toBlock) || toBlock < fromBlock) {\n throw new Error(\"invalid broadcaster discovery block range\");\n }\n const operators = new Set<Address>();\n for (let start = fromBlock; start <= toBlock;) {\n options.signal?.throwIfAborted();\n const end = Math.min(start + blockRange! - 1, toBlock);\n const logs = await provider.getLogs({\n address: this.address,\n topics: [abi.getEvent(\"BroadcasterSet\")!.topicHash],\n fromBlock: start,\n toBlock: end,\n });\n for (const log of logs) {\n if (getAddress(log.address) !== this.address)\n throw new Error(\"registry event address mismatch\");\n const event = abi.parseLog(log);\n if (!event || event.name !== \"BroadcasterSet\")\n throw new Error(\"invalid registry event\");\n operators.add(address(event.args.operator));\n }\n start = end + 1;\n }\n const entries: RegisteredBroadcaster[] = [];\n for (const operator of operators) {\n options.signal?.throwIfAborted();\n entries.push(await this.read(operator));\n }\n return entries;\n }\n}\n","import { ProtocolRpcClient as RpcClient } from \"@invisi-labs/rpc\";\nimport type { Provider } from \"ethers\";\nimport { EthersChainReader } from \"../integrations/ethers\";\n\n/** Protocol RPC transport with ethers provider integration for independent chain checks. */\nexport class ProtocolRpcClient extends RpcClient {\n withProvider(provider: Provider): RpcClient {\n return this.withReader(new EthersChainReader(provider));\n }\n}\n","import { computeNoteIdentity, computeNoteCommitment, Wallet } from \"@invisi-labs/core\";\nimport type { Protocol, Membership, CanonicalBlock } from \"@invisi-labs/protocol\";\nimport type { NoteInput } from \"../transactions/explicit-types\";\nimport { decodePaymentNote, encodePaymentNote } from \"./codec\";\nimport type { PaymentNoteData } from \"./types\";\nimport {\n verifyPaymentNote,\n verificationOptions,\n type PaymentNoteVerificationSettings,\n type PaymentNoteVerificationOptions,\n} from \"./verification\";\n\nconst verification = Symbol(\"PaymentNote verification\");\nexport class VerifiedPaymentNote {\n readonly #membership: Membership;\n readonly #checkedAt: CanonicalBlock;\n constructor(token: symbol, membership: Membership, checkedAt: CanonicalBlock) {\n if (token !== verification) throw new Error(\"Payment note verification required\");\n this.#membership = structuredClone(membership);\n this.#checkedAt = structuredClone(checkedAt);\n }\n get membership(): Membership {\n return structuredClone(this.#membership);\n }\n get checkedAt(): CanonicalBlock {\n return structuredClone(this.#checkedAt);\n }\n}\nexport class SpendablePaymentNote extends VerifiedPaymentNote {\n readonly #input: NoteInput;\n readonly #spendabilityCheckedAt: CanonicalBlock;\n constructor(\n token: symbol,\n input: NoteInput,\n membership: Membership,\n checkedAt: CanonicalBlock,\n spendabilityCheckedAt: CanonicalBlock\n ) {\n super(token, membership, checkedAt);\n this.#input = structuredClone(input);\n this.#spendabilityCheckedAt = structuredClone(spendabilityCheckedAt);\n Object.freeze(this);\n }\n get spendabilityCheckedAt(): CanonicalBlock {\n return structuredClone(this.#spendabilityCheckedAt);\n }\n toInput(): NoteInput {\n return structuredClone(this.#input);\n }\n}\n/** A validated Note opening, independent of an indexed wallet store. */\nexport class PaymentNote implements PaymentNoteData {\n readonly chainId: bigint;\n readonly protocolAddress: PaymentNoteData[\"protocolAddress\"];\n readonly tokenAddress: PaymentNoteData[\"tokenAddress\"];\n readonly amount: bigint;\n readonly ownerAddress: PaymentNoteData[\"ownerAddress\"];\n readonly nonce: bigint;\n readonly commitment: PaymentNoteData[\"commitment\"];\n readonly ipn: string;\n private constructor(data: PaymentNoteData, ipn: string) {\n this.chainId = data.chainId;\n this.protocolAddress = data.protocolAddress;\n this.tokenAddress = data.tokenAddress;\n this.amount = data.amount;\n this.ownerAddress = data.ownerAddress;\n this.nonce = data.nonce;\n this.commitment = data.commitment;\n this.ipn = ipn;\n Object.freeze(this);\n }\n static async from(ipn: string): Promise<PaymentNote> {\n const data = decodePaymentNote(ipn);\n const identity = await computeNoteIdentity(BigInt(data.ownerAddress), data.nonce);\n const commitment = await computeNoteCommitment(\n data.chainId,\n identity,\n BigInt(data.tokenAddress),\n data.amount\n );\n if (commitment !== data.commitment) throw new Error(\"Payment note commitment mismatch\");\n return new PaymentNote(data, encodePaymentNote(data));\n }\n async verify(\n protocol: Protocol,\n options: PaymentNoteVerificationOptions | PaymentNoteVerificationSettings = {}\n ): Promise<VerifiedPaymentNote> {\n const result = await verifyPaymentNote(\n this.data(),\n protocol,\n verificationOptions(protocol, options)\n );\n const verified = new VerifiedPaymentNote(verification, result.membership, result.checkedAt);\n Object.freeze(verified);\n return verified;\n }\n async verifySpendable(\n protocol: Protocol,\n wallet: Wallet,\n options: PaymentNoteVerificationOptions | PaymentNoteVerificationSettings = {}\n ): Promise<SpendablePaymentNote> {\n if (!(wallet instanceof Wallet))\n throw new Error(\"Wallet spending authorization capability required\");\n const result = await verifyPaymentNote(\n this.data(),\n protocol,\n verificationOptions(protocol, options),\n wallet\n );\n return new SpendablePaymentNote(\n verification,\n result.input,\n result.membership,\n result.checkedAt,\n result.spendabilityCheckedAt!\n );\n }\n private data(): PaymentNoteData {\n const { chainId, protocolAddress, tokenAddress, amount, ownerAddress, nonce, commitment } =\n this;\n return { chainId, protocolAddress, tokenAddress, amount, ownerAddress, nonce, commitment };\n }\n}\n","import { protocolConnection } from \"../protocol/connections\";\nimport {\n poseidonHash,\n TREE_DEPTH,\n type Wallet,\n type Note,\n computeNoteNullifier,\n} from \"@invisi-labs/core\";\nimport type { CanonicalBlock, ChainReader, Membership, Protocol } from \"@invisi-labs/protocol\";\nimport type { ProtocolRpcClient } from \"@invisi-labs/rpc\";\nimport { getAddress, type Provider } from \"ethers\";\nimport { EthersChainReader } from \"../integrations/ethers\";\nimport type { NoteInput } from \"../transactions/explicit-types\";\nimport type { PaymentNoteData } from \"./types\";\n\n/** Supply connections for manually constructed Protocols; fromRpc connections are reused. */\nexport type PaymentNoteVerificationOptions = {\n protocolRpc: Pick<ProtocolRpcClient, \"withReader\">;\n confirmations?: number;\n} & ({ provider: Provider; chainReader?: never } | { chainReader: ChainReader; provider?: never });\n\nexport type PaymentNoteVerificationSettings = { confirmations?: number };\nexport function verificationOptions(\n protocol: Protocol,\n options: PaymentNoteVerificationOptions | PaymentNoteVerificationSettings = {}\n): PaymentNoteVerificationOptions {\n const connected = protocolConnection(protocol);\n const resolved = { ...connected, ...options };\n if (\n !(\"protocolRpc\" in resolved) ||\n !resolved.protocolRpc ||\n (!(\"chainReader\" in resolved) && !(\"provider\" in resolved))\n )\n throw new Error(\n \"Payment note verification requires Protocol.fromRpc or explicit chain and Protocol RPC connections\"\n );\n return resolved as PaymentNoteVerificationOptions;\n}\n\nfunction sameBlock(a: CanonicalBlock, b: CanonicalBlock): boolean {\n return (\n a.number === b.number &&\n a.hash === b.hash &&\n a.parentHash === b.parentHash &&\n a.timestamp === b.timestamp\n );\n}\nexport function asNote(data: PaymentNoteData): Note {\n return {\n chainId: data.chainId,\n protocolAddress: BigInt(data.protocolAddress),\n tokenAddress: BigInt(data.tokenAddress),\n amount: data.amount,\n ownerAddress: data.ownerAddress,\n nonce: data.nonce,\n };\n}\nexport async function verifyPaymentNote(\n data: PaymentNoteData,\n protocol: Protocol,\n options: PaymentNoteVerificationOptions,\n wallet?: Wallet\n): Promise<{\n input: NoteInput;\n membership: Membership;\n checkedAt: CanonicalBlock;\n spendabilityCheckedAt?: CanonicalBlock;\n}> {\n if (\n data.chainId !== protocol.context.chainId ||\n getAddress(data.protocolAddress) !== getAddress(protocol.context.protocolAddress)\n )\n throw new Error(\"Payment note protocol context mismatch\");\n const confirmations = options.confirmations ?? 1;\n if (!Number.isSafeInteger(confirmations) || confirmations < 1)\n throw new RangeError(\"confirmations must be positive\");\n const reader = options.chainReader ?? new EthersChainReader(options.provider!);\n await protocol.validateDeployment(reader);\n if (wallet && getAddress(wallet.ownerAddress) !== getAddress(data.ownerAddress))\n throw new Error(\"Payment note owner mismatch\");\n if (wallet) {\n if (typeof wallet.exportAuthorization !== \"function\")\n throw new Error(\"Wallet spending authorization capability required\");\n const authorization = wallet.exportAuthorization();\n if (getAddress(authorization.ownerAddress) !== getAddress(data.ownerAddress))\n throw new Error(\"Wallet authorization owner mismatch\");\n }\n const latest = await reader.getLatestBlockNumber();\n const number = latest - BigInt(confirmations - 1);\n if (number < protocol.deployment.protocol.fromBlock)\n throw new Error(\"Insufficient confirmed blocks\");\n const rpc = options.protocolRpc.withReader(reader);\n const status = await rpc.getStatus(protocol.context);\n if (!status.indexedHead) throw new Error(\"Protocol RPC has no indexed blocks\");\n const indexedNumber = status.indexedHead.number < number ? status.indexedHead.number : number;\n if (indexedNumber < protocol.deployment.protocol.fromBlock)\n throw new Error(\"Protocol RPC has not reached the deployment\");\n const checkedAt = await reader.getBlock(indexedNumber);\n if (checkedAt.number !== indexedNumber)\n throw new Error(\"Payment note confirmation block mismatch\");\n const result = await rpc.getNote(protocol.context, data.commitment, checkedAt);\n if (!result) throw new Error(\"Payment note is not indexed at the requested confirmed block\");\n const { output, membership } = result;\n if (\n output.commitment !== data.commitment ||\n getAddress(output.tokenAddress) !== getAddress(data.tokenAddress) ||\n membership.leaf !== data.commitment ||\n membership.treeId !== output.treeId ||\n membership.leafIndex !== output.leafIndex ||\n membership.block.number > checkedAt.number ||\n output.block.number > checkedAt.number ||\n membership.path.length !== TREE_DEPTH ||\n !Number.isSafeInteger(output.leafIndex) ||\n output.leafIndex < 0 ||\n output.leafIndex >= 2 ** TREE_DEPTH\n )\n throw new Error(\"Payment note membership metadata mismatch\");\n let root = BigInt(data.commitment);\n for (let level = 0; level < membership.path.length; level++) {\n const sibling = membership.path[level]!;\n root = BigInt(\n await poseidonHash((output.leafIndex >> level) & 1 ? [sibling, root] : [root, sibling])\n );\n }\n if (\n root !== BigInt(membership.root) ||\n !(await reader.isKnownRoot(protocol.context, membership.treeId, membership.root, checkedAt))\n )\n throw new Error(\"Payment note membership root is not accepted on chain\");\n if (\n !sameBlock(output.block, await reader.getBlock(output.block.number)) ||\n !sameBlock(membership.block, await reader.getBlock(membership.block.number))\n )\n throw new Error(\"Payment note block is no longer canonical\");\n let spendabilityCheckedAt: CanonicalBlock | undefined;\n if (wallet) {\n // Spendability concerns current state, not just the confirmed historical anchor.\n const current = await reader.getBlock(await reader.getLatestBlockNumber());\n const nullifier = await computeNoteNullifier(data.chainId, data.nonce, data.commitment);\n const spent = await reader.isSpent(protocol.context, [nullifier], current);\n if (spent.length !== 1 || spent[0] !== false)\n throw new Error(\"Payment note is already spent\");\n if (\n !(await reader.isKnownRoot(\n protocol.context,\n membership.treeId,\n membership.root,\n current\n ))\n )\n throw new Error(\"Payment note membership root is no longer spendable\");\n if (!sameBlock(current, await reader.getBlock(current.number)))\n throw new Error(\"Spendability block reorganized\");\n spendabilityCheckedAt = current;\n }\n if (!sameBlock(checkedAt, await reader.getBlock(checkedAt.number)))\n throw new Error(\"Payment note verification block reorganized\");\n return {\n input: {\n note: asNote(data),\n commitment: data.commitment,\n treeId: output.treeId,\n leafIndex: output.leafIndex,\n },\n membership,\n checkedAt,\n ...(spendabilityCheckedAt ? { spendabilityCheckedAt } : {}),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/index.cjs","../src/index.ts","../src/disclosure/DisclosureVerifier.ts","../src/protocol/connections.ts","../src/protocol/Protocol.ts","../src/protocol/BroadcasterRegistry.ts","../src/protocol/ProtocolRpcClient.ts","../src/payment-note/PaymentNote.ts","../src/payment-note/verification.ts"],"names":["candidate","getAddress"],"mappings":"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","file":"/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/index.cjs","sourcesContent":[null,"export {\n Detector,\n Disclosure,\n MAX_MEMO_BYTES,\n MissingCapabilityError,\n NullifierCapability,\n ViewingCapability,\n Wallet,\n computeCreditNullifier,\n creditPeriods,\n creditV1,\n decodeDeliveryHeader,\n decodeMemoText,\n encodeMemo,\n fundsV1,\n} from \"@invisi-labs/primitives\";\nexport type {\n Address,\n CreditDataV1,\n CreditDeliveryState,\n CreditState,\n CreditOpening,\n CreditPolicy,\n DisclosureExport,\n DisclosureOutput,\n DisclosureResult,\n FundsDataV1,\n Hex,\n Memo,\n Note,\n ReceivingKeys,\n} from \"@invisi-labs/primitives\";\nexport { RegistrationOperation } from \"@invisi-labs/rpc\";\nexport type {\n AddressRegistryOptions,\n ProtocolOptions,\n RegistryReader,\n TokenProtocol,\n TokenProtocolOptions,\n} from \"@invisi-labs/rpc\";\nexport type {\n CanonicalBlock,\n CanonicalReceipt,\n ChainReader,\n FactoryReader,\n Membership,\n ProtocolDataProvider,\n ProtocolDataStatus,\n ProtocolUpdateRange,\n RegistryContext,\n TransactionCall,\n TransactionContext,\n} from \"@invisi-labs/protocol\";\nexport type {\n AggregateMember,\n AggregatorCapability,\n ProofBundle,\n ProofStatement,\n Prover,\n ProverOptions,\n} from \"@invisi-labs/prover\";\nexport { Invisi } from \"./client/Invisi\";\nexport type { InvisiOptions, RegistrationPreparationOptions } from \"./client/Invisi\";\nexport { DisclosureVerifier } from \"./disclosure/DisclosureVerifier\";\nexport type {\n DisclosureEvidence,\n DisclosureReader,\n DisclosureReference,\n DisclosureVerifierOptions,\n VerifiedDisclosure,\n} from \"./disclosure/DisclosureVerifier\";\nexport { InvisiError } from \"./errors\";\nexport type { InvisiErrorCode, InvisiErrorDetails } from \"./errors\";\nexport { NoteOutput } from \"./notes/NoteOutput\";\nexport type { NoteOutputContext, PaymentRequest, NoteOutputRecipient } from \"./notes/NoteOutput\";\nexport { Protocol } from \"./protocol/Protocol\";\nexport type {\n RevokeCreditPreparation,\n CreateCreditPreparation,\n DrawCreditPreparation,\n FundingAuthorizationVerifier,\n FundingSigner,\n FundingSource,\n FundingTypedData,\n OperationAggregateMember,\n ShieldPreparation,\n UpdateCreditPreparation,\n TransactionExecution,\n TransactionProveOptions,\n TransferPreparation,\n} from \"./transactions/operation-types\";\n\nexport { MAX_UPDATE_BLOCKS, ProtocolRpcError } from \"@invisi-labs/rpc\";\nexport type {\n ProtocolDeployment,\n ProtocolRpcChain,\n ProtocolRpcClientOptions,\n ProtocolRpcConnectionOptions,\n ProtocolRpcReader,\n RegisteredReceivingAddress,\n} from \"@invisi-labs/rpc\";\nexport { AddressRegistry } from \"./protocol/AddressRegistry\";\nexport { BroadcasterRegistry } from \"./protocol/BroadcasterRegistry\";\nexport type {\n BroadcasterRegistration,\n BroadcasterRegistryOptions,\n RegisteredBroadcaster,\n} from \"./protocol/BroadcasterRegistry\";\nexport { ProtocolRpcClient } from \"./protocol/ProtocolRpcClient\";\n\nexport { PreparedTransaction } from \"./transactions/execution/PreparedTransaction\";\nexport type {\n CreditInput,\n ExplicitRevokeCreditPreparation,\n ExplicitCreateCreditPreparation,\n ExplicitDrawCreditPreparation,\n ExplicitShieldPreparation,\n ExplicitUpdateCreditPreparation,\n ExplicitTransferPreparation,\n NoteInput,\n TransactionIdentity,\n} from \"./transactions/explicit-types\";\n\nexport { getDocumentedGasReference } from \"@invisi-labs/protocol\";\nexport type { DocumentedGasReference, DocumentedGasShape } from \"@invisi-labs/protocol\";\n\nexport type { SigningRequest } from \"@invisi-labs/primitives\";\n\n// Stateless recovery for applications that supply canonical receipts without a wallet store.\nexport { decryptCandidates } from \"./discovery/discovery\";\nexport type { DeliveryEventLog, DiscoveredCredit, DiscoveredNote } from \"./discovery/discovery\";\nexport { readProtocolLogs } from \"./discovery/receipt-logs\";\n\nexport type {\n ProtocolCreditTransition,\n ProtocolNoteOutput,\n IndexedCreditState,\n ProtocolTransactionNoteUpdates,\n ProtocolTransactionCreditUpdates,\n} from \"@invisi-labs/rpc\";\n\nexport * from \"./broadcaster/index\";\n\nexport type {\n BroadcasterFeeSource,\n BroadcasterQuoteOptions,\n} from \"./broadcaster/broadcaster-preparation\";\n\nexport { encodePaymentRequest, decodePaymentRequest } from \"./payment-request/codec\";\nexport type { NoteOutputExecutionOptions } from \"./payment-request/types\";\n\nexport { PaymentNote, VerifiedPaymentNote, SpendablePaymentNote } from \"./payment-note/PaymentNote\";\nexport { encodePaymentNote, decodePaymentNote } from \"./payment-note/codec\";\nexport type { PaymentNoteData } from \"./payment-note/types\";\nexport type {\n PaymentNoteVerificationOptions,\n PaymentNoteVerificationSettings,\n} from \"./payment-note/verification\";\nexport { TransactionOutput } from \"./notes/TransactionOutput\";\n\nexport type { PreparedProvenanceCapability } from \"./broadcaster/provenance-preparation\";\n\nexport {\n authenticatedDecryptor,\n DeliveryDecryptionError,\n DeliveryAuthenticationError,\n} from \"@invisi-labs/primitives\";\nexport type {\n DeliveryDecryptor,\n DeliveryDecryptionResult,\n DeliveryDetectionCandidate,\n DeliveryDetectionBatch,\n} from \"@invisi-labs/primitives\";\n","import type { Hex } from \"@invisi-labs/protocol/contracts\";\nimport type { Provider } from \"ethers\";\nimport { readProtocolLogs } from \"../discovery/receipt-logs\";\nimport { EthersChainReader } from \"../integrations/ethers\";\n\nimport { Disclosure, type DisclosureOutput, type DisclosureResult } from \"@invisi-labs/primitives\";\nimport { TokenProtocol } from \"@invisi-labs/rpc\";\nimport { type CanonicalBlock, type ChainReader } from \"@invisi-labs/protocol\";\nimport { extractDeliveryCandidates } from \"../discovery/discovery\";\n\nexport interface DisclosureReference {\n transactionHash: Hex;\n treeId: bigint;\n leafIndex: number;\n role: \"funds\" | \"owner\" | \"spender\";\n}\n\nexport type DisclosureReader = Pick<\n ChainReader,\n \"getChainId\" | \"getCode\" | \"getReceipt\" | \"getBlock\" | \"getLatestBlockNumber\"\n>;\n\nexport interface DisclosureVerifierOptions {\n protocol: TokenProtocol;\n reader: DisclosureReader;\n /** Minimum confirmations including the inclusion block; defaults to one. */\n confirmations?: number;\n}\n\nexport interface DisclosureEvidence {\n reference: Readonly<DisclosureReference>;\n block: Readonly<CanonicalBlock>;\n confirmations: bigint;\n output: Readonly<DisclosureOutput>;\n}\n\nexport interface VerifiedDisclosure {\n result: DisclosureResult;\n block: Readonly<CanonicalBlock>;\n confirmations: bigint;\n output: Readonly<DisclosureReference & { commitment: Hex }>;\n}\n\nfunction check(value: unknown, message: string): asserts value {\n if (!value) throw new Error(message);\n}\n\nfunction reference(value: DisclosureReference): DisclosureReference {\n check(/^0x[0-9a-fA-F]{64}$/.test(value.transactionHash), \"invalid disclosure transaction hash\");\n check(\n typeof value.treeId === \"bigint\" && value.treeId > 0n && value.treeId < 1n << 64n,\n \"invalid disclosure tree ID\"\n );\n check(\n Number.isSafeInteger(value.leafIndex) && value.leafIndex >= 0 && value.leafIndex < 65536,\n \"invalid disclosure leaf index\"\n );\n check([\"funds\", \"owner\", \"spender\"].includes(value.role), \"invalid disclosure reference role\");\n return {\n transactionHash: value.transactionHash.toLowerCase() as Hex,\n treeId: value.treeId,\n leafIndex: value.leafIndex,\n role: value.role,\n };\n}\n\n/** Read-only verification against a trusted RPC and authenticated protocol deployment.\n * Results establish output content/inclusion at a block, not payer identity, spent state or wallet completeness.\n */\nexport class DisclosureVerifier {\n readonly #protocol: TokenProtocol;\n readonly #reader: DisclosureReader;\n readonly #confirmations: bigint;\n\n constructor(\n options:\n | DisclosureVerifierOptions\n | (Omit<DisclosureVerifierOptions, \"reader\"> & { provider: Provider })\n ) {\n const confirmations = options.confirmations ?? 1;\n check(\n Number.isSafeInteger(confirmations) && confirmations >= 1,\n \"invalid disclosure confirmations\"\n );\n this.#protocol = options.protocol;\n this.#reader =\n \"provider\" in options ? new EthersChainReader(options.provider) : options.reader;\n this.#confirmations = BigInt(confirmations);\n Object.freeze(this);\n }\n\n private async barrier(block: Readonly<CanonicalBlock>): Promise<bigint> {\n await this.#protocol.validateDeployment(this.#reader);\n const canonical = await this.#reader.getBlock(block.number);\n check(\n canonical.number === block.number &&\n canonical.hash.toLowerCase() === block.hash.toLowerCase(),\n \"disclosure canonical block changed; reorg verification required\"\n );\n const head = await this.#reader.getLatestBlockNumber();\n check(\n head >= block.number && head - block.number + 1n >= this.#confirmations,\n \"insufficient disclosure confirmations\"\n );\n check(\n (await this.#reader.getChainId()) === this.#protocol.context.chainId,\n \"disclosure chain changed during verification\"\n );\n return head - block.number + 1n;\n }\n\n /** Resolve the exact inserted output and its delivery from a successful canonical receipt. */\n async readOutput(value: DisclosureReference): Promise<DisclosureEvidence> {\n const selected = reference(value);\n await this.#protocol.validateDeployment(this.#reader);\n const received = await this.#reader.getReceipt(selected.transactionHash);\n check(received, \"disclosure transaction receipt is unavailable\");\n const receipt = structuredClone(received);\n check(receipt.status === \"success\", \"disclosure requires a successful transaction receipt\");\n check(\n receipt.transactionHash.toLowerCase() === selected.transactionHash,\n \"disclosure receipt transaction mismatch\"\n );\n check(\n typeof receipt.block.number === \"bigint\" &&\n receipt.block.number >= 0n &&\n /^0x[0-9a-fA-F]{64}$/.test(receipt.block.hash),\n \"invalid disclosure receipt block\"\n );\n const { context } = this.#protocol;\n const logs = readProtocolLogs(receipt, context.protocolAddress);\n const candidates = extractDeliveryCandidates(logs, context, receipt.block.number).filter(\n (candidate) =>\n candidate.treeId === selected.treeId &&\n candidate.leafIndex === selected.leafIndex &&\n candidate.role === selected.role &&\n candidate.tokenAddress.toLowerCase() === context.tokenAddress.toLowerCase()\n );\n check(\n candidates.length === 1,\n \"disclosure output has no unique canonical insertion and delivery\"\n );\n const candidate = candidates[0]!;\n const confirmations = await this.barrier(receipt.block);\n return Object.freeze({\n reference: Object.freeze(selected),\n block: Object.freeze({ ...receipt.block }),\n confirmations,\n output: Object.freeze({\n chainId: context.chainId,\n protocolAddress: BigInt(context.protocolAddress),\n tokenAddress: BigInt(context.tokenAddress),\n outputCommitment: candidate.commitment,\n role: selected.role,\n ciphertext: candidate.delivery.ciphertext,\n }),\n });\n }\n\n async verify(disclosure: Disclosure, value: DisclosureReference): Promise<VerifiedDisclosure> {\n const evidence = await this.readOutput(value);\n const result = await disclosure.verify(evidence.output);\n const confirmations = await this.barrier(evidence.block);\n return Object.freeze({\n result: Object.freeze(result),\n block: evidence.block,\n confirmations,\n output: Object.freeze({\n ...evidence.reference,\n commitment: evidence.output.outputCommitment,\n }),\n });\n }\n\n toJSON() {\n return { disclosureVerifier: true, confirmations: this.#confirmations.toString() };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","import type { Protocol } from \"@invisi-labs/rpc\";\nimport type { ProtocolRpcClient } from \"@invisi-labs/rpc\";\nimport type { Provider } from \"ethers\";\n\n/** Public network connections only; never holds wallet keys or a signer. */\nconst connections = new WeakMap<\n Protocol,\n { provider: Provider; protocolRpc: Pick<ProtocolRpcClient, \"withReader\"> }\n>();\nexport function rememberProtocolConnection(\n protocol: Protocol,\n provider: Provider,\n protocolRpc: Pick<ProtocolRpcClient, \"withReader\">\n): void {\n connections.set(protocol, { provider, protocolRpc });\n}\nexport function protocolConnection(protocol: Protocol) {\n return connections.get(protocol);\n}\n","import { rememberProtocolConnection } from \"./connections\";\nimport { Protocol as BaseProtocol } from \"@invisi-labs/rpc\";\nimport type { ProtocolRpcClient } from \"@invisi-labs/rpc\";\nimport { getAddress, type Provider } from \"ethers\";\nimport { BroadcasterClient } from \"../broadcaster/index\";\n\nconst sources = new WeakMap<Protocol, Pick<ProtocolRpcClient, \"getBroadcasters\">>();\n\n/** Deployment operations and transaction-compatible broadcaster discovery. */\nexport class Protocol extends BaseProtocol {\n static override async fromRpc(\n rpc: Pick<ProtocolRpcClient, \"getDeployment\"> &\n Partial<Pick<ProtocolRpcClient, \"getBroadcasters\" | \"withReader\">>,\n provider: Provider,\n options: { signal?: AbortSignal } = {}\n ): Promise<Protocol> {\n const verified = await BaseProtocol.fromRpc(rpc, provider, options);\n const protocol = new Protocol({ deployment: verified.deployment });\n if (rpc.getBroadcasters)\n sources.set(protocol, rpc as Pick<ProtocolRpcClient, \"getBroadcasters\">);\n if (rpc.withReader)\n rememberProtocolConnection(\n protocol,\n provider,\n rpc as Pick<ProtocolRpcClient, \"withReader\">\n );\n return protocol;\n }\n\n /** Discover token support without disclosing a transaction or requesting a price. */\n async getBroadcasters(options: {\n tokenAddress: string;\n signal?: AbortSignal;\n }): Promise<BroadcasterClient[]> {\n options.signal?.throwIfAborted();\n const token = getAddress(options.tokenAddress);\n if (BigInt(token) === 0n) throw Error(\"Invalid Broadcaster token address\");\n if (!this.deployment.broadcasterRegistry)\n throw new Error(\"broadcaster registry is not configured\");\n const rpc = sources.get(this);\n if (!rpc) throw new Error(\"broadcaster discovery requires Protocol.fromRpc\");\n const clients: BroadcasterClient[] = [];\n let after: `0x${string}` | undefined;\n let block: Awaited<ReturnType<ProtocolRpcClient[\"getBroadcasters\"]>>[\"block\"] | undefined;\n const seen = new Set<string>();\n do {\n options.signal?.throwIfAborted();\n const page = await rpc.getBroadcasters({\n enabled: true,\n limit: 100,\n ...(options.signal ? { signal: options.signal } : {}),\n ...(after ? { after } : {}),\n ...(block ? { block } : {}),\n });\n block ??= page.block;\n const compatible = await Promise.all(\n page.broadcasters.map(async (entry) => {\n if (!entry.enabled) return undefined;\n try {\n const client = new BroadcasterClient({\n endpoint: entry.endpoint,\n quoteSigner: entry.quoteSigner,\n feeRecipient: entry.feeRecipient,\n });\n if (\n !(await client.supportsToken(\n token,\n {\n chainId: this.context.chainId,\n protocol: this.context.protocolAddress,\n },\n options\n ))\n )\n return undefined;\n return client;\n } catch {\n options.signal?.throwIfAborted();\n return undefined;\n }\n })\n );\n options.signal?.throwIfAborted();\n clients.push(\n ...compatible.filter((client): client is BroadcasterClient => client !== undefined)\n );\n after = page.next;\n if (after && seen.has(after)) throw new Error(\"repeated broadcaster pagination cursor\");\n if (after) seen.add(after);\n } while (after);\n return clients;\n }\n}\n","import type { TransactionCall } from \"@invisi-labs/protocol\";\nimport { broadcasterRegistryAbi, type Address, type Hex } from \"@invisi-labs/protocol/contracts\";\nimport { getAddress, Interface, keccak256, type Provider } from \"ethers\";\n\nexport interface BroadcasterRegistration {\n endpoint: string;\n metadataURI?: string;\n quoteSigner: Address;\n feeRecipient: Address;\n}\n\nexport interface RegisteredBroadcaster extends Required<BroadcasterRegistration> {\n operator: Address;\n enabled: boolean;\n}\n\nexport interface BroadcasterRegistryOptions {\n provider: Provider;\n address: Address;\n chainId: bigint;\n fromBlock: number;\n runtimeCodeHash: string;\n /** Maximum blocks per getLogs request. Defaults to 2,000. */\n blockRange?: number;\n}\n\nconst abi = new Interface(broadcasterRegistryAbi);\n\nfunction address(value: string): Address {\n const normalized = getAddress(value) as Address;\n if (BigInt(normalized) === 0n) throw new Error(\"zero broadcaster address\");\n return normalized;\n}\n\n/** Optional on-chain discovery. Registry entries do not authorize spending or endorse operators. */\nexport class BroadcasterRegistry {\n readonly address: Address;\n readonly #options: Readonly<BroadcasterRegistryOptions>;\n\n constructor(options: BroadcasterRegistryOptions) {\n this.address = address(options.address);\n const blockRange = options.blockRange ?? 2_000;\n if (\n options.chainId <= 0n ||\n !Number.isSafeInteger(options.fromBlock) ||\n options.fromBlock < 0 ||\n !Number.isSafeInteger(blockRange) ||\n blockRange < 1 ||\n blockRange > 100_000 ||\n !/^0x[0-9a-fA-F]{64}$/.test(options.runtimeCodeHash)\n )\n throw new Error(\"invalid broadcaster registry configuration\");\n this.#options = Object.freeze({ ...options, blockRange });\n }\n\n prepareRegistration(registration: BroadcasterRegistration): TransactionCall {\n const { endpoint, metadataURI = \"\" } = registration;\n if (\n !endpoint.startsWith(\"https://\") ||\n endpoint.length <= 8 ||\n endpoint.length > 2048 ||\n /[^\\x21-\\x7e]/.test(endpoint)\n )\n throw new Error(\"broadcaster endpoint must be a printable HTTPS URI\");\n // Parse locally for a useful error; the registry additionally enforces its byte limits.\n const url = new URL(endpoint);\n if (!url.hostname || url.username || url.password) {\n throw new Error(\"broadcaster HTTPS endpoint must not include credentials\");\n }\n if (metadataURI.length > 2048 || /[^\\x21-\\x7e]/.test(metadataURI)) {\n throw new Error(\"invalid broadcaster metadata URI\");\n }\n return this.call(\"setBroadcaster\", [\n endpoint,\n metadataURI,\n address(registration.quoteSigner),\n address(registration.feeRecipient),\n ]);\n }\n\n prepareAvailability(enabled: boolean): TransactionCall {\n return this.call(\"setEnabled\", [enabled]);\n }\n\n private call(name: string, args: readonly unknown[]): TransactionCall {\n return { to: this.address, data: abi.encodeFunctionData(name, args) as Hex, value: 0n };\n }\n\n private async validate(): Promise<void> {\n const { provider, chainId, runtimeCodeHash } = this.#options;\n if ((await provider.getNetwork()).chainId !== chainId) {\n throw new Error(\"broadcaster registry chain mismatch\");\n }\n if (\n keccak256(await provider.getCode(this.address)).toLowerCase() !==\n runtimeCodeHash.toLowerCase()\n ) {\n throw new Error(\"broadcaster registry runtime code mismatch\");\n }\n }\n\n async get(operator: Address): Promise<RegisteredBroadcaster> {\n await this.validate();\n return this.read(address(operator));\n }\n\n private async read(operator: Address): Promise<RegisteredBroadcaster> {\n const result = await this.#options.provider.call(this.call(\"broadcasterOf\", [operator]));\n const [entry] = abi.decodeFunctionResult(\"broadcasterOf\", result);\n return {\n operator,\n endpoint: entry.endpoint,\n metadataURI: entry.metadataURI,\n quoteSigner: address(entry.quoteSigner),\n feeRecipient: address(entry.feeRecipient),\n enabled: entry.enabled,\n };\n }\n\n /** Discover event operators, then read their latest entry; disabled services remain explicit. */\n async discover(\n options: { toBlock?: number; signal?: AbortSignal } = {}\n ): Promise<RegisteredBroadcaster[]> {\n const { provider, fromBlock, blockRange } = this.#options;\n options.signal?.throwIfAborted();\n await this.validate();\n const toBlock = options.toBlock ?? (await provider.getBlockNumber());\n if (!Number.isSafeInteger(toBlock) || toBlock < fromBlock) {\n throw new Error(\"invalid broadcaster discovery block range\");\n }\n const operators = new Set<Address>();\n for (let start = fromBlock; start <= toBlock;) {\n options.signal?.throwIfAborted();\n const end = Math.min(start + blockRange! - 1, toBlock);\n const logs = await provider.getLogs({\n address: this.address,\n topics: [abi.getEvent(\"BroadcasterSet\")!.topicHash],\n fromBlock: start,\n toBlock: end,\n });\n for (const log of logs) {\n if (getAddress(log.address) !== this.address)\n throw new Error(\"registry event address mismatch\");\n const event = abi.parseLog(log);\n if (!event || event.name !== \"BroadcasterSet\")\n throw new Error(\"invalid registry event\");\n operators.add(address(event.args.operator));\n }\n start = end + 1;\n }\n const entries: RegisteredBroadcaster[] = [];\n for (const operator of operators) {\n options.signal?.throwIfAborted();\n entries.push(await this.read(operator));\n }\n return entries;\n }\n}\n","import { ProtocolRpcClient as RpcClient } from \"@invisi-labs/rpc\";\nimport type { Provider } from \"ethers\";\nimport { EthersChainReader } from \"../integrations/ethers\";\n\n/** Protocol RPC transport with ethers provider integration for independent chain checks. */\nexport class ProtocolRpcClient extends RpcClient {\n withProvider(provider: Provider): RpcClient {\n return this.withReader(new EthersChainReader(provider));\n }\n}\n","import { computeNoteIdentity, computeNoteCommitment, Wallet } from \"@invisi-labs/primitives\";\nimport type { Protocol } from \"@invisi-labs/rpc\";\nimport type { Membership, CanonicalBlock } from \"@invisi-labs/protocol\";\nimport type { NoteInput } from \"../transactions/explicit-types\";\nimport { decodePaymentNote, encodePaymentNote } from \"./codec\";\nimport type { PaymentNoteData } from \"./types\";\nimport {\n verifyPaymentNote,\n verificationOptions,\n type PaymentNoteVerificationSettings,\n type PaymentNoteVerificationOptions,\n} from \"./verification\";\n\nconst verification = Symbol(\"PaymentNote verification\");\nexport class VerifiedPaymentNote {\n readonly #membership: Membership;\n readonly #checkedAt: CanonicalBlock;\n constructor(token: symbol, membership: Membership, checkedAt: CanonicalBlock) {\n if (token !== verification) throw new Error(\"Payment note verification required\");\n this.#membership = structuredClone(membership);\n this.#checkedAt = structuredClone(checkedAt);\n }\n get membership(): Membership {\n return structuredClone(this.#membership);\n }\n get checkedAt(): CanonicalBlock {\n return structuredClone(this.#checkedAt);\n }\n}\nexport class SpendablePaymentNote extends VerifiedPaymentNote {\n readonly #input: NoteInput;\n readonly #spendabilityCheckedAt: CanonicalBlock;\n constructor(\n token: symbol,\n input: NoteInput,\n membership: Membership,\n checkedAt: CanonicalBlock,\n spendabilityCheckedAt: CanonicalBlock\n ) {\n super(token, membership, checkedAt);\n this.#input = structuredClone(input);\n this.#spendabilityCheckedAt = structuredClone(spendabilityCheckedAt);\n Object.freeze(this);\n }\n get spendabilityCheckedAt(): CanonicalBlock {\n return structuredClone(this.#spendabilityCheckedAt);\n }\n toInput(): NoteInput {\n return structuredClone(this.#input);\n }\n}\n/** A validated Note opening, independent of an indexed wallet store. */\nexport class PaymentNote implements PaymentNoteData {\n readonly chainId: bigint;\n readonly protocolAddress: PaymentNoteData[\"protocolAddress\"];\n readonly tokenAddress: PaymentNoteData[\"tokenAddress\"];\n readonly amount: bigint;\n readonly ownerAddress: PaymentNoteData[\"ownerAddress\"];\n readonly nonce: bigint;\n readonly commitment: PaymentNoteData[\"commitment\"];\n readonly ipn: string;\n private constructor(data: PaymentNoteData, ipn: string) {\n this.chainId = data.chainId;\n this.protocolAddress = data.protocolAddress;\n this.tokenAddress = data.tokenAddress;\n this.amount = data.amount;\n this.ownerAddress = data.ownerAddress;\n this.nonce = data.nonce;\n this.commitment = data.commitment;\n this.ipn = ipn;\n Object.freeze(this);\n }\n static async from(ipn: string): Promise<PaymentNote> {\n const data = decodePaymentNote(ipn);\n const identity = await computeNoteIdentity(BigInt(data.ownerAddress), data.nonce);\n const commitment = await computeNoteCommitment(\n data.chainId,\n BigInt(data.protocolAddress),\n identity,\n BigInt(data.tokenAddress),\n data.amount\n );\n if (commitment !== data.commitment) throw new Error(\"Payment note commitment mismatch\");\n return new PaymentNote(data, encodePaymentNote(data));\n }\n async verify(\n protocol: Protocol,\n options: PaymentNoteVerificationOptions | PaymentNoteVerificationSettings = {}\n ): Promise<VerifiedPaymentNote> {\n const result = await verifyPaymentNote(\n this.data(),\n protocol,\n verificationOptions(protocol, options)\n );\n const verified = new VerifiedPaymentNote(verification, result.membership, result.checkedAt);\n Object.freeze(verified);\n return verified;\n }\n async verifySpendable(\n protocol: Protocol,\n wallet: Wallet,\n options: PaymentNoteVerificationOptions | PaymentNoteVerificationSettings = {}\n ): Promise<SpendablePaymentNote> {\n if (!(wallet instanceof Wallet)) throw new Error(\"A public Wallet is required\");\n const result = await verifyPaymentNote(\n this.data(),\n protocol,\n verificationOptions(protocol, options),\n wallet\n );\n return new SpendablePaymentNote(\n verification,\n result.input,\n result.membership,\n result.checkedAt,\n result.spendabilityCheckedAt!\n );\n }\n private data(): PaymentNoteData {\n const { chainId, protocolAddress, tokenAddress, amount, ownerAddress, nonce, commitment } =\n this;\n return { chainId, protocolAddress, tokenAddress, amount, ownerAddress, nonce, commitment };\n }\n}\n","import { protocolConnection } from \"../protocol/connections\";\nimport {\n poseidonHash,\n TREE_DEPTH,\n type Wallet,\n type Note,\n computeNoteNullifier,\n} from \"@invisi-labs/primitives\";\nimport type { CanonicalBlock, ChainReader, Membership } from \"@invisi-labs/protocol\";\nimport type { Protocol } from \"@invisi-labs/rpc\";\nimport type { ProtocolRpcClient } from \"@invisi-labs/rpc\";\nimport { getAddress, type Provider } from \"ethers\";\nimport { EthersChainReader } from \"../integrations/ethers\";\nimport type { NoteInput } from \"../transactions/explicit-types\";\nimport type { PaymentNoteData } from \"./types\";\n\n/** Supply connections for manually constructed Protocols; fromRpc connections are reused. */\nexport type PaymentNoteVerificationOptions = {\n protocolRpc: Pick<ProtocolRpcClient, \"withReader\">;\n confirmations?: number;\n} & ({ provider: Provider; chainReader?: never } | { chainReader: ChainReader; provider?: never });\n\nexport type PaymentNoteVerificationSettings = { confirmations?: number };\nexport function verificationOptions(\n protocol: Protocol,\n options: PaymentNoteVerificationOptions | PaymentNoteVerificationSettings = {}\n): PaymentNoteVerificationOptions {\n const connected = protocolConnection(protocol);\n const resolved = { ...connected, ...options };\n if (\n !(\"protocolRpc\" in resolved) ||\n !resolved.protocolRpc ||\n (!(\"chainReader\" in resolved) && !(\"provider\" in resolved))\n )\n throw new Error(\n \"Payment note verification requires Protocol.fromRpc or explicit chain and Protocol RPC connections\"\n );\n return resolved as PaymentNoteVerificationOptions;\n}\n\nfunction sameBlock(a: CanonicalBlock, b: CanonicalBlock): boolean {\n return (\n a.number === b.number &&\n a.hash === b.hash &&\n a.parentHash === b.parentHash &&\n a.timestamp === b.timestamp\n );\n}\nexport function asNote(data: PaymentNoteData): Note {\n return {\n chainId: data.chainId,\n protocolAddress: BigInt(data.protocolAddress),\n tokenAddress: BigInt(data.tokenAddress),\n amount: data.amount,\n ownerAddress: data.ownerAddress,\n nonce: data.nonce,\n };\n}\nexport async function verifyPaymentNote(\n data: PaymentNoteData,\n protocol: Protocol,\n options: PaymentNoteVerificationOptions,\n wallet?: Wallet\n): Promise<{\n input: NoteInput;\n membership: Membership;\n checkedAt: CanonicalBlock;\n spendabilityCheckedAt?: CanonicalBlock;\n}> {\n if (\n data.chainId !== protocol.context.chainId ||\n getAddress(data.protocolAddress) !== getAddress(protocol.context.protocolAddress)\n )\n throw new Error(\"Payment note protocol context mismatch\");\n const confirmations = options.confirmations ?? 1;\n if (!Number.isSafeInteger(confirmations) || confirmations < 1)\n throw new RangeError(\"confirmations must be positive\");\n const reader = options.chainReader ?? new EthersChainReader(options.provider!);\n await protocol.validateDeployment(reader);\n if (wallet && getAddress(wallet.ownerAddress) !== getAddress(data.ownerAddress))\n throw new Error(\"Payment note owner mismatch\");\n const latest = await reader.getLatestBlockNumber();\n const number = latest - BigInt(confirmations - 1);\n if (number < protocol.deployment.protocol.fromBlock)\n throw new Error(\"Insufficient confirmed blocks\");\n const rpc = options.protocolRpc.withReader(reader);\n const status = await rpc.getStatus(protocol.context);\n if (!status.indexedHead) throw new Error(\"Protocol RPC has no indexed blocks\");\n const indexedNumber = status.indexedHead.number < number ? status.indexedHead.number : number;\n if (indexedNumber < protocol.deployment.protocol.fromBlock)\n throw new Error(\"Protocol RPC has not reached the deployment\");\n const checkedAt = await reader.getBlock(indexedNumber);\n if (checkedAt.number !== indexedNumber)\n throw new Error(\"Payment note confirmation block mismatch\");\n const result = await rpc.getNote(protocol.context, data.commitment, checkedAt);\n if (!result) throw new Error(\"Payment note is not indexed at the requested confirmed block\");\n const { output, membership } = result;\n if (\n output.commitment !== data.commitment ||\n getAddress(output.tokenAddress) !== getAddress(data.tokenAddress) ||\n membership.leaf !== data.commitment ||\n membership.treeId !== output.treeId ||\n membership.leafIndex !== output.leafIndex ||\n membership.block.number > checkedAt.number ||\n output.block.number > checkedAt.number ||\n membership.path.length !== TREE_DEPTH ||\n !Number.isSafeInteger(output.leafIndex) ||\n output.leafIndex < 0 ||\n output.leafIndex >= 2 ** TREE_DEPTH\n )\n throw new Error(\"Payment note membership metadata mismatch\");\n let root = BigInt(data.commitment);\n for (let level = 0; level < membership.path.length; level++) {\n const sibling = membership.path[level]!;\n root = BigInt(\n await poseidonHash((output.leafIndex >> level) & 1 ? [sibling, root] : [root, sibling])\n );\n }\n if (\n root !== BigInt(membership.root) ||\n !(await reader.isKnownRoot(protocol.context, membership.treeId, membership.root, checkedAt))\n )\n throw new Error(\"Payment note membership root is not accepted on chain\");\n if (\n !sameBlock(output.block, await reader.getBlock(output.block.number)) ||\n !sameBlock(membership.block, await reader.getBlock(membership.block.number))\n )\n throw new Error(\"Payment note block is no longer canonical\");\n let spendabilityCheckedAt: CanonicalBlock | undefined;\n if (wallet) {\n // Spendability concerns current state, not just the confirmed historical anchor.\n const current = await reader.getBlock(await reader.getLatestBlockNumber());\n const nullifier = await computeNoteNullifier(\n data.chainId,\n BigInt(data.protocolAddress),\n data.nonce,\n data.commitment\n );\n const spent = await reader.isSpent(protocol.context, [nullifier], current);\n if (spent.length !== 1 || spent[0] !== false)\n throw new Error(\"Payment note is already spent\");\n if (\n !(await reader.isKnownRoot(\n protocol.context,\n membership.treeId,\n membership.root,\n current\n ))\n )\n throw new Error(\"Payment note membership root is no longer spendable\");\n if (!sameBlock(current, await reader.getBlock(current.number)))\n throw new Error(\"Spendability block reorganized\");\n spendabilityCheckedAt = current;\n }\n if (!sameBlock(checkedAt, await reader.getBlock(checkedAt.number)))\n throw new Error(\"Payment note verification block reorganized\");\n return {\n input: {\n note: asNote(data),\n commitment: data.commitment,\n treeId: output.treeId,\n leafIndex: output.leafIndex,\n },\n membership,\n checkedAt,\n ...(spendabilityCheckedAt ? { spendabilityCheckedAt } : {}),\n };\n}\n"]}
|