@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,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.relayrLaunchInFlight = exports.relayrLaunchUnfunded = exports.relayrLaunchPaying = exports.isRelayrLaunchPhase = exports.RELAYR_LAUNCH_PHASES = void 0;
|
|
4
|
+
exports.advanceRelayrLaunch = advanceRelayrLaunch;
|
|
5
|
+
exports.resignedRelayrLaunch = resignedRelayrLaunch;
|
|
6
|
+
/** The phases a saved Relayr launch journal may be in, in order. */
|
|
7
|
+
exports.RELAYR_LAUNCH_PHASES = [
|
|
8
|
+
"signing",
|
|
9
|
+
"quoting",
|
|
10
|
+
"quoted",
|
|
11
|
+
"payment-signing",
|
|
12
|
+
"submitted",
|
|
13
|
+
"executing",
|
|
14
|
+
"payment-reverted",
|
|
15
|
+
];
|
|
16
|
+
const isRelayrLaunchPhase = (value) => exports.RELAYR_LAUNCH_PHASES.includes(value);
|
|
17
|
+
exports.isRelayrLaunchPhase = isRelayrLaunchPhase;
|
|
18
|
+
/** A payment was or may be sent: the saved payment chain is required. */
|
|
19
|
+
const relayrLaunchPaying = (phase) => phase === "payment-signing" ||
|
|
20
|
+
phase === "submitted" ||
|
|
21
|
+
phase === "executing" ||
|
|
22
|
+
phase === "payment-reverted";
|
|
23
|
+
exports.relayrLaunchPaying = relayrLaunchPaying;
|
|
24
|
+
/** Nothing funds the quote: published requests are classified, and an abandonable journal signs again. */
|
|
25
|
+
const relayrLaunchUnfunded = (phase) => phase === "signing" ||
|
|
26
|
+
phase === "quoting" ||
|
|
27
|
+
phase === "quoted" ||
|
|
28
|
+
phase === "payment-reverted";
|
|
29
|
+
exports.relayrLaunchUnfunded = relayrLaunchUnfunded;
|
|
30
|
+
/** A payment is with the wallet or the chain: resume reconciles it, never pays again. */
|
|
31
|
+
const relayrLaunchInFlight = (phase) => phase === "payment-signing" || phase === "submitted" || phase === "executing";
|
|
32
|
+
exports.relayrLaunchInFlight = relayrLaunchInFlight;
|
|
33
|
+
/**
|
|
34
|
+
* Moves a launch journal through its payment lifecycle, in place, since the
|
|
35
|
+
* session holds it: true when it changed and must be persisted.
|
|
36
|
+
*/
|
|
37
|
+
function advanceRelayrLaunch(journal, event) {
|
|
38
|
+
switch (event.type) {
|
|
39
|
+
case "quoting":
|
|
40
|
+
journal.phase = "quoting";
|
|
41
|
+
journal.published = true;
|
|
42
|
+
delete journal.abandonable;
|
|
43
|
+
delete journal.quote;
|
|
44
|
+
delete journal.paymentChainId;
|
|
45
|
+
delete journal.paymentDeadline;
|
|
46
|
+
return true;
|
|
47
|
+
case "quoted":
|
|
48
|
+
journal.quote = event.quote;
|
|
49
|
+
journal.phase = "quoted";
|
|
50
|
+
return true;
|
|
51
|
+
case "chosen":
|
|
52
|
+
journal.paymentChainId = event.paymentChainId;
|
|
53
|
+
journal.paymentDeadline = event.paymentDeadline;
|
|
54
|
+
return true;
|
|
55
|
+
case "sending":
|
|
56
|
+
journal.phase = "payment-signing";
|
|
57
|
+
// The wallet's payment has no hash yet, even when an earlier one reverted.
|
|
58
|
+
delete journal.paymentHash;
|
|
59
|
+
return true;
|
|
60
|
+
case "sent":
|
|
61
|
+
journal.payments = event.payments;
|
|
62
|
+
journal.paymentHash = event.payments[event.payments.length - 1].hash;
|
|
63
|
+
journal.phase = "submitted";
|
|
64
|
+
return true;
|
|
65
|
+
case "unsent":
|
|
66
|
+
if (event.outcome === "reverted")
|
|
67
|
+
journal.phase = "payment-reverted";
|
|
68
|
+
else if (event.outcome === "unpaid") {
|
|
69
|
+
journal.phase = "quoted";
|
|
70
|
+
delete journal.paymentChainId;
|
|
71
|
+
delete journal.paymentDeadline;
|
|
72
|
+
}
|
|
73
|
+
return event.outcome !== null;
|
|
74
|
+
case "executing":
|
|
75
|
+
journal.phase = "executing";
|
|
76
|
+
return true;
|
|
77
|
+
case "reverted":
|
|
78
|
+
journal.phase = "payment-reverted";
|
|
79
|
+
return true;
|
|
80
|
+
case "released":
|
|
81
|
+
journal.phase = "quoted";
|
|
82
|
+
delete journal.quote;
|
|
83
|
+
delete journal.payments;
|
|
84
|
+
delete journal.paymentHash;
|
|
85
|
+
delete journal.paymentChainId;
|
|
86
|
+
delete journal.paymentDeadline;
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* A new journal that signs again: `superseded` (published signatures it
|
|
92
|
+
* replaces) marks it published, and `retryNonces` pins each chain's nonce so
|
|
93
|
+
* the forwarder runs at most one of old and new.
|
|
94
|
+
*/
|
|
95
|
+
function resignedRelayrLaunch({ account, retryNonces, superseded, abandonable, }) {
|
|
96
|
+
return {
|
|
97
|
+
account,
|
|
98
|
+
phase: "signing",
|
|
99
|
+
signed: [],
|
|
100
|
+
records: [],
|
|
101
|
+
...(superseded ? { published: true, superseded } : {}),
|
|
102
|
+
...(abandonable ? { abandonable: true } : {}),
|
|
103
|
+
...(retryNonces ? { retryNonces } : {}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# 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":"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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"}
|
|
@@ -390,7 +390,10 @@ async function sendPayment(details, account, deps, hooks = {}) {
|
|
|
390
390
|
...(hooks.intent ? { intent: hooks.intent.key } : {}),
|
|
391
391
|
};
|
|
392
392
|
const handle = (0, writeHold_js_1.openStepHold)(deps.hold, account, safe, call);
|
|
393
|
-
/**
|
|
393
|
+
/**
|
|
394
|
+
* The app's `onSending` began, so its saved "sending" record may stand:
|
|
395
|
+
* any refusal before the wallet then says "not sent", so the app restores it.
|
|
396
|
+
*/
|
|
394
397
|
let saved = false;
|
|
395
398
|
let invoked = false;
|
|
396
399
|
/** The reservation this payment's send took. */
|
|
@@ -401,112 +404,130 @@ async function sendPayment(details, account, deps, hooks = {}) {
|
|
|
401
404
|
const held = handle.peek();
|
|
402
405
|
if (held.status !== "clear")
|
|
403
406
|
throw new writeHold_js_1.WriteHeldError(held);
|
|
404
|
-
return handle.send(client, (gate) =>
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
},
|
|
420
|
-
simulate: async () => {
|
|
421
|
-
const [, found] = await Promise.all([
|
|
422
|
-
(0, relayr_js_1.simulateRelayrPayment)(client, {
|
|
423
|
-
from: account,
|
|
424
|
-
payment: details,
|
|
425
|
-
}),
|
|
426
|
-
// A Safe never proposes again a payment it already queued exactly.
|
|
427
|
-
safe && (0, safeService_js_1.hasSafeService)(details.chainId)
|
|
428
|
-
? (0, safeService_js_1.findPendingSafeAppProposal)(client, details.chainId, account, {
|
|
429
|
-
to: relayr_js_1.RELAYR_PAYMENT_ADDRESS,
|
|
430
|
-
data: details.calldata,
|
|
431
|
-
value: details.amount,
|
|
432
|
-
}, deps.hold.safeService, true)
|
|
433
|
-
: null,
|
|
434
|
-
]);
|
|
435
|
-
queued = found;
|
|
436
|
-
return details;
|
|
437
|
-
},
|
|
438
|
-
beforeWrite: async () => {
|
|
439
|
-
const { intent } = hooks;
|
|
440
|
-
// Only the check and the reservation are under the lock: never a
|
|
441
|
-
// chain switch, simulation or wallet that might not answer.
|
|
442
|
-
await (intent
|
|
443
|
-
? (0, writeRecovery_js_1.browserLocks)().request(`nana-sdk:relayr-payment:${account.toLowerCase()}:${intent.key}`, { mode: "exclusive" }, async () => {
|
|
444
|
-
requireIntentClear(deps, account, intent);
|
|
445
|
-
await gate.beforeSend();
|
|
446
|
-
})
|
|
447
|
-
: gate.beforeSend());
|
|
448
|
-
reserved = handle.peek().reservation;
|
|
449
|
-
try {
|
|
450
|
-
await hooks.onSending?.();
|
|
451
|
-
}
|
|
452
|
-
catch (error) {
|
|
453
|
-
gate.onRejected();
|
|
454
|
-
throw error;
|
|
455
|
-
}
|
|
456
|
-
saved = true;
|
|
457
|
-
},
|
|
458
|
-
beforeSend: () => {
|
|
459
|
-
try {
|
|
460
|
-
if (details.target.toLowerCase() !== relayr_js_1.RELAYR_PAYMENT_ADDRESS ||
|
|
461
|
-
details.calldata.slice(0, 10).toLowerCase() !==
|
|
462
|
-
relayr_js_1.RELAYR_PAYMENT_SELECTOR) {
|
|
463
|
-
throw new Error("The Relayr payment is not to its pinned contract.");
|
|
464
|
-
}
|
|
407
|
+
return handle.send(client, (gate) => {
|
|
408
|
+
/** Every lock is still this tab's: the hold's and the app's. */
|
|
409
|
+
const fence = () => (0, writeRecovery_js_1.assertLocksHeld)([gate, ...(hooks.locks ?? [])]);
|
|
410
|
+
return (0, contractWrite_js_1.submitReviewedContractWrite)({
|
|
411
|
+
request: call,
|
|
412
|
+
expectedAccount: account,
|
|
413
|
+
review: () => Promise.resolve(),
|
|
414
|
+
switchChain: async (chainId) => {
|
|
415
|
+
if (adapter.chainId() !== chainId)
|
|
416
|
+
await adapter.switchChain(chainId);
|
|
417
|
+
},
|
|
418
|
+
currentAccount: () => adapter.account(),
|
|
419
|
+
reverify: async () => {
|
|
420
|
+
await hooks.recheck?.();
|
|
421
|
+
// A lapsed payment would only revert in simulation.
|
|
465
422
|
if ((0, relayr_js_1.quoteExpired)(details.deadline))
|
|
466
423
|
throw new QuoteExpiredError();
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
424
|
+
await (0, relayr_js_1.requireRelayrPaymentRuntime)(client);
|
|
425
|
+
},
|
|
426
|
+
simulate: async () => {
|
|
427
|
+
const [, found] = await Promise.all([
|
|
428
|
+
(0, relayr_js_1.simulateRelayrPayment)(client, {
|
|
429
|
+
from: account,
|
|
430
|
+
payment: details,
|
|
431
|
+
}),
|
|
432
|
+
// A Safe never proposes again a payment it already queued exactly.
|
|
433
|
+
safe && (0, safeService_js_1.hasSafeService)(details.chainId)
|
|
434
|
+
? (0, safeService_js_1.findPendingSafeAppProposal)(client, details.chainId, account, {
|
|
435
|
+
to: relayr_js_1.RELAYR_PAYMENT_ADDRESS,
|
|
436
|
+
data: details.calldata,
|
|
437
|
+
value: details.amount,
|
|
438
|
+
}, deps.hold.safeService, true)
|
|
439
|
+
: null,
|
|
440
|
+
]);
|
|
441
|
+
queued = found;
|
|
442
|
+
return details;
|
|
443
|
+
},
|
|
444
|
+
beforeWrite: async () => {
|
|
445
|
+
const { intent } = hooks;
|
|
446
|
+
// Only the check and the reservation are under the lock: never a
|
|
447
|
+
// chain switch, simulation or wallet that might not answer.
|
|
448
|
+
await (intent
|
|
449
|
+
? (0, writeRecovery_js_1.browserLocks)().request(`nana-sdk:relayr-payment:${account.toLowerCase()}:${intent.key}`, { mode: "exclusive" }, async (lock) => {
|
|
450
|
+
requireIntentClear(deps, account, intent);
|
|
451
|
+
await gate.beforeSend();
|
|
452
|
+
try {
|
|
453
|
+
// A tab asleep through the reservation's reads gave this up.
|
|
454
|
+
await lock.assertHeld();
|
|
455
|
+
}
|
|
456
|
+
catch (error) {
|
|
457
|
+
gate.onRejected();
|
|
458
|
+
throw error;
|
|
459
|
+
}
|
|
460
|
+
})
|
|
461
|
+
: gate.beforeSend());
|
|
462
|
+
reserved = handle.peek().reservation;
|
|
463
|
+
try {
|
|
464
|
+
// The site's own record before the wallet: never under a lost lock.
|
|
465
|
+
await (0, writeRecovery_js_1.assertLocksHeld)(hooks.locks);
|
|
466
|
+
saved = true;
|
|
467
|
+
await hooks.onSending?.();
|
|
468
|
+
// Core's own check before the adapter, which fences again as the
|
|
469
|
+
// last await before the wallet.
|
|
470
|
+
await fence();
|
|
473
471
|
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
throw
|
|
472
|
+
catch (error) {
|
|
473
|
+
gate.onRejected();
|
|
474
|
+
throw error;
|
|
477
475
|
}
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
476
|
+
},
|
|
477
|
+
beforeSend: () => {
|
|
478
|
+
try {
|
|
479
|
+
if (details.target.toLowerCase() !== relayr_js_1.RELAYR_PAYMENT_ADDRESS ||
|
|
480
|
+
details.calldata.slice(0, 10).toLowerCase() !==
|
|
481
|
+
relayr_js_1.RELAYR_PAYMENT_SELECTOR) {
|
|
482
|
+
throw new Error("The Relayr payment is not to its pinned contract.");
|
|
483
|
+
}
|
|
484
|
+
if ((0, relayr_js_1.quoteExpired)(details.deadline))
|
|
485
|
+
throw new QuoteExpiredError();
|
|
486
|
+
if (adapter.isSafe() !== safe)
|
|
487
|
+
throw new Error(safe
|
|
488
|
+
? "Wallet connection changed. Review the payment again."
|
|
489
|
+
: ORDINARY_WALLET);
|
|
490
|
+
if (adapter.chainId() !== details.chainId) {
|
|
491
|
+
throw new Error("Your wallet changed networks. Review the payment again.");
|
|
492
|
+
}
|
|
493
|
+
// Last, after every callback above could have run.
|
|
494
|
+
if (adapter.account()?.toLowerCase() !== account.toLowerCase()) {
|
|
495
|
+
throw new Error(ACCOUNT_CHANGED);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
catch (error) {
|
|
499
|
+
throw new relayr_js_1.RelayrPaymentNotSentError(error);
|
|
500
|
+
}
|
|
501
|
+
},
|
|
502
|
+
onBeforeWriteAborted: () => gate.onRejected(),
|
|
503
|
+
onWriteRejected: () => gate.onRejected(),
|
|
504
|
+
onWriteSubmitted: async (submitted) => {
|
|
505
|
+
gate.afterSubmit(submitted, queued?.tx);
|
|
506
|
+
await hooks.onSent?.(submitted);
|
|
507
|
+
},
|
|
508
|
+
// The pinned contract and gas, never the quote's word.
|
|
509
|
+
write: async ({ chainId, calldata, amount }) => {
|
|
510
|
+
// An adopted proposal is already with the Safe: never "not sent".
|
|
511
|
+
invoked = true;
|
|
512
|
+
if (queued)
|
|
513
|
+
return queued.proposalHash;
|
|
514
|
+
try {
|
|
515
|
+
return await adapter.sendTransaction({
|
|
516
|
+
chainId,
|
|
517
|
+
to: relayr_js_1.RELAYR_PAYMENT_ADDRESS,
|
|
518
|
+
data: calldata,
|
|
519
|
+
value: amount,
|
|
520
|
+
gas: safe ? 0n : relayr_js_1.RELAYR_PAYMENT_GAS,
|
|
521
|
+
fence,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
catch (error) {
|
|
525
|
+
// Only the wallet's own 4001 says it declined.
|
|
526
|
+
throw (0, relayr_js_1.relayrWalletPaymentError)(error);
|
|
527
|
+
}
|
|
528
|
+
},
|
|
529
|
+
});
|
|
530
|
+
});
|
|
510
531
|
};
|
|
511
532
|
let hash;
|
|
512
533
|
try {
|
|
@@ -617,7 +638,7 @@ async function signReviewedForwardRequests(calls, action, deps) {
|
|
|
617
638
|
...(action.context ? { context: action.context } : {}),
|
|
618
639
|
});
|
|
619
640
|
await (0, confirm_js_1.promptReview)(model, Promise.resolve({ status: "passed" }), Promise.resolve(model));
|
|
620
|
-
const signatures = await (0, sign_js_1.signPrepared)(prepared, account, deps.adapter);
|
|
641
|
+
const signatures = await (0, sign_js_1.signPrepared)(prepared, account, deps.adapter, undefined, () => (0, writeRecovery_js_1.assertLocksHeld)(action.locks), () => (0, writeRecovery_js_1.assertLocksHeld)(action.locks));
|
|
621
642
|
return requests.map(({ chainId, request }, index) => entryOf(chainId, request, signatures[index]));
|
|
622
643
|
}
|
|
623
644
|
/**
|
|
@@ -670,6 +691,7 @@ async function payRelayrReviewed(quote, chainId, action, deps) {
|
|
|
670
691
|
recheck: () => (0, relayr_js_1.requireRelayrBundleUnpaid)(details.bundleUuid),
|
|
671
692
|
...(action.onSending ? { onSending: action.onSending } : {}),
|
|
672
693
|
...(action.onSent ? { onSent: action.onSent } : {}),
|
|
694
|
+
...(action.locks ? { locks: action.locks } : {}),
|
|
673
695
|
safe,
|
|
674
696
|
});
|
|
675
697
|
return safe ? { safeTxHash: hash } : { hash };
|
|
@@ -707,11 +729,15 @@ async function pollRelayrBundle(uuid, expectedCount, options = {}) {
|
|
|
707
729
|
throw new Error(`Relayr is still processing paid bundle ${uuid}. Do not submit this action again; check it later.`);
|
|
708
730
|
}
|
|
709
731
|
await new Promise((resolve, reject) => {
|
|
710
|
-
const
|
|
711
|
-
signal?.addEventListener("abort", () => {
|
|
732
|
+
const aborted = () => {
|
|
712
733
|
clearTimeout(timer);
|
|
713
734
|
reject(signal.reason);
|
|
714
|
-
}
|
|
735
|
+
};
|
|
736
|
+
const timer = setTimeout(() => {
|
|
737
|
+
signal?.removeEventListener("abort", aborted);
|
|
738
|
+
resolve();
|
|
739
|
+
}, POLL_INTERVAL_MS);
|
|
740
|
+
signal?.addEventListener("abort", aborted, { once: true });
|
|
715
741
|
});
|
|
716
742
|
}
|
|
717
743
|
}
|