@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.
- package/dist/cjs/jbcenter/ensureDeployed.d.ts +2 -2
- package/dist/cjs/jbcenter/ensureDeployed.d.ts.map +1 -1
- package/dist/cjs/jbcenter/ensureDeployed.js.map +1 -1
- package/dist/cjs/jbcenter.d.ts +4 -1
- package/dist/cjs/jbcenter.d.ts.map +1 -1
- package/dist/cjs/jbcenter.js +6 -6
- package/dist/cjs/jbcenter.js.map +1 -1
- package/dist/cjs/review/gas.d.ts +5 -2
- package/dist/cjs/review/gas.d.ts.map +1 -1
- package/dist/cjs/review/gas.js +8 -3
- package/dist/cjs/review/gas.js.map +1 -1
- package/dist/cjs/review/heldWrite.d.ts +6 -1
- package/dist/cjs/review/heldWrite.d.ts.map +1 -1
- package/dist/cjs/review/heldWrite.js +21 -16
- package/dist/cjs/review/heldWrite.js.map +1 -1
- package/dist/cjs/review/index.d.ts +2 -0
- package/dist/cjs/review/index.d.ts.map +1 -1
- package/dist/cjs/review/index.js +2 -0
- package/dist/cjs/review/index.js.map +1 -1
- package/dist/cjs/review/locks.d.ts +69 -0
- package/dist/cjs/review/locks.d.ts.map +1 -0
- package/dist/cjs/review/locks.js +232 -0
- package/dist/cjs/review/locks.js.map +1 -0
- package/dist/cjs/review/machines.d.ts +9 -0
- package/dist/cjs/review/machines.d.ts.map +1 -0
- package/dist/cjs/review/machines.js +25 -0
- package/dist/cjs/review/machines.js.map +1 -0
- package/dist/cjs/review/react/index.d.ts +3 -0
- package/dist/cjs/review/react/index.d.ts.map +1 -1
- package/dist/cjs/review/react/index.js +3 -0
- package/dist/cjs/review/react/index.js.map +1 -1
- package/dist/cjs/review/react/useFeeBuybackReview.d.ts +6 -0
- package/dist/cjs/review/react/useFeeBuybackReview.d.ts.map +1 -0
- package/dist/cjs/review/react/useFeeBuybackReview.js +53 -0
- package/dist/cjs/review/react/useFeeBuybackReview.js.map +1 -0
- package/dist/cjs/review/react/useMobileWallet.d.ts +15 -0
- package/dist/cjs/review/react/useMobileWallet.d.ts.map +1 -0
- package/dist/cjs/review/react/useMobileWallet.js +50 -0
- package/dist/cjs/review/react/useMobileWallet.js.map +1 -0
- package/dist/cjs/review/react/useReviewedRun.d.ts +28 -1
- package/dist/cjs/review/react/useReviewedRun.d.ts.map +1 -1
- package/dist/cjs/review/react/useReviewedRun.js +251 -39
- package/dist/cjs/review/react/useReviewedRun.js.map +1 -1
- package/dist/cjs/review/react/useSavedAttempt.d.ts +23 -0
- package/dist/cjs/review/react/useSavedAttempt.d.ts.map +1 -1
- package/dist/cjs/review/react/useSavedAttempt.js +101 -11
- package/dist/cjs/review/react/useSavedAttempt.js.map +1 -1
- package/dist/cjs/review/react/useStartOnce.d.ts +8 -0
- package/dist/cjs/review/react/useStartOnce.d.ts.map +1 -0
- package/dist/cjs/review/react/useStartOnce.js +27 -0
- package/dist/cjs/review/react/useStartOnce.js.map +1 -0
- package/dist/cjs/review/relayr.d.ts +1 -1
- package/dist/cjs/review/relayr.d.ts.map +1 -1
- package/dist/cjs/review/relayr.js +15 -0
- package/dist/cjs/review/relayr.js.map +1 -1
- package/dist/cjs/review/relayrLaunch.d.ts +90 -0
- package/dist/cjs/review/relayrLaunch.d.ts.map +1 -0
- package/dist/cjs/review/relayrLaunch.js +106 -0
- package/dist/cjs/review/relayrLaunch.js.map +1 -0
- package/dist/cjs/review/relayrSend.d.ts +5 -0
- package/dist/cjs/review/relayrSend.d.ts.map +1 -1
- package/dist/cjs/review/relayrSend.js +133 -107
- package/dist/cjs/review/relayrSend.js.map +1 -1
- package/dist/cjs/review/reviewDialogQueue.d.ts +47 -0
- package/dist/cjs/review/reviewDialogQueue.d.ts.map +1 -0
- package/dist/cjs/review/reviewDialogQueue.js +120 -0
- package/dist/cjs/review/reviewDialogQueue.js.map +1 -0
- package/dist/cjs/review/runStatus.d.ts +51 -0
- package/dist/cjs/review/runStatus.d.ts.map +1 -0
- package/dist/cjs/review/runStatus.js +54 -0
- package/dist/cjs/review/runStatus.js.map +1 -0
- package/dist/cjs/review/safeRelayr.d.ts +60 -16
- package/dist/cjs/review/safeRelayr.d.ts.map +1 -1
- package/dist/cjs/review/safeRelayr.js +358 -161
- package/dist/cjs/review/safeRelayr.js.map +1 -1
- package/dist/cjs/review/savedAttempt.d.ts.map +1 -1
- package/dist/cjs/review/savedAttempt.js +7 -2
- package/dist/cjs/review/savedAttempt.js.map +1 -1
- package/dist/cjs/review/send.d.ts +27 -5
- package/dist/cjs/review/send.d.ts.map +1 -1
- package/dist/cjs/review/send.js +67 -24
- package/dist/cjs/review/send.js.map +1 -1
- package/dist/cjs/review/sign.d.ts +6 -1
- package/dist/cjs/review/sign.d.ts.map +1 -1
- package/dist/cjs/review/sign.js +10 -4
- package/dist/cjs/review/sign.js.map +1 -1
- package/dist/cjs/review/wallet.d.ts +16 -4
- package/dist/cjs/review/wallet.d.ts.map +1 -1
- package/dist/cjs/review/wallet.js +60 -17
- package/dist/cjs/review/wallet.js.map +1 -1
- package/dist/cjs/review/writeHold.d.ts +18 -3
- package/dist/cjs/review/writeHold.d.ts.map +1 -1
- package/dist/cjs/review/writeHold.js +37 -10
- package/dist/cjs/review/writeHold.js.map +1 -1
- package/dist/cjs/review/writeRecovery.d.ts +13 -8
- package/dist/cjs/review/writeRecovery.d.ts.map +1 -1
- package/dist/cjs/review/writeRecovery.js +67 -144
- package/dist/cjs/review/writeRecovery.js.map +1 -1
- package/dist/cjs/v6/feeBuyback.d.ts +49 -0
- package/dist/cjs/v6/feeBuyback.d.ts.map +1 -1
- package/dist/cjs/v6/feeBuyback.js +151 -0
- package/dist/cjs/v6/feeBuyback.js.map +1 -1
- package/dist/cjs/v6/suckers.d.ts +24 -2
- package/dist/cjs/v6/suckers.d.ts.map +1 -1
- package/dist/cjs/v6/suckers.js +5 -5
- package/dist/cjs/v6/suckers.js.map +1 -1
- package/dist/esm/jbcenter/ensureDeployed.d.ts +2 -2
- package/dist/esm/jbcenter/ensureDeployed.d.ts.map +1 -1
- package/dist/esm/jbcenter/ensureDeployed.js.map +1 -1
- package/dist/esm/jbcenter.d.ts +4 -1
- package/dist/esm/jbcenter.d.ts.map +1 -1
- package/dist/esm/jbcenter.js +6 -6
- package/dist/esm/jbcenter.js.map +1 -1
- package/dist/esm/review/gas.d.ts +5 -2
- package/dist/esm/review/gas.d.ts.map +1 -1
- package/dist/esm/review/gas.js +7 -3
- package/dist/esm/review/gas.js.map +1 -1
- package/dist/esm/review/heldWrite.d.ts +6 -1
- package/dist/esm/review/heldWrite.d.ts.map +1 -1
- package/dist/esm/review/heldWrite.js +21 -16
- package/dist/esm/review/heldWrite.js.map +1 -1
- package/dist/esm/review/index.d.ts +2 -0
- package/dist/esm/review/index.d.ts.map +1 -1
- package/dist/esm/review/index.js +2 -0
- package/dist/esm/review/index.js.map +1 -1
- package/dist/esm/review/locks.d.ts +69 -0
- package/dist/esm/review/locks.d.ts.map +1 -0
- package/dist/esm/review/locks.js +225 -0
- package/dist/esm/review/locks.js.map +1 -0
- package/dist/esm/review/machines.d.ts +9 -0
- package/dist/esm/review/machines.d.ts.map +1 -0
- package/dist/esm/review/machines.js +9 -0
- package/dist/esm/review/machines.js.map +1 -0
- package/dist/esm/review/react/index.d.ts +3 -0
- package/dist/esm/review/react/index.d.ts.map +1 -1
- package/dist/esm/review/react/index.js +3 -0
- package/dist/esm/review/react/index.js.map +1 -1
- package/dist/esm/review/react/useFeeBuybackReview.d.ts +6 -0
- package/dist/esm/review/react/useFeeBuybackReview.d.ts.map +1 -0
- package/dist/esm/review/react/useFeeBuybackReview.js +50 -0
- package/dist/esm/review/react/useFeeBuybackReview.js.map +1 -0
- package/dist/esm/review/react/useMobileWallet.d.ts +15 -0
- package/dist/esm/review/react/useMobileWallet.d.ts.map +1 -0
- package/dist/esm/review/react/useMobileWallet.js +46 -0
- package/dist/esm/review/react/useMobileWallet.js.map +1 -0
- package/dist/esm/review/react/useReviewedRun.d.ts +28 -1
- package/dist/esm/review/react/useReviewedRun.d.ts.map +1 -1
- package/dist/esm/review/react/useReviewedRun.js +252 -40
- package/dist/esm/review/react/useReviewedRun.js.map +1 -1
- package/dist/esm/review/react/useSavedAttempt.d.ts +23 -0
- package/dist/esm/review/react/useSavedAttempt.d.ts.map +1 -1
- package/dist/esm/review/react/useSavedAttempt.js +101 -11
- package/dist/esm/review/react/useSavedAttempt.js.map +1 -1
- package/dist/esm/review/react/useStartOnce.d.ts +8 -0
- package/dist/esm/review/react/useStartOnce.d.ts.map +1 -0
- package/dist/esm/review/react/useStartOnce.js +24 -0
- package/dist/esm/review/react/useStartOnce.js.map +1 -0
- package/dist/esm/review/relayr.d.ts +1 -1
- package/dist/esm/review/relayr.d.ts.map +1 -1
- package/dist/esm/review/relayr.js +1 -0
- package/dist/esm/review/relayr.js.map +1 -1
- package/dist/esm/review/relayrLaunch.d.ts +90 -0
- package/dist/esm/review/relayrLaunch.d.ts.map +1 -0
- package/dist/esm/review/relayrLaunch.js +97 -0
- package/dist/esm/review/relayrLaunch.js.map +1 -0
- package/dist/esm/review/relayrSend.d.ts +5 -0
- package/dist/esm/review/relayrSend.d.ts.map +1 -1
- package/dist/esm/review/relayrSend.js +134 -108
- package/dist/esm/review/relayrSend.js.map +1 -1
- package/dist/esm/review/reviewDialogQueue.d.ts +47 -0
- package/dist/esm/review/reviewDialogQueue.d.ts.map +1 -0
- package/dist/esm/review/reviewDialogQueue.js +117 -0
- package/dist/esm/review/reviewDialogQueue.js.map +1 -0
- package/dist/esm/review/runStatus.d.ts +51 -0
- package/dist/esm/review/runStatus.d.ts.map +1 -0
- package/dist/esm/review/runStatus.js +51 -0
- package/dist/esm/review/runStatus.js.map +1 -0
- package/dist/esm/review/safeRelayr.d.ts +60 -16
- package/dist/esm/review/safeRelayr.d.ts.map +1 -1
- package/dist/esm/review/safeRelayr.js +358 -161
- package/dist/esm/review/safeRelayr.js.map +1 -1
- package/dist/esm/review/savedAttempt.d.ts.map +1 -1
- package/dist/esm/review/savedAttempt.js +7 -2
- package/dist/esm/review/savedAttempt.js.map +1 -1
- package/dist/esm/review/send.d.ts +27 -5
- package/dist/esm/review/send.d.ts.map +1 -1
- package/dist/esm/review/send.js +67 -24
- package/dist/esm/review/send.js.map +1 -1
- package/dist/esm/review/sign.d.ts +6 -1
- package/dist/esm/review/sign.d.ts.map +1 -1
- package/dist/esm/review/sign.js +10 -4
- package/dist/esm/review/sign.js.map +1 -1
- package/dist/esm/review/wallet.d.ts +16 -4
- package/dist/esm/review/wallet.d.ts.map +1 -1
- package/dist/esm/review/wallet.js +60 -17
- package/dist/esm/review/wallet.js.map +1 -1
- package/dist/esm/review/writeHold.d.ts +18 -3
- package/dist/esm/review/writeHold.d.ts.map +1 -1
- package/dist/esm/review/writeHold.js +37 -10
- package/dist/esm/review/writeHold.js.map +1 -1
- package/dist/esm/review/writeRecovery.d.ts +13 -8
- package/dist/esm/review/writeRecovery.d.ts.map +1 -1
- package/dist/esm/review/writeRecovery.js +63 -142
- package/dist/esm/review/writeRecovery.js.map +1 -1
- package/dist/esm/v6/feeBuyback.d.ts +49 -0
- package/dist/esm/v6/feeBuyback.d.ts.map +1 -1
- package/dist/esm/v6/feeBuyback.js +150 -0
- package/dist/esm/v6/feeBuyback.js.map +1 -1
- package/dist/esm/v6/suckers.d.ts +24 -2
- package/dist/esm/v6/suckers.d.ts.map +1 -1
- package/dist/esm/v6/suckers.js +5 -5
- package/dist/esm/v6/suckers.js.map +1 -1
- 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":"AAQA,oEAAoE;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,SAAS;IACT,SAAS;IACT,QAAQ;IACR,iBAAiB;IACjB,WAAW;IACX,WAAW;IACX,kBAAkB;CACV,CAAC;AAiCX,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAc,EACc,EAAE,CAC7B,oBAA2C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAE/D,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAwB,EAAE,EAAE,CAC7D,KAAK,KAAK,iBAAiB;IAC3B,KAAK,KAAK,WAAW;IACrB,KAAK,KAAK,WAAW;IACrB,KAAK,KAAK,kBAAkB,CAAC;AAE/B,0GAA0G;AAC1G,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAwB,EAAE,EAAE,CAC/D,KAAK,KAAK,SAAS;IACnB,KAAK,KAAK,SAAS;IACnB,KAAK,KAAK,QAAQ;IAClB,KAAK,KAAK,kBAAkB,CAAC;AAE/B,yFAAyF;AACzF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAwB,EAAE,EAAE,CAC/D,KAAK,KAAK,iBAAiB,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,CAAC;AAkBhF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA4B,EAC5B,KAAwB;IAExB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;YAC1B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;YACzB,OAAO,OAAO,CAAC,WAAW,CAAC;YAC3B,OAAO,OAAO,CAAC,KAAK,CAAC;YACrB,OAAO,OAAO,CAAC,cAAc,CAAC;YAC9B,OAAO,OAAO,CAAC,eAAe,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC5B,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;YAC9C,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,CAAC,KAAK,GAAG,iBAAiB,CAAC;YAClC,2EAA2E;YAC3E,OAAO,OAAO,CAAC,WAAW,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAClC,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,KAAK,QAAQ;YACX,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU;gBAAE,OAAO,CAAC,KAAK,GAAG,kBAAkB,CAAC;iBAChE,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACzB,OAAO,OAAO,CAAC,cAAc,CAAC;gBAC9B,OAAO,OAAO,CAAC,eAAe,CAAC;YACjC,CAAC;YACD,OAAO,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;QAChC,KAAK,WAAW;YACd,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,KAAK,UAAU;YACb,OAAO,CAAC,KAAK,GAAG,kBAAkB,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,KAAK,UAAU;YACb,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;YACzB,OAAO,OAAO,CAAC,KAAK,CAAC;YACrB,OAAO,OAAO,CAAC,QAAQ,CAAC;YACxB,OAAO,OAAO,CAAC,WAAW,CAAC;YAC3B,OAAO,OAAO,CAAC,cAAc,CAAC;YAC9B,OAAO,OAAO,CAAC,eAAe,CAAC;YAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,OAAO,EACP,WAAW,EACX,UAAU,EACV,WAAW,GAMZ;IACC,OAAO;QACL,OAAO;QACP,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAa,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -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":"AAAA,OAAO,EAKL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,YAAY,EAClB,MAAM,MAAM,CAAC;AAkBd,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,WAAW,CAAC;AAEnB,OAAO,EA+BL,KAAK,YAAY,EACjB,KAAK,WAAW,EAEhB,KAAK,WAAW,EAGjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AASlD,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;
|
|
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
|
-
/**
|
|
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) =>
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
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
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
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
|
-
|
|
467
|
-
|
|
468
|
-
throw
|
|
464
|
+
catch (error) {
|
|
465
|
+
gate.onRejected();
|
|
466
|
+
throw error;
|
|
469
467
|
}
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
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
|
|
703
|
-
signal?.addEventListener("abort", () => {
|
|
724
|
+
const aborted = () => {
|
|
704
725
|
clearTimeout(timer);
|
|
705
726
|
reject(signal.reason);
|
|
706
|
-
}
|
|
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
|
}
|