@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.
Files changed (118) hide show
  1. package/README.md +5 -0
  2. package/dist/broadcaster-3KTB4JO2.cjs +21 -0
  3. package/dist/broadcaster-3KTB4JO2.cjs.map +1 -0
  4. package/dist/broadcaster-7ZKKSTZQ.js +21 -0
  5. package/dist/broadcaster-preparation-PJ263WBL.cjs +15 -0
  6. package/dist/broadcaster-preparation-PJ263WBL.cjs.map +1 -0
  7. package/dist/broadcaster-preparation-ZQAPZAUG.js +15 -0
  8. package/dist/broadcaster-preparation-ZQAPZAUG.js.map +1 -0
  9. package/dist/{chunk-LOU7AP2B.cjs → chunk-2URICDPW.cjs} +72 -33
  10. package/dist/chunk-2URICDPW.cjs.map +1 -0
  11. package/dist/chunk-3D24ABYR.js +86 -0
  12. package/dist/chunk-3D24ABYR.js.map +1 -0
  13. package/dist/chunk-3KTQQZOW.cjs +71 -0
  14. package/dist/chunk-3KTQQZOW.cjs.map +1 -0
  15. package/dist/chunk-4SDP53YQ.cjs +765 -0
  16. package/dist/chunk-4SDP53YQ.cjs.map +1 -0
  17. package/dist/{chunk-XHKQ2BO2.js → chunk-4VI6LYGH.js} +25 -2
  18. package/dist/chunk-4VI6LYGH.js.map +1 -0
  19. package/dist/chunk-BBSRP4MH.cjs +287 -0
  20. package/dist/chunk-BBSRP4MH.cjs.map +1 -0
  21. package/dist/chunk-DGMVGFKM.js +41 -0
  22. package/dist/chunk-DGMVGFKM.js.map +1 -0
  23. package/dist/chunk-DHQEB6JR.cjs +1616 -0
  24. package/dist/chunk-DHQEB6JR.cjs.map +1 -0
  25. package/dist/chunk-FKF67XE6.js +1616 -0
  26. package/dist/chunk-FKF67XE6.js.map +1 -0
  27. package/dist/chunk-GUD3LAUO.js +765 -0
  28. package/dist/chunk-GUD3LAUO.js.map +1 -0
  29. package/dist/chunk-HCB7RQ3S.cjs +79 -0
  30. package/dist/chunk-HCB7RQ3S.cjs.map +1 -0
  31. package/dist/{chunk-GTPUYPQL.js → chunk-HKGJXQVN.js} +69 -30
  32. package/dist/chunk-HKGJXQVN.js.map +1 -0
  33. package/dist/chunk-HLH5JZD4.js +287 -0
  34. package/dist/chunk-HLH5JZD4.js.map +1 -0
  35. package/dist/chunk-J6TZZVAM.cjs +230 -0
  36. package/dist/chunk-J6TZZVAM.cjs.map +1 -0
  37. package/dist/{chunk-7F7ZZW3L.cjs → chunk-LOR6PYH5.cjs} +25 -2
  38. package/dist/chunk-LOR6PYH5.cjs.map +1 -0
  39. package/dist/chunk-MA2QZEF5.cjs +399 -0
  40. package/dist/chunk-MA2QZEF5.cjs.map +1 -0
  41. package/dist/chunk-MI4IP4ZD.cjs +86 -0
  42. package/dist/chunk-MI4IP4ZD.cjs.map +1 -0
  43. package/dist/chunk-OCZLJKIA.cjs +41 -0
  44. package/dist/chunk-OCZLJKIA.cjs.map +1 -0
  45. package/dist/chunk-R5YAOJKB.js +71 -0
  46. package/dist/chunk-R5YAOJKB.js.map +1 -0
  47. package/dist/chunk-RY4M2CIQ.js +399 -0
  48. package/dist/chunk-RY4M2CIQ.js.map +1 -0
  49. package/dist/chunk-THMD5QO2.js +79 -0
  50. package/dist/chunk-THMD5QO2.js.map +1 -0
  51. package/dist/chunk-ZD2652WH.js +230 -0
  52. package/dist/chunk-ZD2652WH.js.map +1 -0
  53. package/dist/credit.cjs +1 -0
  54. package/dist/credit.cjs.map +1 -0
  55. package/dist/credit.d.cts +12 -0
  56. package/dist/credit.d.ts +12 -0
  57. package/dist/credit.js +1 -0
  58. package/dist/credit.js.map +1 -0
  59. package/dist/ethers.cjs +2 -2
  60. package/dist/ethers.cjs.map +1 -1
  61. package/dist/ethers.d.cts +15 -4
  62. package/dist/ethers.d.ts +15 -4
  63. package/dist/ethers.js +1 -1
  64. package/dist/index-CLhGwLxZ.d.cts +42 -0
  65. package/dist/index-Crp-ZFiM.d.ts +42 -0
  66. package/dist/index.cjs +69 -38
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.cts +21 -14
  69. package/dist/index.d.ts +21 -14
  70. package/dist/index.js +64 -33
  71. package/dist/index.js.map +1 -1
  72. package/dist/note.cjs +11 -0
  73. package/dist/note.cjs.map +1 -0
  74. package/dist/note.d.cts +29 -0
  75. package/dist/note.d.ts +29 -0
  76. package/dist/note.js +11 -0
  77. package/dist/note.js.map +1 -0
  78. package/dist/{broadcaster-preparation-DMxxZ_1Q.d.cts → operation-bridge-CoECSxfi.d.cts} +130 -245
  79. package/dist/{broadcaster-preparation-DMxxZ_1Q.d.ts → operation-bridge-CoECSxfi.d.ts} +130 -245
  80. package/dist/preparation-HUBTVCZE.js +404 -0
  81. package/dist/preparation-HUBTVCZE.js.map +1 -0
  82. package/dist/preparation-QD3ZSYV5.cjs +404 -0
  83. package/dist/preparation-QD3ZSYV5.cjs.map +1 -0
  84. package/dist/provenance-preparation-43DN2WK7.cjs +16 -0
  85. package/dist/provenance-preparation-43DN2WK7.cjs.map +1 -0
  86. package/dist/provenance-preparation-HEZE4L5H.js +16 -0
  87. package/dist/provenance-preparation-HEZE4L5H.js.map +1 -0
  88. package/dist/provenance.cjs +59 -0
  89. package/dist/provenance.cjs.map +1 -0
  90. package/dist/provenance.d.cts +34 -0
  91. package/dist/provenance.d.ts +34 -0
  92. package/dist/provenance.js +59 -0
  93. package/dist/provenance.js.map +1 -0
  94. package/dist/{receipt-logs-m0-bhaxW.d.ts → receipt-logs-DQRJK0l8.d.cts} +84 -78
  95. package/dist/{receipt-logs-CvC951p7.d.cts → receipt-logs-fMR6Bwql.d.ts} +84 -78
  96. package/dist/session-support.cjs +28 -7
  97. package/dist/session-support.cjs.map +1 -1
  98. package/dist/session-support.d.cts +71 -39
  99. package/dist/session-support.d.ts +71 -39
  100. package/dist/session-support.js +58 -37
  101. package/dist/session-support.js.map +1 -1
  102. package/package.json +22 -6
  103. package/dist/broadcaster-preparation-RMWQFYNL.js +0 -11
  104. package/dist/broadcaster-preparation-UGOTO4SX.cjs +0 -11
  105. package/dist/broadcaster-preparation-UGOTO4SX.cjs.map +0 -1
  106. package/dist/chunk-7F7ZZW3L.cjs.map +0 -1
  107. package/dist/chunk-EHP5TBC6.js +0 -3565
  108. package/dist/chunk-EHP5TBC6.js.map +0 -1
  109. package/dist/chunk-GTPUYPQL.js.map +0 -1
  110. package/dist/chunk-ITTGBIG2.js +0 -1877
  111. package/dist/chunk-ITTGBIG2.js.map +0 -1
  112. package/dist/chunk-J2JH6HIG.cjs +0 -1877
  113. package/dist/chunk-J2JH6HIG.cjs.map +0 -1
  114. package/dist/chunk-LOU7AP2B.cjs.map +0 -1
  115. package/dist/chunk-RHNIHI4P.cjs +0 -3565
  116. package/dist/chunk-RHNIHI4P.cjs.map +0 -1
  117. package/dist/chunk-XHKQ2BO2.js.map +0 -1
  118. /package/dist/{broadcaster-preparation-RMWQFYNL.js.map → broadcaster-7ZKKSTZQ.js.map} +0 -0
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @invisi-labs/sdk
2
+
3
+ Stateless Invisi transaction preparation, signing requests and protocol integration.
4
+
5
+ Install with `npm install @invisi-labs/sdk@1.2.0`. API documentation and runnable examples are in the [SDK repository](https://github.com/invisi-lab/invisi-sdk-ts).
@@ -0,0 +1,21 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+ var _chunk3KTQQZOWcjs = require('./chunk-3KTQQZOW.cjs');
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+ exports.BroadcasterClient = _chunk3KTQQZOWcjs.BroadcasterClient; exports.BroadcasterRpcError = _chunk3KTQQZOWcjs.BroadcasterRpcError; exports.broadcasterQuoteDomain = _chunk3KTQQZOWcjs.broadcasterQuoteDomain; exports.broadcasterQuoteTypes = _chunk3KTQQZOWcjs.broadcasterQuoteTypes; exports.broadcasterRequestHash = _chunk3KTQQZOWcjs.broadcasterRequestHash; exports.broadcasterTransactInterface = _chunk3KTQQZOWcjs.broadcasterTransactInterface; exports.decodeBroadcasterIntent = _chunk3KTQQZOWcjs.decodeBroadcasterIntent; exports.verifyBroadcasterQuote = _chunk3KTQQZOWcjs.verifyBroadcasterQuote;
21
+ //# sourceMappingURL=broadcaster-3KTB4JO2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/broadcaster-3KTB4JO2.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,mlBAAC","file":"/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/broadcaster-3KTB4JO2.cjs"}
@@ -0,0 +1,21 @@
1
+ import {
2
+ BroadcasterClient,
3
+ BroadcasterRpcError,
4
+ broadcasterQuoteDomain,
5
+ broadcasterQuoteTypes,
6
+ broadcasterRequestHash,
7
+ broadcasterTransactInterface,
8
+ decodeBroadcasterIntent,
9
+ verifyBroadcasterQuote
10
+ } from "./chunk-R5YAOJKB.js";
11
+ export {
12
+ BroadcasterClient,
13
+ BroadcasterRpcError,
14
+ broadcasterQuoteDomain,
15
+ broadcasterQuoteTypes,
16
+ broadcasterRequestHash,
17
+ broadcasterTransactInterface,
18
+ decodeBroadcasterIntent,
19
+ verifyBroadcasterQuote
20
+ };
21
+ //# sourceMappingURL=broadcaster-7ZKKSTZQ.js.map
@@ -0,0 +1,15 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+ var _chunk2URICDPWcjs = require('./chunk-2URICDPW.cjs');
5
+ require('./chunk-BBSRP4MH.cjs');
6
+ require('./chunk-HCB7RQ3S.cjs');
7
+ require('./chunk-3KTQQZOW.cjs');
8
+ require('./chunk-MA2QZEF5.cjs');
9
+ require('./chunk-4SDP53YQ.cjs');
10
+ require('./chunk-LOR6PYH5.cjs');
11
+
12
+
13
+
14
+ exports.prepareBroadcasterPlan = _chunk2URICDPWcjs.prepareBroadcasterPlan; exports.prepareIntent = _chunk2URICDPWcjs.prepareIntent;
15
+ //# sourceMappingURL=broadcaster-preparation-PJ263WBL.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/broadcaster-preparation-PJ263WBL.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,mIAAC","file":"/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/broadcaster-preparation-PJ263WBL.cjs"}
@@ -0,0 +1,15 @@
1
+ import {
2
+ prepareBroadcasterPlan,
3
+ prepareIntent
4
+ } from "./chunk-HKGJXQVN.js";
5
+ import "./chunk-HLH5JZD4.js";
6
+ import "./chunk-THMD5QO2.js";
7
+ import "./chunk-R5YAOJKB.js";
8
+ import "./chunk-RY4M2CIQ.js";
9
+ import "./chunk-GUD3LAUO.js";
10
+ import "./chunk-4VI6LYGH.js";
11
+ export {
12
+ prepareBroadcasterPlan,
13
+ prepareIntent
14
+ };
15
+ //# sourceMappingURL=broadcaster-preparation-ZQAPZAUG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,27 +1,51 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunkJ2JH6HIGcjs = require('./chunk-J2JH6HIG.cjs');
4
+ var _chunkBBSRP4MHcjs = require('./chunk-BBSRP4MH.cjs');
5
+
6
+
7
+ var _chunk3KTQQZOWcjs = require('./chunk-3KTQQZOW.cjs');
8
+
9
+
10
+ var _chunkMA2QZEF5cjs = require('./chunk-MA2QZEF5.cjs');
5
11
 
6
12
  // src/broadcaster/broadcaster-preparation.ts
7
13
  var _ethers = require('ethers');
8
14
  async function prepareIntent(runtime, intent) {
9
- const preparation = new (0, _chunkJ2JH6HIGcjs.TransactionPreparation)(runtime);
15
+ const preparation = new (0, _chunkBBSRP4MHcjs.TransactionPreparation)(runtime);
10
16
  switch (intent.kind) {
11
17
  case "transfer":
12
18
  return preparation.prepareTransfer(intent.options);
13
19
  case "shield":
14
20
  return preparation.prepareShield(intent.options);
21
+ case "draw-credit":
22
+ return preparation.prepareDrawCredit(intent.options);
15
23
  case "create-credit":
16
24
  return preparation.prepareCreateCredit(intent.options);
17
- case "top-up-credit":
18
- return preparation.prepareTopUpCredit(intent.options);
19
- case "cancel-credit":
20
- return preparation.prepareCancelCredit(intent.options);
25
+ case "update-credit":
26
+ return preparation.prepareUpdateCredit(intent.options);
27
+ case "revoke-credit":
28
+ return preparation.prepareRevokeCredit(intent.options);
21
29
  }
22
30
  }
23
31
  async function prepareBroadcasterPlan(plan, reprepare, client, options) {
32
+ const finalize = async (final) => {
33
+ const data = _chunkBBSRP4MHcjs.exportBroadcasterIntent.call(void 0, final).data;
34
+ const quote = await client.getQuote(data, {
35
+ chainId: final.context.chainId,
36
+ protocol: final.context.protocolAddress
37
+ });
38
+ return {
39
+ plan: final,
40
+ quote,
41
+ broadcasterBinding: {
42
+ configuration: { ...client.configuration },
43
+ intentHash: _chunk3KTQQZOWcjs.broadcasterRequestHash.call(void 0, data)
44
+ }
45
+ };
46
+ };
24
47
  if (!plan.intent) throw new Error("operation has no supported preparation intent");
48
+ await _chunkMA2QZEF5cjs.assertCreditUpdatePlan.call(void 0, plan);
25
49
  const intent = structuredClone(plan.intent);
26
50
  intent.options.deadline = plan.deadline;
27
51
  const maxFee = options.maxFeeAmount;
@@ -30,16 +54,45 @@ async function prepareBroadcasterPlan(plan, reprepare, client, options) {
30
54
  throw new Error("maxFeeAmount must be a positive uint128");
31
55
  if (!Number.isInteger(attempts) || attempts < 1 || attempts > 16)
32
56
  throw new Error("maxAttempts must be 1..16");
57
+ if (intent.kind !== "transfer" && intent.kind !== "shield") {
58
+ if (options.feeSource || options.fundingPermit)
59
+ throw new Error("Credit fees use the owner allowance or gross draw deduction");
60
+ let current = plan;
61
+ let previousAmount2 = 0n;
62
+ for (let i = 0; i < attempts; i++) {
63
+ const schedule2 = await client.estimateQuote(_chunkBBSRP4MHcjs.exportBroadcasterIntent.call(void 0, current).data);
64
+ const minimum = BigInt(schedule2.feeAmount), amount = minimum > previousAmount2 ? minimum : previousAmount2;
65
+ const recipient = _ethers.getAddress.call(void 0, schedule2.feeRecipient);
66
+ if (amount <= 0n || amount > maxFee || amount >= 1n << 128n || BigInt(recipient) === 0n)
67
+ throw new Error("broadcaster fee exceeds user limit or is invalid");
68
+ const request = structuredClone(intent);
69
+ request.options.fee = { recipient, amount };
70
+ current = await reprepare(request);
71
+ await _chunkMA2QZEF5cjs.assertCreditUpdatePlan.call(void 0, current);
72
+ if (_optionalChain([current, 'access', _ => _.credit, 'optionalAccess', _2 => _2.revocation]))
73
+ current.credit.revocationCaller = client.configuration.quoteSigner;
74
+ const data = _chunkBBSRP4MHcjs.exportBroadcasterIntent.call(void 0, current).data;
75
+ const recalculated = await client.estimateQuote(data);
76
+ if (_ethers.getAddress.call(void 0, recalculated.feeRecipient) !== recipient || BigInt(recalculated.feeAmount) <= 0n || BigInt(recalculated.feeAmount) > maxFee)
77
+ throw new Error("broadcaster fee exceeds user limit or recipient changed");
78
+ if (amount >= BigInt(recalculated.feeAmount)) {
79
+ current.intent = structuredClone(intent);
80
+ return finalize(current);
81
+ }
82
+ previousAmount2 = amount;
83
+ }
84
+ throw new Error("broadcaster fee did not stabilize within the preparation limit");
85
+ }
33
86
  const funding = "funding" in intent.options ? intent.options.funding : void 0;
34
- let source = _nullishCoalesce(options.feeSource, () => ( (intent.kind === "cancel-credit" ? "payout" : funding ? "public-funding" : "private-inputs")));
35
- if (!["public-funding", "private-inputs", "payout"].includes(source))
87
+ let source = _nullishCoalesce(options.feeSource, () => ( (funding ? "public-funding" : "private-inputs")));
88
+ if (!["public-funding", "private-inputs"].includes(source))
36
89
  throw new Error("unsupported fee source");
37
- if (intent.kind === "cancel-credit" ? source !== "payout" : source === "payout" || intent.kind === "shield" && source !== "public-funding")
90
+ if (intent.kind === "shield" && source !== "public-funding")
38
91
  throw new Error("fee source is unavailable for this operation");
39
92
  if (source === "public-funding" && !funding)
40
93
  throw new Error("public funding fee requires an explicit payer");
41
94
  const permitCallback = options.fundingPermit;
42
- let schedule = await client.fee(plan.context.tokenAddress, _chunkJ2JH6HIGcjs.exportBroadcasterIntent.call(void 0, plan).data);
95
+ let schedule = await client.estimateQuote(_chunkBBSRP4MHcjs.exportBroadcasterIntent.call(void 0, plan).data);
43
96
  let previousAmount = 0n;
44
97
  for (let i = 0; i < attempts; i++) {
45
98
  const minimum = BigInt(schedule.feeAmount);
@@ -47,20 +100,18 @@ async function prepareBroadcasterPlan(plan, reprepare, client, options) {
47
100
  const recipient = _ethers.getAddress.call(void 0, schedule.feeRecipient);
48
101
  if (amount <= 0n || amount > maxFee || amount >= 1n << 128n || BigInt(recipient) === 0n)
49
102
  throw new Error("broadcaster fee exceeds user limit or is invalid");
50
- if (options.feeSource === void 0 && funding && plan.inputs.length > 0 && (intent.kind === "transfer" || intent.kind === "create-credit" || intent.kind === "top-up-credit")) {
51
- const business = intent.kind === "transfer" ? intent.options.outputs.reduce(
103
+ if (options.feeSource === void 0 && funding && plan.inputs.length > 0 && intent.kind === "transfer") {
104
+ const business = intent.options.outputs.reduce(
52
105
  (sum, output) => sum + output.amount,
53
- _nullishCoalesce(_optionalChain([intent, 'access', _ => _.options, 'access', _2 => _2.withdrawal, 'optionalAccess', _3 => _3.amount]), () => ( 0n))
54
- ) : intent.kind === "create-credit" ? intent.options.amount : intent.options.additionalAmount;
106
+ _nullishCoalesce(_optionalChain([intent, 'access', _3 => _3.options, 'access', _4 => _4.withdrawal, 'optionalAccess', _5 => _5.amount]), () => ( 0n))
107
+ );
55
108
  const change = plan.inputs.reduce((sum, input) => sum + input.note.amount, funding.amount) - business;
56
109
  source = change >= amount ? "private-inputs" : "public-funding";
57
110
  }
58
- if (source === "public-funding" && _optionalChain([funding, 'optionalAccess', _4 => _4.permit]) && funding.permit.deadline !== 0n && !permitCallback)
111
+ if (source === "public-funding" && _optionalChain([funding, 'optionalAccess', _6 => _6.permit]) && funding.permit.deadline !== 0n && !permitCallback)
59
112
  throw new Error(
60
113
  "existing permit cannot fund an increased amount; provide fundingPermit for final gross funding or approve separately"
61
114
  );
62
- if (source === "payout" && amount >= plan.credit.cancel.amount)
63
- throw new Error("fee must be less than the cancellation refund");
64
115
  const request = structuredClone(intent);
65
116
  request.options.fee = { recipient, amount };
66
117
  if (funding && "funding" in request.options) {
@@ -78,10 +129,7 @@ async function prepareBroadcasterPlan(plan, reprepare, client, options) {
78
129
  const next = await reprepare(request);
79
130
  if (source === "private-inputs" && next.inputs.length === 0)
80
131
  throw new Error("private-inputs fee requires private funds");
81
- const recalculated = await client.fee(
82
- plan.context.tokenAddress,
83
- _chunkJ2JH6HIGcjs.exportBroadcasterIntent.call(void 0, next).data
84
- );
132
+ const recalculated = await client.estimateQuote(_chunkBBSRP4MHcjs.exportBroadcasterIntent.call(void 0, next).data);
85
133
  const required = BigInt(recalculated.feeAmount);
86
134
  if (_ethers.getAddress.call(void 0, recalculated.feeRecipient) !== recipient || required <= 0n || required > maxFee)
87
135
  throw new Error("broadcaster fee exceeds user limit or recipient changed");
@@ -99,21 +147,12 @@ async function prepareBroadcasterPlan(plan, reprepare, client, options) {
99
147
  if (!permit) throw new Error("fundingPermit did not return a permit");
100
148
  request.options.funding = { ...request.options.funding, permit };
101
149
  final = await reprepare(request);
102
- const permitted = await client.fee(
103
- plan.context.tokenAddress,
104
- _chunkJ2JH6HIGcjs.exportBroadcasterIntent.call(void 0, final).data
105
- );
150
+ const permitted = await client.estimateQuote(_chunkBBSRP4MHcjs.exportBroadcasterIntent.call(void 0, final).data);
106
151
  if (_ethers.getAddress.call(void 0, permitted.feeRecipient) !== recipient || BigInt(permitted.feeAmount) > amount)
107
152
  throw new Error("permit changed the required fee; prepare again");
108
153
  }
109
154
  final.intent = structuredClone(intent);
110
- return {
111
- plan: final,
112
- quote: await client.quote(_chunkJ2JH6HIGcjs.exportBroadcasterIntent.call(void 0, final).data, {
113
- chainId: final.context.chainId,
114
- protocol: final.context.protocolAddress
115
- })
116
- };
155
+ return finalize(final);
117
156
  }
118
157
  previousAmount = amount;
119
158
  schedule = recalculated;
@@ -125,4 +164,4 @@ async function prepareBroadcasterPlan(plan, reprepare, client, options) {
125
164
 
126
165
 
127
166
  exports.prepareIntent = prepareIntent; exports.prepareBroadcasterPlan = prepareBroadcasterPlan;
128
- //# sourceMappingURL=chunk-LOU7AP2B.cjs.map
167
+ //# sourceMappingURL=chunk-2URICDPW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/chunk-2URICDPW.cjs","../src/broadcaster/broadcaster-preparation.ts"],"names":["previousAmount","schedule"],"mappings":"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","file":"/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/chunk-2URICDPW.cjs","sourcesContent":[null,"import { broadcasterRequestHash } from \"./index\";\nimport type { SavedOperation } from \"../transactions/operation-types\";\nimport { assertCreditUpdatePlan } from \"../credit/state\";\nimport { getAddress } from \"ethers\";\nimport type {\n RevokeCreditPreparation,\n CreateCreditPreparation,\n DrawCreditPreparation,\n OperationPlan,\n PreparationRuntime,\n ShieldPreparation,\n UpdateCreditPreparation,\n TransferPreparation,\n} from \"../transactions/operation-types\";\nimport { TransactionPreparation } from \"../transactions/preparation/transaction-preparation\";\nimport type { BroadcasterClient, SignedBroadcasterQuote } from \"./index\";\nimport { exportBroadcasterIntent } from \"./intent\";\nexport type PreparationIntent =\n | { kind: \"transfer\"; options: TransferPreparation }\n | { kind: \"shield\"; options: ShieldPreparation }\n | { kind: \"create-credit\"; options: CreateCreditPreparation }\n | { kind: \"draw-credit\"; options: DrawCreditPreparation }\n | { kind: \"update-credit\"; options: UpdateCreditPreparation }\n | { kind: \"revoke-credit\"; options: RevokeCreditPreparation };\nexport type BroadcasterFeeSource = \"public-funding\" | \"private-inputs\";\nexport interface BroadcasterQuoteOptions {\n maxFeeAmount: bigint;\n feeSource?: BroadcasterFeeSource;\n maxAttempts?: number;\n /** Optional app-owned permit signing, requested once for the final gross funding amount. */\n fundingPermit?: (request: {\n payer: `0x${string}`;\n amount: bigint;\n tokenAddress: `0x${string}`;\n protocolAddress: `0x${string}`;\n }) => Promise<NonNullable<TransferPreparation[\"funding\"]>[\"permit\"]>;\n}\nexport async function prepareIntent(\n runtime: PreparationRuntime<OperationPlan>,\n intent: PreparationIntent\n): Promise<OperationPlan> {\n const preparation = new TransactionPreparation(runtime);\n switch (intent.kind) {\n case \"transfer\":\n return preparation.prepareTransfer(intent.options);\n case \"shield\":\n return preparation.prepareShield(intent.options);\n case \"draw-credit\":\n return preparation.prepareDrawCredit(intent.options);\n case \"create-credit\":\n return preparation.prepareCreateCredit(intent.options);\n case \"update-credit\":\n return preparation.prepareUpdateCredit(intent.options);\n case \"revoke-credit\":\n return preparation.prepareRevokeCredit(intent.options);\n }\n}\nexport async function prepareBroadcasterPlan(\n plan: OperationPlan,\n reprepare: (intent: PreparationIntent) => Promise<OperationPlan>,\n client: BroadcasterClient,\n options: BroadcasterQuoteOptions\n): Promise<{\n plan: OperationPlan;\n quote: SignedBroadcasterQuote;\n broadcasterBinding: NonNullable<SavedOperation[\"broadcasterBinding\"]>;\n}> {\n const finalize = async (final: OperationPlan) => {\n const data = exportBroadcasterIntent(final).data;\n const quote = await client.getQuote(data, {\n chainId: final.context.chainId,\n protocol: final.context.protocolAddress,\n });\n return {\n plan: final,\n quote,\n broadcasterBinding: {\n configuration: { ...client.configuration },\n intentHash: broadcasterRequestHash(data),\n },\n };\n };\n if (!plan.intent) throw new Error(\"operation has no supported preparation intent\");\n await assertCreditUpdatePlan(plan);\n const intent = structuredClone(plan.intent);\n intent.options.deadline = plan.deadline;\n const maxFee = options.maxFeeAmount;\n const attempts = options.maxAttempts ?? 4;\n if (typeof maxFee !== \"bigint\" || maxFee <= 0n || maxFee >= 1n << 128n)\n throw new Error(\"maxFeeAmount must be a positive uint128\");\n if (!Number.isInteger(attempts) || attempts < 1 || attempts > 16)\n throw new Error(\"maxAttempts must be 1..16\");\n if (intent.kind !== \"transfer\" && intent.kind !== \"shield\") {\n if (options.feeSource || options.fundingPermit)\n throw new Error(\"Credit fees use the owner allowance or gross draw deduction\");\n let current = plan;\n let previousAmount = 0n;\n for (let i = 0; i < attempts; i++) {\n const schedule = await client.estimateQuote(exportBroadcasterIntent(current).data);\n const minimum = BigInt(schedule.feeAmount),\n amount = minimum > previousAmount ? minimum : previousAmount;\n const recipient = getAddress(schedule.feeRecipient) as `0x${string}`;\n if (amount <= 0n || amount > maxFee || amount >= 1n << 128n || BigInt(recipient) === 0n)\n throw new Error(\"broadcaster fee exceeds user limit or is invalid\");\n const request = structuredClone(intent);\n request.options.fee = { recipient, amount };\n current = await reprepare(request);\n await assertCreditUpdatePlan(current);\n if (current.credit?.revocation)\n current.credit.revocationCaller = client.configuration.quoteSigner as `0x${string}`;\n const data = exportBroadcasterIntent(current).data;\n const recalculated = await client.estimateQuote(data);\n if (\n getAddress(recalculated.feeRecipient) !== recipient ||\n BigInt(recalculated.feeAmount) <= 0n ||\n BigInt(recalculated.feeAmount) > maxFee\n )\n throw new Error(\"broadcaster fee exceeds user limit or recipient changed\");\n if (amount >= BigInt(recalculated.feeAmount)) {\n current.intent = structuredClone(intent);\n return finalize(current);\n }\n previousAmount = amount;\n }\n throw new Error(\"broadcaster fee did not stabilize within the preparation limit\");\n }\n const funding = \"funding\" in intent.options ? intent.options.funding : undefined;\n let source = options.feeSource ?? (funding ? \"public-funding\" : \"private-inputs\");\n if (![\"public-funding\", \"private-inputs\"].includes(source))\n throw new Error(\"unsupported fee source\");\n if (intent.kind === \"shield\" && source !== \"public-funding\")\n throw new Error(\"fee source is unavailable for this operation\");\n if (source === \"public-funding\" && !funding)\n throw new Error(\"public funding fee requires an explicit payer\");\n const permitCallback = options.fundingPermit;\n let schedule = await client.estimateQuote(exportBroadcasterIntent(plan).data);\n let previousAmount = 0n;\n for (let i = 0; i < attempts; i++) {\n const minimum = BigInt(schedule.feeAmount);\n const amount = minimum > previousAmount ? minimum : previousAmount;\n const recipient = getAddress(schedule.feeRecipient) as `0x${string}`;\n if (amount <= 0n || amount > maxFee || amount >= 1n << 128n || BigInt(recipient) === 0n)\n throw new Error(\"broadcaster fee exceeds user limit or is invalid\");\n // Prefer already available private change; never add a payer implicitly.\n if (\n options.feeSource === undefined &&\n funding &&\n plan.inputs.length > 0 &&\n intent.kind === \"transfer\"\n ) {\n const business = intent.options.outputs.reduce(\n (sum, output) => sum + output.amount,\n intent.options.withdrawal?.amount ?? 0n\n );\n const change =\n plan.inputs.reduce((sum, input) => sum + input.note.amount, funding.amount) -\n business;\n source = change >= amount ? \"private-inputs\" : \"public-funding\";\n }\n if (\n source === \"public-funding\" &&\n funding?.permit &&\n funding.permit.deadline !== 0n &&\n !permitCallback\n )\n throw new Error(\n \"existing permit cannot fund an increased amount; provide fundingPermit for final gross funding or approve separately\"\n );\n const request = structuredClone(intent);\n request.options.fee = { recipient, amount };\n if (funding && \"funding\" in request.options) {\n const signedFunding = { ...funding };\n if (funding.authorization === \"caller\") {\n delete signedFunding.sigNonce;\n delete signedFunding.deadline;\n }\n request.options.funding = {\n ...signedFunding,\n amount: funding.amount + (source === \"public-funding\" ? amount : 0n),\n authorization: \"signature\",\n };\n }\n const next = await reprepare(request);\n if (source === \"private-inputs\" && next.inputs.length === 0)\n throw new Error(\"private-inputs fee requires private funds\");\n const recalculated = await client.estimateQuote(exportBroadcasterIntent(next).data);\n const required = BigInt(recalculated.feeAmount);\n if (\n getAddress(recalculated.feeRecipient) !== recipient ||\n required <= 0n ||\n required > maxFee\n )\n throw new Error(\"broadcaster fee exceeds user limit or recipient changed\");\n if (amount >= required) {\n let final = next;\n if (permitCallback) {\n if (!funding || !(\"funding\" in request.options))\n throw new Error(\"fundingPermit requires public funding\");\n const permit = await permitCallback({\n payer: funding.payer,\n amount: request.options.funding!.amount,\n tokenAddress: plan.context.tokenAddress,\n protocolAddress: plan.context.protocolAddress,\n });\n if (!permit) throw new Error(\"fundingPermit did not return a permit\");\n request.options.funding = { ...request.options.funding!, permit };\n final = await reprepare(request);\n const permitted = await client.estimateQuote(exportBroadcasterIntent(final).data);\n if (\n getAddress(permitted.feeRecipient) !== recipient ||\n BigInt(permitted.feeAmount) > amount\n )\n throw new Error(\"permit changed the required fee; prepare again\");\n }\n final.intent = structuredClone(intent);\n return finalize(final);\n }\n previousAmount = amount;\n schedule = recalculated;\n }\n throw new Error(\"broadcaster fee did not stabilize within the preparation limit\");\n}\n"]}
@@ -0,0 +1,86 @@
1
+ import {
2
+ decodeBroadcasterIntent
3
+ } from "./chunk-R5YAOJKB.js";
4
+
5
+ // src/provenance/proof-record.ts
6
+ import {
7
+ inputDigest,
8
+ operationDigest,
9
+ proofSidecarToWire,
10
+ validateProofBundle,
11
+ word
12
+ } from "@invisi-labs/protocol/provenance";
13
+ import { normalizeTransactRequest, transactUserPublicInputs } from "@invisi-labs/protocol";
14
+ function keys(value, allowed) {
15
+ if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !allowed.includes(key)))
16
+ throw Error("Unknown Provenance packet field");
17
+ }
18
+ async function validateProvenanceProof(packet, trust) {
19
+ keys(packet, [
20
+ "format",
21
+ "data",
22
+ "context",
23
+ "mainCircuitCapacity",
24
+ "publicInputs",
25
+ "operationDigest",
26
+ "sidecars"
27
+ ]);
28
+ keys(packet.context, ["chainId", "protocolAddress", "tokenAddress"]);
29
+ if (packet.format !== "invisi-provenance-submission-v1" || typeof packet.context.chainId !== "string" || typeof packet.context.protocolAddress !== "string" || typeof packet.context.tokenAddress !== "string" || BigInt(packet.context.chainId) !== BigInt(trust.chainId) || BigInt(packet.context.protocolAddress) !== BigInt(trust.protocolAddress) || !Array.isArray(packet.sidecars) || packet.sidecars.length !== 1)
30
+ throw Error("Provenance packet deployment or shape mismatch");
31
+ const decoded = decodeBroadcasterIntent(packet.data);
32
+ if (decoded.method !== "transact") throw Error("Provenance requires private transact calldata");
33
+ const context = {
34
+ chainId: BigInt(packet.context.chainId),
35
+ protocolAddress: packet.context.protocolAddress,
36
+ tokenAddress: packet.context.tokenAddress
37
+ };
38
+ const raw = decoded.request.params;
39
+ const params = {
40
+ token: raw.token,
41
+ sources: Array.from(raw.sources, (source) => ({
42
+ treeId: source.treeId,
43
+ merkleRoot: source.merkleRoot
44
+ })),
45
+ nullifiers: [...raw.nullifiers],
46
+ noteCommitments: [...raw.noteCommitments],
47
+ withdrawalAddress: raw.withdrawalAddress,
48
+ withdrawalAmount: raw.withdrawalAmount,
49
+ deadline: raw.deadline,
50
+ feeRecipient: raw.feeRecipient,
51
+ feeAmount: raw.feeAmount
52
+ };
53
+ const deliveries = decoded.request.deliveries.map(
54
+ (d) => d.toObject(true)
55
+ );
56
+ const funding = decoded.request.funding.toObject(true);
57
+ funding.permit.v = Number(funding.permit.v);
58
+ const normalized = normalizeTransactRequest(context, params, deliveries, funding);
59
+ const publicInputs = transactUserPublicInputs(context, params, deliveries, funding);
60
+ if (!normalized.inputCount || normalized.capacity !== packet.mainCircuitCapacity || JSON.stringify(publicInputs) !== JSON.stringify(packet.publicInputs))
61
+ throw Error("Provenance native statement mismatch");
62
+ const digest = operationDigest({
63
+ ...context,
64
+ mainCircuitCapacity: normalized.capacity,
65
+ publicInputs
66
+ });
67
+ if (packet.operationDigest !== digest) throw Error("Provenance operation digest mismatch");
68
+ const sidecar = packet.sidecars[0];
69
+ const wire = proofSidecarToWire(sidecar);
70
+ if (wire.operationIndex !== "0") throw Error("Unsupported Provenance operation index");
71
+ await validateProofBundle(wire.proofBundle, trust);
72
+ const pi = wire.proofBundle.publicInputs.map(BigInt);
73
+ if (pi[2] !== BigInt(context.tokenAddress) || pi[6] !== BigInt(normalized.inputCount) || word(pi[7] << 128n | pi[8]) !== digest || pi[9] !== await inputDigest(normalized.nullifiers))
74
+ throw Error("Provenance proof statement mismatch");
75
+ return {
76
+ ...packet,
77
+ context: { ...packet.context },
78
+ publicInputs: [...publicInputs],
79
+ sidecars: [wire]
80
+ };
81
+ }
82
+
83
+ export {
84
+ validateProvenanceProof
85
+ };
86
+ //# sourceMappingURL=chunk-3D24ABYR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provenance/proof-record.ts"],"sourcesContent":["import {\n inputDigest,\n operationDigest,\n proofSidecarToWire,\n validateProofBundle,\n word,\n type ProofSidecar,\n type TrustContext,\n} from \"@invisi-labs/protocol/provenance\";\nimport { normalizeTransactRequest, transactUserPublicInputs } from \"@invisi-labs/protocol\";\nimport type { Hex } from \"@invisi-labs/protocol/contracts\";\nimport { decodeBroadcasterIntent } from \"../broadcaster/index\";\n\n/** Public recovery packet; persist encrypted Note openings separately if reproof is needed. */\nexport interface ProvenanceProof {\n format: \"invisi-provenance-submission-v1\";\n data: string;\n context: { chainId: string; protocolAddress: string; tokenAddress: string };\n mainCircuitCapacity: number;\n publicInputs: string[];\n operationDigest: string;\n sidecars: ProofSidecar[];\n}\n\nfunction keys(value: object, allowed: string[]) {\n if (\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).some((key) => !allowed.includes(key))\n )\n throw Error(\"Unknown Provenance packet field\");\n}\n\nexport async function validateProvenanceProof(\n packet: ProvenanceProof,\n trust: TrustContext\n): Promise<ProvenanceProof> {\n keys(packet, [\n \"format\",\n \"data\",\n \"context\",\n \"mainCircuitCapacity\",\n \"publicInputs\",\n \"operationDigest\",\n \"sidecars\",\n ]);\n keys(packet.context, [\"chainId\", \"protocolAddress\", \"tokenAddress\"]);\n if (\n packet.format !== \"invisi-provenance-submission-v1\" ||\n typeof packet.context.chainId !== \"string\" ||\n typeof packet.context.protocolAddress !== \"string\" ||\n typeof packet.context.tokenAddress !== \"string\" ||\n BigInt(packet.context.chainId) !== BigInt(trust.chainId) ||\n BigInt(packet.context.protocolAddress) !== BigInt(trust.protocolAddress) ||\n !Array.isArray(packet.sidecars) ||\n packet.sidecars.length !== 1\n )\n throw Error(\"Provenance packet deployment or shape mismatch\");\n const decoded = decodeBroadcasterIntent(packet.data);\n if (decoded.method !== \"transact\") throw Error(\"Provenance requires private transact calldata\");\n const context = {\n chainId: BigInt(packet.context.chainId),\n protocolAddress: packet.context.protocolAddress as Hex,\n tokenAddress: packet.context.tokenAddress as Hex,\n };\n const raw = decoded.request.params;\n const params = {\n token: raw.token,\n sources: Array.from(raw.sources, (source: any) => ({\n treeId: source.treeId,\n merkleRoot: source.merkleRoot,\n })),\n nullifiers: [...raw.nullifiers],\n noteCommitments: [...raw.noteCommitments],\n withdrawalAddress: raw.withdrawalAddress,\n withdrawalAmount: raw.withdrawalAmount,\n deadline: raw.deadline,\n feeRecipient: raw.feeRecipient,\n feeAmount: raw.feeAmount,\n };\n const deliveries = decoded.request.deliveries.map((d: { toObject(deep: boolean): unknown }) =>\n d.toObject(true)\n );\n const funding = decoded.request.funding.toObject(true);\n funding.permit.v = Number(funding.permit.v);\n const normalized = normalizeTransactRequest(context, params, deliveries, funding);\n const publicInputs = transactUserPublicInputs(context, params, deliveries, funding);\n if (\n !normalized.inputCount ||\n normalized.capacity !== packet.mainCircuitCapacity ||\n JSON.stringify(publicInputs) !== JSON.stringify(packet.publicInputs)\n )\n throw Error(\"Provenance native statement mismatch\");\n const digest = operationDigest({\n ...context,\n mainCircuitCapacity: normalized.capacity,\n publicInputs,\n });\n if (packet.operationDigest !== digest) throw Error(\"Provenance operation digest mismatch\");\n const sidecar = packet.sidecars[0]!;\n const wire = proofSidecarToWire(sidecar);\n if (wire.operationIndex !== \"0\") throw Error(\"Unsupported Provenance operation index\");\n await validateProofBundle(wire.proofBundle, trust);\n const pi = wire.proofBundle.publicInputs.map(BigInt);\n if (\n pi[2] !== BigInt(context.tokenAddress) ||\n pi[6] !== BigInt(normalized.inputCount) ||\n word((pi[7]! << 128n) | pi[8]!) !== digest ||\n pi[9] !== (await inputDigest(normalized.nullifiers))\n )\n throw Error(\"Provenance proof statement mismatch\");\n return {\n ...packet,\n context: { ...packet.context },\n publicInputs: [...publicInputs],\n sidecars: [wire],\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,71 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/broadcaster/index.ts
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+ var _broadcaster = require('@invisi-labs/rpc/broadcaster');
11
+
12
+
13
+
14
+
15
+ // src/broadcaster/operation-bridge.ts
16
+ var bindings = /* @__PURE__ */ new WeakMap();
17
+ function bindBroadcasterOperation(target, hooks) {
18
+ if (bindings.has(target)) throw Error("Broadcaster operation already registered");
19
+ bindings.set(target, hooks);
20
+ }
21
+ function quoteOperation(client, target, options) {
22
+ const hooks = bindings.get(target);
23
+ if (!hooks) throw Error("Operation does not support broadcaster quoting");
24
+ return hooks.quote(client, options);
25
+ }
26
+ function submitOperation(client, target) {
27
+ const hooks = bindings.get(target);
28
+ if (!hooks) throw Error("Operation does not support broadcaster submission");
29
+ return hooks.submit(client);
30
+ }
31
+ function proveOperationProvenance(target, capability, reprove = false) {
32
+ const hooks = bindings.get(target);
33
+ if (!hooks) throw Error("Operation does not support Provenance proving");
34
+ return hooks.proveProvenance(capability, reprove);
35
+ }
36
+ function readOperationProvenance(target) {
37
+ const hooks = bindings.get(target);
38
+ if (!hooks) throw Error("Operation does not support Provenance proving");
39
+ return hooks.readProvenance();
40
+ }
41
+ function operationProvenanceContext(target) {
42
+ const hooks = bindings.get(target);
43
+ if (!hooks) throw Error("Operation does not support Provenance proving");
44
+ return hooks.provenanceContext();
45
+ }
46
+
47
+ // src/broadcaster/index.ts
48
+ var BroadcasterClient = class extends _broadcaster.BroadcasterClient {
49
+ quote(transaction, options) {
50
+ return quoteOperation(this, transaction, options);
51
+ }
52
+ submit(transaction) {
53
+ return submitOperation(this, transaction);
54
+ }
55
+ };
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+ exports.bindBroadcasterOperation = bindBroadcasterOperation; exports.proveOperationProvenance = proveOperationProvenance; exports.readOperationProvenance = readOperationProvenance; exports.operationProvenanceContext = operationProvenanceContext; exports.BroadcasterClient = BroadcasterClient; exports.BroadcasterRpcError = _broadcaster.BroadcasterRpcError; exports.broadcasterQuoteDomain = _broadcaster.broadcasterQuoteDomain; exports.broadcasterQuoteTypes = _broadcaster.broadcasterQuoteTypes; exports.broadcasterRequestHash = _broadcaster.broadcasterRequestHash; exports.broadcasterTransactInterface = _broadcaster.broadcasterTransactInterface; exports.decodeBroadcasterIntent = _broadcaster.decodeBroadcasterIntent; exports.verifyBroadcasterQuote = _broadcaster.verifyBroadcasterQuote;
71
+ //# sourceMappingURL=chunk-3KTQQZOW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/chunk-3KTQQZOW.cjs","../src/broadcaster/index.ts","../src/broadcaster/operation-bridge.ts"],"names":[],"mappings":"AAAA;ACAA;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,2DACG;AAUP;AACI;AAAqB;ADNzB;AACA;AEOA,IAAM,SAAA,kBAAW,IAAI,OAAA,CAA+D,CAAA;AAC7E,SAAS,wBAAA,CACZ,MAAA,EACA,KAAA,EACI;AACJ,EAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,MAAM,KAAA,CAAM,0CAA0C,CAAA;AAChF,EAAA,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AAC9B;AACO,SAAS,cAAA,CACZ,MAAA,EACA,MAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,KAAA,CAAM,gDAAgD,CAAA;AACxE,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA;AACtC;AACO,SAAS,eAAA,CACZ,MAAA,EACA,MAAA,EAC0B;AAC1B,EAAA,MAAM,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,KAAA,CAAM,mDAAmD,CAAA;AAC3E,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAC9B;AAEO,SAAS,wBAAA,CACZ,MAAA,EACA,UAAA,EACA,QAAA,EAAU,KAAA,EACc;AACxB,EAAA,MAAM,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,KAAA,CAAM,+CAA+C,CAAA;AACvE,EAAA,OAAO,KAAA,CAAM,eAAA,CAAgB,UAAA,EAAY,OAAO,CAAA;AACpD;AAEO,SAAS,uBAAA,CACZ,MAAA,EACoC;AACpC,EAAA,MAAM,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,KAAA,CAAM,+CAA+C,CAAA;AACvE,EAAA,OAAO,KAAA,CAAM,cAAA,CAAe,CAAA;AAChC;AAEO,SAAS,0BAAA,CAA2B,MAAA,EAAgD;AACvF,EAAA,MAAM,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,KAAA,CAAM,+CAA+C,CAAA;AACvE,EAAA,OAAO,KAAA,CAAM,iBAAA,CAAkB,CAAA;AACnC;AFxBA;AACA;ACpBO,IAAM,kBAAA,EAAN,MAAA,QAAgC,+BAAqB;AAAA,EACxD,KAAA,CACI,WAAA,EACA,OAAA,EACU;AACV,IAAA,OAAO,cAAA,CAAe,IAAA,EAAM,WAAA,EAAa,OAAO,CAAA;AAAA,EACpD;AAAA,EACA,MAAA,CAAO,WAAA,EAAiE;AACpE,IAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,WAAW,CAAA;AAAA,EAC5C;AACJ,CAAA;ADmBA;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,oxBAAC","file":"/Users/wx/Workspace/invisi-lab/invisi-sdk-ts/packages/sdk/dist/chunk-3KTQQZOW.cjs","sourcesContent":[null,"export {\n BroadcasterRpcError,\n broadcasterQuoteDomain,\n broadcasterQuoteTypes,\n broadcasterRequestHash,\n broadcasterTransactInterface,\n decodeBroadcasterIntent,\n verifyBroadcasterQuote,\n} from \"@invisi-labs/rpc/broadcaster\";\nexport type {\n BroadcasterQuote,\n BroadcasterEstimate,\n SignedBroadcasterQuote,\n BroadcasterTrust,\n BroadcasterStatus,\n BroadcasterTransport,\n BroadcasterConfiguration,\n} from \"@invisi-labs/rpc/broadcaster\";\nimport {\n BroadcasterClient as RpcBroadcasterClient,\n type BroadcasterStatus,\n} from \"@invisi-labs/rpc/broadcaster\";\nimport { quoteOperation, submitOperation, type BroadcasterTransaction } from \"./operation-bridge\";\nimport type { BroadcasterQuoteOptions } from \"./broadcaster-preparation\";\nexport type { BroadcasterTransaction } from \"./operation-bridge\";\n/** Application-level quote and submission conveniences over the public RPC client. */\nexport class BroadcasterClient extends RpcBroadcasterClient {\n quote<T extends BroadcasterTransaction>(\n transaction: T,\n options: BroadcasterQuoteOptions\n ): Promise<T> {\n return quoteOperation(this, transaction, options);\n }\n submit(transaction: BroadcasterTransaction): Promise<BroadcasterStatus> {\n return submitOperation(this, transaction);\n }\n}\n","import type { Scope } from \"@invisi-labs/protocol/provenance\";\nimport type { PreparedProvenanceCapability } from \"./provenance-preparation\";\nimport type { ProvenanceProof } from \"../provenance/proof-record\";\nimport type { BroadcasterClient, BroadcasterStatus } from \"./index\";\nimport type { BroadcasterQuoteOptions } from \"./broadcaster-preparation\";\n\nexport interface BroadcasterTransaction {\n readonly id: string;\n readonly status: string;\n}\ninterface Hooks<T extends BroadcasterTransaction> {\n quote(client: BroadcasterClient, options: BroadcasterQuoteOptions): Promise<T>;\n submit(client: BroadcasterClient): Promise<BroadcasterStatus>;\n provenanceContext(): Promise<Scope>;\n readProvenance(): Promise<ProvenanceProof | undefined>;\n proveProvenance(\n capability: PreparedProvenanceCapability,\n reprove?: boolean\n ): Promise<ProvenanceProof>;\n}\n// Both stateless handles and managed sessions register their own lifecycle/storage boundary.\nconst bindings = new WeakMap<BroadcasterTransaction, Hooks<BroadcasterTransaction>>();\nexport function bindBroadcasterOperation<T extends BroadcasterTransaction>(\n target: T,\n hooks: Hooks<T>\n): void {\n if (bindings.has(target)) throw Error(\"Broadcaster operation already registered\");\n bindings.set(target, hooks);\n}\nexport function quoteOperation<T extends BroadcasterTransaction>(\n client: BroadcasterClient,\n target: T,\n options: BroadcasterQuoteOptions\n): Promise<T> {\n const hooks = bindings.get(target);\n if (!hooks) throw Error(\"Operation does not support broadcaster quoting\");\n return hooks.quote(client, options) as Promise<T>;\n}\nexport function submitOperation(\n client: BroadcasterClient,\n target: BroadcasterTransaction\n): Promise<BroadcasterStatus> {\n const hooks = bindings.get(target);\n if (!hooks) throw Error(\"Operation does not support broadcaster submission\");\n return hooks.submit(client);\n}\n\nexport function proveOperationProvenance(\n target: BroadcasterTransaction,\n capability: PreparedProvenanceCapability,\n reprove = false\n): Promise<ProvenanceProof> {\n const hooks = bindings.get(target);\n if (!hooks) throw Error(\"Operation does not support Provenance proving\");\n return hooks.proveProvenance(capability, reprove);\n}\n\nexport function readOperationProvenance(\n target: BroadcasterTransaction\n): Promise<ProvenanceProof | undefined> {\n const hooks = bindings.get(target);\n if (!hooks) throw Error(\"Operation does not support Provenance proving\");\n return hooks.readProvenance();\n}\n\nexport function operationProvenanceContext(target: BroadcasterTransaction): Promise<Scope> {\n const hooks = bindings.get(target);\n if (!hooks) throw Error(\"Operation does not support Provenance proving\");\n return hooks.provenanceContext();\n}\n"]}