@bananapus/nana-sdk-core 2.12.2 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/cjs/bendystrawOperations.d.ts +38 -0
  2. package/dist/cjs/bendystrawOperations.d.ts.map +1 -0
  3. package/dist/cjs/bendystrawOperations.js +212 -0
  4. package/dist/cjs/bendystrawOperations.js.map +1 -0
  5. package/dist/cjs/review/contractWrite.d.ts +38 -0
  6. package/dist/cjs/review/contractWrite.d.ts.map +1 -0
  7. package/dist/cjs/review/contractWrite.js +57 -0
  8. package/dist/cjs/review/contractWrite.js.map +1 -0
  9. package/dist/cjs/review/gas.d.ts +28 -0
  10. package/dist/cjs/review/gas.d.ts.map +1 -0
  11. package/dist/cjs/review/gas.js +40 -0
  12. package/dist/cjs/review/gas.js.map +1 -0
  13. package/dist/cjs/review/index.d.ts +4 -0
  14. package/dist/cjs/review/index.d.ts.map +1 -0
  15. package/dist/cjs/review/index.js +20 -0
  16. package/dist/cjs/review/index.js.map +1 -0
  17. package/dist/cjs/review/transactionReview.d.ts +81 -0
  18. package/dist/cjs/review/transactionReview.d.ts.map +1 -0
  19. package/dist/cjs/review/transactionReview.js +203 -0
  20. package/dist/cjs/review/transactionReview.js.map +1 -0
  21. package/dist/cjs/safeService.d.ts +36 -0
  22. package/dist/cjs/safeService.d.ts.map +1 -0
  23. package/dist/cjs/safeService.js +142 -0
  24. package/dist/cjs/safeService.js.map +1 -0
  25. package/dist/cjs/utils/bendystraw.d.ts +15 -0
  26. package/dist/cjs/utils/bendystraw.d.ts.map +1 -1
  27. package/dist/cjs/utils/bendystraw.js +54 -0
  28. package/dist/cjs/utils/bendystraw.js.map +1 -1
  29. package/dist/cjs/v6/feeBuyback.d.ts +43 -0
  30. package/dist/cjs/v6/feeBuyback.d.ts.map +1 -0
  31. package/dist/cjs/v6/feeBuyback.js +306 -0
  32. package/dist/cjs/v6/feeBuyback.js.map +1 -0
  33. package/dist/esm/bendystrawOperations.d.ts +38 -0
  34. package/dist/esm/bendystrawOperations.d.ts.map +1 -0
  35. package/dist/esm/bendystrawOperations.js +206 -0
  36. package/dist/esm/bendystrawOperations.js.map +1 -0
  37. package/dist/esm/review/contractWrite.d.ts +38 -0
  38. package/dist/esm/review/contractWrite.d.ts.map +1 -0
  39. package/dist/esm/review/contractWrite.js +54 -0
  40. package/dist/esm/review/contractWrite.js.map +1 -0
  41. package/dist/esm/review/gas.d.ts +28 -0
  42. package/dist/esm/review/gas.d.ts.map +1 -0
  43. package/dist/esm/review/gas.js +36 -0
  44. package/dist/esm/review/gas.js.map +1 -0
  45. package/dist/esm/review/index.d.ts +4 -0
  46. package/dist/esm/review/index.d.ts.map +1 -0
  47. package/dist/esm/review/index.js +4 -0
  48. package/dist/esm/review/index.js.map +1 -0
  49. package/dist/esm/review/transactionReview.d.ts +81 -0
  50. package/dist/esm/review/transactionReview.d.ts.map +1 -0
  51. package/dist/esm/review/transactionReview.js +192 -0
  52. package/dist/esm/review/transactionReview.js.map +1 -0
  53. package/dist/esm/safeService.d.ts +36 -0
  54. package/dist/esm/safeService.d.ts.map +1 -0
  55. package/dist/esm/safeService.js +135 -0
  56. package/dist/esm/safeService.js.map +1 -0
  57. package/dist/esm/utils/bendystraw.d.ts +15 -0
  58. package/dist/esm/utils/bendystraw.d.ts.map +1 -1
  59. package/dist/esm/utils/bendystraw.js +53 -0
  60. package/dist/esm/utils/bendystraw.js.map +1 -1
  61. package/dist/esm/v6/feeBuyback.d.ts +43 -0
  62. package/dist/esm/v6/feeBuyback.d.ts.map +1 -0
  63. package/dist/esm/v6/feeBuyback.js +299 -0
  64. package/dist/esm/v6/feeBuyback.js.map +1 -0
  65. package/package.json +30 -1
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeFeeSimulation = analyzeFeeSimulation;
4
+ exports.checkFeeBuyback = checkFeeBuyback;
5
+ exports.feeMessage = feeMessage;
6
+ exports.feeReceipt = feeReceipt;
7
+ exports.createFeeWatch = createFeeWatch;
8
+ const viem_1 = require("viem");
9
+ // Shared by every Juicebox client. Simulation results are
10
+ // advisory estimates only; the existing transaction simulation/authorization remains mandatory.
11
+ const abi = (0, viem_1.parseAbi)([
12
+ "event Mint(uint256 indexed projectId,uint256 leftoverAmount,uint256 tokenCount,address caller)",
13
+ "event Swap(uint256 indexed projectId,uint256 amountToSwapWith,bytes32 indexed poolId,uint256 amountReceived,address caller)",
14
+ "event Pay(uint256 indexed rulesetId,uint256 indexed rulesetCycleNumber,uint256 indexed projectId,address payer,address beneficiary,uint256 amount,uint256 newlyIssuedTokenCount,string memo,bytes metadata,address caller)",
15
+ "event MintTokens(address indexed beneficiary,uint256 indexed projectId,uint256 tokenCount,uint256 beneficiaryTokenCount,string memo,uint256 reservedPercent,address caller)",
16
+ "event ProcessFee(uint256 indexed projectId,address indexed token,uint256 indexed amount,bool wasHeld,address beneficiary,address caller)",
17
+ ]);
18
+ const unknownResult = () => ({ status: "unknown", fees: [] });
19
+ const same = (a, b) => !!a && !!b && a.toLowerCase() === b.toLowerCase();
20
+ /** Successful simulation logs include internal same-terminal fees that call traces cannot isolate. */
21
+ function analyzeFeeSimulation(value, options) {
22
+ if (!Array.isArray(value) || value.length !== 1)
23
+ return unknownResult();
24
+ const calls = value[0]?.calls;
25
+ if (!Array.isArray(calls) ||
26
+ calls.length !== 1 ||
27
+ calls[0]?.status !== "0x1" ||
28
+ !Array.isArray(calls[0]?.logs) ||
29
+ calls[0].logs.length > 20000)
30
+ return unknownResult();
31
+ const records = [];
32
+ const active = new Map();
33
+ const includes = (addresses, address) => addresses?.some((a) => same(a, address));
34
+ try {
35
+ for (const log of calls[0].logs) {
36
+ let event;
37
+ try {
38
+ event = (0, viem_1.decodeEventLog)({
39
+ abi,
40
+ data: log.data,
41
+ topics: log.topics,
42
+ });
43
+ }
44
+ catch {
45
+ continue;
46
+ }
47
+ const args = event.args;
48
+ if (event.eventName === "Pay") {
49
+ const a = event.args;
50
+ if (!includes(options.terminals, log.address))
51
+ continue;
52
+ const key = `${log.address.toLowerCase()}:${a.projectId}`;
53
+ // Every pay closes the prior scope for this project, even if unrelated.
54
+ active.delete(key);
55
+ if (!includes(options.feePayers, a.payer) || a.amount === 0n)
56
+ continue;
57
+ const terminalPayer = includes(options.terminals, a.payer);
58
+ if (terminalPayer && a.projectId !== 1n)
59
+ continue;
60
+ // Fee recipients can differ from the submitting account. Keep repeated
61
+ // payments distinct without depending on unrelated fees earlier in the log.
62
+ const identity = `${key}:${a.beneficiary.toLowerCase()}`;
63
+ const fee = {
64
+ key: identity,
65
+ projectId: a.projectId,
66
+ beneficiary: a.beneficiary,
67
+ received: a.newlyIssuedTokenCount,
68
+ route: a.newlyIssuedTokenCount > 0n ? "issuance" : "unknown",
69
+ };
70
+ records.push({
71
+ fee,
72
+ payer: a.payer,
73
+ metadata: a.metadata,
74
+ confirmed: !terminalPayer,
75
+ });
76
+ active.set(key, { fee, mint: false, swap: false, sawSwap: false });
77
+ }
78
+ else if (event.eventName === "Mint" || event.eventName === "Swap") {
79
+ if (!includes(options.trustedHooks, log.address))
80
+ continue;
81
+ const state = active.get(`${args.caller.toLowerCase()}:${args.projectId}`);
82
+ if (!state || (state.hook && !same(state.hook, log.address)))
83
+ continue;
84
+ state.hook = log.address;
85
+ // Earlier direct issuance does not verify this hook's beneficiary receipt.
86
+ state.fee.route = "unknown";
87
+ if (event.eventName === "Mint" && event.args.tokenCount > 0n)
88
+ state.mint = true;
89
+ if (event.eventName === "Swap")
90
+ state.sawSwap = true;
91
+ if (event.eventName === "Swap" && event.args.amountReceived > 0n)
92
+ state.swap = true;
93
+ }
94
+ else if (event.eventName === "MintTokens") {
95
+ if (!includes(options.controllers, log.address))
96
+ continue;
97
+ const matches = [...active.entries()].filter(([, s]) => s.fee.projectId === event.args.projectId &&
98
+ same(s.fee.beneficiary, event.args.beneficiary) &&
99
+ same(s.hook, event.args.caller));
100
+ if (matches.length !== 1)
101
+ continue;
102
+ const [key, state] = matches[0];
103
+ state.fee.received += event.args.beneficiaryTokenCount;
104
+ state.fee.route =
105
+ state.fee.received === 0n
106
+ ? "issuance"
107
+ : state.swap
108
+ ? "swap"
109
+ : state.mint && state.sawSwap
110
+ ? "issuance"
111
+ : state.mint
112
+ ? "fallback"
113
+ : "unknown";
114
+ active.delete(key);
115
+ }
116
+ else if (event.eventName === "ProcessFee") {
117
+ if (!includes(options.terminals, log.address))
118
+ continue;
119
+ // Ordinary project payouts also emit terminal-paid Pay logs, even to
120
+ // project #1. Only ProcessFee after settlement proves a platform fee.
121
+ const record = [...records]
122
+ .reverse()
123
+ .find((r) => !r.confirmed &&
124
+ r.fee.projectId === 1n &&
125
+ same(r.payer, log.address) &&
126
+ same(r.fee.beneficiary, event.args.beneficiary) &&
127
+ same(r.metadata, (0, viem_1.numberToHex)(event.args.projectId, { size: 32 })));
128
+ if (record)
129
+ record.confirmed = true;
130
+ }
131
+ }
132
+ }
133
+ catch {
134
+ return unknownResult();
135
+ }
136
+ // Excluded payout candidates must not change a recognized fee's identity.
137
+ const occurrences = new Map();
138
+ const fees = records
139
+ .filter((r) => r.confirmed)
140
+ .map(({ fee }) => {
141
+ const occurrence = occurrences.get(fee.key) ?? 0;
142
+ occurrences.set(fee.key, occurrence + 1);
143
+ fee.key = `${fee.key}:${occurrence}`;
144
+ return fee;
145
+ });
146
+ // Ordinary issuance has no buyback Mint/Swap event and must not be called a fallback.
147
+ return {
148
+ status: fees.some((f) => f.route === "fallback")
149
+ ? "fallback"
150
+ : fees.some((f) => f.route === "unknown")
151
+ ? "unknown"
152
+ : fees.some((f) => f.route === "swap")
153
+ ? "ready"
154
+ : "none",
155
+ fees,
156
+ };
157
+ }
158
+ async function checkFeeBuyback(client, call, options) {
159
+ if (!call.from || !options.trustedHooks.length)
160
+ return unknownResult();
161
+ // Bound provider stalls; a stalled quote must not trap the confirmation dialog.
162
+ const request = async (args) => {
163
+ let timer;
164
+ try {
165
+ return await Promise.race([
166
+ client.request(args),
167
+ new Promise((_, reject) => {
168
+ timer = setTimeout(() => reject(new Error("Fee estimate timed out")), 8000);
169
+ }),
170
+ ]);
171
+ }
172
+ finally {
173
+ if (timer)
174
+ clearTimeout(timer);
175
+ }
176
+ };
177
+ try {
178
+ const block = await request({ method: "eth_blockNumber" });
179
+ if (typeof block !== "string" || !/^0x[0-9a-f]+$/i.test(block))
180
+ return unknownResult();
181
+ const simulation = await request({
182
+ method: "eth_simulateV1",
183
+ params: [
184
+ {
185
+ blockStateCalls: [
186
+ {
187
+ calls: [
188
+ {
189
+ from: call.from,
190
+ to: call.to,
191
+ data: call.data,
192
+ value: (0, viem_1.numberToHex)(call.value ?? 0n),
193
+ gas: (0, viem_1.numberToHex)(call.gas ?? 10000000n),
194
+ },
195
+ ],
196
+ },
197
+ ],
198
+ validation: false,
199
+ },
200
+ block,
201
+ ],
202
+ });
203
+ return {
204
+ ...analyzeFeeSimulation(simulation, options),
205
+ block,
206
+ checkedAt: Date.now(),
207
+ };
208
+ }
209
+ catch {
210
+ return { ...unknownResult(), checkedAt: Date.now() };
211
+ }
212
+ }
213
+ function feeMessage(result) {
214
+ if (result.status === "fallback")
215
+ return "Your fee would create tokens at the issuance rate. Wait for “Buyback ready” to use the pool rate.";
216
+ if (result.status === "ready")
217
+ return "Buyback ready — review and submit now. The rate may change before execution.";
218
+ if (result.status === "unknown")
219
+ return "Fee return unavailable. Retry now, or submit without an estimate.";
220
+ return "";
221
+ }
222
+ function feeReceipt(fee) {
223
+ const amount = (0, viem_1.formatUnits)(fee.received, 18);
224
+ const [whole, fraction] = amount.split(".");
225
+ const recipient = fee.beneficiary
226
+ ? ` to ${fee.beneficiary.slice(0, 6)}…${fee.beneficiary.slice(-4)}`
227
+ : "";
228
+ return `~${whole.replace(/\B(?=(\d{3})+(?!\d))/g, ",")}${fraction ? "." + fraction.slice(0, 4) : ""} project #${fee.projectId} tokens${recipient}`;
229
+ }
230
+ /** One review owns one watcher. It never sends, and stale/closed reviews cannot approve. */
231
+ function createFeeWatch(check, changed) {
232
+ let stopped = false;
233
+ let latest = unknownResult();
234
+ let pending;
235
+ const affected = new Set();
236
+ const affectedCounts = new Map();
237
+ const identity = (fee) => fee.key.slice(0, fee.key.lastIndexOf(":"));
238
+ async function refresh() {
239
+ if (stopped)
240
+ return unknownResult();
241
+ if (pending)
242
+ return pending;
243
+ pending = (async () => {
244
+ let next;
245
+ try {
246
+ next = await check();
247
+ }
248
+ catch {
249
+ next = unknownResult();
250
+ }
251
+ if (stopped)
252
+ return unknownResult();
253
+ const counts = new Map();
254
+ for (const fee of next.fees)
255
+ counts.set(identity(fee), (counts.get(identity(fee)) ?? 0) + 1);
256
+ for (const fee of next.fees) {
257
+ if (fee.route !== "fallback")
258
+ continue;
259
+ affected.add(fee.key);
260
+ const group = identity(fee);
261
+ affectedCounts.set(group, Math.max(affectedCounts.get(group) ?? 0, counts.get(group) ?? 0));
262
+ }
263
+ for (const [group, count] of affectedCounts)
264
+ affectedCounts.set(group, Math.max(count, counts.get(group) ?? 0));
265
+ if (next.status !== "fallback" &&
266
+ ([...affectedCounts].some(([group, count]) => (counts.get(group) ?? 0) < count) ||
267
+ [...affected].some((key) => !next.fees.some((fee) => fee.key === key && fee.route === "swap"))))
268
+ next = { ...next, status: "unknown" };
269
+ latest = next;
270
+ changed(next);
271
+ return next;
272
+ })();
273
+ try {
274
+ return await pending;
275
+ }
276
+ finally {
277
+ pending = undefined;
278
+ }
279
+ }
280
+ return {
281
+ refresh,
282
+ async confirm() {
283
+ if (stopped)
284
+ return false;
285
+ const before = latest;
286
+ if (pending)
287
+ await pending;
288
+ const fresh = await refresh();
289
+ if (stopped)
290
+ return false;
291
+ // A fresh degradation must be displayed before the user can elect to submit anyway.
292
+ if (fresh.status === "fallback" &&
293
+ (before.status !== "fallback" ||
294
+ fresh.fees.some((fee) => fee.route === "fallback" &&
295
+ !before.fees.some((old) => old.key === fee.key && old.route === "fallback"))))
296
+ return false;
297
+ if (fresh.status === "unknown" && before.status !== "unknown")
298
+ return false;
299
+ return true;
300
+ },
301
+ stop() {
302
+ stopped = true;
303
+ },
304
+ };
305
+ }
306
+ //# sourceMappingURL=feeBuyback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feeBuyback.js","sourceRoot":"","sources":["../../../src/v6/feeBuyback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type BendystrawNetwork } from "./utils/bendystraw.js";
2
+ export type BendystrawOperationContract = {
3
+ operationName?: string;
4
+ validateData: (value: unknown) => value is Record<string, unknown>;
5
+ validateVariables: (value: unknown) => value is Record<string, unknown>;
6
+ };
7
+ /**
8
+ * Compile one static GraphQL document into the same runtime operation contract
9
+ * used by every Bendystraw transport: operation name, bounded variables, and
10
+ * recursive response-shape validation.
11
+ */
12
+ export declare function compileBendystrawOperation(query: string): BendystrawOperationContract;
13
+ /** The persisted-operation id a same-origin Bendystraw proxy accepts: the SHA-256 of the exact document. */
14
+ export declare function bendystrawOperationId(query: string): Promise<string>;
15
+ export type PersistedBendystrawRequest = {
16
+ query: string;
17
+ variables: Record<string, unknown>;
18
+ };
19
+ /**
20
+ * Resolve a proxy request body (`{ operation, variables }`) against the app's
21
+ * registry of persisted documents. Anything else, including an unknown id, is
22
+ * refused with null, so the proxy never forwards arbitrary GraphQL.
23
+ */
24
+ export declare function resolvePersistedBendystrawRequest(value: unknown, registry: Readonly<Record<string, string>>): PersistedBendystrawRequest | null;
25
+ /**
26
+ * Send one persisted operation through the app's same-origin proxy
27
+ * (`/api/bendystraw/{network}/query` unless `endpoint` says otherwise). Only
28
+ * the operation id and variables leave the browser; the response is validated
29
+ * against the document's contract.
30
+ */
31
+ export declare function requestPersistedBendystraw<T>(args: {
32
+ contract: BendystrawOperationContract;
33
+ network: BendystrawNetwork;
34
+ query: string;
35
+ variables: Record<string, unknown>;
36
+ endpoint?: string;
37
+ }): Promise<T>;
38
+ //# sourceMappingURL=bendystrawOperations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bendystrawOperations.d.ts","sourceRoot":"","sources":["../../src/bendystrawOperations.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,2BAA2B,GAAG;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnE,iBAAiB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzE,CAAC;AAwJF;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,GACZ,2BAA2B,CAiD7B;AAED,4GAA4G;AAC5G,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS1E;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACzC,0BAA0B,GAAG,IAAI,CAcnC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,CAAC,EAAE,IAAI,EAAE;IACxD,QAAQ,EAAE,2BAA2B,CAAC;IACtC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,CAAC,CAAC,CAkBb"}
@@ -0,0 +1,206 @@
1
+ import { Kind, parse, } from "graphql";
2
+ import { requestBendystraw, } from "./utils/bendystraw.js";
3
+ const contracts = new Map();
4
+ function isRecord(value) {
5
+ return value !== null && typeof value === "object" && !Array.isArray(value);
6
+ }
7
+ function isSafeInput(value, depth = 0) {
8
+ if (depth > 12)
9
+ return false;
10
+ if (value === undefined ||
11
+ value === null ||
12
+ typeof value === "boolean" ||
13
+ (typeof value === "number" && Number.isFinite(value))) {
14
+ return true;
15
+ }
16
+ if (typeof value === "string")
17
+ return value.length <= 16_384;
18
+ if (Array.isArray(value)) {
19
+ return (value.length <= 1_000 &&
20
+ value.every((item) => isSafeInput(item, depth + 1)));
21
+ }
22
+ return (isRecord(value) &&
23
+ Object.keys(value).length <= 250 &&
24
+ Object.values(value).every((item) => isSafeInput(item, depth + 1)));
25
+ }
26
+ function validateNamedInput(name, value) {
27
+ if (!isSafeInput(value))
28
+ return false;
29
+ switch (name) {
30
+ case "Boolean":
31
+ return typeof value === "boolean";
32
+ case "Float":
33
+ return typeof value === "number" && Number.isFinite(value);
34
+ case "Int":
35
+ return typeof value === "number" && Number.isSafeInteger(value);
36
+ case "ID":
37
+ return typeof value === "string" || Number.isSafeInteger(value);
38
+ case "String":
39
+ return typeof value === "string";
40
+ default:
41
+ return true;
42
+ }
43
+ }
44
+ function validateInput(type, value) {
45
+ if (type.kind === Kind.NON_NULL_TYPE) {
46
+ return (value !== null && value !== undefined && validateInput(type.type, value));
47
+ }
48
+ if (value === null || value === undefined)
49
+ return true;
50
+ if (type.kind === Kind.LIST_TYPE) {
51
+ const values = Array.isArray(value) ? value : [value];
52
+ return values.every((item) => validateInput(type.type, item));
53
+ }
54
+ return validateNamedInput(type.name.value, value);
55
+ }
56
+ // Defaults are constant values: the parser rejects a variable inside one.
57
+ function defaultValueOf(value) {
58
+ if (!value)
59
+ return undefined;
60
+ switch (value.kind) {
61
+ case Kind.BOOLEAN:
62
+ return value.value;
63
+ case Kind.ENUM:
64
+ case Kind.STRING:
65
+ return value.value;
66
+ case Kind.FLOAT:
67
+ case Kind.INT:
68
+ return Number(value.value);
69
+ case Kind.LIST:
70
+ return value.values.map(defaultValueOf);
71
+ case Kind.NULL:
72
+ return null;
73
+ case Kind.OBJECT:
74
+ return Object.fromEntries(value.fields.map((field) => [
75
+ field.name.value,
76
+ defaultValueOf(field.value),
77
+ ]));
78
+ }
79
+ }
80
+ function validateSelectedValue(value, selectionSet, fragments) {
81
+ if (value === null)
82
+ return true;
83
+ if (Array.isArray(value)) {
84
+ return value.every((item) => validateSelectedValue(item, selectionSet, fragments));
85
+ }
86
+ if (!isRecord(value))
87
+ return false;
88
+ return validateSelectionSet(value, selectionSet, fragments, true);
89
+ }
90
+ function validateSelectionSet(value, selectionSet, fragments, requireFields) {
91
+ for (const selection of selectionSet.selections) {
92
+ if (selection.kind === Kind.FIELD) {
93
+ const responseKey = selection.alias?.value ?? selection.name.value;
94
+ if (!Object.prototype.hasOwnProperty.call(value, responseKey)) {
95
+ if (requireFields)
96
+ return false;
97
+ continue;
98
+ }
99
+ if (selection.selectionSet &&
100
+ !validateSelectedValue(value[responseKey], selection.selectionSet, fragments)) {
101
+ return false;
102
+ }
103
+ }
104
+ else if (selection.kind === Kind.INLINE_FRAGMENT) {
105
+ if (!validateSelectionSet(value, selection.selectionSet, fragments, requireFields && !selection.typeCondition)) {
106
+ return false;
107
+ }
108
+ }
109
+ else {
110
+ const fragment = fragments.get(selection.name.value);
111
+ if (!fragment)
112
+ return false;
113
+ if (!validateSelectionSet(value, fragment.selectionSet, fragments, false)) {
114
+ return false;
115
+ }
116
+ }
117
+ }
118
+ return true;
119
+ }
120
+ /**
121
+ * Compile one static GraphQL document into the same runtime operation contract
122
+ * used by every Bendystraw transport: operation name, bounded variables, and
123
+ * recursive response-shape validation.
124
+ */
125
+ export function compileBendystrawOperation(query) {
126
+ const cached = contracts.get(query);
127
+ if (cached)
128
+ return cached;
129
+ const document = parse(query);
130
+ const operations = document.definitions.filter((definition) => definition.kind === Kind.OPERATION_DEFINITION);
131
+ if (operations.length !== 1) {
132
+ throw new TypeError("A Bendystraw document must contain exactly one operation");
133
+ }
134
+ const operation = operations[0];
135
+ const fragments = new Map(document.definitions
136
+ .filter((definition) => definition.kind === Kind.FRAGMENT_DEFINITION)
137
+ .map((fragment) => [fragment.name.value, fragment]));
138
+ const variableNames = new Set(operation.variableDefinitions?.map((definition) => definition.variable.name.value) ?? []);
139
+ const contract = {
140
+ operationName: operation.name?.value,
141
+ validateData: (value) => isRecord(value) &&
142
+ validateSelectionSet(value, operation.selectionSet, fragments, true),
143
+ validateVariables: (value) => {
144
+ if (!isRecord(value) || !isSafeInput(value))
145
+ return false;
146
+ if (Object.keys(value).some((name) => !variableNames.has(name)))
147
+ return false;
148
+ return (operation.variableDefinitions ?? []).every((definition) => {
149
+ const name = definition.variable.name.value;
150
+ const input = value[name] === undefined
151
+ ? defaultValueOf(definition.defaultValue)
152
+ : value[name];
153
+ return validateInput(definition.type, input);
154
+ });
155
+ },
156
+ };
157
+ contracts.set(query, contract);
158
+ return contract;
159
+ }
160
+ /** The persisted-operation id a same-origin Bendystraw proxy accepts: the SHA-256 of the exact document. */
161
+ export async function bendystrawOperationId(query) {
162
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(query));
163
+ let id = "";
164
+ for (const byte of new Uint8Array(digest))
165
+ id += byte.toString(16).padStart(2, "0");
166
+ return id;
167
+ }
168
+ /**
169
+ * Resolve a proxy request body (`{ operation, variables }`) against the app's
170
+ * registry of persisted documents. Anything else, including an unknown id, is
171
+ * refused with null, so the proxy never forwards arbitrary GraphQL.
172
+ */
173
+ export function resolvePersistedBendystrawRequest(value, registry) {
174
+ if (!isRecord(value))
175
+ return null;
176
+ const keys = Object.keys(value);
177
+ if (keys.some((key) => key !== "operation" && key !== "variables") ||
178
+ typeof value.operation !== "string" ||
179
+ !/^[a-f0-9]{64}$/u.test(value.operation) ||
180
+ !isRecord(value.variables)) {
181
+ return null;
182
+ }
183
+ // The 64-hex id check above rules out inherited keys such as `__proto__`.
184
+ const query = registry[value.operation];
185
+ return query ? { query, variables: value.variables } : null;
186
+ }
187
+ /**
188
+ * Send one persisted operation through the app's same-origin proxy
189
+ * (`/api/bendystraw/{network}/query` unless `endpoint` says otherwise). Only
190
+ * the operation id and variables leave the browser; the response is validated
191
+ * against the document's contract.
192
+ */
193
+ export async function requestPersistedBendystraw(args) {
194
+ const operation = await bendystrawOperationId(args.query);
195
+ return requestBendystraw(args.endpoint ?? `/api/bendystraw/${args.network}/query`, args.query, args.variables, {
196
+ fetch: (input, init) => fetch(input, {
197
+ ...init,
198
+ body: JSON.stringify({ operation, variables: args.variables }),
199
+ cache: "no-store",
200
+ }),
201
+ operationName: args.contract.operationName,
202
+ validateData: (value) => args.contract.validateData(value),
203
+ validateVariables: args.contract.validateVariables,
204
+ });
205
+ }
206
+ //# sourceMappingURL=bendystrawOperations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bendystrawOperations.js","sourceRoot":"","sources":["../../src/bendystrawOperations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type Address } from "viem";
2
+ export type ReviewedWritePhase = "review" | "simulating" | "signing";
3
+ export type ReviewedContractWriteOptions<TRequest extends {
4
+ chainId: number;
5
+ }, TSimulated, THash> = {
6
+ request: TRequest;
7
+ expectedAccount: Address | undefined;
8
+ review: (request: TRequest) => Promise<unknown>;
9
+ switchChain: (chainId: number) => Promise<unknown>;
10
+ currentAccount: () => Address | undefined;
11
+ simulate: (request: TRequest) => Promise<TSimulated>;
12
+ reverify?: (request: TRequest) => Promise<unknown>;
13
+ /** Persist recovery intent after simulation, before a wallet can broadcast. */
14
+ beforeWrite?: () => unknown | Promise<unknown>;
15
+ /** The persisted intent was rejected by a final gate before write was invoked. */
16
+ onBeforeWriteAborted?: () => unknown | Promise<unknown>;
17
+ /** Clear that intent only when the wallet explicitly rejects the write. */
18
+ onWriteRejected?: () => unknown | Promise<unknown>;
19
+ write: (simulated: TSimulated) => Promise<THash>;
20
+ onPhase?: (phase: ReviewedWritePhase) => void;
21
+ accountChangedError?: string;
22
+ /**
23
+ * An app-specific gate run before anything else, such as refusing writes while
24
+ * the app is impersonating another account. It throws to stop the write.
25
+ */
26
+ guard?: () => void;
27
+ };
28
+ /**
29
+ * Shared review-to-wallet boundary for direct contract writes.
30
+ *
31
+ * The exact request object accepted by review is also handed to simulation,
32
+ * and only the simulation result reaches the wallet writer. Account identity
33
+ * is checked after a chain switch and again immediately before signing.
34
+ */
35
+ export declare function submitReviewedContractWrite<TRequest extends {
36
+ chainId: number;
37
+ }, TSimulated, THash>({ request, expectedAccount, review, switchChain, currentAccount, simulate, reverify, beforeWrite, onBeforeWriteAborted, onWriteRejected, write, onPhase, accountChangedError, guard, }: ReviewedContractWriteOptions<TRequest, TSimulated, THash>): Promise<THash>;
38
+ //# sourceMappingURL=contractWrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contractWrite.d.ts","sourceRoot":"","sources":["../../../src/review/contractWrite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AAEzE,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;AAErE,MAAM,MAAM,4BAA4B,CACtC,QAAQ,SAAS;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EACpC,UAAU,EACV,KAAK,IACH;IACF,OAAO,EAAE,QAAQ,CAAC;IAClB,eAAe,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,cAAc,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,QAAQ,SAAS;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EACpC,UAAU,EACV,KAAK,EACL,EACA,OAAO,EACP,eAAe,EACf,MAAM,EACN,WAAW,EACX,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,KAAK,EACL,OAAO,EACP,mBAAgF,EAChF,KAAK,GACN,EAAE,4BAA4B,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CA+C5E"}