@bananapus/nana-sdk-core 6.0.0 → 6.2.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 (213) hide show
  1. package/dist/cjs/jbcenter/ensureDeployed.d.ts +2 -2
  2. package/dist/cjs/jbcenter/ensureDeployed.d.ts.map +1 -1
  3. package/dist/cjs/jbcenter/ensureDeployed.js.map +1 -1
  4. package/dist/cjs/jbcenter.d.ts +4 -1
  5. package/dist/cjs/jbcenter.d.ts.map +1 -1
  6. package/dist/cjs/jbcenter.js +6 -6
  7. package/dist/cjs/jbcenter.js.map +1 -1
  8. package/dist/cjs/review/gas.d.ts +5 -2
  9. package/dist/cjs/review/gas.d.ts.map +1 -1
  10. package/dist/cjs/review/gas.js +8 -3
  11. package/dist/cjs/review/gas.js.map +1 -1
  12. package/dist/cjs/review/heldWrite.d.ts +6 -1
  13. package/dist/cjs/review/heldWrite.d.ts.map +1 -1
  14. package/dist/cjs/review/heldWrite.js +21 -16
  15. package/dist/cjs/review/heldWrite.js.map +1 -1
  16. package/dist/cjs/review/index.d.ts +2 -0
  17. package/dist/cjs/review/index.d.ts.map +1 -1
  18. package/dist/cjs/review/index.js +2 -0
  19. package/dist/cjs/review/index.js.map +1 -1
  20. package/dist/cjs/review/locks.d.ts +69 -0
  21. package/dist/cjs/review/locks.d.ts.map +1 -0
  22. package/dist/cjs/review/locks.js +232 -0
  23. package/dist/cjs/review/locks.js.map +1 -0
  24. package/dist/cjs/review/machines.d.ts +9 -0
  25. package/dist/cjs/review/machines.d.ts.map +1 -0
  26. package/dist/cjs/review/machines.js +25 -0
  27. package/dist/cjs/review/machines.js.map +1 -0
  28. package/dist/cjs/review/react/index.d.ts +3 -0
  29. package/dist/cjs/review/react/index.d.ts.map +1 -1
  30. package/dist/cjs/review/react/index.js +3 -0
  31. package/dist/cjs/review/react/index.js.map +1 -1
  32. package/dist/cjs/review/react/useFeeBuybackReview.d.ts +6 -0
  33. package/dist/cjs/review/react/useFeeBuybackReview.d.ts.map +1 -0
  34. package/dist/cjs/review/react/useFeeBuybackReview.js +53 -0
  35. package/dist/cjs/review/react/useFeeBuybackReview.js.map +1 -0
  36. package/dist/cjs/review/react/useMobileWallet.d.ts +15 -0
  37. package/dist/cjs/review/react/useMobileWallet.d.ts.map +1 -0
  38. package/dist/cjs/review/react/useMobileWallet.js +50 -0
  39. package/dist/cjs/review/react/useMobileWallet.js.map +1 -0
  40. package/dist/cjs/review/react/useReviewedRun.d.ts +28 -1
  41. package/dist/cjs/review/react/useReviewedRun.d.ts.map +1 -1
  42. package/dist/cjs/review/react/useReviewedRun.js +251 -39
  43. package/dist/cjs/review/react/useReviewedRun.js.map +1 -1
  44. package/dist/cjs/review/react/useSavedAttempt.d.ts +23 -0
  45. package/dist/cjs/review/react/useSavedAttempt.d.ts.map +1 -1
  46. package/dist/cjs/review/react/useSavedAttempt.js +101 -11
  47. package/dist/cjs/review/react/useSavedAttempt.js.map +1 -1
  48. package/dist/cjs/review/react/useStartOnce.d.ts +8 -0
  49. package/dist/cjs/review/react/useStartOnce.d.ts.map +1 -0
  50. package/dist/cjs/review/react/useStartOnce.js +27 -0
  51. package/dist/cjs/review/react/useStartOnce.js.map +1 -0
  52. package/dist/cjs/review/relayr.d.ts +1 -1
  53. package/dist/cjs/review/relayr.d.ts.map +1 -1
  54. package/dist/cjs/review/relayr.js +15 -0
  55. package/dist/cjs/review/relayr.js.map +1 -1
  56. package/dist/cjs/review/relayrLaunch.d.ts +90 -0
  57. package/dist/cjs/review/relayrLaunch.d.ts.map +1 -0
  58. package/dist/cjs/review/relayrLaunch.js +106 -0
  59. package/dist/cjs/review/relayrLaunch.js.map +1 -0
  60. package/dist/cjs/review/relayrSend.d.ts +5 -0
  61. package/dist/cjs/review/relayrSend.d.ts.map +1 -1
  62. package/dist/cjs/review/relayrSend.js +133 -107
  63. package/dist/cjs/review/relayrSend.js.map +1 -1
  64. package/dist/cjs/review/reviewDialogQueue.d.ts +47 -0
  65. package/dist/cjs/review/reviewDialogQueue.d.ts.map +1 -0
  66. package/dist/cjs/review/reviewDialogQueue.js +120 -0
  67. package/dist/cjs/review/reviewDialogQueue.js.map +1 -0
  68. package/dist/cjs/review/runStatus.d.ts +51 -0
  69. package/dist/cjs/review/runStatus.d.ts.map +1 -0
  70. package/dist/cjs/review/runStatus.js +54 -0
  71. package/dist/cjs/review/runStatus.js.map +1 -0
  72. package/dist/cjs/review/safeRelayr.d.ts +60 -16
  73. package/dist/cjs/review/safeRelayr.d.ts.map +1 -1
  74. package/dist/cjs/review/safeRelayr.js +358 -161
  75. package/dist/cjs/review/safeRelayr.js.map +1 -1
  76. package/dist/cjs/review/savedAttempt.d.ts.map +1 -1
  77. package/dist/cjs/review/savedAttempt.js +7 -2
  78. package/dist/cjs/review/savedAttempt.js.map +1 -1
  79. package/dist/cjs/review/send.d.ts +27 -5
  80. package/dist/cjs/review/send.d.ts.map +1 -1
  81. package/dist/cjs/review/send.js +67 -24
  82. package/dist/cjs/review/send.js.map +1 -1
  83. package/dist/cjs/review/sign.d.ts +6 -1
  84. package/dist/cjs/review/sign.d.ts.map +1 -1
  85. package/dist/cjs/review/sign.js +10 -4
  86. package/dist/cjs/review/sign.js.map +1 -1
  87. package/dist/cjs/review/wallet.d.ts +16 -4
  88. package/dist/cjs/review/wallet.d.ts.map +1 -1
  89. package/dist/cjs/review/wallet.js +60 -17
  90. package/dist/cjs/review/wallet.js.map +1 -1
  91. package/dist/cjs/review/writeHold.d.ts +18 -3
  92. package/dist/cjs/review/writeHold.d.ts.map +1 -1
  93. package/dist/cjs/review/writeHold.js +37 -10
  94. package/dist/cjs/review/writeHold.js.map +1 -1
  95. package/dist/cjs/review/writeRecovery.d.ts +13 -8
  96. package/dist/cjs/review/writeRecovery.d.ts.map +1 -1
  97. package/dist/cjs/review/writeRecovery.js +67 -144
  98. package/dist/cjs/review/writeRecovery.js.map +1 -1
  99. package/dist/cjs/v6/feeBuyback.d.ts +49 -0
  100. package/dist/cjs/v6/feeBuyback.d.ts.map +1 -1
  101. package/dist/cjs/v6/feeBuyback.js +151 -0
  102. package/dist/cjs/v6/feeBuyback.js.map +1 -1
  103. package/dist/cjs/v6/suckers.d.ts +24 -2
  104. package/dist/cjs/v6/suckers.d.ts.map +1 -1
  105. package/dist/cjs/v6/suckers.js +5 -5
  106. package/dist/cjs/v6/suckers.js.map +1 -1
  107. package/dist/esm/jbcenter/ensureDeployed.d.ts +2 -2
  108. package/dist/esm/jbcenter/ensureDeployed.d.ts.map +1 -1
  109. package/dist/esm/jbcenter/ensureDeployed.js.map +1 -1
  110. package/dist/esm/jbcenter.d.ts +4 -1
  111. package/dist/esm/jbcenter.d.ts.map +1 -1
  112. package/dist/esm/jbcenter.js +6 -6
  113. package/dist/esm/jbcenter.js.map +1 -1
  114. package/dist/esm/review/gas.d.ts +5 -2
  115. package/dist/esm/review/gas.d.ts.map +1 -1
  116. package/dist/esm/review/gas.js +7 -3
  117. package/dist/esm/review/gas.js.map +1 -1
  118. package/dist/esm/review/heldWrite.d.ts +6 -1
  119. package/dist/esm/review/heldWrite.d.ts.map +1 -1
  120. package/dist/esm/review/heldWrite.js +21 -16
  121. package/dist/esm/review/heldWrite.js.map +1 -1
  122. package/dist/esm/review/index.d.ts +2 -0
  123. package/dist/esm/review/index.d.ts.map +1 -1
  124. package/dist/esm/review/index.js +2 -0
  125. package/dist/esm/review/index.js.map +1 -1
  126. package/dist/esm/review/locks.d.ts +69 -0
  127. package/dist/esm/review/locks.d.ts.map +1 -0
  128. package/dist/esm/review/locks.js +225 -0
  129. package/dist/esm/review/locks.js.map +1 -0
  130. package/dist/esm/review/machines.d.ts +9 -0
  131. package/dist/esm/review/machines.d.ts.map +1 -0
  132. package/dist/esm/review/machines.js +9 -0
  133. package/dist/esm/review/machines.js.map +1 -0
  134. package/dist/esm/review/react/index.d.ts +3 -0
  135. package/dist/esm/review/react/index.d.ts.map +1 -1
  136. package/dist/esm/review/react/index.js +3 -0
  137. package/dist/esm/review/react/index.js.map +1 -1
  138. package/dist/esm/review/react/useFeeBuybackReview.d.ts +6 -0
  139. package/dist/esm/review/react/useFeeBuybackReview.d.ts.map +1 -0
  140. package/dist/esm/review/react/useFeeBuybackReview.js +50 -0
  141. package/dist/esm/review/react/useFeeBuybackReview.js.map +1 -0
  142. package/dist/esm/review/react/useMobileWallet.d.ts +15 -0
  143. package/dist/esm/review/react/useMobileWallet.d.ts.map +1 -0
  144. package/dist/esm/review/react/useMobileWallet.js +46 -0
  145. package/dist/esm/review/react/useMobileWallet.js.map +1 -0
  146. package/dist/esm/review/react/useReviewedRun.d.ts +28 -1
  147. package/dist/esm/review/react/useReviewedRun.d.ts.map +1 -1
  148. package/dist/esm/review/react/useReviewedRun.js +252 -40
  149. package/dist/esm/review/react/useReviewedRun.js.map +1 -1
  150. package/dist/esm/review/react/useSavedAttempt.d.ts +23 -0
  151. package/dist/esm/review/react/useSavedAttempt.d.ts.map +1 -1
  152. package/dist/esm/review/react/useSavedAttempt.js +101 -11
  153. package/dist/esm/review/react/useSavedAttempt.js.map +1 -1
  154. package/dist/esm/review/react/useStartOnce.d.ts +8 -0
  155. package/dist/esm/review/react/useStartOnce.d.ts.map +1 -0
  156. package/dist/esm/review/react/useStartOnce.js +24 -0
  157. package/dist/esm/review/react/useStartOnce.js.map +1 -0
  158. package/dist/esm/review/relayr.d.ts +1 -1
  159. package/dist/esm/review/relayr.d.ts.map +1 -1
  160. package/dist/esm/review/relayr.js +1 -0
  161. package/dist/esm/review/relayr.js.map +1 -1
  162. package/dist/esm/review/relayrLaunch.d.ts +90 -0
  163. package/dist/esm/review/relayrLaunch.d.ts.map +1 -0
  164. package/dist/esm/review/relayrLaunch.js +97 -0
  165. package/dist/esm/review/relayrLaunch.js.map +1 -0
  166. package/dist/esm/review/relayrSend.d.ts +5 -0
  167. package/dist/esm/review/relayrSend.d.ts.map +1 -1
  168. package/dist/esm/review/relayrSend.js +134 -108
  169. package/dist/esm/review/relayrSend.js.map +1 -1
  170. package/dist/esm/review/reviewDialogQueue.d.ts +47 -0
  171. package/dist/esm/review/reviewDialogQueue.d.ts.map +1 -0
  172. package/dist/esm/review/reviewDialogQueue.js +117 -0
  173. package/dist/esm/review/reviewDialogQueue.js.map +1 -0
  174. package/dist/esm/review/runStatus.d.ts +51 -0
  175. package/dist/esm/review/runStatus.d.ts.map +1 -0
  176. package/dist/esm/review/runStatus.js +51 -0
  177. package/dist/esm/review/runStatus.js.map +1 -0
  178. package/dist/esm/review/safeRelayr.d.ts +60 -16
  179. package/dist/esm/review/safeRelayr.d.ts.map +1 -1
  180. package/dist/esm/review/safeRelayr.js +358 -161
  181. package/dist/esm/review/safeRelayr.js.map +1 -1
  182. package/dist/esm/review/savedAttempt.d.ts.map +1 -1
  183. package/dist/esm/review/savedAttempt.js +7 -2
  184. package/dist/esm/review/savedAttempt.js.map +1 -1
  185. package/dist/esm/review/send.d.ts +27 -5
  186. package/dist/esm/review/send.d.ts.map +1 -1
  187. package/dist/esm/review/send.js +67 -24
  188. package/dist/esm/review/send.js.map +1 -1
  189. package/dist/esm/review/sign.d.ts +6 -1
  190. package/dist/esm/review/sign.d.ts.map +1 -1
  191. package/dist/esm/review/sign.js +10 -4
  192. package/dist/esm/review/sign.js.map +1 -1
  193. package/dist/esm/review/wallet.d.ts +16 -4
  194. package/dist/esm/review/wallet.d.ts.map +1 -1
  195. package/dist/esm/review/wallet.js +60 -17
  196. package/dist/esm/review/wallet.js.map +1 -1
  197. package/dist/esm/review/writeHold.d.ts +18 -3
  198. package/dist/esm/review/writeHold.d.ts.map +1 -1
  199. package/dist/esm/review/writeHold.js +37 -10
  200. package/dist/esm/review/writeHold.js.map +1 -1
  201. package/dist/esm/review/writeRecovery.d.ts +13 -8
  202. package/dist/esm/review/writeRecovery.d.ts.map +1 -1
  203. package/dist/esm/review/writeRecovery.js +63 -142
  204. package/dist/esm/review/writeRecovery.js.map +1 -1
  205. package/dist/esm/v6/feeBuyback.d.ts +49 -0
  206. package/dist/esm/v6/feeBuyback.d.ts.map +1 -1
  207. package/dist/esm/v6/feeBuyback.js +150 -0
  208. package/dist/esm/v6/feeBuyback.js.map +1 -1
  209. package/dist/esm/v6/suckers.d.ts +24 -2
  210. package/dist/esm/v6/suckers.d.ts.map +1 -1
  211. package/dist/esm/v6/suckers.js +5 -5
  212. package/dist/esm/v6/suckers.js.map +1 -1
  213. package/package.json +11 -1
@@ -0,0 +1,90 @@
1
+ import type { Address, Hex } from "viem";
2
+ import type { RelayrEntry, RelayrQuote, RelayrSentPayment, RelayrTransactionRecord } from "./relayr.js";
3
+ /** The phases a saved Relayr launch journal may be in, in order. */
4
+ export declare const RELAYR_LAUNCH_PHASES: readonly ["signing", "quoting", "quoted", "payment-signing", "submitted", "executing", "payment-reverted"];
5
+ /** `payment-reverted`: the latest payment canonically reverted; only the SDK's retry rule lets the quote be paid again. */
6
+ export type RelayrLaunchPhase = (typeof RELAYR_LAUNCH_PHASES)[number];
7
+ export type RelayrSignedLaunch = {
8
+ chainId: number;
9
+ entry: RelayrEntry;
10
+ nonce: string;
11
+ deadline: number;
12
+ /** Replaced before any quote was asked for, so nothing of it was ever posted. */
13
+ unposted?: true;
14
+ };
15
+ /** A launch's Relayr journal: exact signatures and quote bindings that survive reloads, including the wallet's no-hash send window. */
16
+ export type RelayrLaunchJournal = {
17
+ account: Address;
18
+ paymentChainId?: number;
19
+ phase: RelayrLaunchPhase;
20
+ signed: RelayrSignedLaunch[];
21
+ superseded?: RelayrSignedLaunch[];
22
+ /** Retrying a known failed attempt must reuse its nonce, even if the old signature is still live. */
23
+ retryNonces?: Record<number, string>;
24
+ quote?: RelayrQuote;
25
+ paymentHash?: Hex;
26
+ /** Every payment sent for the quote, as relayrPaymentDetails authenticated it, under the hash it was mined. */
27
+ payments?: RelayrSentPayment[];
28
+ paymentDeadline?: string;
29
+ records: RelayrTransactionRecord[];
30
+ published?: true;
31
+ abandonable?: true;
32
+ };
33
+ export declare const isRelayrLaunchPhase: (value: unknown) => value is RelayrLaunchPhase;
34
+ /** A payment was or may be sent: the saved payment chain is required. */
35
+ export declare const relayrLaunchPaying: (phase: RelayrLaunchPhase) => phase is "payment-signing" | "submitted" | "executing" | "payment-reverted";
36
+ /** Nothing funds the quote: published requests are classified, and an abandonable journal signs again. */
37
+ export declare const relayrLaunchUnfunded: (phase: RelayrLaunchPhase) => phase is "signing" | "quoting" | "quoted" | "payment-reverted";
38
+ /** A payment is with the wallet or the chain: resume reconciles it, never pays again. */
39
+ export declare const relayrLaunchInFlight: (phase: RelayrLaunchPhase) => phase is "payment-signing" | "submitted" | "executing";
40
+ export type RelayrLaunchEvent =
41
+ /** Persisted before the signed entries are posted to Relayr. */
42
+ {
43
+ type: "quoting";
44
+ } | {
45
+ type: "quoted";
46
+ quote: RelayrQuote;
47
+ } | {
48
+ type: "chosen";
49
+ paymentChainId: number;
50
+ paymentDeadline: string;
51
+ }
52
+ /** The wallet holds the payment and has returned no hash. */
53
+ | {
54
+ type: "sending";
55
+ } | {
56
+ type: "sent";
57
+ payments: RelayrSentPayment[];
58
+ }
59
+ /** The payment attempt failed; `outcome` is relayrPaymentAttemptOutcome's answer. */
60
+ | {
61
+ type: "unsent";
62
+ outcome: "reverted" | "unpaid" | null;
63
+ } | {
64
+ type: "executing";
65
+ }
66
+ /** A saved payment was proven reverted on resume. */
67
+ | {
68
+ type: "reverted";
69
+ }
70
+ /** revertedRelayrQuote proved nothing can fund the quote: the same signatures are quoted again. */
71
+ | {
72
+ type: "released";
73
+ };
74
+ /**
75
+ * Moves a launch journal through its payment lifecycle, in place, since the
76
+ * session holds it: true when it changed and must be persisted.
77
+ */
78
+ export declare function advanceRelayrLaunch(journal: RelayrLaunchJournal, event: RelayrLaunchEvent): boolean;
79
+ /**
80
+ * A new journal that signs again: `superseded` (published signatures it
81
+ * replaces) marks it published, and `retryNonces` pins each chain's nonce so
82
+ * the forwarder runs at most one of old and new.
83
+ */
84
+ export declare function resignedRelayrLaunch({ account, retryNonces, superseded, abandonable, }: {
85
+ account: Address;
86
+ retryNonces?: Record<number, string>;
87
+ superseded?: RelayrSignedLaunch[];
88
+ abandonable?: boolean;
89
+ }): RelayrLaunchJournal;
90
+ //# sourceMappingURL=relayrLaunch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayrLaunch.d.ts","sourceRoot":"","sources":["../../../src/review/relayrLaunch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /** The phases a saved Relayr launch journal may be in, in order. */
2
+ export const RELAYR_LAUNCH_PHASES = [
3
+ "signing",
4
+ "quoting",
5
+ "quoted",
6
+ "payment-signing",
7
+ "submitted",
8
+ "executing",
9
+ "payment-reverted",
10
+ ];
11
+ export const isRelayrLaunchPhase = (value) => RELAYR_LAUNCH_PHASES.includes(value);
12
+ /** A payment was or may be sent: the saved payment chain is required. */
13
+ export const relayrLaunchPaying = (phase) => phase === "payment-signing" ||
14
+ phase === "submitted" ||
15
+ phase === "executing" ||
16
+ phase === "payment-reverted";
17
+ /** Nothing funds the quote: published requests are classified, and an abandonable journal signs again. */
18
+ export const relayrLaunchUnfunded = (phase) => phase === "signing" ||
19
+ phase === "quoting" ||
20
+ phase === "quoted" ||
21
+ phase === "payment-reverted";
22
+ /** A payment is with the wallet or the chain: resume reconciles it, never pays again. */
23
+ export const relayrLaunchInFlight = (phase) => phase === "payment-signing" || phase === "submitted" || phase === "executing";
24
+ /**
25
+ * Moves a launch journal through its payment lifecycle, in place, since the
26
+ * session holds it: true when it changed and must be persisted.
27
+ */
28
+ export function advanceRelayrLaunch(journal, event) {
29
+ switch (event.type) {
30
+ case "quoting":
31
+ journal.phase = "quoting";
32
+ journal.published = true;
33
+ delete journal.abandonable;
34
+ delete journal.quote;
35
+ delete journal.paymentChainId;
36
+ delete journal.paymentDeadline;
37
+ return true;
38
+ case "quoted":
39
+ journal.quote = event.quote;
40
+ journal.phase = "quoted";
41
+ return true;
42
+ case "chosen":
43
+ journal.paymentChainId = event.paymentChainId;
44
+ journal.paymentDeadline = event.paymentDeadline;
45
+ return true;
46
+ case "sending":
47
+ journal.phase = "payment-signing";
48
+ // The wallet's payment has no hash yet, even when an earlier one reverted.
49
+ delete journal.paymentHash;
50
+ return true;
51
+ case "sent":
52
+ journal.payments = event.payments;
53
+ journal.paymentHash = event.payments[event.payments.length - 1].hash;
54
+ journal.phase = "submitted";
55
+ return true;
56
+ case "unsent":
57
+ if (event.outcome === "reverted")
58
+ journal.phase = "payment-reverted";
59
+ else if (event.outcome === "unpaid") {
60
+ journal.phase = "quoted";
61
+ delete journal.paymentChainId;
62
+ delete journal.paymentDeadline;
63
+ }
64
+ return event.outcome !== null;
65
+ case "executing":
66
+ journal.phase = "executing";
67
+ return true;
68
+ case "reverted":
69
+ journal.phase = "payment-reverted";
70
+ return true;
71
+ case "released":
72
+ journal.phase = "quoted";
73
+ delete journal.quote;
74
+ delete journal.payments;
75
+ delete journal.paymentHash;
76
+ delete journal.paymentChainId;
77
+ delete journal.paymentDeadline;
78
+ return true;
79
+ }
80
+ }
81
+ /**
82
+ * A new journal that signs again: `superseded` (published signatures it
83
+ * replaces) marks it published, and `retryNonces` pins each chain's nonce so
84
+ * the forwarder runs at most one of old and new.
85
+ */
86
+ export function resignedRelayrLaunch({ account, retryNonces, superseded, abandonable, }) {
87
+ return {
88
+ account,
89
+ phase: "signing",
90
+ signed: [],
91
+ records: [],
92
+ ...(superseded ? { published: true, superseded } : {}),
93
+ ...(abandonable ? { abandonable: true } : {}),
94
+ ...(retryNonces ? { retryNonces } : {}),
95
+ };
96
+ }
97
+ //# sourceMappingURL=relayrLaunch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayrLaunch.js","sourceRoot":"","sources":["../../../src/review/relayrLaunch.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { type RelayrBundle, type RelayrEntry, type RelayrQuote } from "./relayr.
5
5
  import type { SafeRelayrOptions } from "./safeRelayr.js";
6
6
  import type { ReviewedSendDeps } from "./send.js";
7
7
  import { type WalletAdapter } from "./wallet.js";
8
+ import { type LockHandle } from "./writeRecovery.js";
8
9
  /**
9
10
  * One destination call Relayr runs through the chain's forwarder, with the
10
11
  * gas its request signs. `raw`: Relayr runs it from its own account, unsigned
@@ -54,6 +55,8 @@ export declare function signReviewedForwardRequests(calls: readonly RelayrReview
54
55
  account: Address;
55
56
  context?: readonly ReviewContextRow[];
56
57
  title?: string;
58
+ /** The site's own locks, checked as the last await before each signature. */
59
+ locks?: readonly LockHandle[];
57
60
  }, deps: {
58
61
  adapter: WalletAdapter;
59
62
  clientFor: (chainId: number) => PublicClient;
@@ -75,6 +78,8 @@ export declare function payRelayrReviewed(quote: RelayrQuote, chainId: number, a
75
78
  context?: readonly ReviewContextRow[];
76
79
  onSending?: () => Promise<void>;
77
80
  onSent?: (hash: Hex) => Promise<void>;
81
+ /** The site's own locks, checked before `onSending` and as the last await before the wallet; a lost one sends nothing. */
82
+ locks?: readonly LockHandle[];
78
83
  /** A plan already reviewed with exactly this payment (`reviewPlan`): nothing is asked. */
79
84
  plan?: ReviewedPlan;
80
85
  /** The plan's Relayr round this quote runs: the payment spends its fee bound instead. */
@@ -1 +1 @@
1
- {"version":3,"file":"relayrSend.d.ts","sourceRoot":"","sources":["../../../src/review/relayrSend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"relayrSend.d.ts","sourceRoot":"","sources":["../../../src/review/relayrSend.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ import { prepareSignature, signPrepared, } from "./sign.js";
15
15
  import { simulateStateChangingTransaction } from "./simulation.js";
16
16
  import { unsupportedWalletRequest, walletReady, } from "./wallet.js";
17
17
  import { openStepHold, WriteHeldError } from "./writeHold.js";
18
- import { browserLocks } from "./writeRecovery.js";
18
+ import { assertLocksHeld, browserLocks, } from "./writeRecovery.js";
19
19
  import { pause, timeout } from "../pause.js";
20
20
  import { FOLLOW_MS, RECEIPT_RETRY_MS } from "./heldWrite.js";
21
21
  /**
@@ -382,7 +382,10 @@ async function sendPayment(details, account, deps, hooks = {}) {
382
382
  ...(hooks.intent ? { intent: hooks.intent.key } : {}),
383
383
  };
384
384
  const handle = openStepHold(deps.hold, account, safe, call);
385
- /** The attempt is saved (`onSending`), and the wallet not yet asked. */
385
+ /**
386
+ * The app's `onSending` began, so its saved "sending" record may stand:
387
+ * any refusal before the wallet then says "not sent", so the app restores it.
388
+ */
386
389
  let saved = false;
387
390
  let invoked = false;
388
391
  /** The reservation this payment's send took. */
@@ -393,112 +396,130 @@ async function sendPayment(details, account, deps, hooks = {}) {
393
396
  const held = handle.peek();
394
397
  if (held.status !== "clear")
395
398
  throw new WriteHeldError(held);
396
- return handle.send(client, (gate) => submitReviewedContractWrite({
397
- request: call,
398
- expectedAccount: account,
399
- review: () => Promise.resolve(),
400
- switchChain: async (chainId) => {
401
- if (adapter.chainId() !== chainId)
402
- await adapter.switchChain(chainId);
403
- },
404
- currentAccount: () => adapter.account(),
405
- reverify: async () => {
406
- await hooks.recheck?.();
407
- // A lapsed payment would only revert in simulation.
408
- if (quoteExpired(details.deadline))
409
- throw new QuoteExpiredError();
410
- await requireRelayrPaymentRuntime(client);
411
- },
412
- simulate: async () => {
413
- const [, found] = await Promise.all([
414
- simulateRelayrPayment(client, {
415
- from: account,
416
- payment: details,
417
- }),
418
- // A Safe never proposes again a payment it already queued exactly.
419
- safe && hasSafeService(details.chainId)
420
- ? findPendingSafeAppProposal(client, details.chainId, account, {
421
- to: RELAYR_PAYMENT_ADDRESS,
422
- data: details.calldata,
423
- value: details.amount,
424
- }, deps.hold.safeService, true)
425
- : null,
426
- ]);
427
- queued = found;
428
- return details;
429
- },
430
- beforeWrite: async () => {
431
- const { intent } = hooks;
432
- // Only the check and the reservation are under the lock: never a
433
- // chain switch, simulation or wallet that might not answer.
434
- await (intent
435
- ? browserLocks().request(`nana-sdk:relayr-payment:${account.toLowerCase()}:${intent.key}`, { mode: "exclusive" }, async () => {
436
- requireIntentClear(deps, account, intent);
437
- await gate.beforeSend();
438
- })
439
- : gate.beforeSend());
440
- reserved = handle.peek().reservation;
441
- try {
442
- await hooks.onSending?.();
443
- }
444
- catch (error) {
445
- gate.onRejected();
446
- throw error;
447
- }
448
- saved = true;
449
- },
450
- beforeSend: () => {
451
- try {
452
- if (details.target.toLowerCase() !== RELAYR_PAYMENT_ADDRESS ||
453
- details.calldata.slice(0, 10).toLowerCase() !==
454
- RELAYR_PAYMENT_SELECTOR) {
455
- throw new Error("The Relayr payment is not to its pinned contract.");
456
- }
399
+ return handle.send(client, (gate) => {
400
+ /** Every lock is still this tab's: the hold's and the app's. */
401
+ const fence = () => assertLocksHeld([gate, ...(hooks.locks ?? [])]);
402
+ return submitReviewedContractWrite({
403
+ request: call,
404
+ expectedAccount: account,
405
+ review: () => Promise.resolve(),
406
+ switchChain: async (chainId) => {
407
+ if (adapter.chainId() !== chainId)
408
+ await adapter.switchChain(chainId);
409
+ },
410
+ currentAccount: () => adapter.account(),
411
+ reverify: async () => {
412
+ await hooks.recheck?.();
413
+ // A lapsed payment would only revert in simulation.
457
414
  if (quoteExpired(details.deadline))
458
415
  throw new QuoteExpiredError();
459
- if (adapter.isSafe() !== safe)
460
- throw new Error(safe
461
- ? "Wallet connection changed. Review the payment again."
462
- : ORDINARY_WALLET);
463
- if (adapter.chainId() !== details.chainId) {
464
- throw new Error("Your wallet changed networks. Review the payment again.");
416
+ await requireRelayrPaymentRuntime(client);
417
+ },
418
+ simulate: async () => {
419
+ const [, found] = await Promise.all([
420
+ simulateRelayrPayment(client, {
421
+ from: account,
422
+ payment: details,
423
+ }),
424
+ // A Safe never proposes again a payment it already queued exactly.
425
+ safe && hasSafeService(details.chainId)
426
+ ? findPendingSafeAppProposal(client, details.chainId, account, {
427
+ to: RELAYR_PAYMENT_ADDRESS,
428
+ data: details.calldata,
429
+ value: details.amount,
430
+ }, deps.hold.safeService, true)
431
+ : null,
432
+ ]);
433
+ queued = found;
434
+ return details;
435
+ },
436
+ beforeWrite: async () => {
437
+ const { intent } = hooks;
438
+ // Only the check and the reservation are under the lock: never a
439
+ // chain switch, simulation or wallet that might not answer.
440
+ await (intent
441
+ ? browserLocks().request(`nana-sdk:relayr-payment:${account.toLowerCase()}:${intent.key}`, { mode: "exclusive" }, async (lock) => {
442
+ requireIntentClear(deps, account, intent);
443
+ await gate.beforeSend();
444
+ try {
445
+ // A tab asleep through the reservation's reads gave this up.
446
+ await lock.assertHeld();
447
+ }
448
+ catch (error) {
449
+ gate.onRejected();
450
+ throw error;
451
+ }
452
+ })
453
+ : gate.beforeSend());
454
+ reserved = handle.peek().reservation;
455
+ try {
456
+ // The site's own record before the wallet: never under a lost lock.
457
+ await assertLocksHeld(hooks.locks);
458
+ saved = true;
459
+ await hooks.onSending?.();
460
+ // Core's own check before the adapter, which fences again as the
461
+ // last await before the wallet.
462
+ await fence();
465
463
  }
466
- // Last, after every callback above could have run.
467
- if (adapter.account()?.toLowerCase() !== account.toLowerCase()) {
468
- throw new Error(ACCOUNT_CHANGED);
464
+ catch (error) {
465
+ gate.onRejected();
466
+ throw error;
469
467
  }
470
- }
471
- catch (error) {
472
- throw new RelayrPaymentNotSentError(error);
473
- }
474
- },
475
- onBeforeWriteAborted: () => gate.onRejected(),
476
- onWriteRejected: () => gate.onRejected(),
477
- onWriteSubmitted: async (submitted) => {
478
- gate.afterSubmit(submitted, queued?.tx);
479
- await hooks.onSent?.(submitted);
480
- },
481
- // The pinned contract and gas, never the quote's word.
482
- write: async ({ chainId, calldata, amount }) => {
483
- // An adopted proposal is already with the Safe: never "not sent".
484
- invoked = true;
485
- if (queued)
486
- return queued.proposalHash;
487
- try {
488
- return await adapter.sendTransaction({
489
- chainId,
490
- to: RELAYR_PAYMENT_ADDRESS,
491
- data: calldata,
492
- value: amount,
493
- gas: safe ? 0n : RELAYR_PAYMENT_GAS,
494
- });
495
- }
496
- catch (error) {
497
- // Only the wallet's own 4001 says it declined.
498
- throw relayrWalletPaymentError(error);
499
- }
500
- },
501
- }));
468
+ },
469
+ beforeSend: () => {
470
+ try {
471
+ if (details.target.toLowerCase() !== RELAYR_PAYMENT_ADDRESS ||
472
+ details.calldata.slice(0, 10).toLowerCase() !==
473
+ RELAYR_PAYMENT_SELECTOR) {
474
+ throw new Error("The Relayr payment is not to its pinned contract.");
475
+ }
476
+ if (quoteExpired(details.deadline))
477
+ throw new QuoteExpiredError();
478
+ if (adapter.isSafe() !== safe)
479
+ throw new Error(safe
480
+ ? "Wallet connection changed. Review the payment again."
481
+ : ORDINARY_WALLET);
482
+ if (adapter.chainId() !== details.chainId) {
483
+ throw new Error("Your wallet changed networks. Review the payment again.");
484
+ }
485
+ // Last, after every callback above could have run.
486
+ if (adapter.account()?.toLowerCase() !== account.toLowerCase()) {
487
+ throw new Error(ACCOUNT_CHANGED);
488
+ }
489
+ }
490
+ catch (error) {
491
+ throw new RelayrPaymentNotSentError(error);
492
+ }
493
+ },
494
+ onBeforeWriteAborted: () => gate.onRejected(),
495
+ onWriteRejected: () => gate.onRejected(),
496
+ onWriteSubmitted: async (submitted) => {
497
+ gate.afterSubmit(submitted, queued?.tx);
498
+ await hooks.onSent?.(submitted);
499
+ },
500
+ // The pinned contract and gas, never the quote's word.
501
+ write: async ({ chainId, calldata, amount }) => {
502
+ // An adopted proposal is already with the Safe: never "not sent".
503
+ invoked = true;
504
+ if (queued)
505
+ return queued.proposalHash;
506
+ try {
507
+ return await adapter.sendTransaction({
508
+ chainId,
509
+ to: RELAYR_PAYMENT_ADDRESS,
510
+ data: calldata,
511
+ value: amount,
512
+ gas: safe ? 0n : RELAYR_PAYMENT_GAS,
513
+ fence,
514
+ });
515
+ }
516
+ catch (error) {
517
+ // Only the wallet's own 4001 says it declined.
518
+ throw relayrWalletPaymentError(error);
519
+ }
520
+ },
521
+ });
522
+ });
502
523
  };
503
524
  let hash;
504
525
  try {
@@ -609,7 +630,7 @@ export async function signReviewedForwardRequests(calls, action, deps) {
609
630
  ...(action.context ? { context: action.context } : {}),
610
631
  });
611
632
  await promptReview(model, Promise.resolve({ status: "passed" }), Promise.resolve(model));
612
- const signatures = await signPrepared(prepared, account, deps.adapter);
633
+ const signatures = await signPrepared(prepared, account, deps.adapter, undefined, () => assertLocksHeld(action.locks), () => assertLocksHeld(action.locks));
613
634
  return requests.map(({ chainId, request }, index) => entryOf(chainId, request, signatures[index]));
614
635
  }
615
636
  /**
@@ -662,6 +683,7 @@ export async function payRelayrReviewed(quote, chainId, action, deps) {
662
683
  recheck: () => requireRelayrBundleUnpaid(details.bundleUuid),
663
684
  ...(action.onSending ? { onSending: action.onSending } : {}),
664
685
  ...(action.onSent ? { onSent: action.onSent } : {}),
686
+ ...(action.locks ? { locks: action.locks } : {}),
665
687
  safe,
666
688
  });
667
689
  return safe ? { safeTxHash: hash } : { hash };
@@ -699,11 +721,15 @@ export async function pollRelayrBundle(uuid, expectedCount, options = {}) {
699
721
  throw new Error(`Relayr is still processing paid bundle ${uuid}. Do not submit this action again; check it later.`);
700
722
  }
701
723
  await new Promise((resolve, reject) => {
702
- const timer = setTimeout(resolve, POLL_INTERVAL_MS);
703
- signal?.addEventListener("abort", () => {
724
+ const aborted = () => {
704
725
  clearTimeout(timer);
705
726
  reject(signal.reason);
706
- }, { once: true });
727
+ };
728
+ const timer = setTimeout(() => {
729
+ signal?.removeEventListener("abort", aborted);
730
+ resolve();
731
+ }, POLL_INTERVAL_MS);
732
+ signal?.addEventListener("abort", aborted, { once: true });
707
733
  });
708
734
  }
709
735
  }