All checks were successful
check / check (push) Successful in 17s
Creates a centralized transactionDetail.js view module, replacing the duplicated showTxDetail/copyableHtml/blockieHtml/txDetailAddressHtml code that was in both addressDetail.js and addressToken.js (~120 lines removed). Transaction data is stored in state.viewData and persisted, so the transaction detail view survives popup close/reopen. Adds viewData to persisted state. Each view that needs data for restore stores it in state.viewData before rendering. The ctx object now has showTransactionDetail() alongside all other show methods. Restorable views expanded to include: transaction (via viewData.tx), success-tx (via viewData.hash/blockNumber), error-tx (via viewData.message). txStatus.js split into show (sets data) + render (reads data) for each screen, enabling restore. Non-restorable views (send, confirm-tx, wait-tx, add-wallet, import-key, add-token) fall back to the nearest parent since they involve active form state or network polling.
131 lines
4.5 KiB
JavaScript
131 lines
4.5 KiB
JavaScript
// State management and extension storage persistence.
|
|
|
|
const { DEFAULT_RPC_URL, DEFAULT_BLOCKSCOUT_URL } = require("./constants");
|
|
|
|
const storageApi =
|
|
typeof browser !== "undefined"
|
|
? browser.storage.local
|
|
: chrome.storage.local;
|
|
|
|
const DEFAULT_STATE = {
|
|
hasWallet: false,
|
|
wallets: [],
|
|
trackedTokens: [],
|
|
rpcUrl: DEFAULT_RPC_URL,
|
|
blockscoutUrl: DEFAULT_BLOCKSCOUT_URL,
|
|
lastBalanceRefresh: 0,
|
|
activeAddress: null,
|
|
allowedSites: {},
|
|
deniedSites: {},
|
|
rememberSiteChoice: true,
|
|
showZeroBalanceTokens: true,
|
|
hideLowHolderTokens: true,
|
|
hideFraudContracts: true,
|
|
hideDustTransactions: true,
|
|
dustThresholdGwei: 100000,
|
|
fraudContracts: [],
|
|
tokenHolderCache: {},
|
|
};
|
|
|
|
const state = {
|
|
...DEFAULT_STATE,
|
|
currentView: null,
|
|
selectedWallet: null,
|
|
selectedAddress: null,
|
|
selectedToken: null,
|
|
viewData: {},
|
|
};
|
|
|
|
async function saveState() {
|
|
const persisted = {
|
|
hasWallet: state.hasWallet,
|
|
wallets: state.wallets,
|
|
trackedTokens: state.trackedTokens,
|
|
rpcUrl: state.rpcUrl,
|
|
blockscoutUrl: state.blockscoutUrl,
|
|
lastBalanceRefresh: state.lastBalanceRefresh,
|
|
activeAddress: state.activeAddress,
|
|
allowedSites: state.allowedSites,
|
|
deniedSites: state.deniedSites,
|
|
rememberSiteChoice: state.rememberSiteChoice,
|
|
showZeroBalanceTokens: state.showZeroBalanceTokens,
|
|
hideLowHolderTokens: state.hideLowHolderTokens,
|
|
hideFraudContracts: state.hideFraudContracts,
|
|
hideDustTransactions: state.hideDustTransactions,
|
|
dustThresholdGwei: state.dustThresholdGwei,
|
|
fraudContracts: state.fraudContracts,
|
|
tokenHolderCache: state.tokenHolderCache,
|
|
currentView: state.currentView,
|
|
selectedWallet: state.selectedWallet,
|
|
selectedAddress: state.selectedAddress,
|
|
selectedToken: state.selectedToken,
|
|
viewData: state.viewData,
|
|
};
|
|
await storageApi.set({ autistmask: persisted });
|
|
}
|
|
|
|
async function loadState() {
|
|
const result = await storageApi.get("autistmask");
|
|
if (result.autistmask) {
|
|
const saved = result.autistmask;
|
|
state.hasWallet = saved.hasWallet;
|
|
state.wallets = saved.wallets || [];
|
|
state.trackedTokens = saved.trackedTokens || [];
|
|
state.rpcUrl = saved.rpcUrl || DEFAULT_STATE.rpcUrl;
|
|
state.blockscoutUrl =
|
|
saved.blockscoutUrl || DEFAULT_STATE.blockscoutUrl;
|
|
state.lastBalanceRefresh = saved.lastBalanceRefresh || 0;
|
|
state.activeAddress = saved.activeAddress || null;
|
|
state.allowedSites =
|
|
saved.allowedSites && !Array.isArray(saved.allowedSites)
|
|
? saved.allowedSites
|
|
: {};
|
|
state.deniedSites =
|
|
saved.deniedSites && !Array.isArray(saved.deniedSites)
|
|
? saved.deniedSites
|
|
: {};
|
|
state.rememberSiteChoice =
|
|
saved.rememberSiteChoice !== undefined
|
|
? saved.rememberSiteChoice
|
|
: true;
|
|
state.showZeroBalanceTokens =
|
|
saved.showZeroBalanceTokens !== undefined
|
|
? saved.showZeroBalanceTokens
|
|
: true;
|
|
state.hideLowHolderTokens =
|
|
saved.hideLowHolderTokens !== undefined
|
|
? saved.hideLowHolderTokens
|
|
: true;
|
|
state.hideFraudContracts =
|
|
saved.hideFraudContracts !== undefined
|
|
? saved.hideFraudContracts
|
|
: true;
|
|
state.hideDustTransactions =
|
|
saved.hideDustTransactions !== undefined
|
|
? saved.hideDustTransactions
|
|
: true;
|
|
state.dustThresholdGwei =
|
|
saved.dustThresholdGwei !== undefined
|
|
? saved.dustThresholdGwei
|
|
: 100000;
|
|
state.fraudContracts = saved.fraudContracts || [];
|
|
state.tokenHolderCache = saved.tokenHolderCache || {};
|
|
state.currentView = saved.currentView || null;
|
|
state.selectedWallet =
|
|
saved.selectedWallet !== undefined ? saved.selectedWallet : null;
|
|
state.selectedAddress =
|
|
saved.selectedAddress !== undefined ? saved.selectedAddress : null;
|
|
state.selectedToken = saved.selectedToken || null;
|
|
state.viewData = saved.viewData || {};
|
|
}
|
|
}
|
|
|
|
function currentAddress() {
|
|
if (state.selectedWallet === null || state.selectedAddress === null) {
|
|
return null;
|
|
}
|
|
return state.wallets[state.selectedWallet].addresses[state.selectedAddress];
|
|
}
|
|
|
|
module.exports = { state, saveState, loadState, currentAddress };
|