@bananapus/nana-sdk-core 2.30.0 → 2.32.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 (49) hide show
  1. package/dist/cjs/review/index.d.ts +1 -0
  2. package/dist/cjs/review/index.d.ts.map +1 -1
  3. package/dist/cjs/review/index.js +1 -0
  4. package/dist/cjs/review/index.js.map +1 -1
  5. package/dist/cjs/review/messages.d.ts +16 -0
  6. package/dist/cjs/review/messages.d.ts.map +1 -1
  7. package/dist/cjs/review/messages.js +17 -1
  8. package/dist/cjs/review/messages.js.map +1 -1
  9. package/dist/cjs/review/relayr.d.ts +43 -7
  10. package/dist/cjs/review/relayr.d.ts.map +1 -1
  11. package/dist/cjs/review/relayr.js +118 -7
  12. package/dist/cjs/review/relayr.js.map +1 -1
  13. package/dist/cjs/review/writeHold.d.ts +197 -0
  14. package/dist/cjs/review/writeHold.d.ts.map +1 -0
  15. package/dist/cjs/review/writeHold.js +578 -0
  16. package/dist/cjs/review/writeHold.js.map +1 -0
  17. package/dist/cjs/review/writeRecovery.d.ts +102 -8
  18. package/dist/cjs/review/writeRecovery.d.ts.map +1 -1
  19. package/dist/cjs/review/writeRecovery.js +341 -46
  20. package/dist/cjs/review/writeRecovery.js.map +1 -1
  21. package/dist/cjs/safeService.d.ts +40 -0
  22. package/dist/cjs/safeService.d.ts.map +1 -1
  23. package/dist/cjs/safeService.js +69 -12
  24. package/dist/cjs/safeService.js.map +1 -1
  25. package/dist/esm/review/index.d.ts +1 -0
  26. package/dist/esm/review/index.d.ts.map +1 -1
  27. package/dist/esm/review/index.js +1 -0
  28. package/dist/esm/review/index.js.map +1 -1
  29. package/dist/esm/review/messages.d.ts +16 -0
  30. package/dist/esm/review/messages.d.ts.map +1 -1
  31. package/dist/esm/review/messages.js +16 -0
  32. package/dist/esm/review/messages.js.map +1 -1
  33. package/dist/esm/review/relayr.d.ts +43 -7
  34. package/dist/esm/review/relayr.d.ts.map +1 -1
  35. package/dist/esm/review/relayr.js +116 -6
  36. package/dist/esm/review/relayr.js.map +1 -1
  37. package/dist/esm/review/writeHold.d.ts +197 -0
  38. package/dist/esm/review/writeHold.d.ts.map +1 -0
  39. package/dist/esm/review/writeHold.js +571 -0
  40. package/dist/esm/review/writeHold.js.map +1 -0
  41. package/dist/esm/review/writeRecovery.d.ts +102 -8
  42. package/dist/esm/review/writeRecovery.d.ts.map +1 -1
  43. package/dist/esm/review/writeRecovery.js +339 -46
  44. package/dist/esm/review/writeRecovery.js.map +1 -1
  45. package/dist/esm/safeService.d.ts +40 -0
  46. package/dist/esm/safeService.d.ts.map +1 -1
  47. package/dist/esm/safeService.js +66 -12
  48. package/dist/esm/safeService.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,578 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WriteHoldBusyError = exports.WriteHoldNonceError = exports.WriteHeldError = void 0;
4
+ exports.createWriteHold = createWriteHold;
5
+ const viem_1 = require("viem");
6
+ const safeService_js_1 = require("../safeService.js");
7
+ const messages_js_1 = require("./messages.js");
8
+ const writeRecovery_js_1 = require("./writeRecovery.js");
9
+ /** A send was refused because the exact call is held; `state` says how. */
10
+ class WriteHeldError extends Error {
11
+ constructor(state) {
12
+ super(state.line);
13
+ this.state = state;
14
+ this.name = "WriteHeldError";
15
+ }
16
+ }
17
+ exports.WriteHeldError = WriteHeldError;
18
+ /** The account's nonce couldn't be read, so the wallet never opened. */
19
+ class WriteHoldNonceError extends Error {
20
+ constructor(cause) {
21
+ super(messages_js_1.WRITE_HOLD_NONCE_LINE);
22
+ this.cause = cause;
23
+ this.name = "WriteHoldNonceError";
24
+ }
25
+ }
26
+ exports.WriteHoldNonceError = WriteHoldNonceError;
27
+ /** The exact call is already being sent from another flow or tab. */
28
+ class WriteHoldBusyError extends Error {
29
+ constructor() {
30
+ super("This transaction is already open in another window.");
31
+ this.name = "WriteHoldBusyError";
32
+ }
33
+ }
34
+ exports.WriteHoldBusyError = WriteHoldBusyError;
35
+ const SETTLE_POLL_MS = 15_000;
36
+ /** A hash the network still hasn't seen this long after the wallet returned it was almost certainly never broadcast. */
37
+ const UNSEEN_HASH_MS = 30 * 60_000;
38
+ /** The 30 minutes have passed since the wallet returned the hash, or since it was first read. A clock that couldn't be saved (NaN) never runs out. */
39
+ function unseenTooLong(record) {
40
+ return (Date.now() - Number(record.submittedAt ?? record.firstSeenAt) >=
41
+ UNSEEN_HASH_MS);
42
+ }
43
+ /** A Safe write whose nonce another Safe transaction used: never released on its own. */
44
+ function safeReplaced(record) {
45
+ return {
46
+ status: "safe-replaced",
47
+ record,
48
+ hash: record.hash,
49
+ exit: true,
50
+ line: messages_js_1.WRITE_HOLD_SAFE_REPLACED_LINE,
51
+ warning: messages_js_1.WRITE_HOLD_HASHED_EXIT_LINE,
52
+ };
53
+ }
54
+ function unchecked(record) {
55
+ return {
56
+ status: "held-unchecked",
57
+ record,
58
+ hash: record.hash,
59
+ exit: true,
60
+ line: messages_js_1.WRITE_HOLD_UNCHECKED_LINE,
61
+ warning: messages_js_1.WRITE_HOLD_HASHED_EXIT_LINE,
62
+ };
63
+ }
64
+ /** About an hour of polls; a later state() looks again. */
65
+ const SETTLE_POLL_ATTEMPTS = 240;
66
+ function listenerKey(call) {
67
+ const scope = call.namespace ??
68
+ `${call.call.to}:${BigInt(call.call.value ?? 0)}:${call.call.data}`;
69
+ return `${call.chainId}:${call.account}:${scope}`.toLowerCase();
70
+ }
71
+ function clear(settled) {
72
+ return settled ? { status: "clear", settled } : { status: "clear" };
73
+ }
74
+ function ranExecuted(record, executionHash = record.executionHash, result) {
75
+ return {
76
+ status: "ran-executed",
77
+ record,
78
+ exit: false,
79
+ line: result === "failed" && !record.safe
80
+ ? messages_js_1.WRITE_HOLD_REVERTED_LINE
81
+ : messages_js_1.SAFE_PROPOSAL_EXECUTED_LINE,
82
+ ...(executionHash ? { executionHash } : {}),
83
+ ...(result ? { result } : {}),
84
+ };
85
+ }
86
+ function pendingHash(record) {
87
+ return {
88
+ status: "pending-known-hash",
89
+ record,
90
+ hash: record.hash,
91
+ exit: false,
92
+ line: record.safe ? safeService_js_1.SAFE_PROPOSAL_AWAITING : messages_js_1.WRITE_HOLD_PENDING_LINE,
93
+ };
94
+ }
95
+ /** What the saved record alone says, without asking the chain. */
96
+ function classify(record) {
97
+ if (!record)
98
+ return clear();
99
+ if (record.replaced)
100
+ return safeReplaced(record);
101
+ if (record.executed)
102
+ return ranExecuted(record);
103
+ if (!record.hash)
104
+ return {
105
+ status: "held-no-hash",
106
+ record,
107
+ exit: true,
108
+ line: record.safe ||
109
+ (record.nonce !== undefined && record.fromBlock !== undefined)
110
+ ? (0, messages_js_1.writeHeldMessage)()
111
+ : messages_js_1.WRITE_HOLD_UNCHECKED_LINE,
112
+ };
113
+ return pendingHash(record);
114
+ }
115
+ /**
116
+ * One controller for held wallet writes, framework-free: every app wires its
117
+ * send, receipt and exit through it, so nothing is ever sent twice.
118
+ *
119
+ * - Holds live in the browser's storage, shared by tabs and kept across
120
+ * reloads, or in this tab's memory where storage is refused
121
+ * ({@link createHeldWriteStorage}); {@link reviewLine} is then the line the
122
+ * review shows. The wallet never opens without a hold.
123
+ * - A send checks, reserves and hands the call to the wallet under one lock
124
+ * per exact call (Web Locks, or the SDK's fallback), so two flows or tabs
125
+ * can never both reserve it.
126
+ * - A verified successful receipt releases at once. A revert holds until a
127
+ * canonical finalized block includes it. A Safe proposal proven executed
128
+ * is kept through reload until its execution's receipt settles it; one
129
+ * proven expired releases. One another Safe transaction replaced is never
130
+ * released on its own: the user's exit ends it.
131
+ */
132
+ function createWriteHold(options = {}) {
133
+ const storage = options.storage ?? (0, writeRecovery_js_1.createHeldWriteStorage)();
134
+ const interval = options.settle?.intervalMs ?? SETTLE_POLL_MS;
135
+ const attempts = options.settle?.attempts ?? SETTLE_POLL_ATTEMPTS;
136
+ const listeners = new Map();
137
+ const peekers = new Map();
138
+ const timers = new Map();
139
+ let onStorage;
140
+ function emit(key, state) {
141
+ for (const listener of listeners.get(key) ?? [])
142
+ listener(state);
143
+ }
144
+ /** Another tab changed a hold: every subscribed call shows what it holds now. */
145
+ function watchTabs() {
146
+ if (onStorage || typeof globalThis.addEventListener !== "function")
147
+ return;
148
+ onStorage = (event) => {
149
+ if (event.key && !event.key.startsWith("nana-sdk:reviewed-write"))
150
+ return;
151
+ for (const [key, peek] of peekers) {
152
+ try {
153
+ emit(key, peek());
154
+ }
155
+ catch {
156
+ /* An unreadable record is shown at its next state(). */
157
+ }
158
+ }
159
+ };
160
+ globalThis.addEventListener("storage", onStorage);
161
+ }
162
+ function open(call) {
163
+ const recovery = (0, writeRecovery_js_1.createBrowserWriteRecovery)(call, {
164
+ storage,
165
+ locks: options.locks,
166
+ });
167
+ const key = listenerKey(call);
168
+ /** The effect read the last state() was given: the exit asks it again. */
169
+ let lastEffect;
170
+ const peek = () => classify(recovery.read());
171
+ const shown = (state) => (emit(key, state), state);
172
+ async function locked(work, wait) {
173
+ let entered = false;
174
+ try {
175
+ return {
176
+ value: await recovery.withLock(async () => {
177
+ entered = true;
178
+ return work();
179
+ }, wait),
180
+ };
181
+ }
182
+ catch (error) {
183
+ if (entered)
184
+ throw error;
185
+ return null;
186
+ }
187
+ }
188
+ /** End exactly `record` (read under this lock), committing a hash kept only in memory first. */
189
+ function release(record) {
190
+ try {
191
+ recovery.clear(recovery.submitted(record.hash, record));
192
+ return true;
193
+ }
194
+ catch {
195
+ return false;
196
+ }
197
+ }
198
+ function follow(client, id, left = attempts) {
199
+ if (timers.has(id) || left <= 0)
200
+ return;
201
+ timers.set(id, setTimeout(() => {
202
+ void state(client)
203
+ .catch(() => null)
204
+ .then((next) => {
205
+ timers.delete(id);
206
+ if (next?.status === "ran-executed")
207
+ follow(client, id, left - 1);
208
+ });
209
+ }, interval));
210
+ }
211
+ async function settle(record, receipt, client, proof) {
212
+ const verdict = await (0, writeRecovery_js_1.verifyReviewedWriteReceipt)(client, record, receipt, proof).catch(() => null);
213
+ if (verdict && release(record))
214
+ return clear({
215
+ result: verdict,
216
+ hash: receipt.transactionHash.toLowerCase(),
217
+ });
218
+ if (!record.safe &&
219
+ receipt.status === "reverted" &&
220
+ receipt.transactionHash.toLowerCase() === record.hash) {
221
+ follow(client, record.id);
222
+ return ranExecuted(record, record.hash, "failed");
223
+ }
224
+ if (record.executed)
225
+ follow(client, record.id);
226
+ return classify(recovery.read());
227
+ }
228
+ /** The authenticated nonce of a Safe proposal, from Safe's service. */
229
+ async function proposalNonceOf(record) {
230
+ try {
231
+ const proposal = await (0, safeService_js_1.readSafeTransaction)(record.chainId, record.account, record.hash, options.safeService);
232
+ return (0, safeService_js_1.safeTransactionMessage)(proposal).nonce;
233
+ }
234
+ catch {
235
+ return null;
236
+ }
237
+ }
238
+ /** Follow a saved execution's receipt; null while the node has none. */
239
+ async function execution(record, client) {
240
+ const receipt = await client
241
+ .getTransactionReceipt({ hash: record.executionHash })
242
+ .catch(() => null);
243
+ return receipt ? settle(record, receipt, client) : null;
244
+ }
245
+ /**
246
+ * A direct execution whose receipt is gone: another transaction the
247
+ * executor sent at its nonce, at a canonical finalized block, means it
248
+ * never ran. History that can't be read keeps it held, and after 30
249
+ * minutes with the transaction unknown it gets the unchecked exit.
250
+ */
251
+ async function reconcileDirect(record, client) {
252
+ const used = record.sentFrom && record.sentNonce !== undefined
253
+ ? await (0, writeRecovery_js_1.findTransactionAtNonce)(client, record.sentFrom, BigInt(record.sentNonce))
254
+ : null;
255
+ // Another transaction at that nonce may have run the call too.
256
+ if (used && used.hash !== record.hash)
257
+ return safeReplaced(recovery.replacedOnChain(record));
258
+ if (used ||
259
+ !unseenTooLong(record) ||
260
+ !(await client.getTransaction({ hash: record.hash }).then(() => false, (error) => error?.name === "TransactionNotFoundError")))
261
+ return null;
262
+ // A proof that can't be dropped keeps the exit refusing it.
263
+ return unchecked(recovery.unexecuted(record));
264
+ }
265
+ async function safeState(saved, client) {
266
+ let record = saved;
267
+ const hash = record.hash;
268
+ if (!hash || record.replaced)
269
+ return classify(record);
270
+ if (record.submittedAt === undefined)
271
+ record = recovery.firstSeen(record);
272
+ // The wallet's reply may be the execution itself (run at once).
273
+ if (!record.executed) {
274
+ const atOnce = await client
275
+ .getTransactionReceipt({ hash })
276
+ .catch(() => null);
277
+ if (atOnce) {
278
+ const settled = await settle(record, atOnce, client);
279
+ if (settled.status === "clear")
280
+ return settled;
281
+ // It ran; only its verified result (a failure at finality) ends it.
282
+ record = recovery.executed(record, hash);
283
+ // Who sent it at which nonce proves a canonical replacement later.
284
+ const sent = await client.getTransaction({ hash }).catch(() => null);
285
+ if (sent?.hash?.toLowerCase() === hash && (0, viem_1.isAddress)(sent.from))
286
+ record = recovery.sentBy(record, sent.from, BigInt(sent.nonce));
287
+ follow(client, record.id);
288
+ return ranExecuted(record);
289
+ }
290
+ }
291
+ else if (record.executionHash) {
292
+ const settled = await execution(record, client);
293
+ if (settled?.status === "clear")
294
+ return settled;
295
+ if (record.executionHash === hash) {
296
+ if (!settled) {
297
+ const reconciled = await reconcileDirect(record, client);
298
+ if (reconciled)
299
+ return reconciled;
300
+ }
301
+ follow(client, record.id);
302
+ return settled ?? ranExecuted(record);
303
+ }
304
+ }
305
+ // The chain's proof, from the proposal's nonce: Safe's service is asked
306
+ // only for the nonce, once, and for an expiry.
307
+ if (record.safeNonce === undefined) {
308
+ const nonce = await proposalNonceOf(record);
309
+ if (nonce !== null)
310
+ record = recovery.proposalNonce(record, nonce);
311
+ }
312
+ const end = (record.safeNonce !== undefined &&
313
+ (await (0, safeService_js_1.provenSafeProposalEnd)(client, record.account, hash, BigInt(record.safeNonce)))) ||
314
+ (await (0, safeService_js_1.lookAtSafeProposalEnd)(client, record.chainId, record.account, hash, options.safeService));
315
+ // Another Safe transaction took its nonce, even after a saved execution
316
+ // was reorganized away. It may have run the call too: the exit, never a release.
317
+ if (end.look === "replaced")
318
+ return safeReplaced(recovery.replacedOnChain(record));
319
+ if (end.look === "expired" && !record.executed) {
320
+ const expired = await (0, writeRecovery_js_1.verifyReviewedWriteExpiry)(client, record, options.safeService).catch(() => false);
321
+ if (expired && release(record))
322
+ return clear({ result: "expired" });
323
+ }
324
+ if (end.look === "executed" &&
325
+ (!record.executed ||
326
+ (end.execution &&
327
+ end.execution.executionHash !== record.executionHash))) {
328
+ record = recovery.executed(record, end.execution?.executionHash);
329
+ if (record.executionHash) {
330
+ const settled = await execution(record, client);
331
+ if (settled)
332
+ return settled;
333
+ }
334
+ }
335
+ if (!record.executed &&
336
+ record.safeNonce === undefined &&
337
+ unseenTooLong(record))
338
+ return unchecked(record);
339
+ if (record.executed)
340
+ follow(client, record.id);
341
+ return classify(record);
342
+ }
343
+ async function inspect(client, effect) {
344
+ let record = recovery.read();
345
+ if (!record)
346
+ return clear();
347
+ // No evidence from another chain.
348
+ if ((await client.getChainId().catch(() => null)) !== record.chainId)
349
+ return classify(record);
350
+ if (record.safe)
351
+ return safeState(record, client);
352
+ const check = await recovery
353
+ .resolve(client, effect ? { effect } : undefined)
354
+ .catch(() => null);
355
+ record = recovery.read();
356
+ if (!record)
357
+ return clear();
358
+ if (check?.status === "sent") {
359
+ const receipt = await client
360
+ .getTransactionReceipt({ hash: check.hash })
361
+ .catch(() => null);
362
+ return receipt ? settle(record, receipt, client) : pendingHash(record);
363
+ }
364
+ // A hash saved before its clock existed starts it now.
365
+ if (record.hash && record.submittedAt === undefined)
366
+ record = recovery.firstSeen(record);
367
+ // The app's effect read only changes the line, and offers the exit.
368
+ if (check?.status === "pending" && check.effect)
369
+ return {
370
+ status: "looks-done",
371
+ record,
372
+ exit: true,
373
+ line: messages_js_1.WRITE_HOLD_LOOKS_DONE_LINE,
374
+ ...(record.hash
375
+ ? { hash: record.hash, warning: messages_js_1.WRITE_HOLD_HASHED_EXIT_LINE }
376
+ : {}),
377
+ };
378
+ if (record.hash &&
379
+ record.sentNonce !== undefined &&
380
+ check?.status === "pending" &&
381
+ check.usedBy)
382
+ return {
383
+ status: "dropped-proven",
384
+ record,
385
+ hash: record.hash,
386
+ usedBy: check.usedBy,
387
+ exit: true,
388
+ line: (0, messages_js_1.writeHeldMessage)(),
389
+ warning: messages_js_1.WRITE_HOLD_HASHED_EXIT_LINE,
390
+ };
391
+ if (record.hash &&
392
+ record.sentNonce === undefined &&
393
+ (record.nonce === undefined ||
394
+ record.fromBlock === undefined ||
395
+ unseenTooLong(record)) &&
396
+ (await client.getTransaction({ hash: record.hash }).then(() => false, (error) => error?.name === "TransactionNotFoundError")))
397
+ return unchecked(record);
398
+ return classify(record);
399
+ }
400
+ /**
401
+ * The one answer for this call: what is held, asking the chain. A flow
402
+ * sending it right now leaves the saved record's own answer.
403
+ */
404
+ async function state(client, checks = {}) {
405
+ lastEffect = checks.effect;
406
+ const result = await locked(() => inspect(client, checks.effect), false);
407
+ return shown(result ? result.value : peek());
408
+ }
409
+ return {
410
+ state,
411
+ /** What the saved record alone says, without asking the chain. */
412
+ peek,
413
+ /** Every state this controller reads or makes for the call, and other tabs' changes. */
414
+ subscribe(listener) {
415
+ let set = listeners.get(key);
416
+ if (!set)
417
+ listeners.set(key, (set = new Set()));
418
+ set.add(listener);
419
+ peekers.set(key, peek);
420
+ watchTabs();
421
+ return () => {
422
+ set.delete(listener);
423
+ if (!set.size) {
424
+ listeners.delete(key);
425
+ peekers.delete(key);
426
+ }
427
+ };
428
+ },
429
+ /**
430
+ * Send the call under its hold. A held call throws
431
+ * {@link WriteHeldError} before anything opens, and another flow or tab
432
+ * sending it throws {@link WriteHoldBusyError}. `run` hands the
433
+ * {@link WriteHoldGate} to its wallet boundary. A write that may have
434
+ * reached the wallet stays held whatever `run` throws.
435
+ */
436
+ async send(client, run) {
437
+ let attempt;
438
+ const gate = {
439
+ async beforeSend(actualCall) {
440
+ let evidence;
441
+ if (!call.safe) {
442
+ // The nonce proves later what became of the write: one retry, or nothing is sent.
443
+ const read = () => (0, writeRecovery_js_1.readReviewedWriteNonce)(client, call.account);
444
+ try {
445
+ evidence = await read().catch(read);
446
+ }
447
+ catch (cause) {
448
+ throw new WriteHoldNonceError(cause);
449
+ }
450
+ }
451
+ try {
452
+ attempt = recovery.reserve(actualCall, evidence);
453
+ }
454
+ catch (error) {
455
+ const now = peek();
456
+ if (now.status !== "clear")
457
+ throw new WriteHeldError(now);
458
+ throw error;
459
+ }
460
+ shown(peek());
461
+ },
462
+ afterSubmit(hash, proposal) {
463
+ if (!attempt)
464
+ throw new Error("Hold the write before the wallet opens.");
465
+ try {
466
+ attempt = recovery.submitted(hash, attempt);
467
+ }
468
+ catch (error) {
469
+ if (!(error instanceof writeRecovery_js_1.SubmittedWritePersistenceError))
470
+ throw error;
471
+ attempt = error.record;
472
+ }
473
+ // The proposal the app made, if it hashes to the reply: its nonce.
474
+ if (call.safe && proposal)
475
+ try {
476
+ (0, safeService_js_1.canonicalSafeTxHash)(call.chainId, call.account, proposal, hash);
477
+ attempt = recovery.proposalNonce(attempt, (0, safeService_js_1.safeTransactionMessage)(proposal).nonce);
478
+ }
479
+ catch {
480
+ /* Not this proposal: the service is asked later. */
481
+ }
482
+ shown(classify(attempt));
483
+ },
484
+ onRejected() {
485
+ recovery.rejected();
486
+ attempt = undefined;
487
+ shown(peek());
488
+ },
489
+ };
490
+ const result = await locked(async () => {
491
+ const now = shown(await inspect(client));
492
+ if (now.status !== "clear")
493
+ throw new WriteHeldError(now);
494
+ return run(gate);
495
+ }, false);
496
+ if (!result)
497
+ throw new WriteHoldBusyError();
498
+ return result.value;
499
+ },
500
+ /**
501
+ * The user checked their wallet. Only an exit-offered `snapshot`, the
502
+ * state the user saw, is released, after the chain is asked once more:
503
+ * any change refuses it, and a confirmation that landed meanwhile wins.
504
+ * `released` true: send again.
505
+ */
506
+ async exit(snapshot, acknowledgement, client) {
507
+ if (acknowledgement?.checkedWallet !== true)
508
+ throw new Error("Release a held write only after the user confirms they checked their wallet.");
509
+ const result = await locked(async () => {
510
+ const now = await inspect(client, lastEffect);
511
+ if (snapshot.status === "clear" ||
512
+ now.status === "clear" ||
513
+ !now.exit ||
514
+ now.status !== snapshot.status ||
515
+ JSON.stringify(now.record) !== JSON.stringify(snapshot.record))
516
+ return { released: false, state: now };
517
+ try {
518
+ recovery.abandon(snapshot.record, { checkedWallet: true });
519
+ }
520
+ catch {
521
+ return { released: false, state: peek() };
522
+ }
523
+ return { released: true, state: clear() };
524
+ }, true);
525
+ const ended = result?.value ?? { released: false, state: peek() };
526
+ shown(ended.state);
527
+ return ended;
528
+ },
529
+ /**
530
+ * A receipt for the held write: an ordinary write's own hash, or a Safe
531
+ * proposal's execution (`proof`: its whole batch). It releases only once
532
+ * verified, and a revert only once final.
533
+ */
534
+ async onReceipt(receipt, client, proof) {
535
+ const result = await locked(async () => {
536
+ const record = recovery.read();
537
+ if (!record ||
538
+ (!record.safe &&
539
+ record.hash !== receipt?.transactionHash?.toLowerCase()))
540
+ return classify(record);
541
+ return settle(record, receipt, client, proof);
542
+ }, true);
543
+ return shown(result?.value ?? peek());
544
+ },
545
+ /**
546
+ * The app's own proof that the held Safe proposal ran, with its
547
+ * execution's transaction when known. Kept until its result settles it.
548
+ */
549
+ async onExecuted(client, executionHash) {
550
+ const result = await locked(async () => {
551
+ const record = recovery.read();
552
+ if (!record?.safe || !record.hash)
553
+ return classify(record);
554
+ recovery.executed(record, executionHash);
555
+ return inspect(client);
556
+ }, true);
557
+ return shown(result?.value ?? peek());
558
+ },
559
+ };
560
+ }
561
+ return {
562
+ open,
563
+ /** Whether holds outlive this tab right now. */
564
+ durable: () => storage.durable(),
565
+ /** The review's line while holds last only in this tab, or null. */
566
+ reviewLine: () => (storage.durable() ? null : messages_js_1.WRITE_HOLD_IN_TAB_LINE),
567
+ /** Stop every settle poll and the tab listener (tests, teardown). */
568
+ dispose() {
569
+ for (const timer of timers.values())
570
+ clearTimeout(timer);
571
+ timers.clear();
572
+ if (onStorage)
573
+ globalThis.removeEventListener?.("storage", onStorage);
574
+ onStorage = undefined;
575
+ },
576
+ };
577
+ }
578
+ //# sourceMappingURL=writeHold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeHold.js","sourceRoot":"","sources":["../../../src/review/writeHold.ts"],"names":[],"mappings":"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"}