UNPKG

@unique-nft/utils

Version:

A tiny library to work with Substrate and Ethereum addresses and do some more

1 lines 40.5 kB
{"version":3,"sources":["../src/ExtensionTools/utils.ts","../src/ExtensionTools/ethereum.ts","../src/ExtensionTools/polkadot.ts","../src/ExtensionTools/index.ts"],"sourcesContent":["export const documentReadyPromiseAndWindowIsOk = (): Promise<boolean> => {\n if (typeof window === 'undefined') {\n return Promise.resolve(false)\n } else if(window.document.readyState === 'complete') {\n return Promise.resolve(true)\n } else {\n return new Promise<true>(resolve => window.addEventListener('load', () => resolve(true), {once: true}));\n }\n}\n","import {documentReadyPromiseAndWindowIsOk} from './utils'\n\nexport const windowIsOkSync = (): boolean => {\n return typeof window !== 'undefined' && !!(window as any).ethereum;\n}\n\nexport interface AddEthereumChainParameter {\n chainId: string // A 0x-prefixed hexadecimal string\n chainName: string\n nativeCurrency: {\n name: string\n symbol: string // 2-6 characters long\n decimals: 18\n }\n rpcUrls: string[]\n blockExplorerUrls?: string[]\n iconUrls?: string[] // Currently ignored\n}\n\nexport type UNIQUE_CHAIN = 'unique' | 'quartz' | 'opal' | 'sapphire'\nconst UNIQUE_CHAINS: UNIQUE_CHAIN[] = ['unique', 'quartz', 'opal', 'sapphire']\nconst UNIQUE_CHAIN_IDS: number[] = [8880, 8881, 8882, 8883]\n\nconst UniqueChainName: Record<UNIQUE_CHAIN, UNIQUE_CHAIN> = {\n unique: 'unique',\n quartz: 'quartz',\n opal: 'opal',\n sapphire: 'sapphire',\n}\nconst chainNameToChainId: Record<UNIQUE_CHAIN, number> = {\n unique: 8880,\n quartz: 8881,\n opal: 8882,\n sapphire: 8883\n}\nconst chainIdToChainName: Record<number, UNIQUE_CHAIN> = {\n 8880: 'unique',\n 8881: 'quartz',\n 8882: 'opal',\n 8883: 'sapphire'\n}\n\nconst isUniqueChainFactory = (chainName: UNIQUE_CHAIN) => (): boolean => {\n if (!windowIsOkSync()) {\n return false\n }\n const chainId = parseInt((window as any).ethereum.chainId, 16)\n return chainId === chainNameToChainId[chainName]\n}\nconst currentChainIs: Record<UNIQUE_CHAIN, () => boolean> & {\n anyUniqueChain: (chainId: string | number) => boolean\n byName: (chainName: string) => boolean\n} = {\n unique: isUniqueChainFactory('unique'),\n quartz: isUniqueChainFactory('quartz'),\n opal: isUniqueChainFactory('opal'),\n sapphire: isUniqueChainFactory('sapphire'),\n byName: (chainName: string) => {\n if (!UNIQUE_CHAINS.includes(chainName as UNIQUE_CHAIN)) {\n throw new Error(`Invalid chain name: ${chainName}`)\n }\n return isUniqueChainFactory(chainName as UNIQUE_CHAIN)()\n },\n anyUniqueChain: (chainId: string | number | null | undefined): boolean => {\n if (!chainId) return false\n\n // check if chain id is in the list of unique chains in string or number format\n return (\n (typeof chainId === 'string' && UNIQUE_CHAINS.includes(chainId as UNIQUE_CHAIN)) ||\n (typeof chainId === 'number' && UNIQUE_CHAIN_IDS.includes(chainId))\n )\n }\n}\n\n\nexport type IEthereumExtensionResult = {\n address: string\n chainId: number\n}\n\nexport type IEthereumExtensionError = Error & {\n extensionNotFound: boolean\n userRejected: boolean\n needToRequestAccess: boolean\n chainId: number | null\n}\n\n/**\n * @param requestInsteadOfGet - if true, will call eth_requestAccounts instead of eth_accounts\n * @returns {Promise<IEthereumExtensionResult>}\n * @throws {IEthereumExtensionError}\n */\nconst getOrRequestAccounts = async (requestInsteadOfGet: boolean = false): Promise<IEthereumExtensionResult> => {\n const windowIsOk = await documentReadyPromiseAndWindowIsOk()\n\n if (!windowIsOk) {\n // silently return empty result in non browser environment (e.g. nodejs)\n // to not bother if someone is using this lib in nodejs\n return {address: '', chainId: 0}\n }\n\n if (!(window as any).ethereum) {\n const error = new Error('No extension found') as IEthereumExtensionError\n error.extensionNotFound = true\n error.userRejected = false\n error.needToRequestAccess = false\n error.chainId = null\n\n throw error\n }\n\n const ethereum = (window as any).ethereum\n let accounts: string[] = []\n let chainId: number | null = null\n try {\n accounts = await ethereum.request({method: requestInsteadOfGet ? 'eth_requestAccounts' : 'eth_accounts'})\n chainId = parseInt(ethereum.chainId, 16)\n } catch (_error: any) {\n // EIP-1193 userRejectedRequest error code is 4001\n // If this happens, the user rejected the connection request.\n\n const error = _error as IEthereumExtensionError\n error.userRejected = _error.code === 4001\n error.extensionNotFound = false\n error.needToRequestAccess = false\n\n const chainIdStr = (window as any).ethereum?.chainId\n error.chainId = typeof chainIdStr === 'string' ? parseInt(chainIdStr, 16) : NaN\n\n throw error\n }\n\n const account = accounts[0]\n if (!account) {\n const error = new Error('Need to request account') as IEthereumExtensionError\n error.extensionNotFound = false\n error.userRejected = false\n error.needToRequestAccess = true\n error.chainId = chainId\n\n throw error\n }\n return {\n address: accounts[0],\n chainId,\n }\n}\n\nexport type IEthereumExtensionResultSafe = {\n result: IEthereumExtensionResult\n error: null\n} | {\n result: null\n error: IEthereumExtensionError\n}\n\nconst getOrRequestAccountsSafe = async (requestInsteadOfGet: boolean = false): Promise<IEthereumExtensionResultSafe> => {\n try {\n return {result: await getOrRequestAccounts(requestInsteadOfGet), error: null}\n } catch (error: any) {\n return {result: null, error}\n }\n}\n\nexport const addChainToExtension = async (chainData: AddEthereumChainParameter): Promise<void> => {\n const windowIsOk = await documentReadyPromiseAndWindowIsOk()\n if (!windowIsOk) return\n\n const ethereum = (window as any).ethereum\n\n if (ethereum.chainId === chainData.chainId) {\n console.log(`No need to add the chain to wallet - wallet already has ${chainData.chainName}'s chainId: ${ethereum.chainId} (${parseInt(ethereum.chainId)})`)\n return\n }\n\n try {\n await ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [chainData],\n })\n } catch (error: any) {\n console.error('Error during attempt to add chain to wallet', error.code, error)\n throw error\n }\n}\n\n\nconst UNIQUE_CHAINS_DATA_FOR_EXTENSIONS: Record<UNIQUE_CHAIN, AddEthereumChainParameter> = {\n unique: {\n chainId: '0x22b0',\n chainName: 'Unique',\n nativeCurrency: {\n name: 'Unique',\n symbol: 'UNQ',\n decimals: 18,\n },\n rpcUrls: [`https://rpc.unique.network`],\n iconUrls: [`https://ipfs.unique.network/ipfs/QmbJ7CGZ2GxWMp7s6jy71UGzRsMe4w3KANKXDAExYWdaFR`],\n blockExplorerUrls: ['https://uniquescan.io/unique/'],\n },\n quartz: {\n chainId: '0x22b1',\n chainName: 'Quartz by Unique',\n nativeCurrency: {\n name: 'Quartz',\n symbol: 'QTZ',\n decimals: 18,\n },\n rpcUrls: [`https://rpc-quartz.unique.network`],\n iconUrls: [`https://ipfs.unique.network/ipfs/QmaGPdccULQEFcCGxzstnmE8THfac2kSiGwvWRAiaRq4dp`],\n blockExplorerUrls: ['https://uniquescan.io/quartz/'],\n },\n opal: {\n chainId: '0x22b2',\n chainName: 'Opal by Unique',\n nativeCurrency: {\n name: 'Opal',\n symbol: 'OPL',\n decimals: 18,\n },\n rpcUrls: [`https://rpc-opal.unique.network`],\n iconUrls: [`https://ipfs.unique.network/ipfs/QmYJDpmWyjDa3H6BxweFmQXk4fU8b1GU7M9EqYcaUNvXzc`],\n blockExplorerUrls: ['https://uniquescan.io/opal/'],\n },\n sapphire: {\n chainId: '0x22b3',\n chainName: 'Sapphire by Unique',\n nativeCurrency: {\n name: 'Quartz',\n symbol: 'QTZ',\n decimals: 18,\n },\n rpcUrls: [`https://rpc-sapphire.unique.network`],\n iconUrls: [`https://ipfs.unique.network/ipfs/Qmd1PGt4cDRjFbh4ihP5QKEd4XQVwN1MkebYKdF56V74pf`],\n blockExplorerUrls: ['https://uniquescan.io/sapphire/'],\n },\n}\n\nconst addChain: Record<UNIQUE_CHAIN, () => Promise<void>> & {\n anyChain: (chainData: AddEthereumChainParameter) => Promise<void>\n byName: (chainName: string) => Promise<void>\n} = {\n unique: () => addChainToExtension(UNIQUE_CHAINS_DATA_FOR_EXTENSIONS.unique),\n quartz: () => addChainToExtension(UNIQUE_CHAINS_DATA_FOR_EXTENSIONS.quartz),\n opal: () => addChainToExtension(UNIQUE_CHAINS_DATA_FOR_EXTENSIONS.opal),\n sapphire: () => addChainToExtension(UNIQUE_CHAINS_DATA_FOR_EXTENSIONS.sapphire),\n anyChain: (chainData: AddEthereumChainParameter) => addChainToExtension(chainData),\n byName: (chainName: string) => {\n if (!UNIQUE_CHAINS.includes(chainName as UNIQUE_CHAIN)) {\n throw new Error(`Invalid chain name: ${chainName}`)\n }\n return addChainToExtension(UNIQUE_CHAINS_DATA_FOR_EXTENSIONS[chainName as UNIQUE_CHAIN])\n },\n}\n\nconst switchToChain = async (chainId: number | string): Promise<void> => {\n const windowIsOk = await documentReadyPromiseAndWindowIsOk()\n if (!windowIsOk) return\n\n const parsedChainId: string = typeof chainId === 'string' ? chainId : '0x' + chainId.toString(16)\n\n await (window as any).ethereum.request({method: 'wallet_switchEthereumChain', params: [{chainId: parsedChainId}]})\n}\nconst switchChainTo: Record<UNIQUE_CHAIN, () => Promise<void>> & {\n anyChain: (chainId: number | string) => Promise<void>\n byName: (chainName: string) => Promise<void>\n} = {\n unique: () => switchToChain(chainNameToChainId.unique),\n quartz: () => switchToChain(chainNameToChainId.quartz),\n opal: () => switchToChain(chainNameToChainId.opal),\n sapphire: () => switchToChain(chainNameToChainId.sapphire),\n anyChain: (chainId) => switchToChain(chainId),\n byName: (chainName) => {\n if (!UNIQUE_CHAINS.includes(chainName as UNIQUE_CHAIN)) {\n throw new Error(`Invalid chain name: ${chainName}`)\n }\n return switchToChain(chainNameToChainId[chainName as UNIQUE_CHAIN])\n },\n}\n\nexport type UpdateReason = 'account' | 'chain'\n\nconst subscribeOnChanges = (cb: (result: { reason: UpdateReason, chainId: number, address: string }) => void): (() => void) => {\n if (typeof window === 'undefined' || !(window as any).ethereum) {\n return () => undefined\n }\n\n const ethereum = (window as any).ethereum\n\n const refresh = (reason: UpdateReason) => {\n if (ethereum.chainId && ethereum.selectedAddress) {\n cb({reason, address: ethereum.selectedAddress, chainId: parseInt(ethereum.chainId, 16)})\n } else {\n getAccounts().then(({chainId, address}) => {\n cb({reason, chainId, address})\n }).catch((e) => console.error(`Error during attempt to update account info in subscribeOnChanges`, e))\n }\n }\n\n ethereum.on('accountsChanged', () => {\n refresh('account')\n })\n ethereum.on('chainChanged', () => {\n refresh('chain')\n })\n return () => {\n ethereum.removeListener('accountsChanged', refresh)\n ethereum.removeListener('networkChanged', refresh)\n }\n}\n\nimport type {ContractReceipt, Event} from 'ethers'\n\nconst parseEthersTxReceipt = <ParsedEvents = any>(tx: ContractReceipt, options = {decimals: 18}) => {\n const events = (tx.events || []).filter(event => !!event.event).map((event: Event, index) => {\n const args = event.args\n return {\n name: event.event || `event_${index.toString().padStart(4, '0')}`,\n // args: event.args!,\n events: !args ? {} : Object.keys(args)\n .filter(key => isNaN(parseInt(key)))\n .reduce((acc, key) => {\n const rawValue = args[key]\n const value = (typeof rawValue === 'object' && rawValue?._isBigNumber)\n ? rawValue.toBigInt()\n : rawValue\n acc[key] = value\n return acc\n }, {} as { [K: string]: any })\n }\n }).reduce((acc, elem) => {\n acc[elem.name] = elem.events\n return acc\n }, {} as { [K: string]: any }) as ParsedEvents\n\n const rawPrice = tx.gasUsed.toBigInt() * tx.effectiveGasPrice.toBigInt()\n const priceStr = rawPrice.toString().padStart(options.decimals + 1, '0')\n const price = parseFloat([priceStr.slice(0, -options.decimals), '.', priceStr.slice(-options.decimals)].join(''))\n\n return {\n get tx() {\n return tx\n },\n from: tx.from,\n to: tx.to,\n rawPrice,\n price,\n rawEvents: tx.events || [],\n events,\n gasUsed: tx.gasUsed.toBigInt(),\n cumulativeGasUsed: tx.cumulativeGasUsed.toBigInt(),\n effectiveGasPrice: tx.effectiveGasPrice.toBigInt(),\n }\n}\n\n/**\n * @returns {Promise<IEthereumExtensionResult>}\n * @throws {IEthereumExtensionError}\n */\nconst requestAccounts = () => getOrRequestAccounts(true)\n\n/**\n * @returns {Promise<IEthereumExtensionResult>}\n * @throws {IEthereumExtensionError}\n */\nconst getAccounts = () => getOrRequestAccounts()\n\nexport const Ethereum = {\n getOrRequestAccounts,\n getOrRequestAccountsSafe,\n\n requestAccounts,\n getAccounts,\n\n requestAccountsSafe: () => getOrRequestAccountsSafe(true),\n getAccountsSafe: () => getOrRequestAccountsSafe(),\n\n subscribeOnChanges,\n\n chainNameToChainId,\n chainIdToChainName,\n\n currentChainIs,\n addChain,\n switchChainTo,\n\n UNIQUE_CHAINS_DATA_FOR_EXTENSIONS,\n\n UNIQUE_CHAINS,\n UNIQUE_CHAIN_IDS,\n UniqueChainName,\n\n parseEthersTxReceipt,\n}\n","// =========================================\n// Polkadot types\n// =========================================\nimport {documentReadyPromiseAndWindowIsOk} from './utils'\n\nexport type KeypairType = 'ed25519' | 'sr25519' | 'ecdsa' | 'ethereum'\n\ninterface InjectedAccount {\n address: string\n genesisHash?: string | null\n name?: string\n type?: KeypairType\n}\n\ninterface InjectedWallet {\n accounts: {\n get(): Promise<InjectedAccount[]>\n }\n metadata?: any\n provider?: any\n signer: Signer\n}\n\ninterface NonInjectedWallet {\n enable(): Promise<InjectedWallet>\n\n version: string\n\n // waiting for PR https://github.com/polkadot-js/extension/pull/1126 being merged\n isEnabled?: boolean\n}\n\nexport interface SignerPayloadJSON {\n address: string\n blockHash: string\n blockNumber: string\n era: string\n genesisHash: string\n method: string\n nonce: string\n specVersion: string\n tip: string\n transactionVersion: string\n signedExtensions: string[]\n version: number\n}\n\nexport type SignerPayloadJSONWithAddressOptional = Omit<SignerPayloadJSON, 'address'> & { address?: string }\n\nexport interface SignerPayloadRaw {\n data: string\n address: string\n type: 'bytes' | 'payload'\n}\n\nexport type SignerPayloadRawWithAddressAndTypeOptional = {\n data: string\n address?: SignerPayloadRaw['address']\n type?: SignerPayloadRaw['type']\n}\n\nexport interface SignerResult {\n id: number\n signature: string //The resulting signature in hex string\n}\n\ninterface Signer {\n signPayload: (payload: SignerPayloadJSON) => Promise<SignerResult>\n signRaw: (raw: SignerPayloadRaw) => Promise<SignerResult>\n update?: (id: number, status: any) => void\n}\n\n// =========================================\n// Unique SDK types\n// =========================================\nexport interface UNIQUE_SDK_UnsignedTxPayloadBody {\n signerPayloadJSON?: SignerPayloadJSON\n signerPayloadRaw?: SignerPayloadRaw\n signerPayloadHex: string\n}\n\nexport interface UNIQUE_SDK_SignTxResultResponse {\n signature: string\n signatureType: KeypairType\n}\n\n\n// =========================================\n// module types\n// =========================================\nexport interface IPolkadotExtensionWalletInfo {\n name: string\n version: string\n isEnabled: boolean | undefined\n prettyName: string\n logo: {\n ipfsCid: string,\n url: string,\n }\n}\n\nexport interface IPolkadotExtensionWallet extends IPolkadotExtensionWalletInfo, Omit<InjectedWallet, 'accounts'> {\n accounts: IPolkadotExtensionAccount[]\n}\n\nexport interface IPolkadotExtensionAccount extends Omit<Signer, 'signRaw'> {\n name: string\n\n address: string\n addressShort: string\n\n id: string\n wallet: IPolkadotExtensionWalletInfo\n signRaw: (raw: SignerPayloadRawWithAddressAndTypeOptional | string) => Promise<SignerResult>\n // signPayload and update are inherited from Signer\n\n signer: {\n address: string\n sign: (unsignedTxPayload: UNIQUE_SDK_UnsignedTxPayloadBody) => Promise<UNIQUE_SDK_SignTxResultResponse>\n }\n\n meta: {\n genesisHash: string | null\n name: string\n source: string\n }\n type: KeypairType\n}\n\nexport type IPolkadotExtensionGenericInfo = Pick<IPolkadotExtensionWalletInfo, 'name' | 'prettyName' | 'logo'> & {\n webpage: string\n}\n\n\n// =========================================\n// constants\n// =========================================\nconst IPFS_GATEWAY = 'https://gateway.pinata.cloud/ipfs/'\n\nconst KNOWN_POLKADOT_EXTENSIONS: { [K: string]: { logoIpfsCid: string, prettyName: string, webpage: string } } = {\n 'polkadot-js': {\n logoIpfsCid: 'QmYWczavyNyh3yM56axyyQLgRqcFQYNKe5cDFPfLL94yrz',\n prettyName: 'Polkadot{.js}',\n webpage: 'https://polkadot.js.org/extension/',\n },\n 'subwallet-js': {\n logoIpfsCid: 'QmZ8BvFzGL5DRugJ3pytc1Jo1rTVYjW3mKUWBx7SvaEsdS',\n prettyName: 'Subwallet',\n webpage: 'https://subwallet.app/',\n },\n 'talisman': {\n logoIpfsCid: 'QmWHn4kVoG43U5coNhoR7Ec3Vus5YPjo9SkMvoiiLoy2bY',\n prettyName: 'Talisman',\n webpage: 'https://talisman.xyz/',\n },\n}\nconst FALLBACK_WALLET_LOGO_IPFS_CID = 'QmSC1B9X9ugWkfHKtd5guKTidh2qjvgdn8xXzbFrrHMiBM'\n\nconst compareTwoStrings = (a: string, b: string): number => a > b ? 1 : a < b ? -1 : 0\n\nconst knownPolkadotExtensions: IPolkadotExtensionGenericInfo[] = Object.entries(KNOWN_POLKADOT_EXTENSIONS).map(([name, info]) => {\n return {\n name,\n prettyName: info.prettyName,\n logo: {\n ipfsCid: info.logoIpfsCid,\n url: IPFS_GATEWAY + info.logoIpfsCid,\n },\n webpage: info.webpage,\n }\n}).sort((a, b) => compareTwoStrings(a.name, b.name))\n\nconst isWeb3Environment = async (): Promise<boolean> => {\n const windowIsOk = await documentReadyPromiseAndWindowIsOk()\n if (!windowIsOk) {\n return false\n }\n\n const injectedWeb3 = (window as any).injectedWeb3\n\n return !!injectedWeb3 && Object.keys(injectedWeb3).length !== 0\n}\n\nexport interface IPolkadotExtensionListWalletsResult {\n wallets: IPolkadotExtensionWalletInfo[]\n info: {\n extensionFound: boolean\n enabledWalletsNumber: number\n }\n}\n\nconst getWalletInfo = (walletName: string, nonInjectedWallet: NonInjectedWallet): IPolkadotExtensionWalletInfo => {\n // waiting for PR https://github.com/polkadot-js/extension/pull/1126 being merged\n const isEnabled = nonInjectedWallet.isEnabled // walletName === 'polkadot-js' // for testing,\n\n const prettyName = KNOWN_POLKADOT_EXTENSIONS[walletName]?.prettyName || walletName\n const logo = {\n ipfsCid: KNOWN_POLKADOT_EXTENSIONS[walletName]?.logoIpfsCid || FALLBACK_WALLET_LOGO_IPFS_CID,\n url: IPFS_GATEWAY + (KNOWN_POLKADOT_EXTENSIONS[walletName]?.logoIpfsCid || FALLBACK_WALLET_LOGO_IPFS_CID),\n }\n\n return {\n name: walletName,\n version: nonInjectedWallet.version,\n prettyName,\n logo,\n isEnabled,\n }\n}\n\nconst listWallets = async (): Promise<IPolkadotExtensionListWalletsResult> => {\n if (!(await isWeb3Environment())) {\n return {wallets: [], info: {extensionFound: false, enabledWalletsNumber: 0}}\n }\n\n const walletsArray = Object.entries((window as any).injectedWeb3) as Array<[string, NonInjectedWallet]>\n\n const wallets = walletsArray.map(([name, injectedWallet]) => getWalletInfo(name, injectedWallet))\n\n return {\n wallets,\n info: {\n extensionFound: true,\n enabledWalletsNumber: wallets.reduce((acc, wallet) => acc + (wallet.isEnabled ? 1 : 0), 0),\n },\n }\n}\n\nexport type IPolkadotExtensionLoadWalletByNameResultSafe = {\n result: IPolkadotExtensionWallet\n error: null\n} | {\n result: null\n error: Error\n}\n\nconst loadWalletByNameSafe = async (walletName: string): Promise<IPolkadotExtensionLoadWalletByNameResultSafe> => {\n if (!(await isWeb3Environment())) {\n return {result: null, error: new Error(`now injected web3 found or environment not a browser`)}\n }\n\n const injectedWeb3 = (window as any).injectedWeb3\n const rawWallet = injectedWeb3[walletName] as NonInjectedWallet\n\n if (!rawWallet) {\n return {result: null, error: new Error(`Wallet with name ${walletName} not found in \"window.injectedWeb3\"`)}\n }\n\n try {\n const walletInfo = getWalletInfo(walletName, rawWallet)\n\n const wallet = await rawWallet.enable()\n const accounts = await wallet.accounts.get()\n\n const parsedWallet: IPolkadotExtensionWallet = {\n ...walletInfo,\n ...wallet,\n accounts: accounts.map((account) => {\n const address = account.address\n const addressShort = `${address.slice(0, 5)}...${address.slice(-5)}`\n\n const id = `${walletName}/${address}`\n const accountName = account.name || `${walletName}/${addressShort}`\n\n const accountType = account.type || 'sr25519'\n\n const signRaw = async (payloadRaw: SignerPayloadRawWithAddressAndTypeOptional | string): Promise<SignerResult> => {\n if (!wallet.signer.signRaw) {\n throw new Error(`no signRaw in the wallet ${walletName}`)\n }\n\n const payload: SignerPayloadRaw = typeof payloadRaw === 'string'\n ? {address, data: payloadRaw, type: 'bytes'}\n : {address, ...payloadRaw, type: payloadRaw.type || 'bytes'}\n\n return wallet.signer.signRaw(payload)\n }\n const signPayload = async (payloadJSON: SignerPayloadJSONWithAddressOptional): Promise<SignerResult> => {\n if (!wallet.signer.signPayload) {\n throw new Error(`no signPayload in the wallet ${walletName}`)\n }\n return wallet.signer.signPayload({address, ...payloadJSON,})\n }\n\n const signer = {\n address,\n sign: async (unsignedTxPayload: UNIQUE_SDK_UnsignedTxPayloadBody): Promise<UNIQUE_SDK_SignTxResultResponse> => {\n const signatureType = accountType\n\n if (unsignedTxPayload.signerPayloadJSON) {\n const {signature} = await signPayload(unsignedTxPayload.signerPayloadJSON)\n\n return {signatureType, signature}\n }\n\n const toSign = unsignedTxPayload.signerPayloadRaw || unsignedTxPayload.signerPayloadHex\n\n const {signature} = await signRaw(toSign)\n\n return {signatureType, signature}\n }\n }\n\n const enhancedAccount: IPolkadotExtensionAccount = {\n ...account,\n name: accountName,\n id,\n address,\n addressShort,\n type: accountType,\n meta: {\n genesisHash: account.genesisHash || null,\n name: accountName,\n source: walletName,\n },\n wallet: walletInfo,\n signRaw,\n signPayload,\n update: wallet.signer.update,\n\n signer,\n }\n\n return enhancedAccount\n }),\n }\n return {result: parsedWallet, error: null}\n } catch (e: any) {\n return {result: null, error: e}\n }\n}\n\nconst loadWalletByName = async (walletName: string): Promise<IPolkadotExtensionWallet> => {\n const {result, error} = await loadWalletByNameSafe(walletName)\n if (error) {\n throw error\n }\n return result!\n}\n\nexport type IPolkadotExtensionLoadWalletsError = Error & {\n extensionNotFound: boolean\n accountsNotFound: boolean\n userHasWalletsButHasNoAccounts: boolean\n userHasBlockedAllWallets: boolean\n}\n\nexport interface IPolkadotExtensionLoadWalletsResult {\n wallets: IPolkadotExtensionWallet[]\n accounts: IPolkadotExtensionAccount[]\n\n rejectedWallets: Array<IPolkadotExtensionWalletInfo & {\n error: Error\n isBlockedByUser: boolean\n }>\n}\n\n/**\n * Load all wallets and accounts\n * @param onlyEnabled\n * @returns {Promise<IPolkadotExtensionLoadWalletsResult>}\n * @throws {IPolkadotExtensionLoadWalletsError}\n */\nconst loadWallets = async (onlyEnabled: boolean = false): Promise<IPolkadotExtensionLoadWalletsResult> => {\n if (!(await documentReadyPromiseAndWindowIsOk())) {\n return {wallets: [], accounts: [], rejectedWallets: []}\n }\n if (!(await isWeb3Environment())) {\n const error = new Error(`No injected web3 found`) as IPolkadotExtensionLoadWalletsError\n\n error.extensionNotFound = true\n error.accountsNotFound = false\n error.userHasWalletsButHasNoAccounts = false\n error.userHasBlockedAllWallets = false\n\n throw error\n }\n\n const allWallets = await Promise.all((await listWallets()).wallets\n .filter(wallet => !onlyEnabled || wallet.isEnabled)\n .map(async (wallet) => ({\n info: wallet,\n enabled: await loadWalletByNameSafe(wallet.name)\n }))\n )\n\n const wallets: IPolkadotExtensionLoadWalletsResult['wallets'] = allWallets\n .filter(wallet => !!wallet.enabled.result)\n .map(wallet => wallet.enabled.result as IPolkadotExtensionWallet)\n .sort((a, b) => compareTwoStrings(a.name, b.name))\n\n const rejectedWallets: IPolkadotExtensionLoadWalletsResult['rejectedWallets'] = allWallets\n .filter(wallet => !!wallet.enabled.error)\n .map(wallet => {\n const error = wallet.enabled.error as Error\n\n const result: IPolkadotExtensionLoadWalletsResult['rejectedWallets'][number] = {\n ...wallet.info,\n error,\n isBlockedByUser: error.message.indexOf('is not allowed to interact with this extension') >= 0,\n }\n\n return result\n })\n .sort((a, b) => compareTwoStrings(a.name, b.name))\n\n\n const accounts: IPolkadotExtensionLoadWalletsResult['accounts'] = wallets\n .flatMap(wallet => wallet.accounts)\n .sort((a, b) =>\n compareTwoStrings(a.wallet.name + a.name + a.address, b.wallet.name + b.name + b.address)\n )\n\n if (!accounts.length) {\n const error = new Error(`No accounts found`) as IPolkadotExtensionLoadWalletsError\n\n error.extensionNotFound = false\n error.accountsNotFound = true\n error.userHasWalletsButHasNoAccounts = !!wallets.length\n error.userHasBlockedAllWallets = !wallets.length && !!rejectedWallets.length && rejectedWallets.every(w => w.isBlockedByUser)\n\n throw error\n }\n\n return {\n wallets,\n rejectedWallets,\n accounts,\n }\n}\n\nexport type IPolkadotExtensionLoadWalletsResultSafe = {\n result: IPolkadotExtensionLoadWalletsResult\n error: null\n} | {\n result: null\n error: IPolkadotExtensionLoadWalletsError\n}\n\nconst loadWalletsSafe = async (onlyEnabled: boolean = false): Promise<IPolkadotExtensionLoadWalletsResultSafe> => {\n try {\n return {result: await loadWallets(onlyEnabled), error: null}\n } catch (e: any) {\n return {result: null, error: e}\n }\n}\n\nexport const Polkadot = {\n listWallets,\n\n enableAndLoadAllWallets: () => loadWallets(false),\n loadEnabledWallets: () => loadWallets(true),\n\n enableAndLoadAllWalletsSafe: () => loadWalletsSafe(false),\n loadEnabledWalletsSafe: () => loadWalletsSafe(true),\n\n loadWalletByName,\n loadWalletByNameSafe,\n\n constants: {\n knownPolkadotExtensions,\n extensionNames: {\n polkadot: 'polkadot-js',\n subwallet: 'subwallet-js',\n talisman: 'talisman',\n }\n }\n}\n","import {Ethereum} from './ethereum'\nimport {Polkadot} from './polkadot'\n\nconst ExtensionTools = {\n Ethereum,\n Polkadot,\n}\n\nconst UniqueChainName = Ethereum.UniqueChainName\n\nexport {ExtensionTools, Ethereum, Polkadot, UniqueChainName}\n\nexport default ExtensionTools\n\n// =========================================\n// types\n// =========================================\n\n\nexport type {\n AddEthereumChainParameter,\n UNIQUE_CHAIN,\n UpdateReason,\n IEthereumExtensionResult,\n IEthereumExtensionError,\n IEthereumExtensionResultSafe,\n} from './ethereum'\n\nexport type {\n IPolkadotExtensionWallet,\n IPolkadotExtensionWalletInfo,\n IPolkadotExtensionAccount,\n IPolkadotExtensionGenericInfo,\n IPolkadotExtensionLoadWalletsResult,\n IPolkadotExtensionListWalletsResult,\n IPolkadotExtensionLoadWalletsResultSafe,\n IPolkadotExtensionLoadWalletByNameResultSafe,\n IPolkadotExtensionLoadWalletsError,\n SignerPayloadJSON,\n SignerPayloadRaw,\n SignerPayloadRawWithAddressAndTypeOptional,\n SignerPayloadJSONWithAddressOptional,\n SignerResult,\n} from './polkadot'\n"],"mappings":"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","names":["signature","UniqueChainName"]}