@bananapus/nana-sdk-core 3.5.1 → 4.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 +489 -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 +52 -0
- package/dist/cjs/review/confirm.d.ts.map +1 -0
- package/dist/cjs/review/confirm.js +88 -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 +8 -7
- 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.map +1 -1
- package/dist/cjs/review/heldWrite.js +5 -4
- package/dist/cjs/review/heldWrite.js.map +1 -1
- package/dist/cjs/review/index.d.ts +11 -0
- package/dist/cjs/review/index.d.ts.map +1 -1
- package/dist/cjs/review/index.js +24 -0
- 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 +34 -0
- package/dist/cjs/review/lineError.d.ts.map +1 -0
- package/dist/cjs/review/lineError.js +42 -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 +63 -0
- package/dist/cjs/review/plan.d.ts.map +1 -0
- package/dist/cjs/review/plan.js +149 -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/useReviewedRun.d.ts +96 -0
- package/dist/cjs/review/react/useReviewedRun.d.ts.map +1 -0
- package/dist/cjs/review/react/useReviewedRun.js +261 -0
- package/dist/cjs/review/react/useReviewedRun.js.map +1 -0
- package/dist/cjs/review/receipt.d.ts +4 -1
- package/dist/cjs/review/receipt.d.ts.map +1 -1
- package/dist/cjs/review/receipt.js +7 -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 +51 -8
- package/dist/cjs/review/relayr.js.map +1 -1
- package/dist/cjs/review/relayrSend.d.ts +135 -0
- package/dist/cjs/review/relayrSend.d.ts.map +1 -0
- package/dist/cjs/review/relayrSend.js +943 -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 +5 -1
- 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 +308 -0
- package/dist/cjs/review/safeSend.js.map +1 -0
- package/dist/cjs/review/send.d.ts +241 -0
- package/dist/cjs/review/send.d.ts.map +1 -0
- package/dist/cjs/review/send.js +1017 -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 +109 -0
- package/dist/cjs/review/sign.d.ts.map +1 -0
- package/dist/cjs/review/sign.js +374 -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 +82 -0
- package/dist/cjs/review/wallet.d.ts.map +1 -0
- package/dist/cjs/review/wallet.js +157 -0
- package/dist/cjs/review/wallet.js.map +1 -0
- package/dist/cjs/review/writeHold.d.ts +100 -12
- package/dist/cjs/review/writeHold.d.ts.map +1 -1
- package/dist/cjs/review/writeHold.js +61 -13
- package/dist/cjs/review/writeHold.js.map +1 -1
- package/dist/cjs/review/writeRecovery.d.ts +6 -1
- package/dist/cjs/review/writeRecovery.d.ts.map +1 -1
- package/dist/cjs/review/writeRecovery.js +108 -40
- 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 -7
- package/dist/cjs/v6/pay.d.ts.map +1 -1
- package/dist/cjs/v6/pay.js +168 -40
- 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 +52 -0
- package/dist/esm/review/confirm.d.ts.map +1 -0
- package/dist/esm/review/confirm.js +83 -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 +8 -7
- 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.map +1 -1
- package/dist/esm/review/heldWrite.js +5 -4
- package/dist/esm/review/heldWrite.js.map +1 -1
- package/dist/esm/review/index.d.ts +11 -0
- package/dist/esm/review/index.d.ts.map +1 -1
- package/dist/esm/review/index.js +11 -0
- 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 +34 -0
- package/dist/esm/review/lineError.d.ts.map +1 -0
- package/dist/esm/review/lineError.js +36 -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 +63 -0
- package/dist/esm/review/plan.d.ts.map +1 -0
- package/dist/esm/review/plan.js +141 -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/useReviewedRun.d.ts +96 -0
- package/dist/esm/review/react/useReviewedRun.d.ts.map +1 -0
- package/dist/esm/review/react/useReviewedRun.js +257 -0
- package/dist/esm/review/react/useReviewedRun.js.map +1 -0
- package/dist/esm/review/receipt.d.ts +4 -1
- package/dist/esm/review/receipt.d.ts.map +1 -1
- package/dist/esm/review/receipt.js +6 -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 +50 -8
- package/dist/esm/review/relayr.js.map +1 -1
- package/dist/esm/review/relayrSend.d.ts +135 -0
- package/dist/esm/review/relayrSend.d.ts.map +1 -0
- package/dist/esm/review/relayrSend.js +934 -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 +5 -1
- 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 +303 -0
- package/dist/esm/review/safeSend.js.map +1 -0
- package/dist/esm/review/send.d.ts +241 -0
- package/dist/esm/review/send.d.ts.map +1 -0
- package/dist/esm/review/send.js +1011 -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 +109 -0
- package/dist/esm/review/sign.d.ts.map +1 -0
- package/dist/esm/review/sign.js +368 -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 +82 -0
- package/dist/esm/review/wallet.d.ts.map +1 -0
- package/dist/esm/review/wallet.js +150 -0
- package/dist/esm/review/wallet.js.map +1 -0
- package/dist/esm/review/writeHold.d.ts +100 -12
- package/dist/esm/review/writeHold.d.ts.map +1 -1
- package/dist/esm/review/writeHold.js +59 -13
- package/dist/esm/review/writeHold.js.map +1 -1
- package/dist/esm/review/writeRecovery.d.ts +6 -1
- package/dist/esm/review/writeRecovery.d.ts.map +1 -1
- package/dist/esm/review/writeRecovery.js +111 -43
- 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 -7
- package/dist/esm/v6/pay.d.ts.map +1 -1
- package/dist/esm/v6/pay.js +166 -39
- 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
|
@@ -16,6 +16,7 @@ exports.heldSafeProposal = heldSafeProposal;
|
|
|
16
16
|
exports.safeProposalIsHeldCall = safeProposalIsHeldCall;
|
|
17
17
|
exports.verifyReviewedWriteReceipt = verifyReviewedWriteReceipt;
|
|
18
18
|
exports.verifyReviewedWriteExpiry = verifyReviewedWriteExpiry;
|
|
19
|
+
const lineError_js_1 = require("./lineError.js");
|
|
19
20
|
const viem_1 = require("viem");
|
|
20
21
|
const safeService_js_1 = require("../safeService.js");
|
|
21
22
|
const safe_js_1 = require("../safe.js");
|
|
@@ -29,7 +30,7 @@ const TAB_SEEN = tabState_js_1.TAB.seen;
|
|
|
29
30
|
// failed. It is visible only while the exact durable reservation still exists.
|
|
30
31
|
const unpersistedSubmissions = new WeakMap();
|
|
31
32
|
/** The wallet returned this identity, but storing it failed. Keep it in memory and retry submitted(hash, record). */
|
|
32
|
-
class SubmittedWritePersistenceError extends
|
|
33
|
+
class SubmittedWritePersistenceError extends lineError_js_1.ReviewLineError {
|
|
33
34
|
constructor(record, cause) {
|
|
34
35
|
super("The wallet returned a transaction identity, but recovery storage is unavailable. Keep this transaction pending.");
|
|
35
36
|
this.name = "SubmittedWritePersistenceError";
|
|
@@ -42,7 +43,7 @@ function normalizedIdentity(input) {
|
|
|
42
43
|
if (!Number.isSafeInteger(input?.chainId) ||
|
|
43
44
|
input.chainId <= 0 ||
|
|
44
45
|
!(0, viem_1.isAddress)(input?.account, { strict: false }))
|
|
45
|
-
throw new
|
|
46
|
+
throw new lineError_js_1.ReviewLineError("Invalid reviewed write recovery evidence.");
|
|
46
47
|
return {
|
|
47
48
|
chainId: input.chainId,
|
|
48
49
|
account: input.account.toLowerCase(),
|
|
@@ -55,7 +56,7 @@ function normalized(input) {
|
|
|
55
56
|
!(0, viem_1.isAddress)(input?.call?.to, { strict: false }) ||
|
|
56
57
|
!(0, untrusted_js_1.isHexBytes)(input?.call?.data) ||
|
|
57
58
|
value === null)
|
|
58
|
-
throw new
|
|
59
|
+
throw new lineError_js_1.ReviewLineError("Invalid reviewed write recovery evidence.");
|
|
59
60
|
return {
|
|
60
61
|
...normalizedIdentity(input),
|
|
61
62
|
safe: input.safe,
|
|
@@ -99,7 +100,7 @@ function recordOf(value) {
|
|
|
99
100
|
(record.executed !== undefined && record.executed !== true) ||
|
|
100
101
|
(record.executionHash !== undefined &&
|
|
101
102
|
(record.executed !== true || !(0, untrusted_js_1.isBytes32)(record.executionHash))))
|
|
102
|
-
throw new
|
|
103
|
+
throw new lineError_js_1.ReviewLineError("Invalid saved write recovery record. Keep this action pending.");
|
|
103
104
|
return {
|
|
104
105
|
version: 1,
|
|
105
106
|
id: record.id,
|
|
@@ -174,7 +175,7 @@ function namespaceOf(value) {
|
|
|
174
175
|
return undefined;
|
|
175
176
|
if (typeof value !== "string" ||
|
|
176
177
|
!/^[a-z0-9][a-z0-9:._/-]{0,127}$/.test(value))
|
|
177
|
-
throw new
|
|
178
|
+
throw new lineError_js_1.ReviewLineError("Invalid write recovery namespace.");
|
|
178
179
|
return value;
|
|
179
180
|
}
|
|
180
181
|
function namespaceScope(input) {
|
|
@@ -188,7 +189,7 @@ function scope(input) {
|
|
|
188
189
|
function recoveryStorage(store) {
|
|
189
190
|
const result = store ?? globalThis.localStorage;
|
|
190
191
|
if (!result)
|
|
191
|
-
throw new
|
|
192
|
+
throw new lineError_js_1.ReviewLineError("Write recovery storage is unavailable.");
|
|
192
193
|
return result;
|
|
193
194
|
}
|
|
194
195
|
/** Every key `store` holds: its own `keys()`, or Web Storage's `length` and `key()`. */
|
|
@@ -380,7 +381,7 @@ function findReviewedWrites(input, options = {}) {
|
|
|
380
381
|
const identity = normalizedIdentity(input);
|
|
381
382
|
if (!(0, viem_1.isAddress)(input.to, { strict: false }) ||
|
|
382
383
|
!/^0x[0-9a-fA-F]{8}$/.test(input.selector))
|
|
383
|
-
throw new
|
|
384
|
+
throw new lineError_js_1.ReviewLineError("Invalid write hold match.");
|
|
384
385
|
const to = input.to.toLowerCase();
|
|
385
386
|
const selector = input.selector.toLowerCase();
|
|
386
387
|
const store = recoveryStorage(options.storage);
|
|
@@ -418,7 +419,7 @@ function foundAt(input, at) {
|
|
|
418
419
|
(at.startsWith(prefix) &&
|
|
419
420
|
/^\d+:0x[0-9a-f]{64}$/.test(at.slice(prefix.length)))))
|
|
420
421
|
return at;
|
|
421
|
-
throw new
|
|
422
|
+
throw new lineError_js_1.ReviewLineError("Invalid write recovery key.");
|
|
422
423
|
}
|
|
423
424
|
/**
|
|
424
425
|
* Every unresolved write saved for `account` on `chainId`, with the key it
|
|
@@ -466,7 +467,7 @@ function readBrowserWriteRecovery(input, options = {}) {
|
|
|
466
467
|
const identity = normalizedIdentity(input);
|
|
467
468
|
const namespace = namespaceOf(input?.namespace);
|
|
468
469
|
if (namespace === undefined)
|
|
469
|
-
throw new
|
|
470
|
+
throw new lineError_js_1.ReviewLineError("Provide a write recovery namespace.");
|
|
470
471
|
return readRecovery(recoveryStorage(options.storage), namespaceScope({ ...identity, namespace }));
|
|
471
472
|
}
|
|
472
473
|
/**
|
|
@@ -477,12 +478,20 @@ function readBrowserWriteRecovery(input, options = {}) {
|
|
|
477
478
|
function releasedKey(key, id) {
|
|
478
479
|
return `${key}:released:${id}`;
|
|
479
480
|
}
|
|
481
|
+
/**
|
|
482
|
+
* The key that marks the record `id` saved at `key` as ended by the user's
|
|
483
|
+
* exit or as never sent, never by a settlement's cleanup: only it lets a
|
|
484
|
+
* saved sequence send that step again.
|
|
485
|
+
*/
|
|
486
|
+
function exitedKey(key, id) {
|
|
487
|
+
return `${key}:exited:${id}`;
|
|
488
|
+
}
|
|
480
489
|
function readStored(raw, key, scopeOf = scope, store) {
|
|
481
490
|
if (raw === null)
|
|
482
491
|
return null;
|
|
483
492
|
const record = recordOf(JSON.parse(raw));
|
|
484
493
|
if (scopeOf(record) !== key)
|
|
485
|
-
throw new
|
|
494
|
+
throw new lineError_js_1.ReviewLineError("Saved write recovery scope does not match.");
|
|
486
495
|
if (store && store.getItem(releasedKey(key, record.id)) !== null)
|
|
487
496
|
return null;
|
|
488
497
|
return record;
|
|
@@ -707,7 +716,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
707
716
|
}
|
|
708
717
|
function requireLock() {
|
|
709
718
|
if (!locked)
|
|
710
|
-
throw new
|
|
719
|
+
throw new lineError_js_1.ReviewLineError("Write recovery changes require the browser lock.");
|
|
711
720
|
}
|
|
712
721
|
function read() {
|
|
713
722
|
const store = storage();
|
|
@@ -719,7 +728,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
719
728
|
const store = storage();
|
|
720
729
|
store.setItem(at, raw);
|
|
721
730
|
if (store.getItem(at) !== raw)
|
|
722
|
-
throw new
|
|
731
|
+
throw new lineError_js_1.ReviewLineError("Write recovery storage did not retain the action.");
|
|
723
732
|
}
|
|
724
733
|
function clear(expected) {
|
|
725
734
|
requireLock();
|
|
@@ -735,7 +744,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
735
744
|
if (!current)
|
|
736
745
|
return;
|
|
737
746
|
if (JSON.stringify(current) !== JSON.stringify(recordOf(expected))) {
|
|
738
|
-
throw new
|
|
747
|
+
throw new lineError_js_1.ReviewLineError("Write recovery changed. Keep the current action pending.");
|
|
739
748
|
}
|
|
740
749
|
// The last record of an attempt goes only once its generation is the
|
|
741
750
|
// committed latest marker; otherwise it stays, released, and carries it.
|
|
@@ -743,13 +752,13 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
743
752
|
const marker = releasedKey(at, current.id);
|
|
744
753
|
store.setItem(marker, "1");
|
|
745
754
|
if (store.getItem(marker) !== "1")
|
|
746
|
-
throw new
|
|
755
|
+
throw new lineError_js_1.ReviewLineError("Write recovery storage did not clear the action.");
|
|
747
756
|
unpersistedSubmissions.get(store)?.delete(at);
|
|
748
757
|
return;
|
|
749
758
|
}
|
|
750
759
|
store.removeItem(at);
|
|
751
760
|
if (store.getItem(at) !== null)
|
|
752
|
-
throw new
|
|
761
|
+
throw new lineError_js_1.ReviewLineError("Write recovery storage did not clear the action.");
|
|
753
762
|
unpersistedSubmissions.get(store)?.delete(at);
|
|
754
763
|
}
|
|
755
764
|
/** Add `fields` to exactly `expected`, a hashed record `when` allows; extra evidence only. */
|
|
@@ -777,6 +786,12 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
777
786
|
const current = read();
|
|
778
787
|
if (current?.id === owned.id && current.hash)
|
|
779
788
|
return;
|
|
789
|
+
try {
|
|
790
|
+
storage().setItem(exitedKey(locate(storage()).at, owned.id), "1");
|
|
791
|
+
}
|
|
792
|
+
catch {
|
|
793
|
+
/* Unsaved, a sequence resumed over it asks for the user's check. */
|
|
794
|
+
}
|
|
780
795
|
// Removing the record must not uncover a settlement of an earlier
|
|
781
796
|
// attempt: unless this reservation is the verified latest, it stays as
|
|
782
797
|
// released instead, which still invalidates that settlement.
|
|
@@ -832,13 +847,13 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
832
847
|
function record(hash, expected, replace) {
|
|
833
848
|
requireLock();
|
|
834
849
|
if (!(0, untrusted_js_1.isBytes32)(hash))
|
|
835
|
-
throw new
|
|
850
|
+
throw new lineError_js_1.ReviewLineError("The wallet returned an invalid transaction identity.");
|
|
836
851
|
const previous = expected && recordOf(expected);
|
|
837
852
|
const submittedHash = hash.toLowerCase();
|
|
838
853
|
if (!previous ||
|
|
839
854
|
keyOf(previous) !== key ||
|
|
840
855
|
(!replace && previous.hash && previous.hash !== submittedHash)) {
|
|
841
|
-
throw new
|
|
856
|
+
throw new lineError_js_1.ReviewLineError("Write recovery changed before submission was recorded.");
|
|
842
857
|
}
|
|
843
858
|
// A hash the wallet returns now starts its clock; a speed-up found at its nonce keeps it.
|
|
844
859
|
const submittedAt = replace || previous.hash === submittedHash
|
|
@@ -875,7 +890,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
875
890
|
submittedAt: undefined,
|
|
876
891
|
}) ||
|
|
877
892
|
(!replace && current.hash && current.hash !== submittedHash)) {
|
|
878
|
-
throw new
|
|
893
|
+
throw new lineError_js_1.ReviewLineError("Write recovery changed before submission was recorded.");
|
|
879
894
|
}
|
|
880
895
|
owned = recordOf(submitted);
|
|
881
896
|
if (current.hash !== submittedHash) {
|
|
@@ -909,15 +924,15 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
909
924
|
? normalized({ ...reviewed, call: actualCall })
|
|
910
925
|
: reviewed;
|
|
911
926
|
if (legacyScope(actual) !== legacyScope(reviewed))
|
|
912
|
-
throw new
|
|
927
|
+
throw new lineError_js_1.ReviewLineError("The adopted write has a different recovery scope.");
|
|
913
928
|
const nonce = evidence && (0, untrusted_js_1.uint256)(evidence.nonce);
|
|
914
929
|
const fromBlock = evidence && (0, untrusted_js_1.uint256)(evidence.blockNumber);
|
|
915
930
|
if (evidence && (nonce === null || fromBlock === null))
|
|
916
|
-
throw new
|
|
931
|
+
throw new lineError_js_1.ReviewLineError("Invalid write recovery nonce evidence.");
|
|
917
932
|
const store = storage();
|
|
918
933
|
const { at, raw } = locate(store);
|
|
919
934
|
if (readRecovery(store, at, raw, scopeAt(at)))
|
|
920
|
-
throw new
|
|
935
|
+
throw new lineError_js_1.ReviewLineError("An earlier wallet write is still unresolved. Check it before trying again.");
|
|
921
936
|
// The record this one replaces, if the user released it: its marker goes too.
|
|
922
937
|
let replaced;
|
|
923
938
|
try {
|
|
@@ -956,6 +971,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
956
971
|
if (typeof replaced === "string" && replaced !== record.id)
|
|
957
972
|
try {
|
|
958
973
|
store.removeItem(releasedKey(key, replaced));
|
|
974
|
+
store.removeItem(exitedKey(key, replaced));
|
|
959
975
|
}
|
|
960
976
|
catch {
|
|
961
977
|
/* A leftover marker names only the old record. */
|
|
@@ -988,7 +1004,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
988
1004
|
requireLock();
|
|
989
1005
|
const current = read();
|
|
990
1006
|
if (current && current.mirrorOf !== of)
|
|
991
|
-
throw new
|
|
1007
|
+
throw new lineError_js_1.ReviewLineError("An earlier wallet write is still unresolved. Check it before trying again.");
|
|
992
1008
|
const mirrored = recordOf({
|
|
993
1009
|
version: 1,
|
|
994
1010
|
id: source.id,
|
|
@@ -1028,6 +1044,16 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
1028
1044
|
return undefined;
|
|
1029
1045
|
}
|
|
1030
1046
|
},
|
|
1047
|
+
/** Whether the record `id` ended by the user's exit, or because nothing was sent. */
|
|
1048
|
+
released(id) {
|
|
1049
|
+
try {
|
|
1050
|
+
const store = storage();
|
|
1051
|
+
return store.getItem(exitedKey(locate(store).at, id)) !== null;
|
|
1052
|
+
}
|
|
1053
|
+
catch {
|
|
1054
|
+
return false;
|
|
1055
|
+
}
|
|
1056
|
+
},
|
|
1031
1057
|
/**
|
|
1032
1058
|
* The call's latest reservation id: the record saved at the key (held,
|
|
1033
1059
|
* or released by its exit), or else the saved latest marker.
|
|
@@ -1288,7 +1314,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
1288
1314
|
executed(expected, executionHash) {
|
|
1289
1315
|
requireLock();
|
|
1290
1316
|
if (executionHash !== undefined && !(0, untrusted_js_1.isBytes32)(executionHash))
|
|
1291
|
-
throw new
|
|
1317
|
+
throw new lineError_js_1.ReviewLineError("Invalid execution transaction identity.");
|
|
1292
1318
|
const store = storage();
|
|
1293
1319
|
const { at, raw } = locate(store);
|
|
1294
1320
|
const current = readRecovery(store, at, raw, scopeAt(at));
|
|
@@ -1296,7 +1322,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
1296
1322
|
if (!current?.hash ||
|
|
1297
1323
|
current.id !== wanted.id ||
|
|
1298
1324
|
current.hash !== wanted.hash)
|
|
1299
|
-
throw new
|
|
1325
|
+
throw new lineError_js_1.ReviewLineError("Write recovery changed. Keep the current action pending.");
|
|
1300
1326
|
const next = recordOf({
|
|
1301
1327
|
...current,
|
|
1302
1328
|
executed: true,
|
|
@@ -1335,7 +1361,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
1335
1361
|
*/
|
|
1336
1362
|
abandon(expected, acknowledgement) {
|
|
1337
1363
|
if (acknowledgement?.checkedWallet !== true)
|
|
1338
|
-
throw new
|
|
1364
|
+
throw new lineError_js_1.ReviewLineError("Release a held write only after the user confirms they checked their wallet.");
|
|
1339
1365
|
const wanted = JSON.stringify(recordOf(expected));
|
|
1340
1366
|
const store = storage();
|
|
1341
1367
|
const { at, raw } = locate(store);
|
|
@@ -1343,15 +1369,21 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
1343
1369
|
if (!durable)
|
|
1344
1370
|
return;
|
|
1345
1371
|
if (durable.executed)
|
|
1346
|
-
throw new
|
|
1372
|
+
throw new lineError_js_1.ReviewLineError("This write ran onchain. Keep it held until its result is known.");
|
|
1347
1373
|
const shown = readRecovery(store, at, raw, scopeAt(at));
|
|
1348
1374
|
if (JSON.stringify(durable) !== wanted &&
|
|
1349
1375
|
JSON.stringify(shown) !== wanted)
|
|
1350
|
-
throw new
|
|
1376
|
+
throw new lineError_js_1.ReviewLineError("Write recovery changed. Keep the current action pending.");
|
|
1351
1377
|
const marker = releasedKey(at, durable.id);
|
|
1378
|
+
try {
|
|
1379
|
+
store.setItem(exitedKey(at, durable.id), "1");
|
|
1380
|
+
}
|
|
1381
|
+
catch {
|
|
1382
|
+
/* Unsaved, a sequence resumed over it asks for the user's check. */
|
|
1383
|
+
}
|
|
1352
1384
|
store.setItem(marker, "1");
|
|
1353
1385
|
if (store.getItem(marker) !== "1")
|
|
1354
|
-
throw new
|
|
1386
|
+
throw new lineError_js_1.ReviewLineError("Write recovery storage did not release the action.");
|
|
1355
1387
|
const memory = unpersistedSubmissions.get(store);
|
|
1356
1388
|
if (memory?.get(at)?.id === durable.id)
|
|
1357
1389
|
memory.delete(at);
|
|
@@ -1362,7 +1394,7 @@ function createBrowserWriteRecovery(input, options = {}) {
|
|
|
1362
1394
|
const locks = options.locks ?? browserLocks();
|
|
1363
1395
|
return locks.request(key, { mode: "exclusive", ...(!wait && { ifAvailable: true }) }, async (lock) => {
|
|
1364
1396
|
if (!lock)
|
|
1365
|
-
throw new
|
|
1397
|
+
throw new lineError_js_1.ReviewLineError("This wallet action is already open in another tab.");
|
|
1366
1398
|
locked = true;
|
|
1367
1399
|
try {
|
|
1368
1400
|
return await work();
|
|
@@ -1520,7 +1552,13 @@ function heldBatch(record) {
|
|
|
1520
1552
|
: null;
|
|
1521
1553
|
return inner && inner.map((call) => normalized({ ...record, call }).call);
|
|
1522
1554
|
}
|
|
1523
|
-
/**
|
|
1555
|
+
/**
|
|
1556
|
+
* The MultiSend targets a held batch may run through: a Safe app folds the
|
|
1557
|
+
* same calls into its own version's MultiSendCallOnly, so any recognized
|
|
1558
|
+
* deployment carries exactly the held calldata.
|
|
1559
|
+
*/
|
|
1560
|
+
const BATCH_TARGETS = safe_js_1.MULTI_SEND_CALL_ONLY_DEPLOYMENTS.map((to) => to.toLowerCase());
|
|
1561
|
+
/** Whether `transaction` is the Safe's execTransaction of exactly the held batch: a recognized MultiSendCallOnly, its calldata, zero value and DELEGATECALL. */
|
|
1524
1562
|
function runsHeldBatch(transaction, record) {
|
|
1525
1563
|
try {
|
|
1526
1564
|
const { functionName, args } = (0, viem_1.decodeFunctionData)({
|
|
@@ -1530,7 +1568,7 @@ function runsHeldBatch(transaction, record) {
|
|
|
1530
1568
|
if (functionName !== "execTransaction")
|
|
1531
1569
|
return false;
|
|
1532
1570
|
const [to, value, data, operation] = args;
|
|
1533
|
-
return (to.toLowerCase()
|
|
1571
|
+
return (BATCH_TARGETS.includes(to.toLowerCase()) &&
|
|
1534
1572
|
value === 0n &&
|
|
1535
1573
|
data.toLowerCase() === record.call.data &&
|
|
1536
1574
|
operation === 1);
|
|
@@ -1556,13 +1594,14 @@ function heldSafeProposal(input, nonce) {
|
|
|
1556
1594
|
*/
|
|
1557
1595
|
function safeProposalIsHeldCall(proposal, input) {
|
|
1558
1596
|
const record = normalized(input);
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
:
|
|
1565
|
-
|
|
1597
|
+
const call = { ...record.call, value: BigInt(record.call.value) };
|
|
1598
|
+
return heldBatch({ ...record, version: 1, id: "" })
|
|
1599
|
+
? BATCH_TARGETS.some((to) => (0, safeService_js_1.safeTransactionMatchesCall)(proposal, {
|
|
1600
|
+
...call,
|
|
1601
|
+
to: to,
|
|
1602
|
+
operation: 1,
|
|
1603
|
+
}))
|
|
1604
|
+
: (0, safeService_js_1.safeTransactionMatchesCall)(proposal, call);
|
|
1566
1605
|
}
|
|
1567
1606
|
/**
|
|
1568
1607
|
* Authenticate the saved wallet identity, canonical inclusion and Safe effect.
|
|
@@ -1576,7 +1615,7 @@ function safeProposalIsHeldCall(proposal, input) {
|
|
|
1576
1615
|
*/
|
|
1577
1616
|
async function verifyReviewedWriteReceipt(client, saved, receipt, proof, { finality = true } = {}) {
|
|
1578
1617
|
const record = recordOf(saved);
|
|
1579
|
-
const pending = () => new
|
|
1618
|
+
const pending = () => new lineError_js_1.ReviewLineError("The saved wallet write is not yet proven. Keep this action pending.");
|
|
1580
1619
|
// A batch hold's call is its MultiSend: its proof is the calls it encodes.
|
|
1581
1620
|
const batch = heldBatch(record);
|
|
1582
1621
|
let calls = batch ?? [record.call];
|
|
@@ -1663,6 +1702,35 @@ async function verifyReviewedWriteReceipt(client, saved, receipt, proof, { final
|
|
|
1663
1702
|
throw pending();
|
|
1664
1703
|
status = result.status;
|
|
1665
1704
|
}
|
|
1705
|
+
else if (status === "success" && (0, safeService_js_1.isSafeExecTransaction)(record.call.data)) {
|
|
1706
|
+
// A Safe's execTransaction succeeds only with the Safe's own
|
|
1707
|
+
// ExecutionSuccess for its exact hash: an ExecutionFailure, or no event
|
|
1708
|
+
// for it, is a failure whatever the receipt's status. A call that only
|
|
1709
|
+
// shares the selector, to anything but a Safe, is decided as any other.
|
|
1710
|
+
if (!client.request)
|
|
1711
|
+
throw pending();
|
|
1712
|
+
const { request } = client;
|
|
1713
|
+
const at = (blockNumber) => blockNumber === undefined ? "latest" : (0, viem_1.numberToHex)(blockNumber);
|
|
1714
|
+
// Every read through the one `request` the receipt client has.
|
|
1715
|
+
const identity = await (0, safe_js_1.readAuthorityIdentity)({
|
|
1716
|
+
request,
|
|
1717
|
+
getCode: ({ address, blockNumber }) => request({
|
|
1718
|
+
method: "eth_getCode",
|
|
1719
|
+
params: [address, at(blockNumber)],
|
|
1720
|
+
}),
|
|
1721
|
+
getStorageAt: ({ address, slot, blockNumber }) => request({
|
|
1722
|
+
method: "eth_getStorageAt",
|
|
1723
|
+
params: [address, slot, at(blockNumber)],
|
|
1724
|
+
}),
|
|
1725
|
+
}, record.call.to, { blockNumber: canonical.blockNumber });
|
|
1726
|
+
if (!identity)
|
|
1727
|
+
throw pending();
|
|
1728
|
+
if (identity.kind === "safe") {
|
|
1729
|
+
const execution = await (0, safeService_js_1.safeExecTransactionResult)({ request: client.request }, record.chainId, record.call.to, record.call.data, canonical);
|
|
1730
|
+
if (execution?.status !== "success")
|
|
1731
|
+
status = "failed";
|
|
1732
|
+
}
|
|
1733
|
+
}
|
|
1666
1734
|
const isCanonical = async () => {
|
|
1667
1735
|
const block = await client.getBlock({ blockNumber: canonical.blockNumber });
|
|
1668
1736
|
return (block.number === canonical.blockNumber &&
|
|
@@ -1683,7 +1751,7 @@ async function verifyReviewedWriteReceipt(client, saved, receipt, proof, { final
|
|
|
1683
1751
|
*/
|
|
1684
1752
|
async function verifyReviewedWriteExpiry(client, saved, service) {
|
|
1685
1753
|
const record = recordOf(saved);
|
|
1686
|
-
const pending = () => new
|
|
1754
|
+
const pending = () => new lineError_js_1.ReviewLineError("The saved Safe proposal is not proven expired. Keep this action pending.");
|
|
1687
1755
|
if (!record.safe ||
|
|
1688
1756
|
!record.hash ||
|
|
1689
1757
|
(await client.getChainId()) !== record.chainId)
|