Compare commits
1 Commits
d74dd40743
...
4e5635d959
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e5635d959 |
12
TODO.md
12
TODO.md
@@ -44,12 +44,6 @@ undefined identifiers, which is how
|
|||||||
|
|
||||||
# Completed Steps
|
# Completed Steps
|
||||||
|
|
||||||
- 2026-08-11: WaitTx lifecycle: a receipt and the 60-second timeout can no
|
|
||||||
longer both render on one tick, no timer or in-flight lookup outlives its
|
|
||||||
wait, a failed receipt lookup no longer counts as a timeout (but six in a row
|
|
||||||
end the wait, reported as an unreachable network rather than as a timeout),
|
|
||||||
and the wait now resumes after a popup close
|
|
||||||
([#155](https://git.eeqj.de/sneak/AutistMask/issues/155)).
|
|
||||||
- 2026-08-11: Known-symbol spoof verification became a Settings toggle
|
- 2026-08-11: Known-symbol spoof verification became a Settings toggle
|
||||||
(`hideSpoofedSymbols`), on by default, governing the transaction-history
|
(`hideSpoofedSymbols`), on by default, governing the transaction-history
|
||||||
filter and the fraud-contract learning it feeds
|
filter and the fraud-contract learning it feeds
|
||||||
@@ -112,6 +106,12 @@ undefined identifiers, which is how
|
|||||||
of trusting the persisted flag, so a profile already saved inconsistent no
|
of trusting the persisted flag, so a profile already saved inconsistent no
|
||||||
longer stays broken on every load
|
longer stays broken on every load
|
||||||
([#195](https://git.eeqj.de/sneak/AutistMask/issues/195)).
|
([#195](https://git.eeqj.de/sneak/AutistMask/issues/195)).
|
||||||
|
- 2026-08-11: WaitTx lifecycle: a receipt and the 60-second timeout can no
|
||||||
|
longer both render on one tick, no timer or in-flight lookup outlives its
|
||||||
|
wait, a failed receipt lookup no longer counts as a timeout (but six in a row
|
||||||
|
end the wait, reported as an unreachable network rather than as a timeout),
|
||||||
|
and the wait now resumes after a popup close
|
||||||
|
([#155](https://git.eeqj.de/sneak/AutistMask/issues/155)).
|
||||||
- 2026-08-11: Wallet deletion repairs its own state — `hasWallet` follows the
|
- 2026-08-11: Wallet deletion repairs its own state — `hasWallet` follows the
|
||||||
remaining wallets, the selection only moves when it was deleted, and the
|
remaining wallets, the selection only moves when it was deleted, and the
|
||||||
active-address change is broadcast to connected sites
|
active-address change is broadcast to connected sites
|
||||||
|
|||||||
@@ -195,12 +195,8 @@ function restoreWait() {
|
|||||||
// typeof [] is "object", so an array passes an object check.
|
// typeof [] is "object", so an array passes an object check.
|
||||||
const info = w.txInfo;
|
const info = w.txInfo;
|
||||||
if (!info || typeof info !== "object" || Array.isArray(info)) return false;
|
if (!info || typeof info !== "object" || Array.isArray(info)) return false;
|
||||||
// A string is the whole requirement: the empty string is what a
|
if (typeof info.to !== "string" || !info.to) return false;
|
||||||
// contract-deployment approval persists (approval.js writes `to: toAddr
|
if (typeof info.amount !== "string" || !info.amount) return false;
|
||||||
// || ""`), and both fields render harmlessly when empty, so refusing it
|
|
||||||
// would abandon a wait the live path itself created.
|
|
||||||
if (typeof info.to !== "string") return false;
|
|
||||||
if (typeof info.amount !== "string") return false;
|
|
||||||
if (typeof w.broadcastTime !== "number" || !isFinite(w.broadcastTime)) {
|
if (typeof w.broadcastTime !== "number" || !isFinite(w.broadcastTime)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -350,23 +350,6 @@ describe("WaitTx persistence across popup close", () => {
|
|||||||
expect(jest.getTimerCount()).toBe(0);
|
expect(jest.getTimerCount()).toBe(0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
test("restoreWait resumes a wait whose recipient is the empty string", () => {
|
|
||||||
// The shape a contract-deployment approval persists: approval.js
|
|
||||||
// writes `to: toAddr || ""`, and showWait() renders it without
|
|
||||||
// complaint. Validation must not be stricter than the live path, or
|
|
||||||
// that wait is silently abandoned on every popup open.
|
|
||||||
mockReceiptLookup.mockResolvedValue(null);
|
|
||||||
state.viewData = {
|
|
||||||
pendingWait: {
|
|
||||||
hash: TX_HASH,
|
|
||||||
txInfo: { ...TX_INFO, to: "" },
|
|
||||||
broadcastTime: Date.now(),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
expect(txStatus.restoreWait()).toBe(true);
|
|
||||||
expect(visible("wait-tx")).toBe(true);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("WaitTx against an RPC that never answers", () => {
|
describe("WaitTx against an RPC that never answers", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user