@bananapus/nana-sdk-core 2.25.0 → 2.27.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/review/contractWrite.d.ts +12 -1
- package/dist/cjs/review/contractWrite.d.ts.map +1 -1
- package/dist/cjs/review/contractWrite.js +28 -2
- package/dist/cjs/review/contractWrite.js.map +1 -1
- package/dist/cjs/review/decode.d.ts +4 -3
- package/dist/cjs/review/decode.d.ts.map +1 -1
- package/dist/cjs/review/decode.js +28 -10
- package/dist/cjs/review/decode.js.map +1 -1
- package/dist/cjs/review/index.d.ts +1 -0
- package/dist/cjs/review/index.d.ts.map +1 -1
- package/dist/cjs/review/index.js +1 -0
- package/dist/cjs/review/index.js.map +1 -1
- package/dist/cjs/review/writeRecovery.d.ts +106 -0
- package/dist/cjs/review/writeRecovery.d.ts.map +1 -0
- package/dist/cjs/review/writeRecovery.js +385 -0
- package/dist/cjs/review/writeRecovery.js.map +1 -0
- package/dist/cjs/safeService.d.ts +16 -9
- package/dist/cjs/safeService.d.ts.map +1 -1
- package/dist/cjs/safeService.js +33 -26
- package/dist/cjs/safeService.js.map +1 -1
- package/dist/cjs/v6/sticky.d.ts +319 -2
- package/dist/cjs/v6/sticky.d.ts.map +1 -1
- package/dist/cjs/v6/sticky.js +862 -1
- package/dist/cjs/v6/sticky.js.map +1 -1
- package/dist/cjs/v6/suckers.d.ts +32 -0
- package/dist/cjs/v6/suckers.d.ts.map +1 -1
- package/dist/cjs/v6/suckers.js +70 -0
- package/dist/cjs/v6/suckers.js.map +1 -1
- package/dist/cjs/v6/tokens.d.ts +8 -0
- package/dist/cjs/v6/tokens.d.ts.map +1 -1
- package/dist/cjs/v6/tokens.js +14 -0
- package/dist/cjs/v6/tokens.js.map +1 -1
- package/dist/esm/review/contractWrite.d.ts +12 -1
- package/dist/esm/review/contractWrite.d.ts.map +1 -1
- package/dist/esm/review/contractWrite.js +26 -2
- package/dist/esm/review/contractWrite.js.map +1 -1
- package/dist/esm/review/decode.d.ts +4 -3
- package/dist/esm/review/decode.d.ts.map +1 -1
- package/dist/esm/review/decode.js +29 -11
- package/dist/esm/review/decode.js.map +1 -1
- package/dist/esm/review/index.d.ts +1 -0
- package/dist/esm/review/index.d.ts.map +1 -1
- package/dist/esm/review/index.js +1 -0
- package/dist/esm/review/index.js.map +1 -1
- package/dist/esm/review/writeRecovery.d.ts +106 -0
- package/dist/esm/review/writeRecovery.d.ts.map +1 -0
- package/dist/esm/review/writeRecovery.js +378 -0
- package/dist/esm/review/writeRecovery.js.map +1 -0
- package/dist/esm/safeService.d.ts +16 -9
- package/dist/esm/safeService.d.ts.map +1 -1
- package/dist/esm/safeService.js +33 -26
- package/dist/esm/safeService.js.map +1 -1
- package/dist/esm/v6/sticky.d.ts +319 -2
- package/dist/esm/v6/sticky.d.ts.map +1 -1
- package/dist/esm/v6/sticky.js +821 -1
- package/dist/esm/v6/sticky.js.map +1 -1
- package/dist/esm/v6/suckers.d.ts +32 -0
- package/dist/esm/v6/suckers.d.ts.map +1 -1
- package/dist/esm/v6/suckers.js +71 -2
- package/dist/esm/v6/suckers.js.map +1 -1
- package/dist/esm/v6/tokens.d.ts +8 -0
- package/dist/esm/v6/tokens.d.ts.map +1 -1
- package/dist/esm/v6/tokens.js +13 -0
- package/dist/esm/v6/tokens.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SubmittedWritePersistenceError = void 0;
|
|
4
|
+
exports.parseReviewedWriteRecoveryRecord = recordOf;
|
|
5
|
+
exports.sameReviewedWrite = sameReviewedWrite;
|
|
6
|
+
exports.createBrowserWriteRecovery = createBrowserWriteRecovery;
|
|
7
|
+
exports.verifyReviewedWriteReceipt = verifyReviewedWriteReceipt;
|
|
8
|
+
exports.verifyReviewedWriteExpiry = verifyReviewedWriteExpiry;
|
|
9
|
+
const viem_1 = require("viem");
|
|
10
|
+
const safeService_js_1 = require("../safeService.js");
|
|
11
|
+
const untrusted_js_1 = require("../untrusted.js");
|
|
12
|
+
const relayr_js_1 = require("./relayr.js");
|
|
13
|
+
// A returned hash must survive a component remount even when its durable update
|
|
14
|
+
// failed. It is visible only while the exact durable reservation still exists.
|
|
15
|
+
const unpersistedSubmissions = new WeakMap();
|
|
16
|
+
/** The wallet returned this identity, but storing it failed. Keep it in memory and retry submitted(hash, record). */
|
|
17
|
+
class SubmittedWritePersistenceError extends Error {
|
|
18
|
+
constructor(record, cause) {
|
|
19
|
+
super("The wallet returned a transaction identity, but recovery storage is unavailable. Keep this transaction pending.");
|
|
20
|
+
this.name = "SubmittedWritePersistenceError";
|
|
21
|
+
this.record = recordOf(record);
|
|
22
|
+
Object.defineProperty(this, "cause", { value: cause, configurable: true });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.SubmittedWritePersistenceError = SubmittedWritePersistenceError;
|
|
26
|
+
function normalized(input) {
|
|
27
|
+
const value = (0, untrusted_js_1.uint256)(input?.call?.value ?? 0n);
|
|
28
|
+
if (!Number.isSafeInteger(input?.chainId) ||
|
|
29
|
+
input.chainId <= 0 ||
|
|
30
|
+
!(0, viem_1.isAddress)(input?.account, { strict: false }) ||
|
|
31
|
+
typeof input?.safe !== "boolean" ||
|
|
32
|
+
!(0, viem_1.isAddress)(input?.call?.to, { strict: false }) ||
|
|
33
|
+
!(0, untrusted_js_1.isHexBytes)(input?.call?.data) ||
|
|
34
|
+
value === null)
|
|
35
|
+
throw new Error("Invalid reviewed write recovery evidence.");
|
|
36
|
+
return {
|
|
37
|
+
chainId: input.chainId,
|
|
38
|
+
account: input.account.toLowerCase(),
|
|
39
|
+
safe: input.safe,
|
|
40
|
+
call: {
|
|
41
|
+
to: input.call.to.toLowerCase(),
|
|
42
|
+
data: input.call.data.toLowerCase(),
|
|
43
|
+
value: value.toString(),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function recordOf(value) {
|
|
48
|
+
const record = value;
|
|
49
|
+
if (record?.version !== 1 ||
|
|
50
|
+
typeof record.id !== "string" ||
|
|
51
|
+
!record.id ||
|
|
52
|
+
typeof record.call?.value !== "string" ||
|
|
53
|
+
!/^(0|[1-9]\d*)$/.test(record.call.value) ||
|
|
54
|
+
(record.hash !== undefined && !(0, untrusted_js_1.isBytes32)(record.hash)))
|
|
55
|
+
throw new Error("Invalid saved write recovery record. Keep this action pending.");
|
|
56
|
+
return {
|
|
57
|
+
version: 1,
|
|
58
|
+
id: record.id,
|
|
59
|
+
...normalized(record),
|
|
60
|
+
...(record.hash === undefined
|
|
61
|
+
? {}
|
|
62
|
+
: { hash: record.hash.toLowerCase() }),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Amounts and quote changes must not evade an unresolved action. */
|
|
66
|
+
function scope(input) {
|
|
67
|
+
return `nana-sdk:reviewed-write:v1:${input.chainId}:${input.account}:${input.call.to}:${input.call.data.slice(0, 10)}`;
|
|
68
|
+
}
|
|
69
|
+
/** Exact reviewed evidence, independent of the reservation and submission identities. */
|
|
70
|
+
function sameReviewedWrite(record, input) {
|
|
71
|
+
return (JSON.stringify(normalized(record)) === JSON.stringify(normalized(input)));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* One ordinary-write reservation per account/chain/target/selector. Use the
|
|
75
|
+
* existing domain journal instead when an action already has one. There is no
|
|
76
|
+
* expiry or nonce-based release: an unknown broadcast remains unknown.
|
|
77
|
+
*
|
|
78
|
+
* Every mutation must run inside withLock, including receipt-based clearing.
|
|
79
|
+
* Storage and native cross-tab exclusion are mandatory before opening a wallet.
|
|
80
|
+
*/
|
|
81
|
+
function createBrowserWriteRecovery(input, options = {}) {
|
|
82
|
+
const reviewed = normalized(input);
|
|
83
|
+
const key = scope(reviewed);
|
|
84
|
+
let owned;
|
|
85
|
+
let locked = false;
|
|
86
|
+
let lastStorage;
|
|
87
|
+
function storage() {
|
|
88
|
+
const store = options.storage ?? globalThis.localStorage;
|
|
89
|
+
if (!store)
|
|
90
|
+
throw new Error("Write recovery storage is unavailable.");
|
|
91
|
+
lastStorage = store;
|
|
92
|
+
return store;
|
|
93
|
+
}
|
|
94
|
+
function rememberSubmission(record, verifiedReservation = false) {
|
|
95
|
+
if (!lastStorage)
|
|
96
|
+
return;
|
|
97
|
+
let pending = unpersistedSubmissions.get(lastStorage);
|
|
98
|
+
const previous = pending?.get(key);
|
|
99
|
+
// An unreadable stale callback cannot replace another attempt's only hash.
|
|
100
|
+
if (previous &&
|
|
101
|
+
!verifiedReservation &&
|
|
102
|
+
JSON.stringify(previous) !== JSON.stringify(record))
|
|
103
|
+
return;
|
|
104
|
+
if (!pending)
|
|
105
|
+
unpersistedSubmissions.set(lastStorage, (pending = new Map()));
|
|
106
|
+
pending.set(key, recordOf(record));
|
|
107
|
+
}
|
|
108
|
+
function requireLock() {
|
|
109
|
+
if (!locked)
|
|
110
|
+
throw new Error("Write recovery changes require the browser lock.");
|
|
111
|
+
}
|
|
112
|
+
function readStored(raw) {
|
|
113
|
+
if (raw === null)
|
|
114
|
+
return null;
|
|
115
|
+
const record = recordOf(JSON.parse(raw));
|
|
116
|
+
if (scope(record) !== key)
|
|
117
|
+
throw new Error("Saved write recovery scope does not match.");
|
|
118
|
+
return record;
|
|
119
|
+
}
|
|
120
|
+
function read() {
|
|
121
|
+
const store = storage();
|
|
122
|
+
const record = readStored(store.getItem(key));
|
|
123
|
+
const memory = unpersistedSubmissions.get(store)?.get(key);
|
|
124
|
+
if (!record ||
|
|
125
|
+
!memory ||
|
|
126
|
+
JSON.stringify({ ...record, hash: undefined }) !==
|
|
127
|
+
JSON.stringify({ ...memory, hash: undefined }) ||
|
|
128
|
+
(record.hash && record.hash !== memory.hash)) {
|
|
129
|
+
// A readable durable snapshot also proves whether cached evidence is stale.
|
|
130
|
+
unpersistedSubmissions.get(store)?.delete(key);
|
|
131
|
+
return record;
|
|
132
|
+
}
|
|
133
|
+
if (record.hash)
|
|
134
|
+
unpersistedSubmissions.get(store)?.delete(key);
|
|
135
|
+
return recordOf(memory);
|
|
136
|
+
}
|
|
137
|
+
function persist(record) {
|
|
138
|
+
const raw = JSON.stringify(record);
|
|
139
|
+
const store = storage();
|
|
140
|
+
store.setItem(key, raw);
|
|
141
|
+
if (store.getItem(key) !== raw)
|
|
142
|
+
throw new Error("Write recovery storage did not retain the action.");
|
|
143
|
+
}
|
|
144
|
+
function clear(expected) {
|
|
145
|
+
requireLock();
|
|
146
|
+
// A volatile returned hash is useful for tracking, but is not a successful
|
|
147
|
+
// durable commit. submitted(hash, record) must retry that commit first.
|
|
148
|
+
const current = readStored(storage().getItem(key));
|
|
149
|
+
if (!current)
|
|
150
|
+
return;
|
|
151
|
+
if (JSON.stringify(current) !== JSON.stringify(recordOf(expected))) {
|
|
152
|
+
throw new Error("Write recovery changed. Keep the current action pending.");
|
|
153
|
+
}
|
|
154
|
+
const store = storage();
|
|
155
|
+
store.removeItem(key);
|
|
156
|
+
if (store.getItem(key) !== null)
|
|
157
|
+
throw new Error("Write recovery storage did not clear the action.");
|
|
158
|
+
unpersistedSubmissions.get(store)?.delete(key);
|
|
159
|
+
}
|
|
160
|
+
function rejected() {
|
|
161
|
+
requireLock();
|
|
162
|
+
// A rejection callback from another attempt must never release this one.
|
|
163
|
+
if (!owned || owned.hash)
|
|
164
|
+
return;
|
|
165
|
+
const current = read();
|
|
166
|
+
if (current?.id === owned.id && current.hash)
|
|
167
|
+
return;
|
|
168
|
+
clear(owned);
|
|
169
|
+
owned = undefined;
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
read,
|
|
173
|
+
reserve(actualCall) {
|
|
174
|
+
requireLock();
|
|
175
|
+
// A reused Safe proposal may have a different, already verified deadline.
|
|
176
|
+
// Retain its actual call, without widening the unresolved-action scope.
|
|
177
|
+
const actual = actualCall
|
|
178
|
+
? normalized({ ...reviewed, call: actualCall })
|
|
179
|
+
: reviewed;
|
|
180
|
+
if (scope(actual) !== key)
|
|
181
|
+
throw new Error("The adopted write has a different recovery scope.");
|
|
182
|
+
if (read())
|
|
183
|
+
throw new Error("An earlier wallet write is still unresolved. Check it before trying again.");
|
|
184
|
+
const record = {
|
|
185
|
+
version: 1,
|
|
186
|
+
id: globalThis.crypto.randomUUID(),
|
|
187
|
+
...actual,
|
|
188
|
+
};
|
|
189
|
+
owned = recordOf(record);
|
|
190
|
+
try {
|
|
191
|
+
persist(record);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
// The wallet has not been invoked. A failed readback may still have
|
|
195
|
+
// stored this marker; clean only our exact reservation if readable.
|
|
196
|
+
try {
|
|
197
|
+
rejected();
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
/* Retain ownership for a later cleanup. */
|
|
201
|
+
}
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
return recordOf(record);
|
|
205
|
+
},
|
|
206
|
+
submitted(hash, expected = owned) {
|
|
207
|
+
requireLock();
|
|
208
|
+
if (!(0, untrusted_js_1.isBytes32)(hash))
|
|
209
|
+
throw new Error("The wallet returned an invalid transaction identity.");
|
|
210
|
+
const previous = expected && recordOf(expected);
|
|
211
|
+
const submittedHash = hash.toLowerCase();
|
|
212
|
+
if (!previous ||
|
|
213
|
+
scope(previous) !== key ||
|
|
214
|
+
(previous.hash && previous.hash !== submittedHash)) {
|
|
215
|
+
throw new Error("Write recovery changed before submission was recorded.");
|
|
216
|
+
}
|
|
217
|
+
const submitted = { ...previous, hash: submittedHash };
|
|
218
|
+
let raw;
|
|
219
|
+
try {
|
|
220
|
+
raw = storage().getItem(key);
|
|
221
|
+
}
|
|
222
|
+
catch (cause) {
|
|
223
|
+
owned = submitted;
|
|
224
|
+
rememberSubmission(submitted);
|
|
225
|
+
throw new SubmittedWritePersistenceError(submitted, cause);
|
|
226
|
+
}
|
|
227
|
+
const current = readStored(raw);
|
|
228
|
+
if (!current ||
|
|
229
|
+
JSON.stringify({ ...current, hash: undefined }) !==
|
|
230
|
+
JSON.stringify({ ...previous, hash: undefined }) ||
|
|
231
|
+
(current.hash && current.hash !== submittedHash)) {
|
|
232
|
+
throw new Error("Write recovery changed before submission was recorded.");
|
|
233
|
+
}
|
|
234
|
+
owned = recordOf(submitted);
|
|
235
|
+
if (!current.hash) {
|
|
236
|
+
try {
|
|
237
|
+
persist(submitted);
|
|
238
|
+
}
|
|
239
|
+
catch (cause) {
|
|
240
|
+
rememberSubmission(submitted, true);
|
|
241
|
+
throw new SubmittedWritePersistenceError(submitted, cause);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (lastStorage)
|
|
245
|
+
unpersistedSubmissions.get(lastStorage)?.delete(key);
|
|
246
|
+
return submitted;
|
|
247
|
+
},
|
|
248
|
+
rejected,
|
|
249
|
+
clear,
|
|
250
|
+
async withLock(work, wait = false) {
|
|
251
|
+
const locks = options.locks ?? globalThis.navigator?.locks;
|
|
252
|
+
if (!locks)
|
|
253
|
+
throw new Error("This browser cannot safely coordinate wallet writes.");
|
|
254
|
+
return locks.request(key, { mode: "exclusive", ...(!wait && { ifAvailable: true }) }, async (lock) => {
|
|
255
|
+
if (!lock)
|
|
256
|
+
throw new Error("This wallet action is already open in another tab.");
|
|
257
|
+
locked = true;
|
|
258
|
+
try {
|
|
259
|
+
return await work();
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
262
|
+
locked = false;
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Authenticate the saved wallet identity, canonical inclusion and Safe effect.
|
|
270
|
+
* Ordinary wallet wrappers are allowed: the wallet's returned hash binds their
|
|
271
|
+
* execution. A wallet-returned Safe proposal hash authenticates its execution
|
|
272
|
+
* event even through a wrapper; an immediate execution hash additionally needs
|
|
273
|
+
* exact reviewed calldata. A failure releases only after finality.
|
|
274
|
+
* Throws on missing or inconsistent evidence; the caller retains its record.
|
|
275
|
+
*/
|
|
276
|
+
async function verifyReviewedWriteReceipt(client, saved, receipt, proof) {
|
|
277
|
+
const record = recordOf(saved);
|
|
278
|
+
const pending = () => new Error("The saved wallet write is not yet proven. Keep this action pending.");
|
|
279
|
+
let calls = [record.call];
|
|
280
|
+
if (proof) {
|
|
281
|
+
if (!record.safe ||
|
|
282
|
+
!Array.isArray(proof.calls) ||
|
|
283
|
+
!proof.calls.length ||
|
|
284
|
+
(proof.batch !== undefined && typeof proof.batch !== "boolean"))
|
|
285
|
+
throw pending();
|
|
286
|
+
calls = proof.calls.map((call) => normalized({ ...record, call }).call);
|
|
287
|
+
if (JSON.stringify(calls[0]) !== JSON.stringify(record.call))
|
|
288
|
+
throw pending();
|
|
289
|
+
}
|
|
290
|
+
if (!record.hash ||
|
|
291
|
+
!(0, untrusted_js_1.isBytes32)(receipt?.transactionHash) ||
|
|
292
|
+
(!record.safe && record.hash !== receipt.transactionHash.toLowerCase()))
|
|
293
|
+
throw pending();
|
|
294
|
+
const hash = receipt.transactionHash;
|
|
295
|
+
const [chainId, transaction, canonical] = await Promise.all([
|
|
296
|
+
client.getChainId(),
|
|
297
|
+
client.getTransaction({ hash }),
|
|
298
|
+
client.getTransactionReceipt({ hash }),
|
|
299
|
+
]);
|
|
300
|
+
if (chainId !== record.chainId ||
|
|
301
|
+
(transaction.chainId !== undefined &&
|
|
302
|
+
transaction.chainId !== record.chainId) ||
|
|
303
|
+
transaction.hash?.toLowerCase() !== hash.toLowerCase() ||
|
|
304
|
+
canonical.transactionHash?.toLowerCase() !== hash.toLowerCase() ||
|
|
305
|
+
!(0, untrusted_js_1.isBytes32)(canonical.blockHash) ||
|
|
306
|
+
canonical.blockHash.toLowerCase() !== receipt.blockHash?.toLowerCase() ||
|
|
307
|
+
canonical.blockHash.toLowerCase() !==
|
|
308
|
+
transaction.blockHash?.toLowerCase() ||
|
|
309
|
+
typeof canonical.blockNumber !== "bigint" ||
|
|
310
|
+
canonical.blockNumber < 0n ||
|
|
311
|
+
canonical.blockNumber !== receipt.blockNumber ||
|
|
312
|
+
canonical.blockNumber !== transaction.blockNumber ||
|
|
313
|
+
!(0, viem_1.isAddress)(transaction.from, { strict: false }) ||
|
|
314
|
+
transaction.from.toLowerCase() !== canonical.from?.toLowerCase() ||
|
|
315
|
+
transaction.to?.toLowerCase() !== canonical.to?.toLowerCase() ||
|
|
316
|
+
!Number.isSafeInteger(transaction.transactionIndex) ||
|
|
317
|
+
transaction.transactionIndex < 0 ||
|
|
318
|
+
transaction.transactionIndex !== canonical.transactionIndex ||
|
|
319
|
+
canonical.status !== receipt.status ||
|
|
320
|
+
(canonical.status !== "success" && canonical.status !== "reverted"))
|
|
321
|
+
throw pending();
|
|
322
|
+
let status = canonical.status === "success" ? "success" : "failed";
|
|
323
|
+
if (record.safe) {
|
|
324
|
+
if (!Array.isArray(canonical.logs) ||
|
|
325
|
+
canonical.logs.some((log) => log.removed !== false ||
|
|
326
|
+
log.transactionHash?.toLowerCase() !== hash.toLowerCase() ||
|
|
327
|
+
log.blockHash?.toLowerCase() !== canonical.blockHash.toLowerCase() ||
|
|
328
|
+
log.blockNumber !== canonical.blockNumber ||
|
|
329
|
+
log.transactionIndex !== canonical.transactionIndex))
|
|
330
|
+
throw pending();
|
|
331
|
+
const result = await (0, safeService_js_1.readSafeAppExecution)({
|
|
332
|
+
client: { getTransaction: async () => transaction },
|
|
333
|
+
receipt: canonical,
|
|
334
|
+
safe: record.account,
|
|
335
|
+
proposalHash: record.hash,
|
|
336
|
+
calls,
|
|
337
|
+
batch: proof?.batch,
|
|
338
|
+
});
|
|
339
|
+
// A reverted outer executor has not consumed the Safe proposal's nonce.
|
|
340
|
+
if (result.status !== "success" && result.status !== "failed")
|
|
341
|
+
throw pending();
|
|
342
|
+
status = result.status;
|
|
343
|
+
}
|
|
344
|
+
const isCanonical = async () => {
|
|
345
|
+
const block = await client.getBlock({ blockNumber: canonical.blockNumber });
|
|
346
|
+
return (block.number === canonical.blockNumber &&
|
|
347
|
+
block.hash?.toLowerCase() === canonical.blockHash.toLowerCase());
|
|
348
|
+
};
|
|
349
|
+
if (status === "failed") {
|
|
350
|
+
const finalized = await (0, relayr_js_1.atCanonicalFinalizedBlock)(client, async (number) => number >= canonical.blockNumber && (await isCanonical()));
|
|
351
|
+
if (!finalized?.value)
|
|
352
|
+
throw pending();
|
|
353
|
+
}
|
|
354
|
+
else if (!(await isCanonical()))
|
|
355
|
+
throw pending();
|
|
356
|
+
return status;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Prove a stamped Safe call expired before execution. An advanced nonce, stale
|
|
360
|
+
* service result, UI phase or local clock never releases a saved write.
|
|
361
|
+
*/
|
|
362
|
+
async function verifyReviewedWriteExpiry(client, saved, service) {
|
|
363
|
+
const record = recordOf(saved);
|
|
364
|
+
const pending = () => new Error("The saved Safe proposal is not proven expired. Keep this action pending.");
|
|
365
|
+
if (!record.safe ||
|
|
366
|
+
!record.hash ||
|
|
367
|
+
(await client.getChainId()) !== record.chainId)
|
|
368
|
+
throw pending();
|
|
369
|
+
const proposal = await (0, safeService_js_1.readSafeTransaction)(record.chainId, record.account, record.hash, service);
|
|
370
|
+
if (!(0, safeService_js_1.safeTransactionMatchesCall)(proposal, {
|
|
371
|
+
...record.call,
|
|
372
|
+
value: BigInt(record.call.value),
|
|
373
|
+
}))
|
|
374
|
+
throw pending();
|
|
375
|
+
const proof = await (0, relayr_js_1.atCanonicalFinalizedBlock)(client, async (blockNumber) => {
|
|
376
|
+
const block = await client.getBlock({ blockNumber });
|
|
377
|
+
if (block.number !== blockNumber)
|
|
378
|
+
return false;
|
|
379
|
+
return ((await (0, safeService_js_1.lookAtSafeProposal)({ request: client.request, getBlock: async () => block }, record.chainId, record.account, record.hash, service)) === "expired");
|
|
380
|
+
});
|
|
381
|
+
if (!proof?.value)
|
|
382
|
+
throw pending();
|
|
383
|
+
return true;
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=writeRecovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeRecovery.js","sourceRoot":"","sources":["../../../src/review/writeRecovery.ts"],"names":[],"mappings":";;;AA+GqB,oDAAgC;AAQrD,8CAOC;AAUD,gEAgNC;AAkCD,gEA4GC;AAMD,8DA4CC;AAxhBD,+BAMc;AACd,sDAM2B;AAC3B,kDAAiE;AACjE,2CAAwD;AAsBxD,gFAAgF;AAChF,+EAA+E;AAC/E,MAAM,sBAAsB,GAAG,IAAI,OAAO,EAGvC,CAAC;AAEJ,qHAAqH;AACrH,MAAa,8BAA+B,SAAQ,KAAK;IAKvD,YAAY,MAAmC,EAAE,KAAc;QAC7D,KAAK,CACH,iHAAiH,CAClH,CAAC;QAPK,SAAI,GAAG,gCAAgC,CAAC;QAQ/C,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;CACF;AAZD,wEAYC;AAED,SAAS,UAAU,CACjB,KAAiC;IAIjC,MAAM,KAAK,GAAG,IAAA,sBAAO,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAChD,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC;QACrC,KAAK,CAAC,OAAO,IAAI,CAAC;QAClB,CAAC,IAAA,gBAAS,EAAC,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC7C,OAAO,KAAK,EAAE,IAAI,KAAK,SAAS;QAChC,CAAC,IAAA,gBAAS,EAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC9C,CAAC,IAAA,yBAAU,EAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;QAC9B,KAAK,KAAK,IAAI;QAEd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,EAAa;QAC/C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE;YACJ,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAa;YAC1C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAS;YAC1C,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;SACxB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,MAAM,GAAG,KAA2C,CAAC;IAC3D,IACE,MAAM,EAAE,OAAO,KAAK,CAAC;QACrB,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;QAC7B,CAAC,MAAM,CAAC,EAAE;QACV,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,KAAK,QAAQ;QACtC,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACzC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAA,wBAAS,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEtD,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;IACJ,OAAO;QACL,OAAO,EAAE,CAAC;QACV,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,GAAG,UAAU,CAAC,MAAM,CAAC;QACrB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;YAC3B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAS,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AAKD,qEAAqE;AACrE,SAAS,KAAK,CAAC,KAAiC;IAC9C,OAAO,8BAA8B,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACzH,CAAC;AAED,yFAAyF;AACzF,SAAgB,iBAAiB,CAC/B,MAAmC,EACnC,KAAiC;IAEjC,OAAO,CACL,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,0BAA0B,CACxC,KAAiC,EACjC,UAAgE,EAAE;IAElE,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,KAA8C,CAAC;IACnD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,WAAwC,CAAC;IAE7C,SAAS,OAAO;QACd,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC;QACzD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACtE,WAAW,GAAG,KAAK,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,SAAS,kBAAkB,CACzB,MAAmC,EACnC,mBAAmB,GAAG,KAAK;QAE3B,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,IAAI,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,2EAA2E;QAC3E,IACE,QAAQ;YACR,CAAC,mBAAmB;YACpB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAEnD,OAAO;QACT,IAAI,CAAC,OAAO;YACV,sBAAsB,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,SAAS,WAAW;QAClB,IAAI,CAAC,MAAM;YACT,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACxE,CAAC;IACD,SAAS,UAAU,CAAC,GAAkB;QACpC,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG;YACvB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,SAAS,IAAI;QACX,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3D,IACE,CAAC,MAAM;YACP,CAAC,MAAM;YACP,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAChD,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAC5C,CAAC;YACD,4EAA4E;YAC5E,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,CAAC,IAAI;YAAE,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,SAAS,OAAO,CAAC,MAAmC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;YAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACzE,CAAC;IACD,SAAS,KAAK,CAAC,QAAqC;QAClD,WAAW,EAAE,CAAC;QACd,2EAA2E;QAC3E,wEAAwE;QACxE,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI;YAC7B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,SAAS,QAAQ;QACf,WAAW,EAAE,CAAC;QACd,yEAAyE;QACzE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO;QACjC,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,EAAE,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO;QACrD,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,KAAK,GAAG,SAAS,CAAC;IACpB,CAAC;IAED,OAAO;QACL,IAAI;QACJ,OAAO,CACL,UAA+C;YAE/C,WAAW,EAAE,CAAC;YACd,0EAA0E;YAC1E,wEAAwE;YACxE,MAAM,MAAM,GAAG,UAAU;gBACvB,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;gBAC/C,CAAC,CAAC,QAAQ,CAAC;YACb,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG;gBACvB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,IAAI,IAAI,EAAE;gBACR,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;YACJ,MAAM,MAAM,GAAgC;gBAC1C,OAAO,EAAE,CAAC;gBACV,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE;gBAClC,GAAG,MAAM;aACV,CAAC;YACF,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,oEAAoE;gBACpE,oEAAoE;gBACpE,IAAI,CAAC;oBACH,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAAC,MAAM,CAAC;oBACP,2CAA2C;gBAC7C,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QACD,SAAS,CACP,IAAS,EACT,WAAoD,KAAK;YAEzD,WAAW,EAAE,CAAC;YACd,IAAI,CAAC,IAAA,wBAAS,EAAC,IAAI,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,MAAM,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAS,CAAC;YAChD,IACE,CAAC,QAAQ;gBACT,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG;gBACvB,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,CAAC,EAClD,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,wDAAwD,CACzD,CAAC;YACJ,CAAC;YACD,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACvD,IAAI,GAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,GAAG,GAAG,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,KAAK,GAAG,SAAS,CAAC;gBAClB,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC9B,MAAM,IAAI,8BAA8B,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAChC,IACE,CAAC,OAAO;gBACR,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;oBAC7C,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBAClD,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,EAChD,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,wDAAwD,CACzD,CAAC;YACJ,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACH,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBACpC,MAAM,IAAI,8BAA8B,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;YACD,IAAI,WAAW;gBAAE,sBAAsB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACtE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,QAAQ;QACR,KAAK;QACL,KAAK,CAAC,QAAQ,CAAI,IAAsB,EAAE,IAAI,GAAG,KAAK;YACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC;YAC3D,IAAI,CAAC,KAAK;gBACR,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC,OAAO,CAClB,GAAG,EACH,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,EAC1D,KAAK,EAAE,IAAI,EAAE,EAAE;gBACb,IAAI,CAAC,IAAI;oBACP,MAAM,IAAI,KAAK,CACb,oDAAoD,CACrD,CAAC;gBACJ,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,CAAC;oBACH,OAAO,MAAM,IAAI,EAAE,CAAC;gBACtB,CAAC;wBAAS,CAAC;oBACT,MAAM,GAAG,KAAK,CAAC;gBACjB,CAAC;YACH,CAAC,CACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AA0BD;;;;;;;GAOG;AACI,KAAK,UAAU,0BAA0B,CAC9C,MAAkC,EAClC,KAAkC,EAClC,OAA2B,EAC3B,KAGC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,IAAI,KAAK,CACP,qEAAqE,CACtE,CAAC;IACJ,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,KAAK,EAAE,CAAC;QACV,IACE,CAAC,MAAM,CAAC,IAAI;YACZ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;YAC3B,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;YACnB,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC;YAE/D,MAAM,OAAO,EAAE,CAAC;QAClB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;YAC1D,MAAM,OAAO,EAAE,CAAC;IACpB,CAAC;IACD,IACE,CAAC,MAAM,CAAC,IAAI;QACZ,CAAC,IAAA,wBAAS,EAAC,OAAO,EAAE,eAAe,CAAC;QACpC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAEvE,MAAM,OAAO,EAAE,CAAC;IAClB,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC;IACrC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE;QACnB,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC;QAC/B,MAAM,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,CAAC;KACvC,CAAC,CAAC;IACH,IACE,OAAO,KAAK,MAAM,CAAC,OAAO;QAC1B,CAAC,WAAW,CAAC,OAAO,KAAK,SAAS;YAChC,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC;QACzC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE;QACtD,SAAS,CAAC,eAAe,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE;QAC/D,CAAC,IAAA,wBAAS,EAAC,SAAS,CAAC,SAAS,CAAC;QAC/B,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE;QACtE,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE;YAC/B,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE;QACtC,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ;QACzC,SAAS,CAAC,WAAW,GAAG,EAAE;QAC1B,SAAS,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW;QAC7C,SAAS,CAAC,WAAW,KAAK,WAAW,CAAC,WAAW;QACjD,CAAC,IAAA,gBAAS,EAAC,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC/C,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE;QAChE,WAAW,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE;QAC7D,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,gBAAgB,CAAC;QACnD,WAAW,CAAC,gBAAiB,GAAG,CAAC;QACjC,WAAW,CAAC,gBAAgB,KAAK,SAAS,CAAC,gBAAgB;QAC3D,SAAS,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;QACnC,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,UAAU,CAAC;QAEnE,MAAM,OAAO,EAAE,CAAC;IAElB,IAAI,MAAM,GACR,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,IAAI,CACjB,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,OAAO,KAAK,KAAK;gBACrB,GAAG,CAAC,eAAe,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE;gBACzD,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE;gBAClE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,WAAW;gBACzC,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,gBAAgB,CACtD;YAED,MAAM,OAAO,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,IAAA,qCAAoB,EAAC;YACxC,MAAM,EAAE,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE;YACnD,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,MAAM,CAAC,OAAO;YACpB,YAAY,EAAE,MAAM,CAAC,IAAI;YACzB,KAAK;YACL,KAAK,EAAE,KAAK,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,wEAAwE;QACxE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAC3D,MAAM,OAAO,EAAE,CAAC;QAClB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;QAC7B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,OAAO,CACL,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,WAAW;YACtC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAChE,CAAC;IACJ,CAAC,CAAC;IACF,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,MAAM,IAAA,qCAAyB,EAC/C,MAAM,EACN,KAAK,EAAE,MAAM,EAAE,EAAE,CACf,MAAM,IAAI,SAAS,CAAC,WAAW,IAAI,CAAC,MAAM,WAAW,EAAE,CAAC,CAC3D,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,KAAK;YAAE,MAAM,OAAO,EAAE,CAAC;IACzC,CAAC;SAAM,IAAI,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC;QAAE,MAAM,OAAO,EAAE,CAAC;IACnD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,yBAAyB,CAC7C,MAAiE,EACjE,KAAkC,EAClC,OAA4B;IAE5B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,IAAI,KAAK,CACP,0EAA0E,CAC3E,CAAC;IACJ,IACE,CAAC,MAAM,CAAC,IAAI;QACZ,CAAC,MAAM,CAAC,IAAI;QACZ,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO;QAE9C,MAAM,OAAO,EAAE,CAAC;IAClB,MAAM,QAAQ,GAAG,MAAM,IAAA,oCAAmB,EACxC,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,IAAI,EACX,OAAO,CACR,CAAC;IACF,IACE,CAAC,IAAA,2CAA0B,EAAC,QAAQ,EAAE;QACpC,GAAG,MAAM,CAAC,IAAI;QACd,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;KACjC,CAAC;QAEF,MAAM,OAAO,EAAE,CAAC;IAClB,MAAM,KAAK,GAAG,MAAM,IAAA,qCAAyB,EAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;QAC1E,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAC/C,OAAO,CACL,CAAC,MAAM,IAAA,mCAAkB,EACvB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,EAAE,EACxD,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,IAAK,EACZ,OAAO,CACR,CAAC,KAAK,SAAS,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,EAAE,KAAK;QAAE,MAAM,OAAO,EAAE,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -359,8 +359,12 @@ export declare function requireSafeProposalSuccess(execution: SafeAppExecution,
|
|
|
359
359
|
* exactly as sent.
|
|
360
360
|
*/
|
|
361
361
|
export declare function heldCall(call: SafeAppCall): SafeAppCall;
|
|
362
|
-
/**
|
|
363
|
-
|
|
362
|
+
/**
|
|
363
|
+
* The deadline enforced by `call`'s canonical target on `chainId`, or null
|
|
364
|
+
* without that evidence. A matching selector alone proves no deadline;
|
|
365
|
+
* another contract or an EOA can accept the same calldata after its stamp.
|
|
366
|
+
*/
|
|
367
|
+
export declare function stampedDeadline(call: SafeAppCall, chainId?: number): bigint | null;
|
|
364
368
|
/** A chain client that reads the Safe's nonce and the latest block. */
|
|
365
369
|
type SafeQueueClient = Parameters<typeof readBoundedSafeNonce>[0] & {
|
|
366
370
|
getBlock(): Promise<{
|
|
@@ -373,10 +377,11 @@ type SafeQueueClient = Parameters<typeof readBoundedSafeNonce>[0] & {
|
|
|
373
377
|
* service record, its safeTxHash and the call it runs), read from Safe's
|
|
374
378
|
* service from the Safe's nonce in the latest block, or null: a Safe app
|
|
375
379
|
* never proposes an action that is already queued, whoever queued it,
|
|
376
|
-
* whatever its stamp ({@link heldCall}). A queued call
|
|
377
|
-
*
|
|
378
|
-
* deadline: it can no longer run.
|
|
379
|
-
* queue can't
|
|
380
|
+
* whatever its stamp ({@link heldCall}). A queued call to a canonical target
|
|
381
|
+
* that enforces its deadline is passed over when that numbered block is past
|
|
382
|
+
* the deadline: it can no longer run. Without a numbered block, matching
|
|
383
|
+
* proposals remain held. Throws when the block, the nonce or the queue can't
|
|
384
|
+
* be read.
|
|
380
385
|
*/
|
|
381
386
|
export declare function findPendingSafeAppProposal(client: SafeQueueClient, chainId: number, safe: Address, call: SafeAppCall, service?: SafeServiceOptions): Promise<{
|
|
382
387
|
tx: SafeQueuedTransaction;
|
|
@@ -404,9 +409,11 @@ export declare function lookAtSafeProposal(client: SafeQueueClient, chainId: num
|
|
|
404
409
|
/**
|
|
405
410
|
* Watches a proposal awaiting its signers, one {@link lookAtSafeProposal} a
|
|
406
411
|
* minute, until `signal` aborts. It ends `expired` at the first look that
|
|
407
|
-
*
|
|
408
|
-
*
|
|
409
|
-
* the
|
|
412
|
+
* proves it expired before execution. A passed nonce with no indexed execution
|
|
413
|
+
* remains uncertain however long it lasts: the proposal itself may have run.
|
|
414
|
+
* Execution confirmation belongs to the caller's receipt reader. The return
|
|
415
|
+
* type retains `replaced` for compatibility, but this watch does not infer it
|
|
416
|
+
* from elapsed time or a missing service record.
|
|
410
417
|
*/
|
|
411
418
|
export declare function watchSafeProposal(client: SafeQueueClient, chainId: number, safe: Address, proposalHash: Hex, signal: AbortSignal, service?: SafeServiceOptions): Promise<"expired" | "replaced">;
|
|
412
419
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safeService.d.ts","sourceRoot":"","sources":["../../src/safeService.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,OAAO,EACZ,KAAK,GAAG,EACT,MAAM,MAAM,CAAC;AACd,OAAO,EAGL,oBAAoB,EAGpB,KAAK,YAAY,EAClB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"safeService.d.ts","sourceRoot":"","sources":["../../src/safeService.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/safeService.js
CHANGED
|
@@ -47,6 +47,7 @@ const viem_1 = require("viem");
|
|
|
47
47
|
const safe_js_1 = require("./safe.js");
|
|
48
48
|
const pause_js_1 = require("./pause.js");
|
|
49
49
|
const untrusted_js_1 = require("./untrusted.js");
|
|
50
|
+
const uniswapV4Deployments_js_1 = require("./v6/uniswapV4Deployments.js");
|
|
50
51
|
/**
|
|
51
52
|
* Safe's per-chain app URL prefix. Wider than {@link SAFE_SERVICE_PREFIX}:
|
|
52
53
|
* Safe app links work on chains without a hosted transaction service.
|
|
@@ -652,8 +653,8 @@ async function requireSafeProposalSuccess(execution, failure) {
|
|
|
652
653
|
}
|
|
653
654
|
/**
|
|
654
655
|
* The calls this app stamps with a field at send time, by selector: the
|
|
655
|
-
* stamp's argument, and
|
|
656
|
-
*
|
|
656
|
+
* stamp's argument, and the canonical deployment that enforces its deadline.
|
|
657
|
+
* Universal Router's `execute` and PositionManager's
|
|
657
658
|
* `modifyLiquidities` check a deadline; the expiration Permit2's `approve`
|
|
658
659
|
* sets only bounds the allowance it grants.
|
|
659
660
|
*/
|
|
@@ -662,13 +663,13 @@ const STAMPED_CALLS = {
|
|
|
662
663
|
"0x3593564c": {
|
|
663
664
|
params: [{ type: "bytes" }, { type: "bytes[]" }, { type: "uint256" }],
|
|
664
665
|
stamp: 2,
|
|
665
|
-
|
|
666
|
+
deadlineTarget: "universalRouter",
|
|
666
667
|
},
|
|
667
668
|
// modifyLiquidities(bytes unlockData, uint256 deadline)
|
|
668
669
|
"0xdd46508f": {
|
|
669
670
|
params: [{ type: "bytes" }, { type: "uint256" }],
|
|
670
671
|
stamp: 1,
|
|
671
|
-
|
|
672
|
+
deadlineTarget: "positionManager",
|
|
672
673
|
},
|
|
673
674
|
// approve(address token, address spender, uint160 amount, uint48 expiration)
|
|
674
675
|
"0x87517c45": {
|
|
@@ -679,7 +680,7 @@ const STAMPED_CALLS = {
|
|
|
679
680
|
{ type: "uint48" },
|
|
680
681
|
],
|
|
681
682
|
stamp: 3,
|
|
682
|
-
|
|
683
|
+
deadlineTarget: null,
|
|
683
684
|
},
|
|
684
685
|
};
|
|
685
686
|
/** A stamped call's shape and arguments, when its data is exactly their ABI encoding. */
|
|
@@ -717,10 +718,17 @@ function heldCall(call) {
|
|
|
717
718
|
data: `${call.data.slice(0, 10)}${(0, viem_1.encodeAbiParameters)(stamped.shape.params, args).slice(2)}`,
|
|
718
719
|
};
|
|
719
720
|
}
|
|
720
|
-
/**
|
|
721
|
-
|
|
721
|
+
/**
|
|
722
|
+
* The deadline enforced by `call`'s canonical target on `chainId`, or null
|
|
723
|
+
* without that evidence. A matching selector alone proves no deadline;
|
|
724
|
+
* another contract or an EOA can accept the same calldata after its stamp.
|
|
725
|
+
*/
|
|
726
|
+
function stampedDeadline(call, chainId) {
|
|
722
727
|
const stamped = stampedArgs(call);
|
|
723
|
-
|
|
728
|
+
if (!stamped?.shape.deadlineTarget || chainId === undefined)
|
|
729
|
+
return null;
|
|
730
|
+
const target = (0, uniswapV4Deployments_js_1.uniswapV4Deployment)(chainId)?.[stamped.shape.deadlineTarget];
|
|
731
|
+
return target && (0, viem_1.isAddressEqual)(call.to, target)
|
|
724
732
|
? BigInt(stamped.args[stamped.shape.stamp])
|
|
725
733
|
: null;
|
|
726
734
|
}
|
|
@@ -743,10 +751,11 @@ function proposedCall(tx) {
|
|
|
743
751
|
* service record, its safeTxHash and the call it runs), read from Safe's
|
|
744
752
|
* service from the Safe's nonce in the latest block, or null: a Safe app
|
|
745
753
|
* never proposes an action that is already queued, whoever queued it,
|
|
746
|
-
* whatever its stamp ({@link heldCall}). A queued call
|
|
747
|
-
*
|
|
748
|
-
* deadline: it can no longer run.
|
|
749
|
-
* queue can't
|
|
754
|
+
* whatever its stamp ({@link heldCall}). A queued call to a canonical target
|
|
755
|
+
* that enforces its deadline is passed over when that numbered block is past
|
|
756
|
+
* the deadline: it can no longer run. Without a numbered block, matching
|
|
757
|
+
* proposals remain held. Throws when the block, the nonce or the queue can't
|
|
758
|
+
* be read.
|
|
750
759
|
*/
|
|
751
760
|
async function findPendingSafeAppProposal(client, chainId, safe, call, service) {
|
|
752
761
|
// One block's view: its time, and the Safe's nonce in it. A proposal listed
|
|
@@ -763,10 +772,10 @@ async function findPendingSafeAppProposal(client, chainId, safe, call, service)
|
|
|
763
772
|
const queued = (await listPendingSafeTransactions(chainId, safe, Number(nonce), service)).flatMap((tx) => {
|
|
764
773
|
const proposed = proposedCall(tx);
|
|
765
774
|
return proposed && sameCall(heldCall(proposed), held)
|
|
766
|
-
? [{ tx, call: proposed, deadline: stampedDeadline(proposed) }]
|
|
775
|
+
? [{ tx, call: proposed, deadline: stampedDeadline(proposed, chainId) }]
|
|
767
776
|
: [];
|
|
768
777
|
});
|
|
769
|
-
const live = queued.find(({ deadline }) => deadline === null || deadline >= block.timestamp);
|
|
778
|
+
const live = queued.find(({ deadline }) => block.number === null || deadline === null || deadline >= block.timestamp);
|
|
770
779
|
return live
|
|
771
780
|
? {
|
|
772
781
|
tx: live.tx,
|
|
@@ -783,8 +792,11 @@ async function findPendingSafeAppProposal(client, chainId, safe, call, service)
|
|
|
783
792
|
async function lookAtSafeProposal(client, chainId, safe, proposalHash, service) {
|
|
784
793
|
try {
|
|
785
794
|
const block = await client.getBlock();
|
|
795
|
+
// Without a numbered block, the nonce and deadline have no common snapshot.
|
|
796
|
+
if (block.number === null)
|
|
797
|
+
return "live";
|
|
786
798
|
const nonce = await (0, safe_js_1.readBoundedSafeNonce)(client, safe, {
|
|
787
|
-
blockNumber: block.number
|
|
799
|
+
blockNumber: block.number,
|
|
788
800
|
});
|
|
789
801
|
const record = await readSafeTransaction(chainId, safe, proposalHash, service);
|
|
790
802
|
if (nonce === null || record.isExecuted)
|
|
@@ -792,7 +804,7 @@ async function lookAtSafeProposal(client, chainId, safe, proposalHash, service)
|
|
|
792
804
|
if (nonce > safeTransactionMessage(record).nonce)
|
|
793
805
|
return "passed";
|
|
794
806
|
const call = proposedCall(record);
|
|
795
|
-
const deadline = call && stampedDeadline(call);
|
|
807
|
+
const deadline = call && stampedDeadline(call, chainId);
|
|
796
808
|
return deadline !== null && block.timestamp > deadline ? "expired" : "live";
|
|
797
809
|
}
|
|
798
810
|
catch {
|
|
@@ -801,26 +813,21 @@ async function lookAtSafeProposal(client, chainId, safe, proposalHash, service)
|
|
|
801
813
|
}
|
|
802
814
|
/** A watch looks at its proposal once a minute, so it reads the Safe's nonce at most that often. */
|
|
803
815
|
const SAFE_LOOK_MS = 60_000;
|
|
804
|
-
/** How long looks in a row must find the Safe past a proposal before it counts as replaced. */
|
|
805
|
-
const SAFE_REPLACED_AFTER_MS = 10 * 60_000;
|
|
806
816
|
/**
|
|
807
817
|
* Watches a proposal awaiting its signers, one {@link lookAtSafeProposal} a
|
|
808
818
|
* minute, until `signal` aborts. It ends `expired` at the first look that
|
|
809
|
-
*
|
|
810
|
-
*
|
|
811
|
-
* the
|
|
819
|
+
* proves it expired before execution. A passed nonce with no indexed execution
|
|
820
|
+
* remains uncertain however long it lasts: the proposal itself may have run.
|
|
821
|
+
* Execution confirmation belongs to the caller's receipt reader. The return
|
|
822
|
+
* type retains `replaced` for compatibility, but this watch does not infer it
|
|
823
|
+
* from elapsed time or a missing service record.
|
|
812
824
|
*/
|
|
813
825
|
async function watchSafeProposal(client, chainId, safe, proposalHash, signal, service) {
|
|
814
|
-
let passedSince = null;
|
|
815
826
|
for (;;) {
|
|
816
827
|
await (0, pause_js_1.pause)(SAFE_LOOK_MS, signal, waitAborted);
|
|
817
828
|
const look = await lookAtSafeProposal(client, chainId, safe, proposalHash, service);
|
|
818
829
|
if (look === "expired")
|
|
819
830
|
return look;
|
|
820
|
-
passedSince = look === "passed" ? (passedSince ?? Date.now()) : null;
|
|
821
|
-
if (passedSince !== null &&
|
|
822
|
-
Date.now() - passedSince >= SAFE_REPLACED_AFTER_MS)
|
|
823
|
-
return "replaced";
|
|
824
831
|
}
|
|
825
832
|
}
|
|
826
833
|
/** Looks at the chain for an execution returned at once, and the pause between them. */
|