import type { Network, Account, Prices, Settings, Networks, HistoryItem } from '@/extension/types' import type { Ref } from 'vue' const defaultSettings = { enableStorageEnctyption: false, encryptAfterEveryTx: false, lockOutEnabled: false, lockOutPeriod: 2, lockOutBlocked: false, theme: 'system', lastLock: Date.now() } export const storageSave = async (key: string, value: any): Promise =>{ await chrome.storage.local.set({ [key]: value }) } export const storageGet = async (key: string): Promise<{ [key: string]: any }> => { return await chrome.storage.local.get(key) } export const storageWipe = async (): Promise => { await chrome.storage.local.clear() } export const getNetworks = async (): Promise => { return (await storageGet('networks'))?.networks ?? {} as Networks } export const replaceNetworks = async (networks: Networks): Promise => { await storageSave('networks', networks) } export const saveNetwork = async (network: Network): Promise => { const saveNetworks = await getNetworks() saveNetworks[network.chainId] = network await storageSave('networks', saveNetworks) } export const getSelectedNetwork = async (): Promise => { return (await storageGet('selectedNetwork'))?.selectedNetwork ?? null as unknown as Network } export const saveSelectedNetwork = async (selectedNetwork: Network ): Promise => { await storageSave('selectedNetwork', selectedNetwork ) } export const getAccounts = async (): Promise => { return (await storageGet('accounts')).accounts ?? [] as Account[] } export const saveAccount = async (account: Account): Promise => { const savedAccounts = await getAccounts() await storageSave('accounts', [account, ...savedAccounts]) } export const replaceAccounts = async (accounts: Account[]): Promise => { await storageSave('accounts', accounts) } export const getSelectedAccount = async (): Promise => { return (await storageGet('selectedAccount'))?.selectedAccount ?? null as unknown as Account } export const saveSelectedAccount = async (selectedAccount: Account): Promise => { await storageSave('selectedAccount', selectedAccount ) } export const setPrices = async (prices: Prices): Promise => { await storageSave('prices', prices ) } export const getPrices = async (): Promise => { return (await storageGet('prices'))?.prices ?? {} as unknown as Prices } export const getHistory = async (): Promise => { return (await storageGet('history'))?.history ?? [] as unknown as Prices } export const addToHistory = async (historyItem: HistoryItem): Promise => { const history = await getHistory() if (history.length >= 100) { history.pop() history.unshift(historyItem) } else { history.unshift(historyItem) } await storageSave('history', history) } export const wipeHistory = async (): Promise => { await storageSave('history', []) } export const getSettings = async (): Promise => { return (await storageGet('settings'))?.settings ?? defaultSettings as unknown as Settings } export const setSettings = async (settings: Settings): Promise => { await storageSave('settings', settings ) } export const blockLockout = async (): Promise => { const settings = await getSettings() settings.lockOutBlocked = true await setSettings(settings) return settings } export const unBlockLockout = async (): Promise => { const settings = await getSettings() settings.lockOutBlocked = false await setSettings(settings) return settings } export const getBalanceCache = async (): Promise => { return (await storageGet('balance'))?.balance ?? '0x0' } export const setBalanceCache = async (balance: string): Promise => { await storageSave('balance', balance ) } export const getRandomPk = () => { const array = new Uint32Array(10); crypto.getRandomValues(array) return array.reduce( (pv, cv) => `${pv}${cv.toString(16)}`, '0x' ).substring(0, 66) } export const smallRandomString = (size = 7) => { if(size <= 7) { return (Math.random() + 1).toString(36).substring(0,7); } else { let str = '' for(let i = 0; i < (size / 7) << 0; i++){ str+=(Math.random() + i).toString(36).substring(0,7); } return str.substring(0, size) } } export const clearPk = async (): Promise => { let accounts = await getAccounts() const accProm = accounts.map(async a => { if(a.encPk) { a.pk = '' } return a }) accounts = await Promise.all(accProm) await Promise.all([replaceAccounts(accounts), saveSelectedAccount(accounts[0])]) } export const hexTostr = (hexStr: string) => { if(hexStr.substring(0,2) === '0x') { const chunks = []; const hexCodes = hexStr.substring(2) for (let i = 0, charsLength = hexCodes.length; i < charsLength; i += 2) { chunks.push(hexCodes.substring(i, i + 2)); } return chunks.reduce( (pv, cv) => `${pv}${String.fromCharCode(parseInt(cv, 16))}`, '') } return hexStr } export const strToHex = (str: string) => `0x${str.split('').map( s => s.charCodeAt(0).toString(16) ).join('')}` export const numToHexStr = (num: number) => `0x${num.toString(16)}` export const copyAddress = async (address: string, toastRef: Ref) => { await navigator.clipboard.writeText(address) toastRef.value = true } export const getUrl = (url: string) => chrome.runtime.getURL(url) export const paste = (id: string) => { const el = document.getElementById(id) if(el){ el.focus(); (document as any)?.execCommand('paste') } } export const openTab = (url: string) => { chrome.tabs.create({ url }); }