@bananapus/nana-sdk-core 3.5.2 → 5.0.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/bin/wallet-check.mjs +495 -0
- package/dist/cjs/actions/suckerPairs.d.ts +5 -3
- package/dist/cjs/actions/suckerPairs.d.ts.map +1 -1
- package/dist/cjs/actions/suckerPairs.js +6 -26
- package/dist/cjs/actions/suckerPairs.js.map +1 -1
- package/dist/cjs/pause.d.ts +2 -0
- package/dist/cjs/pause.d.ts.map +1 -1
- package/dist/cjs/pause.js +17 -0
- package/dist/cjs/pause.js.map +1 -1
- package/dist/cjs/review/confirm.d.ts +56 -0
- package/dist/cjs/review/confirm.d.ts.map +1 -0
- package/dist/cjs/review/confirm.js +99 -0
- package/dist/cjs/review/confirm.js.map +1 -0
- package/dist/cjs/review/contractWrite.d.ts +5 -3
- package/dist/cjs/review/contractWrite.d.ts.map +1 -1
- package/dist/cjs/review/contractWrite.js +10 -8
- package/dist/cjs/review/contractWrite.js.map +1 -1
- package/dist/cjs/review/decode.d.ts +19 -1
- package/dist/cjs/review/decode.d.ts.map +1 -1
- package/dist/cjs/review/decode.js +30 -11
- package/dist/cjs/review/decode.js.map +1 -1
- package/dist/cjs/review/decodeCall.d.ts +21 -0
- package/dist/cjs/review/decodeCall.d.ts.map +1 -0
- package/dist/cjs/review/decodeCall.js +183 -0
- package/dist/cjs/review/decodeCall.js.map +1 -0
- package/dist/cjs/review/heldWrite.d.ts +4 -0
- package/dist/cjs/review/heldWrite.d.ts.map +1 -1
- package/dist/cjs/review/heldWrite.js +35 -31
- package/dist/cjs/review/heldWrite.js.map +1 -1
- package/dist/cjs/review/index.d.ts +12 -1
- package/dist/cjs/review/index.d.ts.map +1 -1
- package/dist/cjs/review/index.js +29 -1
- package/dist/cjs/review/index.js.map +1 -1
- package/dist/cjs/review/intents.d.ts +10 -0
- package/dist/cjs/review/intents.d.ts.map +1 -1
- package/dist/cjs/review/intents.js +13 -0
- package/dist/cjs/review/intents.js.map +1 -1
- package/dist/cjs/review/lineError.d.ts +72 -0
- package/dist/cjs/review/lineError.d.ts.map +1 -0
- package/dist/cjs/review/lineError.js +76 -0
- package/dist/cjs/review/lineError.js.map +1 -0
- package/dist/cjs/review/messages.d.ts +15 -3
- package/dist/cjs/review/messages.d.ts.map +1 -1
- package/dist/cjs/review/messages.js +16 -4
- package/dist/cjs/review/messages.js.map +1 -1
- package/dist/cjs/review/model.d.ts +149 -0
- package/dist/cjs/review/model.d.ts.map +1 -0
- package/dist/cjs/review/model.js +750 -0
- package/dist/cjs/review/model.js.map +1 -0
- package/dist/cjs/review/plan.d.ts +61 -0
- package/dist/cjs/review/plan.d.ts.map +1 -0
- package/dist/cjs/review/plan.js +143 -0
- package/dist/cjs/review/plan.js.map +1 -0
- package/dist/cjs/review/react/index.d.ts +1 -0
- package/dist/cjs/review/react/index.d.ts.map +1 -1
- package/dist/cjs/review/react/index.js +1 -0
- package/dist/cjs/review/react/index.js.map +1 -1
- package/dist/cjs/review/react/useHeldSend.js +3 -4
- package/dist/cjs/review/react/useHeldSend.js.map +1 -1
- package/dist/cjs/review/react/useHeldWrite.d.ts.map +1 -1
- package/dist/cjs/review/react/useHeldWrite.js +2 -1
- package/dist/cjs/review/react/useHeldWrite.js.map +1 -1
- package/dist/cjs/review/react/useReviewedRun.d.ts +122 -0
- package/dist/cjs/review/react/useReviewedRun.d.ts.map +1 -0
- package/dist/cjs/review/react/useReviewedRun.js +443 -0
- package/dist/cjs/review/react/useReviewedRun.js.map +1 -0
- package/dist/cjs/review/receipt.d.ts +37 -1
- package/dist/cjs/review/receipt.d.ts.map +1 -1
- package/dist/cjs/review/receipt.js +76 -3
- package/dist/cjs/review/receipt.js.map +1 -1
- package/dist/cjs/review/relayr.d.ts +13 -4
- package/dist/cjs/review/relayr.d.ts.map +1 -1
- package/dist/cjs/review/relayr.js +52 -8
- package/dist/cjs/review/relayr.js.map +1 -1
- package/dist/cjs/review/relayrSend.d.ts +106 -0
- package/dist/cjs/review/relayrSend.d.ts.map +1 -0
- package/dist/cjs/review/relayrSend.js +795 -0
- package/dist/cjs/review/relayrSend.js.map +1 -0
- package/dist/cjs/review/reviewQueue.d.ts +10 -9
- package/dist/cjs/review/reviewQueue.d.ts.map +1 -1
- package/dist/cjs/review/reviewQueue.js +19 -29
- package/dist/cjs/review/reviewQueue.js.map +1 -1
- package/dist/cjs/review/reviewRequests.d.ts +86 -0
- package/dist/cjs/review/reviewRequests.d.ts.map +1 -0
- package/dist/cjs/review/reviewRequests.js +266 -0
- package/dist/cjs/review/reviewRequests.js.map +1 -0
- package/dist/cjs/review/safeRelayr.d.ts +3 -1
- package/dist/cjs/review/safeRelayr.d.ts.map +1 -1
- package/dist/cjs/review/safeRelayr.js +9 -9
- package/dist/cjs/review/safeRelayr.js.map +1 -1
- package/dist/cjs/review/safeSend.d.ts +69 -0
- package/dist/cjs/review/safeSend.d.ts.map +1 -0
- package/dist/cjs/review/safeSend.js +306 -0
- package/dist/cjs/review/safeSend.js.map +1 -0
- package/dist/cjs/review/send.d.ts +272 -0
- package/dist/cjs/review/send.d.ts.map +1 -0
- package/dist/cjs/review/send.js +1163 -0
- package/dist/cjs/review/send.js.map +1 -0
- package/dist/cjs/review/sequence.d.ts +77 -0
- package/dist/cjs/review/sequence.d.ts.map +1 -0
- package/dist/cjs/review/sequence.js +232 -0
- package/dist/cjs/review/sequence.js.map +1 -0
- package/dist/cjs/review/sign.d.ts +111 -0
- package/dist/cjs/review/sign.d.ts.map +1 -0
- package/dist/cjs/review/sign.js +378 -0
- package/dist/cjs/review/sign.js.map +1 -0
- package/dist/cjs/review/simulation.d.ts +41 -2
- package/dist/cjs/review/simulation.d.ts.map +1 -1
- package/dist/cjs/review/simulation.js +99 -29
- package/dist/cjs/review/simulation.js.map +1 -1
- package/dist/cjs/review/transaction-message.d.ts +13 -0
- package/dist/cjs/review/transaction-message.d.ts.map +1 -1
- package/dist/cjs/review/transaction-message.js +25 -0
- package/dist/cjs/review/transaction-message.js.map +1 -1
- package/dist/cjs/review/transactionReview.d.ts +27 -19
- package/dist/cjs/review/transactionReview.d.ts.map +1 -1
- package/dist/cjs/review/transactionReview.js +22 -63
- package/dist/cjs/review/transactionReview.js.map +1 -1
- package/dist/cjs/review/wallet.d.ts +98 -0
- package/dist/cjs/review/wallet.d.ts.map +1 -0
- package/dist/cjs/review/wallet.js +234 -0
- package/dist/cjs/review/wallet.js.map +1 -0
- package/dist/cjs/review/writeHold.d.ts +138 -13
- package/dist/cjs/review/writeHold.d.ts.map +1 -1
- package/dist/cjs/review/writeHold.js +98 -18
- package/dist/cjs/review/writeHold.js.map +1 -1
- package/dist/cjs/review/writeRecovery.d.ts +17 -1
- package/dist/cjs/review/writeRecovery.d.ts.map +1 -1
- package/dist/cjs/review/writeRecovery.js +146 -45
- package/dist/cjs/review/writeRecovery.js.map +1 -1
- package/dist/cjs/safeService.d.ts +27 -4
- package/dist/cjs/safeService.d.ts.map +1 -1
- package/dist/cjs/safeService.js +120 -3
- package/dist/cjs/safeService.js.map +1 -1
- package/dist/cjs/testing.d.ts +24 -0
- package/dist/cjs/testing.d.ts.map +1 -1
- package/dist/cjs/testing.js +26 -1
- package/dist/cjs/testing.js.map +1 -1
- package/dist/cjs/v6/defifa.d.ts.map +1 -1
- package/dist/cjs/v6/defifa.js +24 -23
- package/dist/cjs/v6/defifa.js.map +1 -1
- package/dist/cjs/v6/executionErrors.d.ts.map +1 -1
- package/dist/cjs/v6/executionErrors.js +3 -2
- package/dist/cjs/v6/executionErrors.js.map +1 -1
- package/dist/cjs/v6/pay.d.ts +25 -8
- package/dist/cjs/v6/pay.d.ts.map +1 -1
- package/dist/cjs/v6/pay.js +117 -23
- package/dist/cjs/v6/pay.js.map +1 -1
- package/dist/cjs/v6/suckers.d.ts +30 -0
- package/dist/cjs/v6/suckers.d.ts.map +1 -1
- package/dist/cjs/v6/suckers.js +69 -5
- package/dist/cjs/v6/suckers.js.map +1 -1
- package/dist/esm/actions/suckerPairs.d.ts +5 -3
- package/dist/esm/actions/suckerPairs.d.ts.map +1 -1
- package/dist/esm/actions/suckerPairs.js +7 -27
- package/dist/esm/actions/suckerPairs.js.map +1 -1
- package/dist/esm/pause.d.ts +2 -0
- package/dist/esm/pause.d.ts.map +1 -1
- package/dist/esm/pause.js +16 -0
- package/dist/esm/pause.js.map +1 -1
- package/dist/esm/review/confirm.d.ts +56 -0
- package/dist/esm/review/confirm.d.ts.map +1 -0
- package/dist/esm/review/confirm.js +93 -0
- package/dist/esm/review/confirm.js.map +1 -0
- package/dist/esm/review/contractWrite.d.ts +5 -3
- package/dist/esm/review/contractWrite.d.ts.map +1 -1
- package/dist/esm/review/contractWrite.js +10 -8
- package/dist/esm/review/contractWrite.js.map +1 -1
- package/dist/esm/review/decode.d.ts +19 -1
- package/dist/esm/review/decode.d.ts.map +1 -1
- package/dist/esm/review/decode.js +29 -14
- package/dist/esm/review/decode.js.map +1 -1
- package/dist/esm/review/decodeCall.d.ts +21 -0
- package/dist/esm/review/decodeCall.d.ts.map +1 -0
- package/dist/esm/review/decodeCall.js +180 -0
- package/dist/esm/review/decodeCall.js.map +1 -0
- package/dist/esm/review/heldWrite.d.ts +4 -0
- package/dist/esm/review/heldWrite.d.ts.map +1 -1
- package/dist/esm/review/heldWrite.js +34 -30
- package/dist/esm/review/heldWrite.js.map +1 -1
- package/dist/esm/review/index.d.ts +12 -1
- package/dist/esm/review/index.d.ts.map +1 -1
- package/dist/esm/review/index.js +12 -1
- package/dist/esm/review/index.js.map +1 -1
- package/dist/esm/review/intents.d.ts +10 -0
- package/dist/esm/review/intents.d.ts.map +1 -1
- package/dist/esm/review/intents.js +12 -0
- package/dist/esm/review/intents.js.map +1 -1
- package/dist/esm/review/lineError.d.ts +72 -0
- package/dist/esm/review/lineError.d.ts.map +1 -0
- package/dist/esm/review/lineError.js +68 -0
- package/dist/esm/review/lineError.js.map +1 -0
- package/dist/esm/review/messages.d.ts +15 -3
- package/dist/esm/review/messages.d.ts.map +1 -1
- package/dist/esm/review/messages.js +15 -3
- package/dist/esm/review/messages.js.map +1 -1
- package/dist/esm/review/model.d.ts +149 -0
- package/dist/esm/review/model.d.ts.map +1 -0
- package/dist/esm/review/model.js +746 -0
- package/dist/esm/review/model.js.map +1 -0
- package/dist/esm/review/plan.d.ts +61 -0
- package/dist/esm/review/plan.d.ts.map +1 -0
- package/dist/esm/review/plan.js +136 -0
- package/dist/esm/review/plan.js.map +1 -0
- package/dist/esm/review/react/index.d.ts +1 -0
- package/dist/esm/review/react/index.d.ts.map +1 -1
- package/dist/esm/review/react/index.js +1 -0
- package/dist/esm/review/react/index.js.map +1 -1
- package/dist/esm/review/react/useHeldSend.js +3 -4
- package/dist/esm/review/react/useHeldSend.js.map +1 -1
- package/dist/esm/review/react/useHeldWrite.d.ts.map +1 -1
- package/dist/esm/review/react/useHeldWrite.js +2 -1
- package/dist/esm/review/react/useHeldWrite.js.map +1 -1
- package/dist/esm/review/react/useReviewedRun.d.ts +122 -0
- package/dist/esm/review/react/useReviewedRun.d.ts.map +1 -0
- package/dist/esm/review/react/useReviewedRun.js +439 -0
- package/dist/esm/review/react/useReviewedRun.js.map +1 -0
- package/dist/esm/review/receipt.d.ts +37 -1
- package/dist/esm/review/receipt.d.ts.map +1 -1
- package/dist/esm/review/receipt.js +72 -2
- package/dist/esm/review/receipt.js.map +1 -1
- package/dist/esm/review/relayr.d.ts +13 -4
- package/dist/esm/review/relayr.d.ts.map +1 -1
- package/dist/esm/review/relayr.js +51 -8
- package/dist/esm/review/relayr.js.map +1 -1
- package/dist/esm/review/relayrSend.d.ts +106 -0
- package/dist/esm/review/relayrSend.d.ts.map +1 -0
- package/dist/esm/review/relayrSend.js +787 -0
- package/dist/esm/review/relayrSend.js.map +1 -0
- package/dist/esm/review/reviewQueue.d.ts +10 -9
- package/dist/esm/review/reviewQueue.d.ts.map +1 -1
- package/dist/esm/review/reviewQueue.js +17 -26
- package/dist/esm/review/reviewQueue.js.map +1 -1
- package/dist/esm/review/reviewRequests.d.ts +86 -0
- package/dist/esm/review/reviewRequests.d.ts.map +1 -0
- package/dist/esm/review/reviewRequests.js +263 -0
- package/dist/esm/review/reviewRequests.js.map +1 -0
- package/dist/esm/review/safeRelayr.d.ts +3 -1
- package/dist/esm/review/safeRelayr.d.ts.map +1 -1
- package/dist/esm/review/safeRelayr.js +9 -9
- package/dist/esm/review/safeRelayr.js.map +1 -1
- package/dist/esm/review/safeSend.d.ts +69 -0
- package/dist/esm/review/safeSend.d.ts.map +1 -0
- package/dist/esm/review/safeSend.js +301 -0
- package/dist/esm/review/safeSend.js.map +1 -0
- package/dist/esm/review/send.d.ts +272 -0
- package/dist/esm/review/send.d.ts.map +1 -0
- package/dist/esm/review/send.js +1156 -0
- package/dist/esm/review/send.js.map +1 -0
- package/dist/esm/review/sequence.d.ts +77 -0
- package/dist/esm/review/sequence.d.ts.map +1 -0
- package/dist/esm/review/sequence.js +223 -0
- package/dist/esm/review/sequence.js.map +1 -0
- package/dist/esm/review/sign.d.ts +111 -0
- package/dist/esm/review/sign.d.ts.map +1 -0
- package/dist/esm/review/sign.js +372 -0
- package/dist/esm/review/sign.js.map +1 -0
- package/dist/esm/review/simulation.d.ts +41 -2
- package/dist/esm/review/simulation.d.ts.map +1 -1
- package/dist/esm/review/simulation.js +95 -29
- package/dist/esm/review/simulation.js.map +1 -1
- package/dist/esm/review/transaction-message.d.ts +13 -0
- package/dist/esm/review/transaction-message.d.ts.map +1 -1
- package/dist/esm/review/transaction-message.js +23 -0
- package/dist/esm/review/transaction-message.js.map +1 -1
- package/dist/esm/review/transactionReview.d.ts +27 -19
- package/dist/esm/review/transactionReview.d.ts.map +1 -1
- package/dist/esm/review/transactionReview.js +19 -56
- package/dist/esm/review/transactionReview.js.map +1 -1
- package/dist/esm/review/wallet.d.ts +98 -0
- package/dist/esm/review/wallet.d.ts.map +1 -0
- package/dist/esm/review/wallet.js +227 -0
- package/dist/esm/review/wallet.js.map +1 -0
- package/dist/esm/review/writeHold.d.ts +138 -13
- package/dist/esm/review/writeHold.d.ts.map +1 -1
- package/dist/esm/review/writeHold.js +96 -19
- package/dist/esm/review/writeHold.js.map +1 -1
- package/dist/esm/review/writeRecovery.d.ts +17 -1
- package/dist/esm/review/writeRecovery.d.ts.map +1 -1
- package/dist/esm/review/writeRecovery.js +149 -48
- package/dist/esm/review/writeRecovery.js.map +1 -1
- package/dist/esm/safeService.d.ts +27 -4
- package/dist/esm/safeService.d.ts.map +1 -1
- package/dist/esm/safeService.js +119 -4
- package/dist/esm/safeService.js.map +1 -1
- package/dist/esm/testing.d.ts +24 -0
- package/dist/esm/testing.d.ts.map +1 -1
- package/dist/esm/testing.js +23 -1
- package/dist/esm/testing.js.map +1 -1
- package/dist/esm/v6/defifa.d.ts.map +1 -1
- package/dist/esm/v6/defifa.js +24 -23
- package/dist/esm/v6/defifa.js.map +1 -1
- package/dist/esm/v6/executionErrors.d.ts.map +1 -1
- package/dist/esm/v6/executionErrors.js +3 -2
- package/dist/esm/v6/executionErrors.js.map +1 -1
- package/dist/esm/v6/pay.d.ts +25 -8
- package/dist/esm/v6/pay.d.ts.map +1 -1
- package/dist/esm/v6/pay.js +115 -22
- package/dist/esm/v6/pay.js.map +1 -1
- package/dist/esm/v6/suckers.d.ts +30 -0
- package/dist/esm/v6/suckers.d.ts.map +1 -1
- package/dist/esm/v6/suckers.js +67 -5
- package/dist/esm/v6/suckers.js.map +1 -1
- package/package.json +11 -2
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import { ReviewLineError } from "../lineError.js";
|
|
2
|
+
import { tell } from "../receipt.js";
|
|
3
|
+
import { createHeldWriteView, discardReviewedSequence, errorLine, findReviewedSequence, isDefiniteWalletRejection, openStepHold, RECEIPT_RETRY_MS, REVIEWED_ACCOUNT_CHANGED_LINE, REVIEWED_ENGINE_LOAD_LINE, ReviewedReceiptUnverifiedError, safeBatchCall, settledLine, TransactionReviewCancelledError, walletReady, } from "../index.js";
|
|
4
|
+
import { useEffect, useMemo, useRef, useState, useSyncExternalStore, } from "react";
|
|
5
|
+
import { actionsOf, idle, keyOf, none, } from "./heldView.js";
|
|
6
|
+
const IDLE = {
|
|
7
|
+
phase: "idle",
|
|
8
|
+
step: 0,
|
|
9
|
+
total: 0,
|
|
10
|
+
error: null,
|
|
11
|
+
failure: null,
|
|
12
|
+
hash: null,
|
|
13
|
+
safeTxHash: null,
|
|
14
|
+
receipt: null,
|
|
15
|
+
settled: null,
|
|
16
|
+
};
|
|
17
|
+
/** The bytes a call sends, for comparing two actions. */
|
|
18
|
+
const sent = ({ chainId, to, data, value, gas }) => [
|
|
19
|
+
chainId,
|
|
20
|
+
to.toLowerCase(),
|
|
21
|
+
data.toLowerCase(),
|
|
22
|
+
value ?? 0n,
|
|
23
|
+
gas ?? null,
|
|
24
|
+
];
|
|
25
|
+
export const REVIEWED_RUN_SCOPE_LINE = "This action has more than one step and no scope to resume it by. Nothing was sent.";
|
|
26
|
+
export const REVIEWED_RUN_BUSY_LINE = "This action is still running. Wait for it to finish, then try again.";
|
|
27
|
+
/**
|
|
28
|
+
* The one reviewed-send hook every site shares: its state, progress and
|
|
29
|
+
* error lines. A site's own hook only builds `deps` from its wallet library;
|
|
30
|
+
* null `deps` (no wallet yet) refuses every run.
|
|
31
|
+
*/
|
|
32
|
+
export function useReviewedRun(deps) {
|
|
33
|
+
const [state, setState] = useState(IDLE);
|
|
34
|
+
/** The hold followed after a run, and its chain's client: its view is `held`. */
|
|
35
|
+
const [watched, setWatched] = useState(null);
|
|
36
|
+
/** The latest run: an earlier one's late answers change nothing. */
|
|
37
|
+
const latest = useRef(0);
|
|
38
|
+
/** How many runs are open: a discard waits for none. */
|
|
39
|
+
const open = useRef(0);
|
|
40
|
+
const mounted = useRef(false);
|
|
41
|
+
/** This render's `run`: a run's end that continues the action runs it. */
|
|
42
|
+
const runLatest = useRef(async () => null);
|
|
43
|
+
/**
|
|
44
|
+
* Ends the latest run's in-place follow, and resolves an `ended()` it left
|
|
45
|
+
* pending with null (released): a reset or a later run replaced it. Its
|
|
46
|
+
* hold keeps the sent step.
|
|
47
|
+
*/
|
|
48
|
+
const leave = useRef(() => { });
|
|
49
|
+
const replaced = () => {
|
|
50
|
+
latest.current += 1;
|
|
51
|
+
const left = leave.current;
|
|
52
|
+
leave.current = () => { };
|
|
53
|
+
left();
|
|
54
|
+
};
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
mounted.current = true;
|
|
57
|
+
return () => {
|
|
58
|
+
mounted.current = false;
|
|
59
|
+
// Unmounted: the run ends as on a reset.
|
|
60
|
+
replaced();
|
|
61
|
+
};
|
|
62
|
+
}, []);
|
|
63
|
+
/** How a followed step ended, as the run that followed it shows it. */
|
|
64
|
+
const showSettled = (run, step, total, settled, receipt) => {
|
|
65
|
+
if (latest.current !== run)
|
|
66
|
+
return;
|
|
67
|
+
const finished = step === total - 1;
|
|
68
|
+
setState((now) => settled.result !== "success"
|
|
69
|
+
? { ...IDLE, error: settledLine(settled), receipt }
|
|
70
|
+
: finished
|
|
71
|
+
? {
|
|
72
|
+
...now,
|
|
73
|
+
phase: "done",
|
|
74
|
+
hash: settled.hash,
|
|
75
|
+
receipt,
|
|
76
|
+
error: null,
|
|
77
|
+
failure: null,
|
|
78
|
+
settled: { step, finished },
|
|
79
|
+
}
|
|
80
|
+
: {
|
|
81
|
+
...IDLE,
|
|
82
|
+
step,
|
|
83
|
+
total,
|
|
84
|
+
hash: settled.hash,
|
|
85
|
+
receipt,
|
|
86
|
+
settled: { step, finished },
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
/** The engine's load, shared by every preload and run until one fails. */
|
|
90
|
+
const loading = useRef(null);
|
|
91
|
+
const view = useMemo(() => watched
|
|
92
|
+
? createHeldWriteView(watched.handle, {
|
|
93
|
+
client: watched.client,
|
|
94
|
+
// The followed step's end ends the run once checked: a proposal
|
|
95
|
+
// never stays proposed, and never shows done unverified.
|
|
96
|
+
onSettled: (settled, receipt) => watched.finish(settled, receipt),
|
|
97
|
+
onReleased: () => {
|
|
98
|
+
watched.released?.();
|
|
99
|
+
if (latest.current === watched.run)
|
|
100
|
+
setState(IDLE);
|
|
101
|
+
},
|
|
102
|
+
})
|
|
103
|
+
: undefined, [watched]);
|
|
104
|
+
useEffect(() => view?.start(), [view]);
|
|
105
|
+
const engine = deps?.engine;
|
|
106
|
+
const load = (from) => {
|
|
107
|
+
const pending = (loading.current ??= from());
|
|
108
|
+
pending.catch(() => {
|
|
109
|
+
// A failed load is tried again by the next preload or run.
|
|
110
|
+
if (loading.current === pending)
|
|
111
|
+
loading.current = null;
|
|
112
|
+
});
|
|
113
|
+
return pending;
|
|
114
|
+
};
|
|
115
|
+
const preload = () => {
|
|
116
|
+
if (engine)
|
|
117
|
+
load(engine).catch(() => {
|
|
118
|
+
/* A run loads it again, and reports its failure. */
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
useEffect(preload, [engine]);
|
|
122
|
+
const shown = useSyncExternalStore(view?.subscribe ?? none, view?.get ?? idle, view?.get ?? idle);
|
|
123
|
+
const held = shown.phase === "clear" ||
|
|
124
|
+
shown.phase === "released" ||
|
|
125
|
+
shown.phase === "settled"
|
|
126
|
+
? null
|
|
127
|
+
: shown;
|
|
128
|
+
const api = {
|
|
129
|
+
...state,
|
|
130
|
+
held,
|
|
131
|
+
...actionsOf(shown, held ? view : undefined),
|
|
132
|
+
reset: () => {
|
|
133
|
+
replaced();
|
|
134
|
+
setState(IDLE);
|
|
135
|
+
setWatched(null);
|
|
136
|
+
},
|
|
137
|
+
preload,
|
|
138
|
+
discard: async (scope, account = deps?.account) => {
|
|
139
|
+
if (open.current)
|
|
140
|
+
throw new ReviewLineError(REVIEWED_RUN_BUSY_LINE);
|
|
141
|
+
if (!deps || !account)
|
|
142
|
+
throw new ReviewLineError("Connect a wallet first.");
|
|
143
|
+
const { storage } = deps;
|
|
144
|
+
const saved = findReviewedSequence(scope, account, { storage });
|
|
145
|
+
if (saved)
|
|
146
|
+
await discardReviewedSequence(saved, { storage });
|
|
147
|
+
if (open.current)
|
|
148
|
+
return;
|
|
149
|
+
replaced();
|
|
150
|
+
setState(IDLE);
|
|
151
|
+
setWatched(null);
|
|
152
|
+
},
|
|
153
|
+
run: async (action) => {
|
|
154
|
+
replaced();
|
|
155
|
+
const id = latest.current;
|
|
156
|
+
// A step still confirming is followed in place, in the same review,
|
|
157
|
+
// until a reset or a later run ends it.
|
|
158
|
+
const following = new AbortController();
|
|
159
|
+
leave.current = () => following.abort();
|
|
160
|
+
open.current += 1;
|
|
161
|
+
const update = (next) => {
|
|
162
|
+
if (latest.current === id)
|
|
163
|
+
setState((now) => ({ ...now, ...next }));
|
|
164
|
+
};
|
|
165
|
+
setState({ ...IDLE, phase: "review", total: action.calls.length });
|
|
166
|
+
let loaded;
|
|
167
|
+
setWatched(null);
|
|
168
|
+
/**
|
|
169
|
+
* Completes a sent step once its hold settled it, as the run would
|
|
170
|
+
* have (`completeReviewedStep`: the journal, `onConfirmed` once with
|
|
171
|
+
* the receipt its hold verified, the acknowledgement), then shows how
|
|
172
|
+
* it ended, once. Until it can (the receipt unread, or the hold not yet
|
|
173
|
+
* settled for this send), it is tried again, never shown.
|
|
174
|
+
*/
|
|
175
|
+
const completing = (target, total, end) => {
|
|
176
|
+
let completed = Promise.resolve(null);
|
|
177
|
+
let shown = false;
|
|
178
|
+
const action$ = {
|
|
179
|
+
account: deps.account,
|
|
180
|
+
scope: action.scope,
|
|
181
|
+
onConfirmed: action.onConfirmed,
|
|
182
|
+
};
|
|
183
|
+
const finish = (seen, receipt = null) => {
|
|
184
|
+
let unread = false;
|
|
185
|
+
completed = completed.then((prior) => prior ??
|
|
186
|
+
(loaded ? Promise.resolve(loaded) : load(deps.engine))
|
|
187
|
+
.then((engine) => engine.completeReviewedStep(target, action$, deps, receipt))
|
|
188
|
+
.catch(() => {
|
|
189
|
+
unread = true;
|
|
190
|
+
return null;
|
|
191
|
+
}));
|
|
192
|
+
void completed.then((ended) => {
|
|
193
|
+
if (shown || latest.current !== id)
|
|
194
|
+
return;
|
|
195
|
+
// Nothing advanced (its receipt unread, or its hold not settled
|
|
196
|
+
// for this send yet): it is tried again.
|
|
197
|
+
if (unread || (!ended && seen)) {
|
|
198
|
+
if (mounted.current)
|
|
199
|
+
setTimeout(() => finish(seen, receipt), RECEIPT_RETRY_MS);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (!ended)
|
|
203
|
+
return;
|
|
204
|
+
shown = true;
|
|
205
|
+
// Shown with the receipt completion checked, a failure's too.
|
|
206
|
+
showSettled(id, target.step, total, ended.settled, ended.receipt);
|
|
207
|
+
setWatched(null);
|
|
208
|
+
end?.(ended);
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
return finish;
|
|
212
|
+
};
|
|
213
|
+
/** The step a run that did not finish leaves held, if any. */
|
|
214
|
+
const follow = async (finish, released) => {
|
|
215
|
+
if (latest.current !== id || !deps?.account)
|
|
216
|
+
return;
|
|
217
|
+
try {
|
|
218
|
+
const { account, adapter, hold, storage } = deps;
|
|
219
|
+
// Its Safe mode is read only once the wallet says it is known.
|
|
220
|
+
await walletReady(adapter);
|
|
221
|
+
if (latest.current !== id)
|
|
222
|
+
return;
|
|
223
|
+
const safe = adapter.isSafe();
|
|
224
|
+
const saved = !action.scope
|
|
225
|
+
? null
|
|
226
|
+
: findReviewedSequence(action.scope, account, { storage });
|
|
227
|
+
const total = saved?.calls.length ?? action.calls.length;
|
|
228
|
+
// A Safe app's batch is held as its one MultiSend proposal, its last step.
|
|
229
|
+
const steps = saved?.sending
|
|
230
|
+
? [
|
|
231
|
+
{
|
|
232
|
+
call: saved.calls[saved.sending.step],
|
|
233
|
+
step: saved.sending.step,
|
|
234
|
+
},
|
|
235
|
+
]
|
|
236
|
+
: !saved && action.batch && safe && action.calls.length > 1
|
|
237
|
+
? [
|
|
238
|
+
{
|
|
239
|
+
call: safeBatchCall(account, action.calls),
|
|
240
|
+
step: total - 1,
|
|
241
|
+
},
|
|
242
|
+
]
|
|
243
|
+
: action.calls.map((call, step) => ({ call, step }));
|
|
244
|
+
// A held step, or the last step's success nothing showed.
|
|
245
|
+
const found = steps
|
|
246
|
+
.map(({ call, step }) => ({
|
|
247
|
+
call,
|
|
248
|
+
step,
|
|
249
|
+
handle: openStepHold(hold, account, safe, call),
|
|
250
|
+
}))
|
|
251
|
+
.find(({ handle, step }) => handle.peek().status !== "clear" ||
|
|
252
|
+
(step === total - 1 && handle.unacknowledgedSuccess()));
|
|
253
|
+
// Its settlement completes it as a send's would: a proposal too.
|
|
254
|
+
const reservation = found?.handle.peek().reservation ??
|
|
255
|
+
found?.handle.unacknowledgedSuccess()?.reservation;
|
|
256
|
+
setWatched(found
|
|
257
|
+
? {
|
|
258
|
+
handle: found.handle,
|
|
259
|
+
client: deps.clientFor(found.call.chainId),
|
|
260
|
+
run: id,
|
|
261
|
+
step: found.step,
|
|
262
|
+
total,
|
|
263
|
+
finish: finish ??
|
|
264
|
+
completing({
|
|
265
|
+
step: found.step,
|
|
266
|
+
held: { call: found.call, reservation },
|
|
267
|
+
}, total),
|
|
268
|
+
...(released ? { released } : {}),
|
|
269
|
+
}
|
|
270
|
+
: null);
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
/* A call the hold can't open holds nothing to show. */
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
try {
|
|
277
|
+
if (!deps?.account)
|
|
278
|
+
throw new ReviewLineError("Connect a wallet first.");
|
|
279
|
+
if (action.account &&
|
|
280
|
+
action.account.toLowerCase() !== deps.account.toLowerCase())
|
|
281
|
+
throw new ReviewLineError(REVIEWED_ACCOUNT_CHANGED_LINE);
|
|
282
|
+
if (action.calls.length > 1 && action.scope === undefined)
|
|
283
|
+
throw new ReviewLineError(REVIEWED_RUN_SCOPE_LINE);
|
|
284
|
+
const { signal } = action;
|
|
285
|
+
if (signal?.aborted)
|
|
286
|
+
throw new TransactionReviewCancelledError();
|
|
287
|
+
let withdraw = () => { };
|
|
288
|
+
loaded = await Promise.race([
|
|
289
|
+
load(deps.engine).catch((cause) => {
|
|
290
|
+
throw Object.assign(new ReviewLineError(REVIEWED_ENGINE_LOAD_LINE), { cause });
|
|
291
|
+
}),
|
|
292
|
+
// A review withdrawn while the engine loads ends here, cancelled.
|
|
293
|
+
new Promise((_, reject) => {
|
|
294
|
+
withdraw = () => reject(new TransactionReviewCancelledError());
|
|
295
|
+
signal?.addEventListener("abort", withdraw, { once: true });
|
|
296
|
+
}),
|
|
297
|
+
]).finally(() => signal?.removeEventListener("abort", withdraw));
|
|
298
|
+
const { resumeReviewed, sendReviewed } = loaded;
|
|
299
|
+
const { account, guard } = deps;
|
|
300
|
+
const tracked = {
|
|
301
|
+
...deps,
|
|
302
|
+
onProgress: (progress) => {
|
|
303
|
+
tell(deps.onProgress, progress);
|
|
304
|
+
update({
|
|
305
|
+
phase: progress.phase,
|
|
306
|
+
step: progress.step,
|
|
307
|
+
total: progress.total,
|
|
308
|
+
...(progress.hash
|
|
309
|
+
? progress.phase === "proposed"
|
|
310
|
+
? { safeTxHash: progress.hash }
|
|
311
|
+
: { hash: progress.hash }
|
|
312
|
+
: {}),
|
|
313
|
+
});
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
const unfinished = action.scope === undefined
|
|
317
|
+
? null
|
|
318
|
+
: findReviewedSequence(action.scope, account, {
|
|
319
|
+
storage: deps.storage,
|
|
320
|
+
});
|
|
321
|
+
// Resumed only when the user asked for the same calls again;
|
|
322
|
+
// otherwise sendReviewed refuses while it is unfinished.
|
|
323
|
+
const saved = unfinished &&
|
|
324
|
+
keyOf(unfinished.calls.map(sent)) === keyOf(action.calls.map(sent))
|
|
325
|
+
? unfinished
|
|
326
|
+
: null;
|
|
327
|
+
const given = action.follow?.signal;
|
|
328
|
+
const inPlace = {
|
|
329
|
+
...action.follow,
|
|
330
|
+
signal: given
|
|
331
|
+
? AbortSignal.any([following.signal, given])
|
|
332
|
+
: following.signal,
|
|
333
|
+
onConfirming: (step) => {
|
|
334
|
+
update({ phase: "receipt", step });
|
|
335
|
+
tell(action.follow?.onConfirming, step);
|
|
336
|
+
},
|
|
337
|
+
};
|
|
338
|
+
const result = saved
|
|
339
|
+
? await resumeReviewed(saved, { ...action, guard, follow: inPlace }, tracked)
|
|
340
|
+
: await sendReviewed({ ...action, account, guard, follow: inPlace }, tracked);
|
|
341
|
+
if (result.status === "proposed")
|
|
342
|
+
void follow();
|
|
343
|
+
else if (mounted.current && latest.current === id) {
|
|
344
|
+
// Shown: its success blocks no later run.
|
|
345
|
+
const calls = saved?.calls ?? action.calls;
|
|
346
|
+
const handle = openStepHold(deps.hold, account, false, calls[calls.length - 1]);
|
|
347
|
+
const success = handle.unacknowledgedSuccess();
|
|
348
|
+
if (success &&
|
|
349
|
+
result.hashes.some((h) => h.toLowerCase() === success.hash))
|
|
350
|
+
await handle.acknowledge(success).catch(() => undefined);
|
|
351
|
+
}
|
|
352
|
+
return result;
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
if (error instanceof ReviewedReceiptUnverifiedError) {
|
|
356
|
+
// Still confirming: followed until its hold settles it.
|
|
357
|
+
update({
|
|
358
|
+
phase: "receipt",
|
|
359
|
+
step: error.step,
|
|
360
|
+
hash: error.hash,
|
|
361
|
+
error: null,
|
|
362
|
+
failure: null,
|
|
363
|
+
});
|
|
364
|
+
let end;
|
|
365
|
+
const outcome = new Promise((resolve) => (end = resolve));
|
|
366
|
+
// Replaced, or the caller's follow ended (a cancel, unlike its
|
|
367
|
+
// timeout), already or later: its end is null, the step still held,
|
|
368
|
+
// and nothing continues the action.
|
|
369
|
+
const cancelled = action.follow?.signal;
|
|
370
|
+
if (latest.current !== id || cancelled?.aborted)
|
|
371
|
+
end(null);
|
|
372
|
+
else {
|
|
373
|
+
leave.current = () => end(null);
|
|
374
|
+
cancelled?.addEventListener("abort", () => end(null), {
|
|
375
|
+
once: true,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
const finish = completing(error, action.calls.length, end);
|
|
379
|
+
// Followed for a later settlement; one already there is read once it attaches.
|
|
380
|
+
void follow(finish, () => end(null)).then(() => finish());
|
|
381
|
+
const before = error.held?.hashes ?? [];
|
|
382
|
+
return {
|
|
383
|
+
status: "receipt",
|
|
384
|
+
step: error.step,
|
|
385
|
+
hash: error.hash,
|
|
386
|
+
...(error.held?.signatures
|
|
387
|
+
? { signatures: error.held.signatures }
|
|
388
|
+
: {}),
|
|
389
|
+
ended: () => outcome.then(async (ran) => {
|
|
390
|
+
if (!ran)
|
|
391
|
+
return null;
|
|
392
|
+
const { settled, receipt } = ran;
|
|
393
|
+
if (settled.result !== "success") {
|
|
394
|
+
const line = settledLine(settled);
|
|
395
|
+
return {
|
|
396
|
+
status: "failed",
|
|
397
|
+
error: line,
|
|
398
|
+
failure: new ReviewLineError(line),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
const signatures = error.held?.signatures;
|
|
402
|
+
if (error.step < action.calls.length - 1) {
|
|
403
|
+
const started = await runLatest.current(action);
|
|
404
|
+
const next = started?.status === "receipt"
|
|
405
|
+
? await started.ended()
|
|
406
|
+
: started;
|
|
407
|
+
return next?.status === "done" &&
|
|
408
|
+
signatures &&
|
|
409
|
+
!next.signatures
|
|
410
|
+
? { ...next, signatures }
|
|
411
|
+
: next;
|
|
412
|
+
}
|
|
413
|
+
return {
|
|
414
|
+
status: "done",
|
|
415
|
+
hashes: [...before, settled.hash],
|
|
416
|
+
receipts: receipt ? [receipt] : [],
|
|
417
|
+
...(signatures ? { signatures } : {}),
|
|
418
|
+
};
|
|
419
|
+
}),
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
const cancelled = error instanceof TransactionReviewCancelledError ||
|
|
423
|
+
isDefiniteWalletRejection(error);
|
|
424
|
+
const line = cancelled ? null : errorLine(error);
|
|
425
|
+
update({ ...IDLE, error: line, failure: cancelled ? null : error });
|
|
426
|
+
void follow();
|
|
427
|
+
return line === null
|
|
428
|
+
? null
|
|
429
|
+
: { status: "failed", error: line, failure: error };
|
|
430
|
+
}
|
|
431
|
+
finally {
|
|
432
|
+
open.current -= 1;
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
};
|
|
436
|
+
runLatest.current = api.run;
|
|
437
|
+
return api;
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=useReviewedRun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReviewedRun.js","sourceRoot":"","sources":["../../../../src/review/react/useReviewedRun.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { ReviewLineError } from "./lineError.js";
|
|
1
2
|
import type { Hex, PublicClient, TransactionReceipt } from "viem";
|
|
3
|
+
/** The line when a broadcast transaction's receipt can't be tracked. */
|
|
4
|
+
export declare const TRANSACTION_TRACKING_UNAVAILABLE_LINE = "This transaction was submitted, but its confirmation can't be tracked right now. Check it in your wallet and do not submit it again yet.";
|
|
2
5
|
/**
|
|
3
6
|
* A transaction was broadcast, but neither the receipt watcher nor direct
|
|
4
7
|
* receipt reads could confirm it. Its outcome is unknown, so the app must keep
|
|
5
8
|
* treating it as submitted and must not offer to send it again.
|
|
6
9
|
*/
|
|
7
|
-
export declare class TransactionReceiptUnavailableError extends
|
|
10
|
+
export declare class TransactionReceiptUnavailableError extends ReviewLineError {
|
|
8
11
|
readonly hash: Hex;
|
|
9
12
|
readonly chainId?: number | undefined;
|
|
10
13
|
readonly name = "TransactionReceiptUnavailableError";
|
|
@@ -29,4 +32,37 @@ export declare function waitForTrackedReceipt(client: Pick<PublicClient, "chain"
|
|
|
29
32
|
attempts?: number;
|
|
30
33
|
intervalMs?: number;
|
|
31
34
|
}): Promise<TransactionReceipt>;
|
|
35
|
+
/** How a held write settled, as {@link heldReceipt} checks a receipt against it. */
|
|
36
|
+
type Settled = {
|
|
37
|
+
result: "success" | "failed";
|
|
38
|
+
hash: Hex;
|
|
39
|
+
blockHash?: Hex;
|
|
40
|
+
safe?: true;
|
|
41
|
+
};
|
|
42
|
+
type HeldClient = Pick<PublicClient, "getTransactionReceipt" | "getBlock">;
|
|
43
|
+
/**
|
|
44
|
+
* The receipt a hold verified for `settled`, the only one a sent step's
|
|
45
|
+
* outcome is told by: `seen` (a watcher's, say) when it is that transaction,
|
|
46
|
+
* else read. It must be in the block the hold verified; with none kept (a
|
|
47
|
+
* Safe log proved it, or it was saved by 4.x), in a block still canonical
|
|
48
|
+
* and final. A success must read a success, and a failure a revert unless
|
|
49
|
+
* it is a Safe's (`safe`: its own failure). Anything else throws: the step
|
|
50
|
+
* stays unverified until the chain agrees with its hold.
|
|
51
|
+
*/
|
|
52
|
+
export declare function heldReceipt(settled: Settled, client: HeldClient, seen?: TransactionReceipt | null): Promise<TransactionReceipt>;
|
|
53
|
+
/**
|
|
54
|
+
* Where `settled` confirmed: the block its hold verified, while still
|
|
55
|
+
* canonical, or with none kept, its {@link heldReceipt}'s. Throws otherwise.
|
|
56
|
+
*/
|
|
57
|
+
export declare function heldBlock(settled: Settled, client: HeldClient): Promise<{
|
|
58
|
+
blockNumber: bigint;
|
|
59
|
+
blockHash: Hex;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Calls a site's callback (`onProgress`, `onConfirming`, `onSubmitted`,
|
|
63
|
+
* `onConfirmed`, `onSettled`). One that throws or rejects is logged, and
|
|
64
|
+
* never changes what was sent or how it settled.
|
|
65
|
+
*/
|
|
66
|
+
export declare function tell<Args extends unknown[]>(callback: ((...args: Args) => unknown) | undefined, ...args: Args): void | Promise<void>;
|
|
67
|
+
export {};
|
|
32
68
|
//# sourceMappingURL=receipt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../../src/review/receipt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAElE;;;;GAIG;AACH,qBAAa,kCAAmC,SAAQ,
|
|
1
|
+
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../../src/review/receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAElE,wEAAwE;AACxE,eAAO,MAAM,qCAAqC,6IAC0F,CAAC;AAE7I;;;;GAIG;AACH,qBAAa,kCAAmC,SAAQ,eAAe;IAUnE,QAAQ,CAAC,IAAI,EAAE,GAAG;IAClB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM;IAV3B,QAAQ,CAAC,IAAI,wCAAwC;IACrD;;;;OAIG;IACH,SAAiB,KAAK,EAAE,OAAO,CAAC;gBAGrB,IAAI,EAAE,GAAG,EACT,OAAO,CAAC,EAAE,MAAM,YAAA,EACzB,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAWpC;AAED,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,kCAAkC,CAE7C;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,IAAI,CACV,YAAY,EACZ,OAAO,GAAG,uBAAuB,GAAG,2BAA2B,CAChE,EACD,IAAI,EAAE,GAAG,EACT,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACvD,OAAO,CAAC,kBAAkB,CAAC,CAmB7B;AAED,oFAAoF;AACpF,KAAK,OAAO,GAAG;IACb,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;AACF,KAAK,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,uBAAuB,GAAG,UAAU,CAAC,CAAC;AAK3E;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,UAAU,EAClB,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA8B7B;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,GAAG,CAAA;CAAE,CAAC,CAUlD;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,IAAI,SAAS,OAAO,EAAE,EACzC,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,GAAG,SAAS,EAClD,GAAG,IAAI,EAAE,IAAI,GACZ,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtB"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { ReviewLineError } from "./lineError.js";
|
|
2
|
+
/** The line when a broadcast transaction's receipt can't be tracked. */
|
|
3
|
+
export const TRANSACTION_TRACKING_UNAVAILABLE_LINE = "This transaction was submitted, but its confirmation can't be tracked right now. Check it in your wallet and do not submit it again yet.";
|
|
1
4
|
/**
|
|
2
5
|
* A transaction was broadcast, but neither the receipt watcher nor direct
|
|
3
6
|
* receipt reads could confirm it. Its outcome is unknown, so the app must keep
|
|
4
7
|
* treating it as submitted and must not offer to send it again.
|
|
5
8
|
*/
|
|
6
|
-
export class TransactionReceiptUnavailableError extends
|
|
9
|
+
export class TransactionReceiptUnavailableError extends ReviewLineError {
|
|
7
10
|
constructor(hash, chainId, options = {}) {
|
|
8
|
-
|
|
11
|
+
// The hash and chain stay fields: a caller's hash is not validated here.
|
|
12
|
+
super(TRANSACTION_TRACKING_UNAVAILABLE_LINE);
|
|
9
13
|
this.hash = hash;
|
|
10
14
|
this.chainId = chainId;
|
|
11
15
|
this.name = "TransactionReceiptUnavailableError";
|
|
@@ -48,4 +52,70 @@ export async function waitForTrackedReceipt(client, hash, options = {}) {
|
|
|
48
52
|
});
|
|
49
53
|
}
|
|
50
54
|
}
|
|
55
|
+
const unverified = (hash) => new Error(`Transaction ${hash}'s receipt is not the one its hold verified.`);
|
|
56
|
+
/**
|
|
57
|
+
* The receipt a hold verified for `settled`, the only one a sent step's
|
|
58
|
+
* outcome is told by: `seen` (a watcher's, say) when it is that transaction,
|
|
59
|
+
* else read. It must be in the block the hold verified; with none kept (a
|
|
60
|
+
* Safe log proved it, or it was saved by 4.x), in a block still canonical
|
|
61
|
+
* and final. A success must read a success, and a failure a revert unless
|
|
62
|
+
* it is a Safe's (`safe`: its own failure). Anything else throws: the step
|
|
63
|
+
* stays unverified until the chain agrees with its hold.
|
|
64
|
+
*/
|
|
65
|
+
export async function heldReceipt(settled, client, seen) {
|
|
66
|
+
const hash = settled.hash.toLowerCase();
|
|
67
|
+
const inBlock = (receipt) => receipt.transactionHash.toLowerCase() === hash &&
|
|
68
|
+
(!settled.blockHash ||
|
|
69
|
+
receipt.blockHash?.toLowerCase() === settled.blockHash.toLowerCase());
|
|
70
|
+
const receipt = seen && inBlock(seen)
|
|
71
|
+
? seen
|
|
72
|
+
: await client.getTransactionReceipt({ hash: settled.hash });
|
|
73
|
+
if (!inBlock(receipt) ||
|
|
74
|
+
(settled.result === "success"
|
|
75
|
+
? receipt.status !== "success"
|
|
76
|
+
: // Only a Safe's own failure runs under an outer success.
|
|
77
|
+
!settled.safe && receipt.status !== "reverted"))
|
|
78
|
+
throw unverified(settled.hash);
|
|
79
|
+
if (!settled.blockHash) {
|
|
80
|
+
const [block, final] = await Promise.all([
|
|
81
|
+
client.getBlock({ blockNumber: receipt.blockNumber }),
|
|
82
|
+
client.getBlock({ blockTag: "finalized" }),
|
|
83
|
+
]);
|
|
84
|
+
if (block.hash?.toLowerCase() !== receipt.blockHash?.toLowerCase() ||
|
|
85
|
+
final.number < receipt.blockNumber)
|
|
86
|
+
throw unverified(settled.hash);
|
|
87
|
+
}
|
|
88
|
+
return receipt;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Where `settled` confirmed: the block its hold verified, while still
|
|
92
|
+
* canonical, or with none kept, its {@link heldReceipt}'s. Throws otherwise.
|
|
93
|
+
*/
|
|
94
|
+
export async function heldBlock(settled, client) {
|
|
95
|
+
if (!settled.blockHash) {
|
|
96
|
+
const { blockNumber, blockHash } = await heldReceipt(settled, client);
|
|
97
|
+
return { blockNumber, blockHash };
|
|
98
|
+
}
|
|
99
|
+
const { number } = await client.getBlock({ blockHash: settled.blockHash });
|
|
100
|
+
const canonical = await client.getBlock({ blockNumber: number });
|
|
101
|
+
if (canonical.hash?.toLowerCase() !== settled.blockHash.toLowerCase())
|
|
102
|
+
throw unverified(settled.hash);
|
|
103
|
+
return { blockNumber: number, blockHash: canonical.hash };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Calls a site's callback (`onProgress`, `onConfirming`, `onSubmitted`,
|
|
107
|
+
* `onConfirmed`, `onSettled`). One that throws or rejects is logged, and
|
|
108
|
+
* never changes what was sent or how it settled.
|
|
109
|
+
*/
|
|
110
|
+
export function tell(callback, ...args) {
|
|
111
|
+
try {
|
|
112
|
+
const told = callback?.(...args);
|
|
113
|
+
if (told instanceof Promise)
|
|
114
|
+
return told.then(() => undefined, logged);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
logged(error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const logged = (error) => console.error("A site callback failed; the write stands.", error);
|
|
51
121
|
//# sourceMappingURL=receipt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../../src/review/receipt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../../src/review/receipt.ts"],"names":[],"mappings":"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"}
|