@rango-dev/wallets-react 0.27.1-next.10 → 0.27.1-next.12
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/helpers/index.js +1 -1
- package/dist/helpers/index.js.map +3 -3
- package/dist/hub/autoConnect.d.ts.map +1 -1
- package/dist/hub/helpers.d.ts +2 -1
- package/dist/hub/helpers.d.ts.map +1 -1
- package/dist/hub/useHubAdapter.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +3 -3
- package/dist/wallets-react.build.json +1 -1
- package/package.json +5 -4
- package/src/hub/autoConnect.ts +9 -11
- package/src/hub/helpers.ts +11 -12
- package/src/hub/useHubAdapter.ts +54 -30
package/dist/helpers/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var g=Object.defineProperty;var o=(d,e)=>g(d,"name",{value:e,configurable:!0});import{guessProviderStateSelector as
|
|
1
|
+
var g=Object.defineProperty;var o=(d,e)=>g(d,"name",{value:e,configurable:!0});import{guessProviderStateSelector as je,namespaceStateSelector as Ue}from"@rango-dev/wallets-core";import{LegacyEvents as $e}from"@rango-dev/wallets-core/legacy";import{generateStoreId as Ge}from"@rango-dev/wallets-core/utils";import{pickVersion as C}from"@rango-dev/wallets-core/utils";import{convertEvmBlockchainMetaToEvmChainInfo as ze}from"@rango-dev/wallets-shared";import{isEvmBlockchain as Je}from"rango-types";var s="last-connected-wallets",r="hub-v1-last-connected-wallets";import{createContext as h}from"react";var c="Context hasn't been initialized yet.",w={async connect(){throw new Error(c)},async disconnect(){throw new Error(c)},async disconnectAll(){throw new Error(c)},async suggestAndConnect(){throw new Error(c)},state(){throw new Error(c)},canSwitchNetworkTo(){throw new Error(c)},providers(){throw new Error(c)},getWalletInfo(){throw new Error(c)},getSigners(){throw new Error(c)}},u=h(w);import{useEffect as he,useReducer as we}from"react";import{Persistor as i}from"@rango-dev/wallets-core/legacy";var l=class{static{o(this,"LastConnectedWalletsFromStorage")}#e;constructor(e){this.#e=e}addWallet(e,t){if(this.#e===r)return this.#t(e,t);if(this.#e===s)return this.#a(e);throw new Error("Not implemented")}removeWallets(e){if(this.#e===r)return this.#n(e);if(this.#e===s)return this.#c(e);throw new Error("Not implemented")}list(){if(this.#e===r)return this.#r();if(this.#e===s)return this.#o();throw new Error("Not implemented")}removeNamespacesFromWallet(e,t){if(this.#e===r)return this.#s(e,t);throw new Error("Not implemented")}#o(){let t=new i().getItem(s)||[],n={};return t.forEach(a=>{n[a]=[]}),n}#r(){return new i().getItem(r)||{}}#t(e,t){let n=new i,a=n.getItem(this.#e)||{};n.setItem(this.#e,{...a,[e]:t})}#a(e){let t=new i,n=t.getItem(this.#e)||[];t.setItem(s,n.concat(e))}#n(e){let t=new i,n=t.getItem(this.#e)||{};if(!e){t.setItem(this.#e,{});return}e.forEach(a=>{n[a]&&delete n[a]}),t.setItem(this.#e,n)}#s(e,t){let f=(new i().getItem(this.#e)||{})[e].filter(p=>!t.includes(p.namespace));this.#n([e]),this.#t(e,f)}#c(e){let t=new i,n=t.getItem(this.#e)||[];if(!e){t.setItem(this.#e,[]);return}t.setItem(s,n.filter(a=>!e.includes(a)))}};import{Persistor as F}from"@rango-dev/wallets-core/legacy";import{LegacyWallet as U}from"@rango-dev/wallets-core/legacy";import{useContext as $,useRef as q}from"react";import{useEffect as Z,useRef as ee}from"react";import{legacyFormatAddressWithNetwork as Te}from"@rango-dev/wallets-core/legacy";import{CAIP as be}from"@rango-dev/wallets-core/utils";import{Err as Re,Ok as Be}from"ts-results";var tt=new l(r);function m(d){let e="0.0.0",t=[];return d.forEach(n=>{let a=C(n,e);t.push(a[1])}),t}o(m,"getAllLegacyProviders");import"@rango-dev/wallets-shared";import{useEffect as Rt,useRef as Bt,useState as Ft}from"react";import{Ok as Ot,Result as Vt}from"ts-results";import{legacyEagerConnectHandler as st,legacyIsEvmNamespace as ct}from"@rango-dev/wallets-core/legacy";import{Result as it}from"ts-results";var pt=new l(r);import{createStore as vt,Hub as Ct}from"@rango-dev/wallets-core";import{useRef as Et}from"react";export{m as getAllLegacyProviders};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hub/utils.ts", "../../src/hub/constants.ts", "../../src/legacy/context.ts", "../../src/legacy/useLegacyProviders.ts", "../../src/hub/lastConnectedWallets.ts", "../../src/legacy/helpers.ts", "../../src/legacy/hooks.ts", "../../src/legacy/useAutoConnect.ts", "../../src/hub/helpers.ts", "../../src/hub/useHubAdapter.ts", "../../src/hub/autoConnect.ts", "../../src/hub/useHubRefs.ts"],
|
|
4
|
-
"sourcesContent": ["import type { AllProxiedNamespaces } from './types.js';\nimport type { Hub, Provider, State } from '@rango-dev/wallets-core';\nimport type {\n LegacyNamespaceInputForConnect,\n LegacyProviderInterface,\n LegacyEventHandler as WalletEventHandler,\n} from '@rango-dev/wallets-core/legacy';\n\nimport {\n guessProviderStateSelector,\n namespaceStateSelector,\n} from '@rango-dev/wallets-core';\nimport { LegacyEvents as Events } from '@rango-dev/wallets-core/legacy';\nimport {\n generateStoreId,\n type VersionedProviders,\n} from '@rango-dev/wallets-core/utils';\nimport { pickVersion } from '@rango-dev/wallets-core/utils';\nimport {\n type AddEthereumChainParameter,\n convertEvmBlockchainMetaToEvmChainInfo,\n} from '@rango-dev/wallets-shared';\nimport { type BlockchainMeta, isEvmBlockchain } from 'rango-types';\n\nimport {\n type ConnectResult,\n HUB_LAST_CONNECTED_WALLETS,\n type ProviderProps,\n} from '../legacy/mod.js';\n\nimport {\n fromAccountIdToLegacyAddressFormat,\n isConnectResultEvm,\n isConnectResultSolana,\n} from './helpers.js';\nimport { LastConnectedWalletsFromStorage } from './lastConnectedWallets.js';\n\n/* Gets a list of hub and legacy providers and returns a tuple which separates them. */\nexport function separateLegacyAndHubProviders(\n providers: VersionedProviders[]\n): [LegacyProviderInterface[], Provider[]] {\n const LEGACY_VERSION = '0.0.0';\n const HUB_VERSION = '1.0.0';\n\n const legacyProviders: LegacyProviderInterface[] = [];\n const hubProviders: Provider[] = [];\n\n providers.forEach((provider) => {\n try {\n const target = pickVersion(provider, HUB_VERSION);\n hubProviders.push(target[1]);\n } catch {\n const target = pickVersion(provider, LEGACY_VERSION);\n legacyProviders.push(target[1]);\n }\n });\n\n return [legacyProviders, hubProviders];\n}\n\nexport function findProviderByType(\n providers: Provider[],\n type: string\n): Provider | undefined {\n return providers.find((provider) => provider.id === type);\n}\n\n/**\n * We will call this function on hub's `subscribe`.\n * it will check states and will emit legacy events for backward compatibility.\n */\n\nconst lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n HUB_LAST_CONNECTED_WALLETS\n);\n\nexport function checkHubStateAndTriggerEvents(\n hub: Hub,\n currentState: State,\n previousState: State,\n onUpdateState: WalletEventHandler,\n allProviders: VersionedProviders[],\n allBlockChains: ProviderProps['allBlockChains']\n): void {\n hub.getAll().forEach((provider, providerId) => {\n const currentProviderState = guessProviderStateSelector(\n currentState,\n providerId\n );\n const previousProviderState = guessProviderStateSelector(\n previousState,\n providerId\n );\n\n let accounts: string[] | null = [];\n /*\n * We don't rely `accounts` to make sure we will trigger proper event on this case:\n * previous value: [0x...]\n * current value: []\n */\n let hasAccountChanged = false;\n let hasNetworkChanged = false;\n let hasProviderDisconnected = false;\n let anyNamespaceIsConnected = false;\n // It will pick the last network from namespaces.\n let maybeNetwork = null;\n const disconnectedNamespacesIds: string[] = [];\n\n provider.getAll().forEach((namespace) => {\n const storeId = generateStoreId(providerId, namespace.namespaceId);\n const currentNamespaceState = namespaceStateSelector(\n currentState,\n storeId\n );\n const previousNamespaceState = namespaceStateSelector(\n previousState,\n storeId\n );\n\n if (currentNamespaceState.network !== null) {\n maybeNetwork = currentNamespaceState.network;\n }\n\n // Check for network\n if (currentNamespaceState.network !== previousNamespaceState.network) {\n hasNetworkChanged = true;\n }\n\n // TODO: `accounts` has been frozen, we should check and find where object.freeze() is calling.\n\n // Check for accounts\n if (currentNamespaceState.accounts) {\n anyNamespaceIsConnected = true;\n if (\n previousNamespaceState.accounts?.slice().sort().toString() !==\n currentNamespaceState.accounts?.slice().sort().toString()\n ) {\n hasAccountChanged = true;\n }\n const formattedAddresses = currentNamespaceState.accounts.map(\n fromAccountIdToLegacyAddressFormat\n );\n\n if (accounts) {\n accounts = [...accounts, ...formattedAddresses];\n } else {\n accounts = [...formattedAddresses];\n }\n } else if (!!previousNamespaceState.accounts) {\n /*\n * If previously namespace was connected and now we can not get any accounts from the namespace, the namespace should be considered as disconnected.\n * For example switching to an account which did not permitted to connect yet or maybe the account does not support the requested namespace.\n */\n disconnectedNamespacesIds.push(namespace.namespaceId);\n hasAccountChanged = true;\n }\n });\n\n if (disconnectedNamespacesIds.length > 0) {\n lastConnectedWalletsFromStorage.removeNamespacesFromWallet(\n providerId,\n disconnectedNamespacesIds\n );\n }\n\n if (disconnectedNamespacesIds.length > 0 && !anyNamespaceIsConnected) {\n accounts = null;\n hasProviderDisconnected = true;\n }\n\n let legacyProvider;\n try {\n legacyProvider = getLegacyProvider(allProviders, providerId);\n } catch (e) {\n console.warn(\n 'Having legacy provider is required for including some information like supported chain. ',\n e\n );\n }\n\n const coreState = {\n connected: currentProviderState.connected,\n connecting: currentProviderState.connecting,\n installed: currentProviderState.installed,\n accounts: accounts,\n network: maybeNetwork,\n reachable: true,\n };\n\n const eventInfo = {\n supportedBlockchains:\n legacyProvider?.getWalletInfo(allBlockChains || []).supportedChains ||\n [],\n isContractWallet: false,\n isHub: true,\n };\n\n if (previousProviderState.installed !== currentProviderState.installed) {\n onUpdateState(\n providerId,\n Events.INSTALLED,\n currentProviderState.installed,\n coreState,\n eventInfo\n );\n }\n if (previousProviderState.connecting !== currentProviderState.connecting) {\n onUpdateState(\n providerId,\n Events.CONNECTING,\n currentProviderState.connecting,\n coreState,\n eventInfo\n );\n }\n if (previousProviderState.connected !== currentProviderState.connected) {\n onUpdateState(\n providerId,\n Events.CONNECTED,\n currentProviderState.connected,\n coreState,\n eventInfo\n );\n }\n if (hasAccountChanged) {\n // This event is triggered to clear wallet state and after that set new accounts for wallet\n onUpdateState(providerId, Events.ACCOUNTS, null, coreState, eventInfo);\n onUpdateState(\n providerId,\n Events.ACCOUNTS,\n accounts,\n coreState,\n eventInfo\n );\n }\n if (hasProviderDisconnected) {\n onUpdateState(providerId, Events.ACCOUNTS, null, coreState, eventInfo);\n }\n if (hasNetworkChanged) {\n onUpdateState(\n providerId,\n Events.NETWORK,\n maybeNetwork,\n coreState,\n eventInfo\n );\n }\n });\n}\n\nexport function getAllLegacyProviders(\n allProviders: VersionedProviders[]\n): LegacyProviderInterface[] {\n const LEGACY_VERSION = '0.0.0';\n\n const legacyProviders: LegacyProviderInterface[] = [];\n\n allProviders.forEach((provider) => {\n const target = pickVersion(provider, LEGACY_VERSION);\n legacyProviders.push(target[1]);\n });\n\n return legacyProviders;\n}\n\nexport function getLegacyProvider(\n allProviders: VersionedProviders[],\n type: string\n): LegacyProviderInterface {\n const legacyProviders: LegacyProviderInterface[] =\n getAllLegacyProviders(allProviders);\n\n const provider = legacyProviders.find((legacyProvider) => {\n return legacyProvider.config.type === type;\n });\n\n if (!provider) {\n console.warn(\n `You have a provider that doesn't have legacy provider. It causes some problems since we need some legacy functionality. Provider Id: ${type}`\n );\n throw new Error(\n `You need to have legacy implementation to use some methods. Provider Id: ${type}`\n );\n }\n\n return provider;\n}\n\n/**\n * In legacy mode, for those who have switch network functionality (like evm), we are using an enum for network names\n * this enum only has meaning for us, and when we are going to connect an instance (e.g. window.ethereum) we should pass chain id.\n */\nexport function convertNamespaceNetworkToEvmChainId(\n namespace: LegacyNamespaceInputForConnect,\n meta: BlockchainMeta[]\n) {\n if (!namespace.network) {\n return undefined;\n }\n\n const evmBlockchainsList = meta.filter(isEvmBlockchain);\n const evmChains = convertEvmBlockchainMetaToEvmChainInfo(evmBlockchainsList);\n\n return evmChains[namespace.network];\n}\n\n/**\n * We are passing an string for chain id (e.g. ETH, POLYGON), but wallet's instances (e.g. window.ethereum) needs chainId (e.g. 0x1).\n * This function will help us to map these strings to proper hex ids.\n *\n * If you need same functionality for other blockchain types (e.g. Cosmos), You can make a separate function and add it here.\n */\nexport function tryConvertNamespaceNetworkToChainInfo(\n namespace: LegacyNamespaceInputForConnect,\n meta: BlockchainMeta[]\n): string | AddEthereumChainParameter | undefined {\n // `undefined` means it's not evm or we couldn't find it in meta.\n const evmChain = convertNamespaceNetworkToEvmChainId(namespace, meta);\n const network = evmChain || namespace.network;\n\n return network;\n}\n\nexport function transformHubResultToLegacyResult(\n res: Awaited<ReturnType<AllProxiedNamespaces['connect']>>\n): ConnectResult {\n if (isConnectResultEvm(res)) {\n return {\n accounts: res.accounts,\n network: res.network,\n provider: undefined,\n };\n } else if (isConnectResultSolana(res)) {\n return {\n accounts: res,\n network: null,\n provider: undefined,\n };\n }\n\n return {\n accounts: [res],\n network: null,\n provider: undefined,\n };\n}\n\nexport function checkProviderListsEquality(\n providerList1: Provider[],\n providerList2: Provider[]\n) {\n const providerIds1 = providerList1\n .map((provider) => provider.id)\n .sort()\n .toString();\n const providerIds2 = providerList2\n .map((provider) => provider.id)\n .sort()\n .toString();\n\n return providerIds1 === providerIds2;\n}\n", "export const LEGACY_LAST_CONNECTED_WALLETS = 'last-connected-wallets';\nexport const HUB_LAST_CONNECTED_WALLETS = 'hub-v1-last-connected-wallets';\n", "import type { ProviderContext } from './types.js';\n\nimport { createContext } from 'react';\n\nconst defaultErrorMesssage = \"Context hasn't been initialized yet.\";\nconst defaultContext: ProviderContext = {\n async connect() {\n throw new Error(defaultErrorMesssage);\n },\n async disconnect() {\n throw new Error(defaultErrorMesssage);\n },\n async disconnectAll() {\n throw new Error(defaultErrorMesssage);\n },\n async suggestAndConnect() {\n throw new Error(defaultErrorMesssage);\n },\n state() {\n throw new Error(defaultErrorMesssage);\n },\n canSwitchNetworkTo() {\n throw new Error(defaultErrorMesssage);\n },\n providers() {\n throw new Error(defaultErrorMesssage);\n },\n getWalletInfo() {\n throw new Error(defaultErrorMesssage);\n },\n getSigners() {\n throw new Error(defaultErrorMesssage);\n },\n};\n\nexport const WalletContext = createContext<ProviderContext>(defaultContext);\n", "import type { ProviderContext, ProviderProps } from './types.js';\nimport type { LegacyProviderInterface } from '@rango-dev/wallets-core/legacy';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { useEffect, useReducer } from 'react';\n\nimport { autoConnect } from './autoConnect.js';\nimport {\n availableWallets,\n checkWalletProviders,\n clearPersistance,\n connectedWallets,\n defaultWalletState,\n makeEventHandler,\n stateReducer,\n tryPersistWallet,\n tryRemoveWalletFromPersistance,\n} from './helpers.js';\nimport { useInitializers } from './hooks.js';\nimport { useAutoConnect } from './useAutoConnect.js';\n\nexport type LegacyProviderProps = Omit<ProviderProps, 'providers'> & {\n providers: LegacyProviderInterface[];\n};\n\nexport function useLegacyProviders(\n props: LegacyProviderProps\n): ProviderContext {\n const [providersState, dispatch] = useReducer(stateReducer, {});\n\n // Get (or add) wallet instance (`provider`s will be wrapped in a `Wallet`)\n const getWalletInstance = useInitializers(\n makeEventHandler(dispatch, props.onUpdateState)\n );\n\n // Getting providers from props and put all of them in a `Map` with an appropriate interface.\n const listOfProviders = props.providers;\n const wallets = checkWalletProviders(listOfProviders);\n\n useAutoConnect({\n allBlockChains: props.allBlockChains,\n autoConnect: props.autoConnect,\n autoConnectHandler: async () => autoConnect(wallets, getWalletInstance),\n });\n\n // Final API we put in context and it will be available to use for users.\n const api: ProviderContext = {\n async connect(type, namespaces) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n // Legacy providers doesn't implemented multiple namespaces, so it will always be one value.\n let network = undefined;\n if (namespaces && namespaces.length > 0) {\n /*\n * This may not be safe in cases there are two `network` for namespaces, the first one will be picked always.\n * But since legacy provider only accepts one value, it shouldn't be happened when we are using legacy mode.\n */\n network = namespaces.find((ns) => !!ns.network)?.network;\n }\n\n const walletInstance = getWalletInstance(wallet);\n const result = await walletInstance.connect(network, namespaces);\n if (props.autoConnect) {\n void tryPersistWallet({\n type,\n walletActions: wallet.actions,\n getState: api.state,\n });\n }\n\n return [result];\n },\n async disconnect(type) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n const walletInstance = getWalletInstance(wallet);\n await walletInstance.disconnect();\n if (props.autoConnect) {\n tryRemoveWalletFromPersistance({ type, walletActions: wallet.actions });\n }\n },\n async disconnectAll() {\n const disconnect_promises: Promise<any>[] = [];\n\n /*\n * When a wallet is initializing, a record will be added to `providersState`\n * So we use them to know what wallet has been initialized then we need to\n * filter connected wallets only.\n */\n connectedWallets(providersState).forEach((type) => {\n const wallet = wallets.get(type);\n\n if (wallet) {\n const walletInstance = getWalletInstance(wallet);\n disconnect_promises.push(walletInstance.disconnect());\n }\n });\n\n if (props.autoConnect) {\n clearPersistance();\n }\n return await Promise.allSettled(disconnect_promises);\n },\n\n async suggestAndConnect(type, network) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n const walletInstance = getWalletInstance(wallet);\n const result = await walletInstance.suggestAndConnect(network);\n\n return result;\n },\n\n state(type) {\n return providersState[type] || defaultWalletState;\n },\n canSwitchNetworkTo(type, network) {\n const wallet = wallets.get(type);\n if (!wallet) {\n return false;\n }\n\n const walletInstance = getWalletInstance(wallet);\n return walletInstance.canSwitchNetworkTo\n ? walletInstance.canSwitchNetworkTo(network, walletInstance.provider)\n : false;\n },\n providers() {\n const providers: { [type in WalletType]?: any } = {};\n availableWallets(providersState).forEach((type) => {\n const wallet = wallets.get(type);\n if (wallet) {\n const walletInstance = getWalletInstance(wallet);\n providers[type] = walletInstance.provider;\n }\n });\n\n return providers;\n },\n getWalletInfo(type) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n /*\n * Get wallet info could be used in render methods to show wallets data\n * So, addWalletRef method shouldn't be called in this method\n */\n\n return wallet.actions.getWalletInfo(props.allBlockChains || []);\n },\n async getSigners(type) {\n const wallet = wallets.get(type);\n\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n const walletInstance = getWalletInstance(wallet);\n const provider = walletInstance.provider;\n const result = walletInstance.getSigners(provider);\n\n return result;\n },\n };\n\n // Initialize instances\n useEffect(() => {\n wallets.forEach((wallet) => {\n const walletInstance = getWalletInstance(wallet);\n const runOnInit = () => {\n if (walletInstance.onInit) {\n walletInstance.onInit();\n }\n };\n\n const initWhenPageIsReady = (event: Event) => {\n if (\n event.target &&\n (event.target as Document).readyState === 'complete'\n ) {\n runOnInit();\n\n document.removeEventListener('readystatechange', initWhenPageIsReady);\n }\n };\n\n // Try to run, maybe it's ready.\n runOnInit();\n\n /*\n * Try again when the page has been completely loaded.\n * Some of wallets, take some time to be fully injected and loaded.\n */\n document.addEventListener('readystatechange', initWhenPageIsReady);\n });\n }, []);\n\n // Setting supported blockchains on instances\n useEffect(() => {\n const allBlockChains = props.allBlockChains;\n if (allBlockChains) {\n wallets.forEach((wallet) => {\n const walletInstance = getWalletInstance(wallet);\n const walletInfo = walletInstance.getWalletInfo(\n props.allBlockChains || []\n );\n walletInstance.setInfo({\n supportedBlockchains: walletInfo.supportedChains,\n isContractWallet: !!walletInfo.isContractWallet,\n });\n });\n }\n }, [props.allBlockChains]);\n\n // Setting event handler on instances\n useEffect(() => {\n wallets.forEach((wallet) => {\n const walletInstance = getWalletInstance(wallet);\n walletInstance.setHandler(\n makeEventHandler(dispatch, props.onUpdateState)\n );\n });\n }, [props.onUpdateState]);\n\n return api;\n}\n", "import type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\n\nimport { Persistor } from '@rango-dev/wallets-core/legacy';\n\nimport {\n HUB_LAST_CONNECTED_WALLETS,\n LEGACY_LAST_CONNECTED_WALLETS,\n} from './constants.js';\n\nexport interface NamespaceInput {\n namespace: Namespace;\n network: string | undefined;\n}\n\nexport interface LastConnectedWalletsStorage {\n [providerId: string]: NamespaceInput[];\n}\n\nexport type LegacyLastConnectedWalletsStorage = string[];\n\n/**\n * We are doing some certain actions on storage for `last-connected-wallets` key.\n * This class helps us to define them in one place and also it has support for both legacy and hub.\n */\nexport class LastConnectedWalletsFromStorage {\n #storageKey: string;\n\n constructor(storageKey: string) {\n this.#storageKey = storageKey;\n }\n\n addWallet(providerId: string, namespaces: NamespaceInput[]): void {\n if (this.#storageKey === HUB_LAST_CONNECTED_WALLETS) {\n return this.#addWalletToHub(providerId, namespaces);\n } else if (this.#storageKey === LEGACY_LAST_CONNECTED_WALLETS) {\n return this.#addWalletToLegacy(providerId);\n }\n throw new Error('Not implemented');\n }\n removeWallets(providerIds?: string[]): void {\n if (this.#storageKey === HUB_LAST_CONNECTED_WALLETS) {\n return this.#removeWalletsFromHub(providerIds);\n } else if (this.#storageKey === LEGACY_LAST_CONNECTED_WALLETS) {\n return this.#removeWalletsFromLegacy(providerIds);\n }\n throw new Error('Not implemented');\n }\n list(): LastConnectedWalletsStorage {\n if (this.#storageKey === HUB_LAST_CONNECTED_WALLETS) {\n return this.#listFromHub();\n } else if (this.#storageKey === LEGACY_LAST_CONNECTED_WALLETS) {\n return this.#listFromLegacy();\n }\n throw new Error('Not implemented');\n }\n removeNamespacesFromWallet(providerId: string, namespaceIds: string[]) {\n if (this.#storageKey === HUB_LAST_CONNECTED_WALLETS) {\n return this.#removeNamespaceFromWalletHub(providerId, namespaceIds);\n }\n throw new Error('Not implemented');\n }\n\n #listFromLegacy(): LastConnectedWalletsStorage {\n const persistor = new Persistor<LegacyLastConnectedWalletsStorage>();\n const lastConnectedWallets =\n persistor.getItem(LEGACY_LAST_CONNECTED_WALLETS) || [];\n const output: LastConnectedWalletsStorage = {};\n lastConnectedWallets.forEach((provider) => {\n // Setting empty namespaces\n output[provider] = [];\n });\n return output;\n }\n #listFromHub(): LastConnectedWalletsStorage {\n const persistor = new Persistor<LastConnectedWalletsStorage>();\n const lastConnectedWallets =\n persistor.getItem(HUB_LAST_CONNECTED_WALLETS) || {};\n return lastConnectedWallets;\n }\n #addWalletToHub(providerId: string, namespaces: NamespaceInput[]): void {\n const storage = new Persistor<LastConnectedWalletsStorage>();\n const data = storage.getItem(this.#storageKey) || {};\n\n storage.setItem(this.#storageKey, {\n ...data,\n [providerId]: namespaces,\n });\n }\n #addWalletToLegacy(providerId: string): void {\n const storage = new Persistor<LegacyLastConnectedWalletsStorage>();\n const data = storage.getItem(this.#storageKey) || [];\n\n storage.setItem(LEGACY_LAST_CONNECTED_WALLETS, data.concat(providerId));\n }\n #removeWalletsFromHub(providerIds?: string[]): void {\n const persistor = new Persistor<LastConnectedWalletsStorage>();\n const storageState = persistor.getItem(this.#storageKey) || {};\n\n // Remove all wallets\n if (!providerIds) {\n persistor.setItem(this.#storageKey, {});\n return;\n }\n\n // Remove some of the wallets\n providerIds.forEach((providerId) => {\n if (storageState[providerId]) {\n delete storageState[providerId];\n }\n });\n\n persistor.setItem(this.#storageKey, storageState);\n }\n #removeNamespaceFromWalletHub(\n providerId: string,\n namespaceIds: string[]\n ): void {\n const persistor = new Persistor<LastConnectedWalletsStorage>();\n const storageState = persistor.getItem(this.#storageKey) || {};\n\n const currentProviderNamespaces = storageState[providerId];\n const newProviderNamespaces = currentProviderNamespaces.filter(\n (namespace) => !namespaceIds.includes(namespace.namespace)\n );\n\n this.#removeWalletsFromHub([providerId]);\n this.#addWalletToHub(providerId, newProviderNamespaces);\n }\n #removeWalletsFromLegacy(providerIds?: string[]): void {\n const persistor = new Persistor<LegacyLastConnectedWalletsStorage>();\n const storageState = persistor.getItem(this.#storageKey) || [];\n\n // Remove all wallets\n if (!providerIds) {\n persistor.setItem(this.#storageKey, []);\n return;\n }\n\n // Remove some of the wallets\n persistor.setItem(\n LEGACY_LAST_CONNECTED_WALLETS,\n storageState.filter((wallet) => !providerIds.includes(wallet))\n );\n }\n}\n", "import type {\n ProviderInterface,\n State,\n WalletActions,\n WalletProviders,\n} from './types.js';\nimport type {\n LegacyOptions as Options,\n LegacyEventHandler as WalletEventHandler,\n LegacyState as WalletState,\n} from '@rango-dev/wallets-core/legacy';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { Persistor } from '@rango-dev/wallets-core/legacy';\n\nimport { LEGACY_LAST_CONNECTED_WALLETS } from '../hub/constants.js';\nimport { LastConnectedWalletsFromStorage } from '../hub/lastConnectedWallets.js';\n\nexport function choose(wallets: any[], type: WalletType): any | null {\n return wallets.find((wallet) => wallet.type === type) || null;\n}\n\nexport const defaultWalletState: WalletState = {\n connected: false,\n connecting: false,\n reachable: false,\n installed: false,\n accounts: null,\n network: null,\n};\n\nexport function stateReducer(state: State, action: any) {\n if (action.type === 'new_state') {\n // TODO fix problem and remove ts-ignore\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const target_wallet = state[action.wallet];\n if (!target_wallet) {\n return {\n ...state,\n [action.wallet]: {\n ...defaultWalletState,\n [action.name]: action.value,\n },\n };\n }\n\n return {\n ...state,\n [action.wallet]: {\n ...target_wallet,\n [action.name]: action.value,\n },\n };\n }\n\n return state;\n}\n\nexport function connectedWallets(providersState: State): WalletType[] {\n return Object.entries(providersState)\n .filter(([, wallet_state]) => {\n return wallet_state?.connected;\n })\n .map(([type]) => {\n return type;\n });\n}\n\nexport function availableWallets(providersState: State): WalletType[] {\n return Object.entries(providersState).map(([type]) => {\n return type;\n });\n}\n\nexport function checkWalletProviders(\n list: ProviderInterface[]\n): WalletProviders {\n const wallets: WalletProviders = new Map();\n\n list.forEach((provider) => {\n const { config, ...actions } = provider;\n wallets.set(config.type, {\n actions,\n config,\n });\n });\n\n return wallets;\n}\n\n/* eslint-disable @typescript-eslint/ban-types */\nexport function isAsync(fn: Function) {\n return fn?.constructor?.name === 'AsyncFunction';\n}\n\nexport function needsCheckInstallation(options: Options) {\n const { checkInstallation = true } = options.config;\n return checkInstallation;\n}\n\nexport async function tryPersistWallet({\n type,\n walletActions,\n getState,\n}: {\n type: WalletType;\n walletActions: WalletActions;\n getState: (walletType: WalletType) => WalletState;\n}) {\n if (walletActions.canEagerConnect) {\n const lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n LEGACY_LAST_CONNECTED_WALLETS\n );\n const lastConnectedWallets = lastConnectedWalletsFromStorage.list();\n const walletAlreadyPersisted = !!lastConnectedWallets[type];\n\n /*\n *If on the last attempt we are unable to eagerly connect to any wallet and the user connects any wallet manualy,\n *persistance will be outdated and will need to be removed.\n */\n if (walletAlreadyPersisted && !getState(type).connected) {\n clearPersistance();\n }\n\n if (!walletAlreadyPersisted) {\n lastConnectedWalletsFromStorage.addWallet(type, []);\n }\n }\n}\n\nexport function tryRemoveWalletFromPersistance({\n type,\n walletActions,\n}: {\n type: WalletType;\n walletActions: WalletActions;\n}) {\n if (walletActions.canEagerConnect) {\n const lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n LEGACY_LAST_CONNECTED_WALLETS\n );\n lastConnectedWalletsFromStorage.removeWallets([type]);\n }\n}\n\nexport function clearPersistance() {\n const persistor = new Persistor<string[]>();\n const wallets = persistor.getItem(LEGACY_LAST_CONNECTED_WALLETS);\n if (wallets) {\n persistor.removeItem(LEGACY_LAST_CONNECTED_WALLETS);\n }\n}\n\n/*\n *Our event handler includes an internal state updater, and a notifier\n *for the outside listener.\n *On creating first wallet refrence, and on chaning `props.onUpdateState`\n *we are using this function.\n */\nexport function makeEventHandler(\n dispatcher: any,\n onUpdateState?: WalletEventHandler\n) {\n const handler: WalletEventHandler = (\n type,\n name,\n value,\n coreState,\n supportedChains\n ) => {\n const action = { type: 'new_state', wallet: type, name, value };\n // Update state\n dispatcher(action);\n\n // Giving the event to the outside listener\n if (onUpdateState) {\n onUpdateState(type, name, value, coreState, supportedChains);\n }\n };\n\n return handler;\n}\n", "import type { ProviderContext, WalletActions, WalletConfig } from './types.js';\nimport type { LegacyEventHandler as WalletEventHandler } from '@rango-dev/wallets-core/legacy';\n\nimport { LegacyWallet as Wallet } from '@rango-dev/wallets-core/legacy';\nimport { useContext, useRef } from 'react';\n\nimport { WalletContext } from './context.js';\n\nexport type GetWalletInstance = (wallet: {\n actions: WalletActions;\n config: WalletConfig;\n}) => Wallet;\n\nexport function useInitializers(\n onChangeState: WalletEventHandler\n): GetWalletInstance {\n const availableWallets = useRef<{\n [key: string]: Wallet | undefined;\n }>({});\n\n /*\n * If `wallet` hasn't been added to `availableWallets`,\n * Get a instance of `Wallet` and save the refrence in `availableWallets`.\n * Otherwise, return the already created instance.\n */\n function updater(wallet: {\n actions: WalletActions;\n config: WalletConfig;\n }): Wallet {\n const type = wallet.config.type;\n // We only update, if there is no instance available.\n if (typeof availableWallets.current[type] === 'undefined') {\n availableWallets.current[type] = new Wallet(\n {\n config: wallet.config,\n handler: onChangeState,\n },\n wallet.actions\n );\n }\n\n return availableWallets.current[type]!;\n }\n\n return updater;\n}\n\nexport function useWallets(): ProviderContext {\n const context = useContext(WalletContext);\n if (!context) {\n throw Error('useWallet can only be used within the Provider component');\n }\n return context;\n}\n", "import type { ProviderProps } from './types.js';\n\nimport { useEffect, useRef } from 'react';\n\nimport { shouldTryAutoConnect } from './utils.js';\n\nexport function useAutoConnect(\n props: Pick<ProviderProps, 'allBlockChains' | 'autoConnect'> & {\n /**\n * A function to run autoConnect on instances\n */\n autoConnectHandler: () => void;\n }\n) {\n const autoConnectInitiated = useRef(false);\n\n useEffect(() => {\n if (shouldTryAutoConnect(props) && !autoConnectInitiated.current) {\n autoConnectInitiated.current = true;\n props.autoConnectHandler();\n }\n }, [props.autoConnect, props.allBlockChains]);\n}\n", "import type { AllProxiedNamespaces } from './types.js';\nimport type {\n Accounts,\n AccountsWithActiveChain,\n} from '@rango-dev/wallets-core/namespaces/common';\n\nimport { legacyFormatAddressWithNetwork as formatAddressWithNetwork } from '@rango-dev/wallets-core/legacy';\nimport { CAIP } from '@rango-dev/wallets-core/utils';\n\nexport function mapCaipNamespaceToLegacyNetworkName(\n chainId: CAIP.ChainIdParams | string\n): string {\n if (typeof chainId === 'string') {\n return chainId;\n }\n const useNamespaceAsNetworkFor = ['solana'];\n\n if (useNamespaceAsNetworkFor.includes(chainId.namespace.toLowerCase())) {\n return chainId.namespace.toUpperCase();\n }\n\n if (chainId.namespace.toLowerCase() === 'eip155') {\n return 'ETH';\n }\n\n return chainId.reference;\n}\n\n/**\n * CAIP's accountId has a format like this: eip155:1:0xab16a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb\n * Legacy format is something like this: ETH:0xab16a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb\n * This function will try to convert this two format.\n *\n * @see https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md\n */\nexport function fromAccountIdToLegacyAddressFormat(account: string): string {\n const { chainId, address } = CAIP.AccountId.parse(account);\n const network = mapCaipNamespaceToLegacyNetworkName(chainId);\n return formatAddressWithNetwork(address, network);\n}\n\n/**\n * Getting a list of (lazy) promises and run them one after another.\n */\nexport async function runSequentiallyWithoutFailure<\n T extends () => Promise<unknown>\n>(\n promises: Array<T>\n): Promise<Array<T extends () => Promise<infer R> ? R : never>> {\n const result = await promises.reduce(async (prev, task) => {\n const previousResults = await prev;\n try {\n const taskResult = await task();\n\n return [...previousResults, taskResult];\n } catch (error) {\n return [...previousResults, error];\n }\n }, Promise.resolve([]) as Promise<any>);\n return result;\n}\n\nexport function isConnectResultEvm(\n result: Awaited<ReturnType<AllProxiedNamespaces['connect']>>\n): result is AccountsWithActiveChain {\n return typeof result === 'object' && !Array.isArray(result);\n}\n\nexport function isConnectResultSolana(\n result: Awaited<ReturnType<AllProxiedNamespaces['connect']>>\n): result is Accounts {\n return Array.isArray(result);\n}\n", "import type { AllProxiedNamespaces, ExtensionLink } from './types.js';\nimport type { Providers } from '../index.js';\nimport type { Provider } from '@rango-dev/wallets-core';\nimport type { LegacyNamespaceInputForConnect } from '@rango-dev/wallets-core/legacy';\nimport type { VersionedProviders } from '@rango-dev/wallets-core/utils';\n\nimport { type WalletInfo } from '@rango-dev/wallets-shared';\nimport { useEffect, useRef, useState } from 'react';\n\nimport {\n type ConnectResult,\n HUB_LAST_CONNECTED_WALLETS,\n type ProviderContext,\n type ProviderProps,\n} from '../legacy/mod.js';\nimport { useAutoConnect } from '../legacy/useAutoConnect.js';\n\nimport { autoConnect } from './autoConnect.js';\nimport { fromAccountIdToLegacyAddressFormat } from './helpers.js';\nimport {\n LastConnectedWalletsFromStorage,\n type NamespaceInput,\n} from './lastConnectedWallets.js';\nimport { useHubRefs } from './useHubRefs.js';\nimport {\n checkHubStateAndTriggerEvents,\n getLegacyProvider,\n transformHubResultToLegacyResult,\n tryConvertNamespaceNetworkToChainInfo,\n} from './utils.js';\n\nexport type UseAdapterParams = Omit<ProviderProps, 'providers'> & {\n providers: Provider[];\n /** This is only will be used to access some parts of the legacy provider that doesn't exists in Hub. */\n allVersionedProviders: VersionedProviders[];\n};\n\nexport function useHubAdapter(params: UseAdapterParams): ProviderContext {\n const { getStore, getHub } = useHubRefs(params.providers);\n const [, rerender] = useState(0);\n // useEffect will run `subscribe` once, so we need a reference and mutate the value if it's changes.\n const dataRef = useRef({\n onUpdateState: params.onUpdateState,\n allVersionedProviders: params.allVersionedProviders,\n allBlockChains: params.allBlockChains,\n });\n\n useEffect(() => {\n dataRef.current = {\n onUpdateState: params.onUpdateState,\n allVersionedProviders: params.allVersionedProviders,\n allBlockChains: params.allBlockChains,\n };\n }, [params]);\n\n // Initialize instances\n useEffect(() => {\n const runOnInit = () => {\n getHub().init();\n\n rerender((currentRender) => currentRender + 1);\n };\n\n // Then will call init whenever page is ready.\n const initHubWhenPageIsReady = (event: Event) => {\n // Then will call init whenever page is ready.\n if (\n event.target &&\n (event.target as Document).readyState === 'complete'\n ) {\n runOnInit();\n document.removeEventListener(\n 'readystatechange',\n initHubWhenPageIsReady\n );\n }\n };\n\n // Try to run, maybe it's ready.\n runOnInit();\n\n /*\n * Try again when the page has been completely loaded.\n * Some of wallets, take some time to be fully injected and loaded.\n */\n document.addEventListener('readystatechange', initHubWhenPageIsReady);\n\n getStore().subscribe((curr, prev) => {\n if (dataRef.current.onUpdateState) {\n checkHubStateAndTriggerEvents(\n getHub(),\n curr,\n prev,\n dataRef.current.onUpdateState,\n dataRef.current.allVersionedProviders,\n dataRef.current.allBlockChains\n );\n }\n rerender((currentRender) => currentRender + 1);\n });\n }, []);\n\n useAutoConnect({\n autoConnect: params.autoConnect,\n allBlockChains: params.allBlockChains,\n autoConnectHandler: () => {\n void autoConnect({\n getLegacyProvider: getLegacyProvider.bind(\n null,\n params.allVersionedProviders\n ),\n allBlockChains: params.allBlockChains,\n getHub,\n wallets: params.configs?.wallets,\n });\n },\n });\n\n const lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n HUB_LAST_CONNECTED_WALLETS\n );\n\n const api: ProviderContext = {\n canSwitchNetworkTo(type, network) {\n const provider = getLegacyProvider(params.allVersionedProviders, type);\n const switchTo = provider.canSwitchNetworkTo;\n\n if (!switchTo) {\n return false;\n }\n\n return switchTo({\n network,\n meta: params.allBlockChains || [],\n provider: provider.getInstance(),\n });\n },\n async connect(type, namespaces) {\n const wallet = getHub().get(type);\n if (!wallet) {\n throw new Error(\n `You should add ${type} to provider first then call 'connect'.`\n );\n }\n\n if (!namespaces) {\n throw new Error('Passing namespace to `connect` is required.');\n }\n\n // Check `namespace` and look into hub to see how it can match given namespace to hub namespace.\n const targetNamespaces: [\n LegacyNamespaceInputForConnect,\n AllProxiedNamespaces\n ][] = [];\n namespaces.forEach((namespace) => {\n const targetNamespace = namespace.namespace;\n\n const result = wallet.findByNamespace(targetNamespace);\n\n if (!result) {\n throw new Error(\n `We couldn't find any provider matched with your request namespace. (requested namespace: ${namespace.namespace})`\n );\n }\n\n targetNamespaces.push([namespace, result]);\n });\n\n // Keeping only namespaces that connected successfully, then we'll store them on storage for auto connect functionality.\n const successfulyConnectedNamespaces: NamespaceInput[] = [];\n\n // Try to run `connect` on matched namespaces\n const connectResultFromTargetNamespaces = targetNamespaces.map(\n async ([namespaceInput, namespace]) => {\n const network = tryConvertNamespaceNetworkToChainInfo(\n namespaceInput,\n params.allBlockChains || []\n );\n\n /*\n * `connect` can have different interfaces (e.g. Solana -> .connect(), EVM -> .connect(\"0x1\") ),\n * our assumption here is all the `connect` hasn't chain or if they have, they will accept it in first argument.\n * By this assumption, always passing a chain should be problematic since it will be ignored if the namespace's `connect` hasn't chain.\n */\n const result = namespace.connect(network);\n return result\n .then<ConnectResult>(transformHubResultToLegacyResult)\n .then((res) => {\n successfulyConnectedNamespaces.push({\n namespace: namespaceInput.namespace,\n network: namespaceInput.network,\n });\n return res;\n });\n }\n );\n\n // If Provider has support for auto connect, we will add the wallet to storage.\n const legacyProvider = getLegacyProvider(\n params.allVersionedProviders,\n type\n );\n\n if (legacyProvider.canEagerConnect) {\n void Promise.allSettled(connectResultFromTargetNamespaces).then(() => {\n if (successfulyConnectedNamespaces.length > 0) {\n lastConnectedWalletsFromStorage.addWallet(\n type,\n successfulyConnectedNamespaces\n );\n }\n });\n }\n\n const connectResultWithLegacyFormat = await Promise.all(\n connectResultFromTargetNamespaces\n );\n\n return connectResultWithLegacyFormat;\n },\n async disconnect(type) {\n const wallet = getHub().get(type);\n if (!wallet) {\n throw new Error(\n `You should add ${type} to provider first then call 'disconnect'.`\n );\n }\n\n wallet.getAll().forEach((namespace) => {\n return namespace.disconnect();\n });\n\n if (params.autoConnect) {\n lastConnectedWalletsFromStorage.removeWallets([type]);\n }\n },\n async disconnectAll() {\n const disconnectPromises: Promise<any>[] = Array.from(\n getHub().getAll().values()\n ).map(async (provider) => this.disconnect(provider.id));\n\n return await Promise.allSettled(disconnectPromises);\n },\n async getSigners(type) {\n const provider = getLegacyProvider(params.allVersionedProviders, type);\n return provider.getSigners(provider.getInstance());\n },\n getWalletInfo(type) {\n const wallet = getHub().get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n const info = wallet.info();\n if (!info) {\n throw new Error('Your provider should have required `info`.');\n }\n\n const provider = getLegacyProvider(params.allVersionedProviders, type);\n\n const installLink: Exclude<WalletInfo['installLink'], string> = {\n DEFAULT: '',\n };\n\n // `extensions` in legacy format was uppercase and also `DEFAULT` was used instead of `homepage`\n Object.keys(info.extensions).forEach((k) => {\n const key = k as ExtensionLink;\n\n if (info.extensions[key] === 'homepage') {\n installLink.DEFAULT = info.extensions[key] || '';\n }\n\n const allowedKeys: ExtensionLink[] = [\n 'firefox',\n 'chrome',\n 'brave',\n 'edge',\n ];\n if (allowedKeys.includes(key)) {\n const upperCasedKey = key.toUpperCase() as keyof Exclude<\n WalletInfo['installLink'],\n string\n >;\n installLink[upperCasedKey] = info.extensions[key] || '';\n }\n });\n\n const walletInfoFromLegacy = provider.getWalletInfo(\n params.allBlockChains || []\n );\n\n return {\n name: info.name,\n img: info.icon,\n installLink: installLink,\n // We don't have this values anymore, fill them with some values that communicate this.\n color: 'red',\n supportedChains: walletInfoFromLegacy.supportedChains,\n isContractWallet: false,\n mobileWallet: false,\n // if set to false here, it will not show the wallet in mobile in anyways. to be compatible with old behavior, undefined is more appropirate.\n showOnMobile: undefined,\n needsNamespace: walletInfoFromLegacy.needsNamespace,\n needsDerivationPath: walletInfoFromLegacy.needsDerivationPath,\n\n isHub: true,\n properties: wallet.info()?.properties,\n };\n },\n providers() {\n const output: Providers = {};\n\n Array.from(getHub().getAll().keys()).forEach((id) => {\n try {\n const provider = getLegacyProvider(params.allVersionedProviders, id);\n output[id] = provider.getInstance();\n } catch (e) {\n console.warn(e);\n }\n });\n\n return output;\n },\n state(type) {\n const result = getHub().state();\n const provider = result[type];\n\n if (!provider) {\n throw new Error(\n `It seems your requested provider doesn't exist in hub. Provider Id: ${type}`\n );\n }\n\n const accounts = provider.namespaces\n .filter((namespace) => namespace.connected)\n .flatMap((namespace) =>\n namespace.accounts?.map(fromAccountIdToLegacyAddressFormat)\n )\n .filter((account): account is string => !!account);\n\n const coreState = {\n connected: provider.connected,\n connecting: provider.connecting,\n installed: provider.installed,\n reachable: true,\n accounts: accounts,\n network: null,\n };\n return coreState;\n },\n suggestAndConnect(_type, _network): never {\n throw new Error('`suggestAndConnect` is not implemented');\n },\n };\n\n return api;\n}\n", "import type { AllProxiedNamespaces } from './types.js';\nimport type { UseAdapterParams } from './useHubAdapter.js';\nimport type { Hub } from '@rango-dev/wallets-core';\nimport type {\n LegacyNamespaceInputForConnect,\n LegacyProviderInterface,\n} from '@rango-dev/wallets-core/legacy';\nimport type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport {\n legacyEagerConnectHandler,\n legacyIsEvmNamespace,\n} from '@rango-dev/wallets-core/legacy';\n\nimport { HUB_LAST_CONNECTED_WALLETS } from '../legacy/mod.js';\n\nimport { runSequentiallyWithoutFailure } from './helpers.js';\nimport { LastConnectedWalletsFromStorage } from './lastConnectedWallets.js';\nimport { convertNamespaceNetworkToEvmChainId } from './utils.js';\n\n// Getting connected wallets from storage\nconst lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n HUB_LAST_CONNECTED_WALLETS\n);\n\n/**\n * Run `.connect` action on some selected namespaces (passed as param) for a provider.\n */\nasync function eagerConnect(\n type: string,\n namespacesInput: LegacyNamespaceInputForConnect[] | undefined,\n params: {\n getHub: () => Hub;\n allBlockChains: UseAdapterParams['allBlockChains'];\n }\n) {\n const { getHub, allBlockChains } = params;\n const wallet = getHub().get(type);\n if (!wallet) {\n throw new Error(\n `You should add ${type} to provider first then call 'connect'.`\n );\n }\n\n if (!namespacesInput) {\n throw new Error('Passing namespace to `connect` is required. ');\n }\n\n const targetNamespaces: [\n LegacyNamespaceInputForConnect,\n AllProxiedNamespaces\n ][] = [];\n namespacesInput.forEach((namespaceInput) => {\n const targetNamespace: Namespace = namespaceInput.namespace;\n\n const result = wallet.findByNamespace(targetNamespace);\n\n if (!result) {\n throw new Error(\n `We couldn't find any provider matched with your request namespace. (requested namespace: ${namespaceInput.namespace})`\n );\n }\n\n targetNamespaces.push([namespaceInput, result]);\n });\n\n const connectNamespacesPromises = targetNamespaces.map(\n ([info, namespace]) => {\n const evmChain = legacyIsEvmNamespace(info)\n ? convertNamespaceNetworkToEvmChainId(info, allBlockChains || [])\n : undefined;\n const chain = evmChain || info.network;\n\n return async () =>\n await namespace.connect(chain).catch((e) => {\n /*\n * Since we check for connect failures using `instanceof Error`\n * this check is added here to make sure the thrown error always is an instance of `Error`\n */\n if (e instanceof Error) {\n throw e;\n }\n throw new Error(e);\n });\n }\n );\n\n /**\n * Sometimes calling methods on a instance in parallel, would cause an error in wallet.\n * We are running a method at a time to make sure we are covering this.\n * e.g. when we are trying to eagerConnect evm and solana on phantom at the same time, the last namespace throw an error.\n */\n const connectNamespacesResult = await runSequentiallyWithoutFailure(\n connectNamespacesPromises\n );\n\n const failedNamespaces: LegacyNamespaceInputForConnect[] = [];\n connectNamespacesResult.forEach((result, index) => {\n if (result instanceof Error) {\n failedNamespaces.push(targetNamespaces[index][0]);\n }\n });\n\n if (failedNamespaces.length > 0) {\n lastConnectedWalletsFromStorage.removeNamespacesFromWallet(\n type,\n failedNamespaces.map((namespace) => namespace.namespace)\n );\n }\n\n const atLeastOneNamespaceConnectedSuccessfully =\n connectNamespacesResult.length - failedNamespaces.length > 0;\n if (!atLeastOneNamespaceConnectedSuccessfully) {\n throw new Error(`No namespace connected for ${type}`);\n }\n\n const successfulResult = connectNamespacesResult.filter(\n (result) => !(result instanceof Error)\n );\n return successfulResult;\n}\n\n/*\n *\n * Get last connected wallets from storage then run `.connect` on them if `.canEagerConnect` returns true.\n *\n * Note 1:\n * - It currently use `.getInstance`, `.canEagerConenct` and `getWalletInfo()`.supported chains from legacy provider implementation.\n * - For each namespace, we don't have a separate `.canEagerConnect`. it's only one and will be used for all namespaces.\n */\nexport async function autoConnect(deps: {\n getHub: () => Hub;\n allBlockChains: UseAdapterParams['allBlockChains'];\n getLegacyProvider: (type: string) => LegacyProviderInterface;\n wallets?: (WalletType | LegacyProviderInterface)[];\n}): Promise<void> {\n const { getHub, allBlockChains, getLegacyProvider, wallets } = deps;\n const lastConnectedWallets = lastConnectedWalletsFromStorage.list();\n const walletIds = Object.keys(lastConnectedWallets);\n\n const walletsToRemoveFromPersistance: string[] = [];\n\n if (walletIds.length) {\n const eagerConnectQueue: any[] = [];\n\n // Run `.connect` if `.canEagerConnect` returns `true`.\n walletIds.forEach((providerName) => {\n if (wallets && !wallets.includes(providerName)) {\n console.warn(\n 'Trying to run auto connect for a wallet which is not included in config. Desired wallet:',\n providerName\n );\n walletsToRemoveFromPersistance.push(providerName);\n return;\n }\n\n const legacyProvider = getLegacyProvider(providerName);\n\n let legacyInstance: any;\n try {\n legacyInstance = legacyProvider.getInstance();\n } catch (e) {\n console.warn(\n \"It seems instance isn't available yet for auto connect. This can happen when extension not loaded yet (sometimes when opening browser for first time) or extension is disabled. Desired wallet:\",\n providerName\n );\n return;\n }\n\n const namespaces: LegacyNamespaceInputForConnect[] = lastConnectedWallets[\n providerName\n ].map((namespace) => ({\n namespace: namespace.namespace,\n network: namespace.network,\n }));\n\n const canEagerConnect = async () => {\n if (!legacyProvider.canEagerConnect) {\n throw new Error(\n `${providerName} provider hasn't implemented canEagerConnect.`\n );\n }\n return await legacyProvider.canEagerConnect({\n instance: legacyInstance,\n meta: legacyProvider.getWalletInfo(allBlockChains || [])\n .supportedChains,\n });\n };\n const connectHandler = async () => {\n return eagerConnect(providerName, namespaces, {\n allBlockChains,\n getHub,\n });\n };\n\n eagerConnectQueue.push(\n legacyEagerConnectHandler({\n canEagerConnect,\n connectHandler,\n providerName,\n }).catch((e) => {\n walletsToRemoveFromPersistance.push(providerName);\n console.warn(e);\n })\n );\n });\n\n await Promise.all(eagerConnectQueue);\n\n lastConnectedWalletsFromStorage.removeWallets(\n walletsToRemoveFromPersistance\n );\n }\n}\n", "import type { Provider, Store } from '@rango-dev/wallets-core';\n\nimport { createStore, Hub } from '@rango-dev/wallets-core';\nimport { useRef } from 'react';\n\nimport { checkProviderListsEquality } from './utils.js';\n\nexport function useHubRefs(providers: Provider[]) {\n const store = useRef<Store | null>(null);\n\n const hub = useRef<Hub | null>(null);\n\n function createHub() {\n const createdHub = new Hub({\n store: getStore(),\n });\n /*\n * First add providers to hub\n * This helps to `getWalletInfo` be usable, before initialize.\n */\n providers.forEach((provider) => {\n createdHub.add(provider.id, provider);\n });\n hub.current = createdHub;\n return createdHub;\n }\n\n // https://react.dev/reference/react/useRef#avoiding-recreating-the-ref-contents\n function getStore() {\n if (store.current !== null) {\n return store.current;\n }\n const createdStore = createStore();\n store.current = createdStore;\n return createdStore;\n }\n\n function getHub(): Hub {\n const hubProviders = hub.current?.getAll();\n\n if (\n !hub.current ||\n !hubProviders ||\n // If hub does not contain a provider, it should be added\n !checkProviderListsEquality(Array.from(hubProviders.values()), providers)\n ) {\n return createHub();\n }\n return hub.current;\n }\n\n return { getStore, getHub };\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
6
|
-
"names": ["guessProviderStateSelector", "namespaceStateSelector", "Events", "generateStoreId", "pickVersion", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "LEGACY_LAST_CONNECTED_WALLETS", "HUB_LAST_CONNECTED_WALLETS", "createContext", "defaultErrorMesssage", "defaultContext", "WalletContext", "useEffect", "useReducer", "Persistor", "LastConnectedWalletsFromStorage", "__name", "#storageKey", "storageKey", "providerId", "namespaces", "HUB_LAST_CONNECTED_WALLETS", "#addWalletToHub", "LEGACY_LAST_CONNECTED_WALLETS", "#addWalletToLegacy", "providerIds", "#removeWalletsFromHub", "#removeWalletsFromLegacy", "#listFromHub", "#listFromLegacy", "namespaceIds", "#removeNamespaceFromWalletHub", "lastConnectedWallets", "Persistor", "output", "provider", "storage", "data", "persistor", "storageState", "newProviderNamespaces", "namespace", "wallet", "Persistor", "Wallet", "useContext", "useRef", "useEffect", "useRef", "formatAddressWithNetwork", "CAIP", "lastConnectedWalletsFromStorage", "LastConnectedWalletsFromStorage", "HUB_LAST_CONNECTED_WALLETS", "getAllLegacyProviders", "allProviders", "LEGACY_VERSION", "legacyProviders", "provider", "target", "pickVersion", "__name", "useEffect", "useRef", "useState", "legacyEagerConnectHandler", "legacyIsEvmNamespace", "lastConnectedWalletsFromStorage", "LastConnectedWalletsFromStorage", "HUB_LAST_CONNECTED_WALLETS", "createStore", "Hub", "useRef"]
|
|
4
|
+
"sourcesContent": ["import type { AllProxiedNamespaces } from './types.js';\nimport type { Hub, Provider, State } from '@rango-dev/wallets-core';\nimport type {\n LegacyNamespaceInputForConnect,\n LegacyProviderInterface,\n LegacyEventHandler as WalletEventHandler,\n} from '@rango-dev/wallets-core/legacy';\n\nimport {\n guessProviderStateSelector,\n namespaceStateSelector,\n} from '@rango-dev/wallets-core';\nimport { LegacyEvents as Events } from '@rango-dev/wallets-core/legacy';\nimport {\n generateStoreId,\n type VersionedProviders,\n} from '@rango-dev/wallets-core/utils';\nimport { pickVersion } from '@rango-dev/wallets-core/utils';\nimport {\n type AddEthereumChainParameter,\n convertEvmBlockchainMetaToEvmChainInfo,\n} from '@rango-dev/wallets-shared';\nimport { type BlockchainMeta, isEvmBlockchain } from 'rango-types';\n\nimport {\n type ConnectResult,\n HUB_LAST_CONNECTED_WALLETS,\n type ProviderProps,\n} from '../legacy/mod.js';\n\nimport {\n fromAccountIdToLegacyAddressFormat,\n isConnectResultEvm,\n isConnectResultSolana,\n} from './helpers.js';\nimport { LastConnectedWalletsFromStorage } from './lastConnectedWallets.js';\n\n/* Gets a list of hub and legacy providers and returns a tuple which separates them. */\nexport function separateLegacyAndHubProviders(\n providers: VersionedProviders[]\n): [LegacyProviderInterface[], Provider[]] {\n const LEGACY_VERSION = '0.0.0';\n const HUB_VERSION = '1.0.0';\n\n const legacyProviders: LegacyProviderInterface[] = [];\n const hubProviders: Provider[] = [];\n\n providers.forEach((provider) => {\n try {\n const target = pickVersion(provider, HUB_VERSION);\n hubProviders.push(target[1]);\n } catch {\n const target = pickVersion(provider, LEGACY_VERSION);\n legacyProviders.push(target[1]);\n }\n });\n\n return [legacyProviders, hubProviders];\n}\n\nexport function findProviderByType(\n providers: Provider[],\n type: string\n): Provider | undefined {\n return providers.find((provider) => provider.id === type);\n}\n\n/**\n * We will call this function on hub's `subscribe`.\n * it will check states and will emit legacy events for backward compatibility.\n */\n\nconst lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n HUB_LAST_CONNECTED_WALLETS\n);\n\nexport function checkHubStateAndTriggerEvents(\n hub: Hub,\n currentState: State,\n previousState: State,\n onUpdateState: WalletEventHandler,\n allProviders: VersionedProviders[],\n allBlockChains: ProviderProps['allBlockChains']\n): void {\n hub.getAll().forEach((provider, providerId) => {\n const currentProviderState = guessProviderStateSelector(\n currentState,\n providerId\n );\n const previousProviderState = guessProviderStateSelector(\n previousState,\n providerId\n );\n\n let accounts: string[] | null = [];\n /*\n * We don't rely `accounts` to make sure we will trigger proper event on this case:\n * previous value: [0x...]\n * current value: []\n */\n let hasAccountChanged = false;\n let hasNetworkChanged = false;\n let hasProviderDisconnected = false;\n let anyNamespaceIsConnected = false;\n // It will pick the last network from namespaces.\n let maybeNetwork = null;\n const disconnectedNamespacesIds: string[] = [];\n\n provider.getAll().forEach((namespace) => {\n const storeId = generateStoreId(providerId, namespace.namespaceId);\n const currentNamespaceState = namespaceStateSelector(\n currentState,\n storeId\n );\n const previousNamespaceState = namespaceStateSelector(\n previousState,\n storeId\n );\n\n if (currentNamespaceState.network !== null) {\n maybeNetwork = currentNamespaceState.network;\n }\n\n // Check for network\n if (currentNamespaceState.network !== previousNamespaceState.network) {\n hasNetworkChanged = true;\n }\n\n // TODO: `accounts` has been frozen, we should check and find where object.freeze() is calling.\n\n // Check for accounts\n if (currentNamespaceState.accounts) {\n anyNamespaceIsConnected = true;\n if (\n previousNamespaceState.accounts?.slice().sort().toString() !==\n currentNamespaceState.accounts?.slice().sort().toString()\n ) {\n hasAccountChanged = true;\n }\n const formattedAddresses = currentNamespaceState.accounts.map(\n fromAccountIdToLegacyAddressFormat\n );\n\n if (accounts) {\n accounts = [...accounts, ...formattedAddresses];\n } else {\n accounts = [...formattedAddresses];\n }\n } else if (!!previousNamespaceState.accounts) {\n /*\n * If previously namespace was connected and now we can not get any accounts from the namespace, the namespace should be considered as disconnected.\n * For example switching to an account which did not permitted to connect yet or maybe the account does not support the requested namespace.\n */\n disconnectedNamespacesIds.push(namespace.namespaceId);\n hasAccountChanged = true;\n }\n });\n\n if (disconnectedNamespacesIds.length > 0) {\n lastConnectedWalletsFromStorage.removeNamespacesFromWallet(\n providerId,\n disconnectedNamespacesIds\n );\n }\n\n if (disconnectedNamespacesIds.length > 0 && !anyNamespaceIsConnected) {\n accounts = null;\n hasProviderDisconnected = true;\n }\n\n let legacyProvider;\n try {\n legacyProvider = getLegacyProvider(allProviders, providerId);\n } catch (e) {\n console.warn(\n 'Having legacy provider is required for including some information like supported chain. ',\n e\n );\n }\n\n const coreState = {\n connected: currentProviderState.connected,\n connecting: currentProviderState.connecting,\n installed: currentProviderState.installed,\n accounts: accounts,\n network: maybeNetwork,\n reachable: true,\n };\n\n const eventInfo = {\n supportedBlockchains:\n legacyProvider?.getWalletInfo(allBlockChains || []).supportedChains ||\n [],\n isContractWallet: false,\n isHub: true,\n };\n\n if (previousProviderState.installed !== currentProviderState.installed) {\n onUpdateState(\n providerId,\n Events.INSTALLED,\n currentProviderState.installed,\n coreState,\n eventInfo\n );\n }\n if (previousProviderState.connecting !== currentProviderState.connecting) {\n onUpdateState(\n providerId,\n Events.CONNECTING,\n currentProviderState.connecting,\n coreState,\n eventInfo\n );\n }\n if (previousProviderState.connected !== currentProviderState.connected) {\n onUpdateState(\n providerId,\n Events.CONNECTED,\n currentProviderState.connected,\n coreState,\n eventInfo\n );\n }\n if (hasAccountChanged) {\n // This event is triggered to clear wallet state and after that set new accounts for wallet\n onUpdateState(providerId, Events.ACCOUNTS, null, coreState, eventInfo);\n onUpdateState(\n providerId,\n Events.ACCOUNTS,\n accounts,\n coreState,\n eventInfo\n );\n }\n if (hasProviderDisconnected) {\n onUpdateState(providerId, Events.ACCOUNTS, null, coreState, eventInfo);\n }\n if (hasNetworkChanged) {\n onUpdateState(\n providerId,\n Events.NETWORK,\n maybeNetwork,\n coreState,\n eventInfo\n );\n }\n });\n}\n\nexport function getAllLegacyProviders(\n allProviders: VersionedProviders[]\n): LegacyProviderInterface[] {\n const LEGACY_VERSION = '0.0.0';\n\n const legacyProviders: LegacyProviderInterface[] = [];\n\n allProviders.forEach((provider) => {\n const target = pickVersion(provider, LEGACY_VERSION);\n legacyProviders.push(target[1]);\n });\n\n return legacyProviders;\n}\n\nexport function getLegacyProvider(\n allProviders: VersionedProviders[],\n type: string\n): LegacyProviderInterface {\n const legacyProviders: LegacyProviderInterface[] =\n getAllLegacyProviders(allProviders);\n\n const provider = legacyProviders.find((legacyProvider) => {\n return legacyProvider.config.type === type;\n });\n\n if (!provider) {\n console.warn(\n `You have a provider that doesn't have legacy provider. It causes some problems since we need some legacy functionality. Provider Id: ${type}`\n );\n throw new Error(\n `You need to have legacy implementation to use some methods. Provider Id: ${type}`\n );\n }\n\n return provider;\n}\n\n/**\n * In legacy mode, for those who have switch network functionality (like evm), we are using an enum for network names\n * this enum only has meaning for us, and when we are going to connect an instance (e.g. window.ethereum) we should pass chain id.\n */\nexport function convertNamespaceNetworkToEvmChainId(\n namespace: LegacyNamespaceInputForConnect,\n meta: BlockchainMeta[]\n) {\n if (!namespace.network) {\n return undefined;\n }\n\n const evmBlockchainsList = meta.filter(isEvmBlockchain);\n const evmChains = convertEvmBlockchainMetaToEvmChainInfo(evmBlockchainsList);\n\n return evmChains[namespace.network];\n}\n\n/**\n * We are passing an string for chain id (e.g. ETH, POLYGON), but wallet's instances (e.g. window.ethereum) needs chainId (e.g. 0x1).\n * This function will help us to map these strings to proper hex ids.\n *\n * If you need same functionality for other blockchain types (e.g. Cosmos), You can make a separate function and add it here.\n */\nexport function tryConvertNamespaceNetworkToChainInfo(\n namespace: LegacyNamespaceInputForConnect,\n meta: BlockchainMeta[]\n): string | AddEthereumChainParameter | undefined {\n // `undefined` means it's not evm or we couldn't find it in meta.\n const evmChain = convertNamespaceNetworkToEvmChainId(namespace, meta);\n const network = evmChain || namespace.network;\n\n return network;\n}\n\nexport function transformHubResultToLegacyResult(\n res: Awaited<ReturnType<AllProxiedNamespaces['connect']>>\n): ConnectResult {\n if (isConnectResultEvm(res)) {\n return {\n accounts: res.accounts,\n network: res.network,\n provider: undefined,\n };\n } else if (isConnectResultSolana(res)) {\n return {\n accounts: res,\n network: null,\n provider: undefined,\n };\n }\n\n return {\n accounts: [res],\n network: null,\n provider: undefined,\n };\n}\n\nexport function checkProviderListsEquality(\n providerList1: Provider[],\n providerList2: Provider[]\n) {\n const providerIds1 = providerList1\n .map((provider) => provider.id)\n .sort()\n .toString();\n const providerIds2 = providerList2\n .map((provider) => provider.id)\n .sort()\n .toString();\n\n return providerIds1 === providerIds2;\n}\n", "export const LEGACY_LAST_CONNECTED_WALLETS = 'last-connected-wallets';\nexport const HUB_LAST_CONNECTED_WALLETS = 'hub-v1-last-connected-wallets';\n", "import type { ProviderContext } from './types.js';\n\nimport { createContext } from 'react';\n\nconst defaultErrorMesssage = \"Context hasn't been initialized yet.\";\nconst defaultContext: ProviderContext = {\n async connect() {\n throw new Error(defaultErrorMesssage);\n },\n async disconnect() {\n throw new Error(defaultErrorMesssage);\n },\n async disconnectAll() {\n throw new Error(defaultErrorMesssage);\n },\n async suggestAndConnect() {\n throw new Error(defaultErrorMesssage);\n },\n state() {\n throw new Error(defaultErrorMesssage);\n },\n canSwitchNetworkTo() {\n throw new Error(defaultErrorMesssage);\n },\n providers() {\n throw new Error(defaultErrorMesssage);\n },\n getWalletInfo() {\n throw new Error(defaultErrorMesssage);\n },\n getSigners() {\n throw new Error(defaultErrorMesssage);\n },\n};\n\nexport const WalletContext = createContext<ProviderContext>(defaultContext);\n", "import type { ProviderContext, ProviderProps } from './types.js';\nimport type { LegacyProviderInterface } from '@rango-dev/wallets-core/legacy';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { useEffect, useReducer } from 'react';\n\nimport { autoConnect } from './autoConnect.js';\nimport {\n availableWallets,\n checkWalletProviders,\n clearPersistance,\n connectedWallets,\n defaultWalletState,\n makeEventHandler,\n stateReducer,\n tryPersistWallet,\n tryRemoveWalletFromPersistance,\n} from './helpers.js';\nimport { useInitializers } from './hooks.js';\nimport { useAutoConnect } from './useAutoConnect.js';\n\nexport type LegacyProviderProps = Omit<ProviderProps, 'providers'> & {\n providers: LegacyProviderInterface[];\n};\n\nexport function useLegacyProviders(\n props: LegacyProviderProps\n): ProviderContext {\n const [providersState, dispatch] = useReducer(stateReducer, {});\n\n // Get (or add) wallet instance (`provider`s will be wrapped in a `Wallet`)\n const getWalletInstance = useInitializers(\n makeEventHandler(dispatch, props.onUpdateState)\n );\n\n // Getting providers from props and put all of them in a `Map` with an appropriate interface.\n const listOfProviders = props.providers;\n const wallets = checkWalletProviders(listOfProviders);\n\n useAutoConnect({\n allBlockChains: props.allBlockChains,\n autoConnect: props.autoConnect,\n autoConnectHandler: async () => autoConnect(wallets, getWalletInstance),\n });\n\n // Final API we put in context and it will be available to use for users.\n const api: ProviderContext = {\n async connect(type, namespaces) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n // Legacy providers doesn't implemented multiple namespaces, so it will always be one value.\n let network = undefined;\n if (namespaces && namespaces.length > 0) {\n /*\n * This may not be safe in cases there are two `network` for namespaces, the first one will be picked always.\n * But since legacy provider only accepts one value, it shouldn't be happened when we are using legacy mode.\n */\n network = namespaces.find((ns) => !!ns.network)?.network;\n }\n\n const walletInstance = getWalletInstance(wallet);\n const result = await walletInstance.connect(network, namespaces);\n if (props.autoConnect) {\n void tryPersistWallet({\n type,\n walletActions: wallet.actions,\n getState: api.state,\n });\n }\n\n return [result];\n },\n async disconnect(type) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n const walletInstance = getWalletInstance(wallet);\n await walletInstance.disconnect();\n if (props.autoConnect) {\n tryRemoveWalletFromPersistance({ type, walletActions: wallet.actions });\n }\n },\n async disconnectAll() {\n const disconnect_promises: Promise<any>[] = [];\n\n /*\n * When a wallet is initializing, a record will be added to `providersState`\n * So we use them to know what wallet has been initialized then we need to\n * filter connected wallets only.\n */\n connectedWallets(providersState).forEach((type) => {\n const wallet = wallets.get(type);\n\n if (wallet) {\n const walletInstance = getWalletInstance(wallet);\n disconnect_promises.push(walletInstance.disconnect());\n }\n });\n\n if (props.autoConnect) {\n clearPersistance();\n }\n return await Promise.allSettled(disconnect_promises);\n },\n\n async suggestAndConnect(type, network) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n const walletInstance = getWalletInstance(wallet);\n const result = await walletInstance.suggestAndConnect(network);\n\n return result;\n },\n\n state(type) {\n return providersState[type] || defaultWalletState;\n },\n canSwitchNetworkTo(type, network) {\n const wallet = wallets.get(type);\n if (!wallet) {\n return false;\n }\n\n const walletInstance = getWalletInstance(wallet);\n return walletInstance.canSwitchNetworkTo\n ? walletInstance.canSwitchNetworkTo(network, walletInstance.provider)\n : false;\n },\n providers() {\n const providers: { [type in WalletType]?: any } = {};\n availableWallets(providersState).forEach((type) => {\n const wallet = wallets.get(type);\n if (wallet) {\n const walletInstance = getWalletInstance(wallet);\n providers[type] = walletInstance.provider;\n }\n });\n\n return providers;\n },\n getWalletInfo(type) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n /*\n * Get wallet info could be used in render methods to show wallets data\n * So, addWalletRef method shouldn't be called in this method\n */\n\n return wallet.actions.getWalletInfo(props.allBlockChains || []);\n },\n async getSigners(type) {\n const wallet = wallets.get(type);\n\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n const walletInstance = getWalletInstance(wallet);\n const provider = walletInstance.provider;\n const result = walletInstance.getSigners(provider);\n\n return result;\n },\n };\n\n // Initialize instances\n useEffect(() => {\n wallets.forEach((wallet) => {\n const walletInstance = getWalletInstance(wallet);\n const runOnInit = () => {\n if (walletInstance.onInit) {\n walletInstance.onInit();\n }\n };\n\n const initWhenPageIsReady = (event: Event) => {\n if (\n event.target &&\n (event.target as Document).readyState === 'complete'\n ) {\n runOnInit();\n\n document.removeEventListener('readystatechange', initWhenPageIsReady);\n }\n };\n\n // Try to run, maybe it's ready.\n runOnInit();\n\n /*\n * Try again when the page has been completely loaded.\n * Some of wallets, take some time to be fully injected and loaded.\n */\n document.addEventListener('readystatechange', initWhenPageIsReady);\n });\n }, []);\n\n // Setting supported blockchains on instances\n useEffect(() => {\n const allBlockChains = props.allBlockChains;\n if (allBlockChains) {\n wallets.forEach((wallet) => {\n const walletInstance = getWalletInstance(wallet);\n const walletInfo = walletInstance.getWalletInfo(\n props.allBlockChains || []\n );\n walletInstance.setInfo({\n supportedBlockchains: walletInfo.supportedChains,\n isContractWallet: !!walletInfo.isContractWallet,\n });\n });\n }\n }, [props.allBlockChains]);\n\n // Setting event handler on instances\n useEffect(() => {\n wallets.forEach((wallet) => {\n const walletInstance = getWalletInstance(wallet);\n walletInstance.setHandler(\n makeEventHandler(dispatch, props.onUpdateState)\n );\n });\n }, [props.onUpdateState]);\n\n return api;\n}\n", "import type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\n\nimport { Persistor } from '@rango-dev/wallets-core/legacy';\n\nimport {\n HUB_LAST_CONNECTED_WALLETS,\n LEGACY_LAST_CONNECTED_WALLETS,\n} from './constants.js';\n\nexport interface NamespaceInput {\n namespace: Namespace;\n network: string | undefined;\n}\n\nexport interface LastConnectedWalletsStorage {\n [providerId: string]: NamespaceInput[];\n}\n\nexport type LegacyLastConnectedWalletsStorage = string[];\n\n/**\n * We are doing some certain actions on storage for `last-connected-wallets` key.\n * This class helps us to define them in one place and also it has support for both legacy and hub.\n */\nexport class LastConnectedWalletsFromStorage {\n #storageKey: string;\n\n constructor(storageKey: string) {\n this.#storageKey = storageKey;\n }\n\n addWallet(providerId: string, namespaces: NamespaceInput[]): void {\n if (this.#storageKey === HUB_LAST_CONNECTED_WALLETS) {\n return this.#addWalletToHub(providerId, namespaces);\n } else if (this.#storageKey === LEGACY_LAST_CONNECTED_WALLETS) {\n return this.#addWalletToLegacy(providerId);\n }\n throw new Error('Not implemented');\n }\n removeWallets(providerIds?: string[]): void {\n if (this.#storageKey === HUB_LAST_CONNECTED_WALLETS) {\n return this.#removeWalletsFromHub(providerIds);\n } else if (this.#storageKey === LEGACY_LAST_CONNECTED_WALLETS) {\n return this.#removeWalletsFromLegacy(providerIds);\n }\n throw new Error('Not implemented');\n }\n list(): LastConnectedWalletsStorage {\n if (this.#storageKey === HUB_LAST_CONNECTED_WALLETS) {\n return this.#listFromHub();\n } else if (this.#storageKey === LEGACY_LAST_CONNECTED_WALLETS) {\n return this.#listFromLegacy();\n }\n throw new Error('Not implemented');\n }\n removeNamespacesFromWallet(providerId: string, namespaceIds: string[]) {\n if (this.#storageKey === HUB_LAST_CONNECTED_WALLETS) {\n return this.#removeNamespaceFromWalletHub(providerId, namespaceIds);\n }\n throw new Error('Not implemented');\n }\n\n #listFromLegacy(): LastConnectedWalletsStorage {\n const persistor = new Persistor<LegacyLastConnectedWalletsStorage>();\n const lastConnectedWallets =\n persistor.getItem(LEGACY_LAST_CONNECTED_WALLETS) || [];\n const output: LastConnectedWalletsStorage = {};\n lastConnectedWallets.forEach((provider) => {\n // Setting empty namespaces\n output[provider] = [];\n });\n return output;\n }\n #listFromHub(): LastConnectedWalletsStorage {\n const persistor = new Persistor<LastConnectedWalletsStorage>();\n const lastConnectedWallets =\n persistor.getItem(HUB_LAST_CONNECTED_WALLETS) || {};\n return lastConnectedWallets;\n }\n #addWalletToHub(providerId: string, namespaces: NamespaceInput[]): void {\n const storage = new Persistor<LastConnectedWalletsStorage>();\n const data = storage.getItem(this.#storageKey) || {};\n\n storage.setItem(this.#storageKey, {\n ...data,\n [providerId]: namespaces,\n });\n }\n #addWalletToLegacy(providerId: string): void {\n const storage = new Persistor<LegacyLastConnectedWalletsStorage>();\n const data = storage.getItem(this.#storageKey) || [];\n\n storage.setItem(LEGACY_LAST_CONNECTED_WALLETS, data.concat(providerId));\n }\n #removeWalletsFromHub(providerIds?: string[]): void {\n const persistor = new Persistor<LastConnectedWalletsStorage>();\n const storageState = persistor.getItem(this.#storageKey) || {};\n\n // Remove all wallets\n if (!providerIds) {\n persistor.setItem(this.#storageKey, {});\n return;\n }\n\n // Remove some of the wallets\n providerIds.forEach((providerId) => {\n if (storageState[providerId]) {\n delete storageState[providerId];\n }\n });\n\n persistor.setItem(this.#storageKey, storageState);\n }\n #removeNamespaceFromWalletHub(\n providerId: string,\n namespaceIds: string[]\n ): void {\n const persistor = new Persistor<LastConnectedWalletsStorage>();\n const storageState = persistor.getItem(this.#storageKey) || {};\n\n const currentProviderNamespaces = storageState[providerId];\n const newProviderNamespaces = currentProviderNamespaces.filter(\n (namespace) => !namespaceIds.includes(namespace.namespace)\n );\n\n this.#removeWalletsFromHub([providerId]);\n this.#addWalletToHub(providerId, newProviderNamespaces);\n }\n #removeWalletsFromLegacy(providerIds?: string[]): void {\n const persistor = new Persistor<LegacyLastConnectedWalletsStorage>();\n const storageState = persistor.getItem(this.#storageKey) || [];\n\n // Remove all wallets\n if (!providerIds) {\n persistor.setItem(this.#storageKey, []);\n return;\n }\n\n // Remove some of the wallets\n persistor.setItem(\n LEGACY_LAST_CONNECTED_WALLETS,\n storageState.filter((wallet) => !providerIds.includes(wallet))\n );\n }\n}\n", "import type {\n ProviderInterface,\n State,\n WalletActions,\n WalletProviders,\n} from './types.js';\nimport type {\n LegacyOptions as Options,\n LegacyEventHandler as WalletEventHandler,\n LegacyState as WalletState,\n} from '@rango-dev/wallets-core/legacy';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { Persistor } from '@rango-dev/wallets-core/legacy';\n\nimport { LEGACY_LAST_CONNECTED_WALLETS } from '../hub/constants.js';\nimport { LastConnectedWalletsFromStorage } from '../hub/lastConnectedWallets.js';\n\nexport function choose(wallets: any[], type: WalletType): any | null {\n return wallets.find((wallet) => wallet.type === type) || null;\n}\n\nexport const defaultWalletState: WalletState = {\n connected: false,\n connecting: false,\n reachable: false,\n installed: false,\n accounts: null,\n network: null,\n};\n\nexport function stateReducer(state: State, action: any) {\n if (action.type === 'new_state') {\n // TODO fix problem and remove ts-ignore\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const target_wallet = state[action.wallet];\n if (!target_wallet) {\n return {\n ...state,\n [action.wallet]: {\n ...defaultWalletState,\n [action.name]: action.value,\n },\n };\n }\n\n return {\n ...state,\n [action.wallet]: {\n ...target_wallet,\n [action.name]: action.value,\n },\n };\n }\n\n return state;\n}\n\nexport function connectedWallets(providersState: State): WalletType[] {\n return Object.entries(providersState)\n .filter(([, wallet_state]) => {\n return wallet_state?.connected;\n })\n .map(([type]) => {\n return type;\n });\n}\n\nexport function availableWallets(providersState: State): WalletType[] {\n return Object.entries(providersState).map(([type]) => {\n return type;\n });\n}\n\nexport function checkWalletProviders(\n list: ProviderInterface[]\n): WalletProviders {\n const wallets: WalletProviders = new Map();\n\n list.forEach((provider) => {\n const { config, ...actions } = provider;\n wallets.set(config.type, {\n actions,\n config,\n });\n });\n\n return wallets;\n}\n\n/* eslint-disable @typescript-eslint/ban-types */\nexport function isAsync(fn: Function) {\n return fn?.constructor?.name === 'AsyncFunction';\n}\n\nexport function needsCheckInstallation(options: Options) {\n const { checkInstallation = true } = options.config;\n return checkInstallation;\n}\n\nexport async function tryPersistWallet({\n type,\n walletActions,\n getState,\n}: {\n type: WalletType;\n walletActions: WalletActions;\n getState: (walletType: WalletType) => WalletState;\n}) {\n if (walletActions.canEagerConnect) {\n const lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n LEGACY_LAST_CONNECTED_WALLETS\n );\n const lastConnectedWallets = lastConnectedWalletsFromStorage.list();\n const walletAlreadyPersisted = !!lastConnectedWallets[type];\n\n /*\n *If on the last attempt we are unable to eagerly connect to any wallet and the user connects any wallet manualy,\n *persistance will be outdated and will need to be removed.\n */\n if (walletAlreadyPersisted && !getState(type).connected) {\n clearPersistance();\n }\n\n if (!walletAlreadyPersisted) {\n lastConnectedWalletsFromStorage.addWallet(type, []);\n }\n }\n}\n\nexport function tryRemoveWalletFromPersistance({\n type,\n walletActions,\n}: {\n type: WalletType;\n walletActions: WalletActions;\n}) {\n if (walletActions.canEagerConnect) {\n const lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n LEGACY_LAST_CONNECTED_WALLETS\n );\n lastConnectedWalletsFromStorage.removeWallets([type]);\n }\n}\n\nexport function clearPersistance() {\n const persistor = new Persistor<string[]>();\n const wallets = persistor.getItem(LEGACY_LAST_CONNECTED_WALLETS);\n if (wallets) {\n persistor.removeItem(LEGACY_LAST_CONNECTED_WALLETS);\n }\n}\n\n/*\n *Our event handler includes an internal state updater, and a notifier\n *for the outside listener.\n *On creating first wallet refrence, and on chaning `props.onUpdateState`\n *we are using this function.\n */\nexport function makeEventHandler(\n dispatcher: any,\n onUpdateState?: WalletEventHandler\n) {\n const handler: WalletEventHandler = (\n type,\n name,\n value,\n coreState,\n supportedChains\n ) => {\n const action = { type: 'new_state', wallet: type, name, value };\n // Update state\n dispatcher(action);\n\n // Giving the event to the outside listener\n if (onUpdateState) {\n onUpdateState(type, name, value, coreState, supportedChains);\n }\n };\n\n return handler;\n}\n", "import type { ProviderContext, WalletActions, WalletConfig } from './types.js';\nimport type { LegacyEventHandler as WalletEventHandler } from '@rango-dev/wallets-core/legacy';\n\nimport { LegacyWallet as Wallet } from '@rango-dev/wallets-core/legacy';\nimport { useContext, useRef } from 'react';\n\nimport { WalletContext } from './context.js';\n\nexport type GetWalletInstance = (wallet: {\n actions: WalletActions;\n config: WalletConfig;\n}) => Wallet;\n\nexport function useInitializers(\n onChangeState: WalletEventHandler\n): GetWalletInstance {\n const availableWallets = useRef<{\n [key: string]: Wallet | undefined;\n }>({});\n\n /*\n * If `wallet` hasn't been added to `availableWallets`,\n * Get a instance of `Wallet` and save the refrence in `availableWallets`.\n * Otherwise, return the already created instance.\n */\n function updater(wallet: {\n actions: WalletActions;\n config: WalletConfig;\n }): Wallet {\n const type = wallet.config.type;\n // We only update, if there is no instance available.\n if (typeof availableWallets.current[type] === 'undefined') {\n availableWallets.current[type] = new Wallet(\n {\n config: wallet.config,\n handler: onChangeState,\n },\n wallet.actions\n );\n }\n\n return availableWallets.current[type]!;\n }\n\n return updater;\n}\n\nexport function useWallets(): ProviderContext {\n const context = useContext(WalletContext);\n if (!context) {\n throw Error('useWallet can only be used within the Provider component');\n }\n return context;\n}\n", "import type { ProviderProps } from './types.js';\n\nimport { useEffect, useRef } from 'react';\n\nimport { shouldTryAutoConnect } from './utils.js';\n\nexport function useAutoConnect(\n props: Pick<ProviderProps, 'allBlockChains' | 'autoConnect'> & {\n /**\n * A function to run autoConnect on instances\n */\n autoConnectHandler: () => void;\n }\n) {\n const autoConnectInitiated = useRef(false);\n\n useEffect(() => {\n if (shouldTryAutoConnect(props) && !autoConnectInitiated.current) {\n autoConnectInitiated.current = true;\n props.autoConnectHandler();\n }\n }, [props.autoConnect, props.allBlockChains]);\n}\n", "import type { AllProxiedNamespaces } from './types.js';\nimport type {\n Accounts,\n AccountsWithActiveChain,\n} from '@rango-dev/wallets-core/namespaces/common';\nimport type { Result } from 'ts-results';\n\nimport { legacyFormatAddressWithNetwork as formatAddressWithNetwork } from '@rango-dev/wallets-core/legacy';\nimport { CAIP } from '@rango-dev/wallets-core/utils';\nimport { Err, Ok } from 'ts-results';\n\nexport function mapCaipNamespaceToLegacyNetworkName(\n chainId: CAIP.ChainIdParams | string\n): string {\n if (typeof chainId === 'string') {\n return chainId;\n }\n const useNamespaceAsNetworkFor = ['solana'];\n\n if (useNamespaceAsNetworkFor.includes(chainId.namespace.toLowerCase())) {\n return chainId.namespace.toUpperCase();\n }\n\n if (chainId.namespace.toLowerCase() === 'eip155') {\n return 'ETH';\n }\n\n return chainId.reference;\n}\n\n/**\n * CAIP's accountId has a format like this: eip155:1:0xab16a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb\n * Legacy format is something like this: ETH:0xab16a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb\n * This function will try to convert this two format.\n *\n * @see https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md\n */\nexport function fromAccountIdToLegacyAddressFormat(account: string): string {\n const { chainId, address } = CAIP.AccountId.parse(account);\n const network = mapCaipNamespaceToLegacyNetworkName(chainId);\n return formatAddressWithNetwork(address, network);\n}\n\n/**\n * Getting a list of (lazy) promises and run them one after another.\n */\n\nexport async function runSequentiallyWithoutFailure<R>(\n promises: Array<() => Promise<R>>\n): Promise<Result<R, unknown>[]> {\n return promises.reduce(async (prevPromise, task) => {\n const previousResults = await prevPromise;\n try {\n const taskResult = await task();\n return [...previousResults, new Ok(taskResult)];\n } catch (error) {\n return [...previousResults, new Err(error)];\n }\n }, Promise.resolve<Result<R, unknown>[]>([]));\n}\n\nexport function isConnectResultEvm(\n result: Awaited<ReturnType<AllProxiedNamespaces['connect']>>\n): result is AccountsWithActiveChain {\n return typeof result === 'object' && !Array.isArray(result);\n}\n\nexport function isConnectResultSolana(\n result: Awaited<ReturnType<AllProxiedNamespaces['connect']>>\n): result is Accounts {\n return Array.isArray(result);\n}\n", "import type { AllProxiedNamespaces, ExtensionLink } from './types.js';\nimport type { Providers } from '../index.js';\nimport type { Provider } from '@rango-dev/wallets-core';\nimport type { LegacyNamespaceInputForConnect } from '@rango-dev/wallets-core/legacy';\nimport type { VersionedProviders } from '@rango-dev/wallets-core/utils';\n\nimport { type WalletInfo } from '@rango-dev/wallets-shared';\nimport { useEffect, useRef, useState } from 'react';\nimport { Ok, Result } from 'ts-results';\n\nimport {\n type ConnectResult,\n HUB_LAST_CONNECTED_WALLETS,\n type ProviderContext,\n type ProviderProps,\n} from '../legacy/mod.js';\nimport { useAutoConnect } from '../legacy/useAutoConnect.js';\n\nimport { autoConnect } from './autoConnect.js';\nimport {\n fromAccountIdToLegacyAddressFormat,\n runSequentiallyWithoutFailure,\n} from './helpers.js';\nimport { LastConnectedWalletsFromStorage } from './lastConnectedWallets.js';\nimport { useHubRefs } from './useHubRefs.js';\nimport {\n checkHubStateAndTriggerEvents,\n getLegacyProvider,\n transformHubResultToLegacyResult,\n tryConvertNamespaceNetworkToChainInfo,\n} from './utils.js';\n\nexport type UseAdapterParams = Omit<ProviderProps, 'providers'> & {\n providers: Provider[];\n /** This is only will be used to access some parts of the legacy provider that doesn't exists in Hub. */\n allVersionedProviders: VersionedProviders[];\n};\n\nexport function useHubAdapter(params: UseAdapterParams): ProviderContext {\n const { getStore, getHub } = useHubRefs(params.providers);\n const [, rerender] = useState(0);\n // useEffect will run `subscribe` once, so we need a reference and mutate the value if it's changes.\n const dataRef = useRef({\n onUpdateState: params.onUpdateState,\n allVersionedProviders: params.allVersionedProviders,\n allBlockChains: params.allBlockChains,\n });\n\n useEffect(() => {\n dataRef.current = {\n onUpdateState: params.onUpdateState,\n allVersionedProviders: params.allVersionedProviders,\n allBlockChains: params.allBlockChains,\n };\n }, [params]);\n\n // Initialize instances\n useEffect(() => {\n const runOnInit = () => {\n getHub().init();\n\n rerender((currentRender) => currentRender + 1);\n };\n\n // Then will call init whenever page is ready.\n const initHubWhenPageIsReady = (event: Event) => {\n // Then will call init whenever page is ready.\n if (\n event.target &&\n (event.target as Document).readyState === 'complete'\n ) {\n runOnInit();\n document.removeEventListener(\n 'readystatechange',\n initHubWhenPageIsReady\n );\n }\n };\n\n // Try to run, maybe it's ready.\n runOnInit();\n\n /*\n * Try again when the page has been completely loaded.\n * Some of wallets, take some time to be fully injected and loaded.\n */\n document.addEventListener('readystatechange', initHubWhenPageIsReady);\n\n getStore().subscribe((curr, prev) => {\n if (dataRef.current.onUpdateState) {\n checkHubStateAndTriggerEvents(\n getHub(),\n curr,\n prev,\n dataRef.current.onUpdateState,\n dataRef.current.allVersionedProviders,\n dataRef.current.allBlockChains\n );\n }\n rerender((currentRender) => currentRender + 1);\n });\n }, []);\n\n useAutoConnect({\n autoConnect: params.autoConnect,\n allBlockChains: params.allBlockChains,\n autoConnectHandler: () => {\n void autoConnect({\n getLegacyProvider: getLegacyProvider.bind(\n null,\n params.allVersionedProviders\n ),\n allBlockChains: params.allBlockChains,\n getHub,\n wallets: params.configs?.wallets,\n });\n },\n });\n\n const lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n HUB_LAST_CONNECTED_WALLETS\n );\n\n const api: ProviderContext = {\n canSwitchNetworkTo(type, network) {\n const provider = getLegacyProvider(params.allVersionedProviders, type);\n const switchTo = provider.canSwitchNetworkTo;\n\n if (!switchTo) {\n return false;\n }\n\n return switchTo({\n network,\n meta: params.allBlockChains || [],\n provider: provider.getInstance(),\n });\n },\n async connect(type, namespaces) {\n const wallet = getHub().get(type);\n if (!wallet) {\n throw new Error(\n `You should add ${type} to provider first then call 'connect'.`\n );\n }\n\n if (!namespaces) {\n throw new Error('Passing namespace to `connect` is required.');\n }\n\n // Check `namespace` and look into hub to see how it can match given namespace to hub namespace.\n const targetNamespaces: [\n LegacyNamespaceInputForConnect,\n AllProxiedNamespaces\n ][] = [];\n namespaces.forEach((namespace) => {\n const targetNamespace = namespace.namespace;\n\n const result = wallet.findByNamespace(targetNamespace);\n\n if (!result) {\n throw new Error(\n `We couldn't find any provider matched with your request namespace. (requested namespace: ${namespace.namespace})`\n );\n }\n\n targetNamespaces.push([namespace, result]);\n });\n\n // Try to run `connect` on matched namespaces\n const connectResultFromTargetNamespaces = targetNamespaces.map(\n ([namespaceInput, namespace]) => {\n const network = tryConvertNamespaceNetworkToChainInfo(\n namespaceInput,\n params.allBlockChains || []\n );\n\n /*\n * `connect` can have different interfaces (e.g. Solana -> .connect(), EVM -> .connect(\"0x1\") ),\n * our assumption here is all the `connect` hasn't chain or if they have, they will accept it in first argument.\n * By this assumption, always passing a chain should be problematic since it will be ignored if the namespace's `connect` hasn't chain.\n */\n return async () =>\n namespace\n .connect(network)\n .then<ConnectResult>(transformHubResultToLegacyResult)\n .then((connectResult) => {\n return {\n response: connectResult,\n input: {\n namespace: namespaceInput.namespace,\n network: namespaceInput.network,\n },\n };\n });\n }\n );\n\n /*\n * We need to connect to namespace one after another, sending multiple requests at the same time may be failed.\n * e.g. when wallet popup opens and asking for the password from the user, it should be resolved first, then other request will be resolved.\n */\n const connectResultWithLegacyFormat = await runSequentiallyWithoutFailure(\n connectResultFromTargetNamespaces\n );\n\n // Keeping only namespaces that connected successfully, then we'll store them on storage for auto connect functionality.\n const successfullyConnectedNamespaces = connectResultWithLegacyFormat\n .filter(<T, E>(result: Result<T, E>): result is Ok<T> => result.ok)\n .map((result) => {\n return {\n namespace: result.val.input.namespace,\n network: result.val.input.network,\n };\n });\n\n // If Provider has support for auto connect, we will add the wallet to storage.\n const legacyProvider = getLegacyProvider(\n params.allVersionedProviders,\n type\n );\n\n if (\n legacyProvider.canEagerConnect &&\n successfullyConnectedNamespaces.length > 0\n ) {\n lastConnectedWalletsFromStorage.addWallet(\n type,\n successfullyConnectedNamespaces\n );\n }\n\n // Getting rid of `input` from Result\n const connectResults = connectResultWithLegacyFormat.map((result) =>\n result.andThen((okResult) => new Ok(okResult.response))\n );\n\n const allResult = Result.all(...connectResults);\n if (allResult.err) {\n throw allResult.val;\n }\n\n return allResult.unwrap();\n },\n async disconnect(type) {\n const wallet = getHub().get(type);\n if (!wallet) {\n throw new Error(\n `You should add ${type} to provider first then call 'disconnect'.`\n );\n }\n\n wallet.getAll().forEach((namespace) => {\n return namespace.disconnect();\n });\n\n if (params.autoConnect) {\n lastConnectedWalletsFromStorage.removeWallets([type]);\n }\n },\n async disconnectAll() {\n const disconnectPromises: Promise<void>[] = Array.from(\n getHub().getAll().values()\n ).map(async (provider) => this.disconnect(provider.id));\n\n return await Promise.allSettled(disconnectPromises);\n },\n async getSigners(type) {\n const provider = getLegacyProvider(params.allVersionedProviders, type);\n return provider.getSigners(provider.getInstance());\n },\n getWalletInfo(type) {\n const wallet = getHub().get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n const info = wallet.info();\n if (!info) {\n throw new Error('Your provider should have required `info`.');\n }\n\n const provider = getLegacyProvider(params.allVersionedProviders, type);\n\n const installLink: Exclude<WalletInfo['installLink'], string> = {\n DEFAULT: '',\n };\n\n // `extensions` in legacy format was uppercase and also `DEFAULT` was used instead of `homepage`\n Object.keys(info.extensions).forEach((k) => {\n const key = k as ExtensionLink;\n\n if (info.extensions[key] === 'homepage') {\n installLink.DEFAULT = info.extensions[key] || '';\n }\n\n const allowedKeys: ExtensionLink[] = [\n 'firefox',\n 'chrome',\n 'brave',\n 'edge',\n ];\n if (allowedKeys.includes(key)) {\n const upperCasedKey = key.toUpperCase() as keyof Exclude<\n WalletInfo['installLink'],\n string\n >;\n installLink[upperCasedKey] = info.extensions[key] || '';\n }\n });\n\n const walletInfoFromLegacy = provider.getWalletInfo(\n params.allBlockChains || []\n );\n\n return {\n name: info.name,\n img: info.icon,\n installLink: installLink,\n // We don't have this values anymore, fill them with some values that communicate this.\n color: 'red',\n supportedChains: walletInfoFromLegacy.supportedChains,\n isContractWallet: false,\n mobileWallet: false,\n // if set to false here, it will not show the wallet in mobile in anyways. to be compatible with old behavior, undefined is more appropirate.\n showOnMobile: undefined,\n needsNamespace: walletInfoFromLegacy.needsNamespace,\n needsDerivationPath: walletInfoFromLegacy.needsDerivationPath,\n\n isHub: true,\n properties: wallet.info()?.properties,\n };\n },\n providers() {\n const output: Providers = {};\n\n Array.from(getHub().getAll().keys()).forEach((id) => {\n try {\n const provider = getLegacyProvider(params.allVersionedProviders, id);\n output[id] = provider.getInstance();\n } catch (e) {\n console.warn(e);\n }\n });\n\n return output;\n },\n state(type) {\n const result = getHub().state();\n const provider = result[type];\n\n if (!provider) {\n throw new Error(\n `It seems your requested provider doesn't exist in hub. Provider Id: ${type}`\n );\n }\n\n const accounts = provider.namespaces\n .filter((namespace) => namespace.connected)\n .flatMap((namespace) =>\n namespace.accounts?.map(fromAccountIdToLegacyAddressFormat)\n )\n .filter((account): account is string => !!account);\n\n const coreState = {\n connected: provider.connected,\n connecting: provider.connecting,\n installed: provider.installed,\n reachable: true,\n accounts: accounts,\n network: null,\n };\n return coreState;\n },\n suggestAndConnect(_type, _network): never {\n throw new Error('`suggestAndConnect` is not implemented');\n },\n };\n\n return api;\n}\n", "import type { AllProxiedNamespaces } from './types.js';\nimport type { UseAdapterParams } from './useHubAdapter.js';\nimport type { Hub } from '@rango-dev/wallets-core';\nimport type {\n LegacyNamespaceInputForConnect,\n LegacyProviderInterface,\n} from '@rango-dev/wallets-core/legacy';\nimport type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport {\n legacyEagerConnectHandler,\n legacyIsEvmNamespace,\n} from '@rango-dev/wallets-core/legacy';\nimport { Result } from 'ts-results';\n\nimport { HUB_LAST_CONNECTED_WALLETS } from '../legacy/mod.js';\n\nimport { runSequentiallyWithoutFailure } from './helpers.js';\nimport { LastConnectedWalletsFromStorage } from './lastConnectedWallets.js';\nimport { convertNamespaceNetworkToEvmChainId } from './utils.js';\n\n// Getting connected wallets from storage\nconst lastConnectedWalletsFromStorage = new LastConnectedWalletsFromStorage(\n HUB_LAST_CONNECTED_WALLETS\n);\n\n/**\n * Run `.connect` action on some selected namespaces (passed as param) for a provider.\n */\nasync function eagerConnect(\n type: string,\n namespacesInput: LegacyNamespaceInputForConnect[] | undefined,\n params: {\n getHub: () => Hub;\n allBlockChains: UseAdapterParams['allBlockChains'];\n }\n) {\n const { getHub, allBlockChains } = params;\n const wallet = getHub().get(type);\n if (!wallet) {\n throw new Error(\n `You should add ${type} to provider first then call 'connect'.`\n );\n }\n\n if (!namespacesInput) {\n throw new Error('Passing namespace to `connect` is required. ');\n }\n\n const targetNamespaces: [\n LegacyNamespaceInputForConnect,\n AllProxiedNamespaces\n ][] = [];\n namespacesInput.forEach((namespaceInput) => {\n const targetNamespace: Namespace = namespaceInput.namespace;\n\n const result = wallet.findByNamespace(targetNamespace);\n\n if (!result) {\n throw new Error(\n `We couldn't find any provider matched with your request namespace. (requested namespace: ${namespaceInput.namespace})`\n );\n }\n\n targetNamespaces.push([namespaceInput, result]);\n });\n\n const connectNamespacesPromises = targetNamespaces.map(\n ([info, namespace]) => {\n const evmChain = legacyIsEvmNamespace(info)\n ? convertNamespaceNetworkToEvmChainId(info, allBlockChains || [])\n : undefined;\n const chain = evmChain || info.network;\n\n return async () =>\n await namespace.connect(chain).catch((e) => {\n /*\n * Since we check for connect failures using `instanceof Error`\n * this check is added here to make sure the thrown error always is an instance of `Error`\n */\n if (e instanceof Error) {\n throw e;\n }\n throw new Error(e);\n });\n }\n );\n\n /**\n * Sometimes calling methods on a instance in parallel, would cause an error in wallet.\n * We are running a method at a time to make sure we are covering this.\n * e.g. when we are trying to eagerConnect evm and solana on phantom at the same time, the last namespace throw an error.\n */\n const connectNamespacesResult = await runSequentiallyWithoutFailure(\n connectNamespacesPromises\n );\n\n const failedNamespaces: LegacyNamespaceInputForConnect[] = [];\n connectNamespacesResult.forEach((result, index) => {\n if (result.err) {\n failedNamespaces.push(targetNamespaces[index][0]);\n }\n });\n\n if (failedNamespaces.length > 0) {\n lastConnectedWalletsFromStorage.removeNamespacesFromWallet(\n type,\n failedNamespaces.map((namespace) => namespace.namespace)\n );\n }\n\n const atLeastOneNamespaceConnectedSuccessfully = connectNamespacesResult.some(\n (result) => result.ok\n );\n if (!atLeastOneNamespaceConnectedSuccessfully) {\n throw new Error(`No namespace connected for ${type}`);\n }\n return Result.all(...connectNamespacesResult).unwrap();\n}\n\n/*\n *\n * Get last connected wallets from storage then run `.connect` on them if `.canEagerConnect` returns true.\n *\n * Note 1:\n * - It currently use `.getInstance`, `.canEagerConenct` and `getWalletInfo()`.supported chains from legacy provider implementation.\n * - For each namespace, we don't have a separate `.canEagerConnect`. it's only one and will be used for all namespaces.\n */\nexport async function autoConnect(deps: {\n getHub: () => Hub;\n allBlockChains: UseAdapterParams['allBlockChains'];\n getLegacyProvider: (type: string) => LegacyProviderInterface;\n wallets?: (WalletType | LegacyProviderInterface)[];\n}): Promise<void> {\n const { getHub, allBlockChains, getLegacyProvider, wallets } = deps;\n const lastConnectedWallets = lastConnectedWalletsFromStorage.list();\n const walletIds = Object.keys(lastConnectedWallets);\n\n const walletsToRemoveFromPersistance: string[] = [];\n\n if (walletIds.length) {\n const eagerConnectQueue: unknown[] = [];\n\n // Run `.connect` if `.canEagerConnect` returns `true`.\n walletIds.forEach((providerName) => {\n if (wallets && !wallets.includes(providerName)) {\n console.warn(\n 'Trying to run auto connect for a wallet which is not included in config. Desired wallet:',\n providerName\n );\n walletsToRemoveFromPersistance.push(providerName);\n return;\n }\n\n const legacyProvider = getLegacyProvider(providerName);\n\n let legacyInstance: unknown;\n try {\n legacyInstance = legacyProvider.getInstance();\n } catch {\n console.warn(\n \"It seems instance isn't available yet for auto connect. This can happen when extension not loaded yet (sometimes when opening browser for first time) or extension is disabled. Desired wallet:\",\n providerName\n );\n return;\n }\n\n const namespaces: LegacyNamespaceInputForConnect[] = lastConnectedWallets[\n providerName\n ].map((namespace) => ({\n namespace: namespace.namespace,\n network: namespace.network,\n }));\n\n const canEagerConnect = async () => {\n if (!legacyProvider.canEagerConnect) {\n throw new Error(\n `${providerName} provider hasn't implemented canEagerConnect.`\n );\n }\n return await legacyProvider.canEagerConnect({\n instance: legacyInstance,\n meta: legacyProvider.getWalletInfo(allBlockChains || [])\n .supportedChains,\n });\n };\n const connectHandler = async () => {\n return eagerConnect(providerName, namespaces, {\n allBlockChains,\n getHub,\n });\n };\n\n eagerConnectQueue.push(\n legacyEagerConnectHandler({\n canEagerConnect,\n connectHandler,\n providerName,\n }).catch((e) => {\n walletsToRemoveFromPersistance.push(providerName);\n console.warn(e);\n })\n );\n });\n\n await Promise.all(eagerConnectQueue);\n\n lastConnectedWalletsFromStorage.removeWallets(\n walletsToRemoveFromPersistance\n );\n }\n}\n", "import type { Provider, Store } from '@rango-dev/wallets-core';\n\nimport { createStore, Hub } from '@rango-dev/wallets-core';\nimport { useRef } from 'react';\n\nimport { checkProviderListsEquality } from './utils.js';\n\nexport function useHubRefs(providers: Provider[]) {\n const store = useRef<Store | null>(null);\n\n const hub = useRef<Hub | null>(null);\n\n function createHub() {\n const createdHub = new Hub({\n store: getStore(),\n });\n /*\n * First add providers to hub\n * This helps to `getWalletInfo` be usable, before initialize.\n */\n providers.forEach((provider) => {\n createdHub.add(provider.id, provider);\n });\n hub.current = createdHub;\n return createdHub;\n }\n\n // https://react.dev/reference/react/useRef#avoiding-recreating-the-ref-contents\n function getStore() {\n if (store.current !== null) {\n return store.current;\n }\n const createdStore = createStore();\n store.current = createdStore;\n return createdStore;\n }\n\n function getHub(): Hub {\n const hubProviders = hub.current?.getAll();\n\n if (\n !hub.current ||\n !hubProviders ||\n // If hub does not contain a provider, it should be added\n !checkProviderListsEquality(Array.from(hubProviders.values()), providers)\n ) {\n return createHub();\n }\n return hub.current;\n }\n\n return { getStore, getHub };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["guessProviderStateSelector", "namespaceStateSelector", "Events", "generateStoreId", "pickVersion", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "LEGACY_LAST_CONNECTED_WALLETS", "HUB_LAST_CONNECTED_WALLETS", "createContext", "defaultErrorMesssage", "defaultContext", "WalletContext", "useEffect", "useReducer", "Persistor", "LastConnectedWalletsFromStorage", "__name", "#storageKey", "storageKey", "providerId", "namespaces", "HUB_LAST_CONNECTED_WALLETS", "#addWalletToHub", "LEGACY_LAST_CONNECTED_WALLETS", "#addWalletToLegacy", "providerIds", "#removeWalletsFromHub", "#removeWalletsFromLegacy", "#listFromHub", "#listFromLegacy", "namespaceIds", "#removeNamespaceFromWalletHub", "lastConnectedWallets", "Persistor", "output", "provider", "storage", "data", "persistor", "storageState", "newProviderNamespaces", "namespace", "wallet", "Persistor", "Wallet", "useContext", "useRef", "useEffect", "useRef", "formatAddressWithNetwork", "CAIP", "Err", "Ok", "lastConnectedWalletsFromStorage", "LastConnectedWalletsFromStorage", "HUB_LAST_CONNECTED_WALLETS", "getAllLegacyProviders", "allProviders", "LEGACY_VERSION", "legacyProviders", "provider", "target", "pickVersion", "__name", "useEffect", "useRef", "useState", "Ok", "Result", "legacyEagerConnectHandler", "legacyIsEvmNamespace", "Result", "lastConnectedWalletsFromStorage", "LastConnectedWalletsFromStorage", "HUB_LAST_CONNECTED_WALLETS", "createStore", "Hub", "useRef"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoConnect.d.ts","sourceRoot":"","sources":["../../src/hub/autoConnect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"autoConnect.d.ts","sourceRoot":"","sources":["../../src/hub/autoConnect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAyH5D,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,MAAM,EAAE,MAAM,GAAG,CAAC;IAClB,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACnD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,uBAAuB,CAAC;IAC7D,OAAO,CAAC,EAAE,CAAC,UAAU,GAAG,uBAAuB,CAAC,EAAE,CAAC;CACpD,GAAG,OAAO,CAAC,IAAI,CAAC,CA8EhB"}
|
package/dist/hub/helpers.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AllProxiedNamespaces } from './types.js';
|
|
2
2
|
import type { Accounts, AccountsWithActiveChain } from '@rango-dev/wallets-core/namespaces/common';
|
|
3
|
+
import type { Result } from 'ts-results';
|
|
3
4
|
import { CAIP } from '@rango-dev/wallets-core/utils';
|
|
4
5
|
export declare function mapCaipNamespaceToLegacyNetworkName(chainId: CAIP.ChainIdParams | string): string;
|
|
5
6
|
/**
|
|
@@ -13,7 +14,7 @@ export declare function fromAccountIdToLegacyAddressFormat(account: string): str
|
|
|
13
14
|
/**
|
|
14
15
|
* Getting a list of (lazy) promises and run them one after another.
|
|
15
16
|
*/
|
|
16
|
-
export declare function runSequentiallyWithoutFailure<
|
|
17
|
+
export declare function runSequentiallyWithoutFailure<R>(promises: Array<() => Promise<R>>): Promise<Result<R, unknown>[]>;
|
|
17
18
|
export declare function isConnectResultEvm(result: Awaited<ReturnType<AllProxiedNamespaces['connect']>>): result is AccountsWithActiveChain;
|
|
18
19
|
export declare function isConnectResultSolana(result: Awaited<ReturnType<AllProxiedNamespaces['connect']>>): result is Accounts;
|
|
19
20
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/hub/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EACV,QAAQ,EACR,uBAAuB,EACxB,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/hub/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EACV,QAAQ,EACR,uBAAuB,EACxB,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAGrD,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,GACnC,MAAM,CAeR;AAED;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI1E;AAED;;GAEG;AAEH,wBAAsB,6BAA6B,CAAC,CAAC,EACnD,QAAQ,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAU/B;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,GAC3D,MAAM,IAAI,uBAAuB,CAEnC;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,GAC3D,MAAM,IAAI,QAAQ,CAEpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHubAdapter.d.ts","sourceRoot":"","sources":["../../src/hub/useHubAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"useHubAdapter.d.ts","sourceRoot":"","sources":["../../src/hub/useHubAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAMxE,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAiB1B,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG;IAChE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,wGAAwG;IACxG,qBAAqB,EAAE,kBAAkB,EAAE,CAAC;CAC7C,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CAsVvE"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var he=Object.defineProperty;var i=(e,n)=>he(e,"name",{value:n,configurable:!0});import{Persistor as ve}from"@rango-dev/wallets-core/legacy";var h="last-connected-wallets",w="hub-v1-last-connected-wallets";import{Persistor as A}from"@rango-dev/wallets-core/legacy";var C=class{static{i(this,"LastConnectedWalletsFromStorage")}#e;constructor(n){this.#e=n}addWallet(n,a){if(this.#e===w)return this.#t(n,a);if(this.#e===h)return this.#a(n);throw new Error("Not implemented")}removeWallets(n){if(this.#e===w)return this.#n(n);if(this.#e===h)return this.#c(n);throw new Error("Not implemented")}list(){if(this.#e===w)return this.#r();if(this.#e===h)return this.#o();throw new Error("Not implemented")}removeNamespacesFromWallet(n,a){if(this.#e===w)return this.#s(n,a);throw new Error("Not implemented")}#o(){let a=new A().getItem(h)||[],s={};return a.forEach(c=>{s[c]=[]}),s}#r(){return new A().getItem(w)||{}}#t(n,a){let s=new A,c=s.getItem(this.#e)||{};s.setItem(this.#e,{...c,[n]:a})}#a(n){let a=new A,s=a.getItem(this.#e)||[];a.setItem(h,s.concat(n))}#n(n){let a=new A,s=a.getItem(this.#e)||{};if(!n){a.setItem(this.#e,{});return}n.forEach(c=>{s[c]&&delete s[c]}),a.setItem(this.#e,s)}#s(n,a){let u=(new A().getItem(this.#e)||{})[n].filter(r=>!a.includes(r.namespace));this.#n([n]),this.#t(n,u)}#c(n){let a=new A,s=a.getItem(this.#e)||[];if(!n){a.setItem(this.#e,[]);return}a.setItem(h,s.filter(c=>!n.includes(c)))}};function tt(e,n){return e.find(a=>a.type===n)||null}i(tt,"choose");var R={connected:!1,connecting:!1,reachable:!1,installed:!1,accounts:null,network:null};function q(e,n){if(n.type==="new_state"){let a=e[n.wallet];return a?{...e,[n.wallet]:{...a,[n.name]:n.value}}:{...e,[n.wallet]:{...R,[n.name]:n.value}}}return e}i(q,"stateReducer");function K(e){return Object.entries(e).filter(([,n])=>n?.connected).map(([n])=>n)}i(K,"connectedWallets");function z(e){return Object.entries(e).map(([n])=>n)}i(z,"availableWallets");function Q(e){let n=new Map;return e.forEach(a=>{let{config:s,...c}=a;n.set(s.type,{actions:c,config:s})}),n}i(Q,"checkWalletProviders");function nt(e){return e?.constructor?.name==="AsyncFunction"}i(nt,"isAsync");function ot(e){let{checkInstallation:n=!0}=e.config;return n}i(ot,"needsCheckInstallation");async function J({type:e,walletActions:n,getState:a}){if(n.canEagerConnect){let s=new C(h),l=!!s.list()[e];l&&!a(e).connected&&F(),l||s.addWallet(e,[])}}i(J,"tryPersistWallet");function X({type:e,walletActions:n}){n.canEagerConnect&&new C(h).removeWallets([e])}i(X,"tryRemoveWalletFromPersistance");function F(){let e=new ve;e.getItem(h)&&e.removeItem(h)}i(F,"clearPersistance");function O(e,n){return i((s,c,l,u,r)=>{e({type:"new_state",wallet:s,name:c,value:l}),n&&n(s,c,l,u,r)},"handler")}i(O,"makeEventHandler");import Ue from"react";import{createContext as we}from"react";var W="Context hasn't been initialized yet.",Ce={async connect(){throw new Error(W)},async disconnect(){throw new Error(W)},async disconnectAll(){throw new Error(W)},async suggestAndConnect(){throw new Error(W)},state(){throw new Error(W)},canSwitchNetworkTo(){throw new Error(W)},providers(){throw new Error(W)},getWalletInfo(){throw new Error(W)},getSigners(){throw new Error(W)}},x=we(Ce);import{guessProviderStateSelector as ae,namespaceStateSelector as se}from"@rango-dev/wallets-core";import{LegacyEvents as N}from"@rango-dev/wallets-core/legacy";import{generateStoreId as Te}from"@rango-dev/wallets-core/utils";import{pickVersion as V}from"@rango-dev/wallets-core/utils";import{convertEvmBlockchainMetaToEvmChainInfo as be}from"@rango-dev/wallets-shared";import{isEvmBlockchain as He}from"rango-types";import{useEffect as _,useReducer as Ae}from"react";async function Z(e,n){let a=new C(h),s=a.list(),c=Object.keys(s);if(c.length){let l=[];c.forEach(t=>{let o=e.get(t);if(o){let d=n(o);l.push({walletType:t,eagerConnect:d.eagerConnect.bind(d)})}});let u=await Promise.allSettled(l.map(async({eagerConnect:t})=>t())),r=[];u.forEach((t,o)=>{let{status:d}=t;d==="rejected"&&r.push(l[o].walletType)}),r.length&&a.removeWallets(r)}}i(Z,"autoConnect");import{LegacyWallet as Pe}from"@rango-dev/wallets-core/legacy";import{useContext as We,useRef as Ee}from"react";function ee(e){let n=Ee({});function a(s){let c=s.config.type;return typeof n.current[c]>"u"&&(n.current[c]=new Pe({config:s.config,handler:e},s.actions)),n.current[c]}return i(a,"updater"),a}i(ee,"useInitializers");function Se(){let e=We(x);if(!e)throw Error("useWallet can only be used within the Provider component");return e}i(Se,"useWallets");import{useEffect as ke,useRef as Le}from"react";function te(e){return!!e.allBlockChains?.length&&!!e.autoConnect}i(te,"shouldTryAutoConnect");function b(e){let n=Le(!1);ke(()=>{te(e)&&!n.current&&(n.current=!0,e.autoConnectHandler())},[e.autoConnect,e.allBlockChains])}i(b,"useAutoConnect");function D(e){let[n,a]=Ae(q,{}),s=ee(O(a,e.onUpdateState)),c=e.providers,l=Q(c);b({allBlockChains:e.allBlockChains,autoConnect:e.autoConnect,autoConnectHandler:async()=>Z(l,s)});let u={async connect(r,t){let o=l.get(r);if(!o)throw new Error(`You should add ${r} to provider first.`);let d;t&&t.length>0&&(d=t.find(g=>!!g.network)?.network);let p=await s(o).connect(d,t);return e.autoConnect&&J({type:r,walletActions:o.actions,getState:u.state}),[p]},async disconnect(r){let t=l.get(r);if(!t)throw new Error(`You should add ${r} to provider first.`);await s(t).disconnect(),e.autoConnect&&X({type:r,walletActions:t.actions})},async disconnectAll(){let r=[];return K(n).forEach(t=>{let o=l.get(t);if(o){let d=s(o);r.push(d.disconnect())}}),e.autoConnect&&F(),await Promise.allSettled(r)},async suggestAndConnect(r,t){let o=l.get(r);if(!o)throw new Error(`You should add ${r} to provider first.`);return await s(o).suggestAndConnect(t)},state(r){return n[r]||R},canSwitchNetworkTo(r,t){let o=l.get(r);if(!o)return!1;let d=s(o);return d.canSwitchNetworkTo?d.canSwitchNetworkTo(t,d.provider):!1},providers(){let r={};return z(n).forEach(t=>{let o=l.get(t);if(o){let d=s(o);r[t]=d.provider}}),r},getWalletInfo(r){let t=l.get(r);if(!t)throw new Error(`You should add ${r} to provider first.`);return t.actions.getWalletInfo(e.allBlockChains||[])},async getSigners(r){let t=l.get(r);if(!t)throw new Error(`You should add ${r} to provider first.`);let o=s(t),d=o.provider;return o.getSigners(d)}};return _(()=>{l.forEach(r=>{let t=s(r),o=i(()=>{t.onInit&&t.onInit()},"runOnInit"),d=i(m=>{m.target&&m.target.readyState==="complete"&&(o(),document.removeEventListener("readystatechange",d))},"initWhenPageIsReady");o(),document.addEventListener("readystatechange",d)})},[]),_(()=>{e.allBlockChains&&l.forEach(t=>{let o=s(t),d=o.getWalletInfo(e.allBlockChains||[]);o.setInfo({supportedBlockchains:d.supportedChains,isContractWallet:!!d.isContractWallet})})},[e.allBlockChains]),_(()=>{l.forEach(r=>{s(r).setHandler(O(a,e.onUpdateState))})},[e.onUpdateState]),u}i(D,"useLegacyProviders");import{legacyFormatAddressWithNetwork as Ne}from"@rango-dev/wallets-core/legacy";import{CAIP as Ie}from"@rango-dev/wallets-core/utils";function xe(e){return typeof e=="string"?e:["solana"].includes(e.namespace.toLowerCase())?e.namespace.toUpperCase():e.namespace.toLowerCase()==="eip155"?"ETH":e.reference}i(xe,"mapCaipNamespaceToLegacyNetworkName");function H(e){let{chainId:n,address:a}=Ie.AccountId.parse(e),s=xe(n);return Ne(a,s)}i(H,"fromAccountIdToLegacyAddressFormat");async function ne(e){return await e.reduce(async(a,s)=>{let c=await a;try{let l=await s();return[...c,l]}catch(l){return[...c,l]}},Promise.resolve([]))}i(ne,"runSequentiallyWithoutFailure");function oe(e){return typeof e=="object"&&!Array.isArray(e)}i(oe,"isConnectResultEvm");function re(e){return Array.isArray(e)}i(re,"isConnectResultSolana");function j(e){let n="0.0.0",a="1.0.0",s=[],c=[];return e.forEach(l=>{try{let u=V(l,a);c.push(u[1])}catch{let u=V(l,n);s.push(u[1])}}),[s,c]}i(j,"separateLegacyAndHubProviders");function E(e,n){return e.find(a=>a.id===n)}i(E,"findProviderByType");var Be=new C(w);function ce(e,n,a,s,c,l){e.getAll().forEach((u,r)=>{let t=ae(n,r),o=ae(a,r),d=[],m=!1,p=!1,g=!1,y=!1,f=null,v=[];u.getAll().forEach(T=>{let G=Te(r,T.namespaceId),I=se(n,G),B=se(a,G);if(I.network!==null&&(f=I.network),I.network!==B.network&&(p=!0),I.accounts){y=!0,B.accounts?.slice().sort().toString()!==I.accounts?.slice().sort().toString()&&(m=!0);let $=I.accounts.map(H);d?d=[...d,...$]:d=[...$]}else B.accounts&&(v.push(T.namespaceId),m=!0)}),v.length>0&&Be.removeNamespacesFromWallet(r,v),v.length>0&&!y&&(d=null,g=!0);let L;try{L=k(c,r)}catch(T){console.warn("Having legacy provider is required for including some information like supported chain. ",T)}let S={connected:t.connected,connecting:t.connecting,installed:t.installed,accounts:d,network:f,reachable:!0},P={supportedBlockchains:L?.getWalletInfo(l||[]).supportedChains||[],isContractWallet:!1,isHub:!0};o.installed!==t.installed&&s(r,N.INSTALLED,t.installed,S,P),o.connecting!==t.connecting&&s(r,N.CONNECTING,t.connecting,S,P),o.connected!==t.connected&&s(r,N.CONNECTED,t.connected,S,P),m&&(s(r,N.ACCOUNTS,null,S,P),s(r,N.ACCOUNTS,d,S,P)),g&&s(r,N.ACCOUNTS,null,S,P),p&&s(r,N.NETWORK,f,S,P)})}i(ce,"checkHubStateAndTriggerEvents");function ie(e){let n="0.0.0",a=[];return e.forEach(s=>{let c=V(s,n);a.push(c[1])}),a}i(ie,"getAllLegacyProviders");function k(e,n){let s=ie(e).find(c=>c.config.type===n);if(!s)throw console.warn(`You have a provider that doesn't have legacy provider. It causes some problems since we need some legacy functionality. Provider Id: ${n}`),new Error(`You need to have legacy implementation to use some methods. Provider Id: ${n}`);return s}i(k,"getLegacyProvider");function U(e,n){if(!e.network)return;let a=n.filter(He);return be(a)[e.network]}i(U,"convertNamespaceNetworkToEvmChainId");function le(e,n){return U(e,n)||e.network}i(le,"tryConvertNamespaceNetworkToChainInfo");function de(e){return oe(e)?{accounts:e.accounts,network:e.network,provider:void 0}:re(e)?{accounts:e,network:null,provider:void 0}:{accounts:[e],network:null,provider:void 0}}i(de,"transformHubResultToLegacyResult");function ue(e,n){let a=e.map(c=>c.id).sort().toString(),s=n.map(c=>c.id).sort().toString();return a===s}i(ue,"checkProviderListsEquality");import"@rango-dev/wallets-shared";import{useEffect as ge,useRef as Ve,useState as je}from"react";import{legacyEagerConnectHandler as Re,legacyIsEvmNamespace as Fe}from"@rango-dev/wallets-core/legacy";var M=new C(w);async function Oe(e,n,a){let{getHub:s,allBlockChains:c}=a,l=s().get(e);if(!l)throw new Error(`You should add ${e} to provider first then call 'connect'.`);if(!n)throw new Error("Passing namespace to `connect` is required. ");let u=[];n.forEach(p=>{let g=p.namespace,y=l.findByNamespace(g);if(!y)throw new Error(`We couldn't find any provider matched with your request namespace. (requested namespace: ${p.namespace})`);u.push([p,y])});let r=u.map(([p,g])=>{let f=(Fe(p)?U(p,c||[]):void 0)||p.network;return async()=>await g.connect(f).catch(v=>{throw v instanceof Error?v:new Error(v)})}),t=await ne(r),o=[];if(t.forEach((p,g)=>{p instanceof Error&&o.push(u[g][0])}),o.length>0&&M.removeNamespacesFromWallet(e,o.map(p=>p.namespace)),!(t.length-o.length>0))throw new Error(`No namespace connected for ${e}`);return t.filter(p=>!(p instanceof Error))}i(Oe,"eagerConnect");async function pe(e){let{getHub:n,allBlockChains:a,getLegacyProvider:s,wallets:c}=e,l=M.list(),u=Object.keys(l),r=[];if(u.length){let t=[];u.forEach(o=>{if(c&&!c.includes(o)){console.warn("Trying to run auto connect for a wallet which is not included in config. Desired wallet:",o),r.push(o);return}let d=s(o),m;try{m=d.getInstance()}catch{console.warn("It seems instance isn't available yet for auto connect. This can happen when extension not loaded yet (sometimes when opening browser for first time) or extension is disabled. Desired wallet:",o);return}let p=l[o].map(f=>({namespace:f.namespace,network:f.network})),g=i(async()=>{if(!d.canEagerConnect)throw new Error(`${o} provider hasn't implemented canEagerConnect.`);return await d.canEagerConnect({instance:m,meta:d.getWalletInfo(a||[]).supportedChains})},"canEagerConnect"),y=i(async()=>Oe(o,p,{allBlockChains:a,getHub:n}),"connectHandler");t.push(Re({canEagerConnect:g,connectHandler:y,providerName:o}).catch(f=>{r.push(o),console.warn(f)}))}),await Promise.all(t),M.removeWallets(r)}}i(pe,"autoConnect");import{createStore as _e,Hub as De}from"@rango-dev/wallets-core";import{useRef as me}from"react";function fe(e){let n=me(null),a=me(null);function s(){let u=new De({store:c()});return e.forEach(r=>{u.add(r.id,r)}),a.current=u,u}i(s,"createHub");function c(){if(n.current!==null)return n.current;let u=_e();return n.current=u,u}i(c,"getStore");function l(){let u=a.current?.getAll();return!a.current||!u||!ue(Array.from(u.values()),e)?s():a.current}return i(l,"getHub"),{getStore:c,getHub:l}}i(fe,"useHubRefs");function Y(e){let{getStore:n,getHub:a}=fe(e.providers),[,s]=je(0),c=Ve({onUpdateState:e.onUpdateState,allVersionedProviders:e.allVersionedProviders,allBlockChains:e.allBlockChains});ge(()=>{c.current={onUpdateState:e.onUpdateState,allVersionedProviders:e.allVersionedProviders,allBlockChains:e.allBlockChains}},[e]),ge(()=>{let r=i(()=>{a().init(),s(o=>o+1)},"runOnInit"),t=i(o=>{o.target&&o.target.readyState==="complete"&&(r(),document.removeEventListener("readystatechange",t))},"initHubWhenPageIsReady");r(),document.addEventListener("readystatechange",t),n().subscribe((o,d)=>{c.current.onUpdateState&&ce(a(),o,d,c.current.onUpdateState,c.current.allVersionedProviders,c.current.allBlockChains),s(m=>m+1)})},[]),b({autoConnect:e.autoConnect,allBlockChains:e.allBlockChains,autoConnectHandler:()=>{pe({getLegacyProvider:k.bind(null,e.allVersionedProviders),allBlockChains:e.allBlockChains,getHub:a,wallets:e.configs?.wallets})}});let l=new C(w);return{canSwitchNetworkTo(r,t){let o=k(e.allVersionedProviders,r),d=o.canSwitchNetworkTo;return d?d({network:t,meta:e.allBlockChains||[],provider:o.getInstance()}):!1},async connect(r,t){let o=a().get(r);if(!o)throw new Error(`You should add ${r} to provider first then call 'connect'.`);if(!t)throw new Error("Passing namespace to `connect` is required.");let d=[];t.forEach(f=>{let v=f.namespace,L=o.findByNamespace(v);if(!L)throw new Error(`We couldn't find any provider matched with your request namespace. (requested namespace: ${f.namespace})`);d.push([f,L])});let m=[],p=d.map(async([f,v])=>{let L=le(f,e.allBlockChains||[]);return v.connect(L).then(de).then(P=>(m.push({namespace:f.namespace,network:f.network}),P))});return k(e.allVersionedProviders,r).canEagerConnect&&Promise.allSettled(p).then(()=>{m.length>0&&l.addWallet(r,m)}),await Promise.all(p)},async disconnect(r){let t=a().get(r);if(!t)throw new Error(`You should add ${r} to provider first then call 'disconnect'.`);t.getAll().forEach(o=>o.disconnect()),e.autoConnect&&l.removeWallets([r])},async disconnectAll(){let r=Array.from(a().getAll().values()).map(async t=>this.disconnect(t.id));return await Promise.allSettled(r)},async getSigners(r){let t=k(e.allVersionedProviders,r);return t.getSigners(t.getInstance())},getWalletInfo(r){let t=a().get(r);if(!t)throw new Error(`You should add ${r} to provider first.`);let o=t.info();if(!o)throw new Error("Your provider should have required `info`.");let d=k(e.allVersionedProviders,r),m={DEFAULT:""};Object.keys(o.extensions).forEach(g=>{let y=g;if(o.extensions[y]==="homepage"&&(m.DEFAULT=o.extensions[y]||""),["firefox","chrome","brave","edge"].includes(y)){let v=y.toUpperCase();m[v]=o.extensions[y]||""}});let p=d.getWalletInfo(e.allBlockChains||[]);return{name:o.name,img:o.icon,installLink:m,color:"red",supportedChains:p.supportedChains,isContractWallet:!1,mobileWallet:!1,showOnMobile:void 0,needsNamespace:p.needsNamespace,needsDerivationPath:p.needsDerivationPath,isHub:!0,properties:t.info()?.properties}},providers(){let r={};return Array.from(a().getAll().keys()).forEach(t=>{try{let o=k(e.allVersionedProviders,t);r[t]=o.getInstance()}catch(o){console.warn(o)}}),r},state(r){let o=a().state()[r];if(!o)throw new Error(`It seems your requested provider doesn't exist in hub. Provider Id: ${r}`);let d=o.namespaces.filter(p=>p.connected).flatMap(p=>p.accounts?.map(H)).filter(p=>!!p);return{connected:o.connected,connecting:o.connecting,installed:o.installed,reachable:!0,accounts:d,network:null}},suggestAndConnect(r,t){throw new Error("`suggestAndConnect` is not implemented")}}}i(Y,"useHubAdapter");function ye(e){let{providers:n,...a}=e,[s,c]=j(n),l=D({...a,providers:s}),u=Y({...a,providers:c,allVersionedProviders:n});return{canSwitchNetworkTo(t,o){return E(c,t)?u.canSwitchNetworkTo(t,o):l.canSwitchNetworkTo(t,o)},async connect(t,o){return E(c,t)?await u.connect(t,o):await l.connect(t,o)},async disconnect(t){return E(c,t)?await u.disconnect(t):await l.disconnect(t)},async disconnectAll(){return await Promise.allSettled([u.disconnectAll(),l.disconnectAll()])},async getSigners(t){return E(c,t)?u.getSigners(t):l.getSigners(t)},getWalletInfo(t){return E(c,t)?u.getWalletInfo(t):l.getWalletInfo(t)},providers(){let t={};return c.length>0&&(t={...t,...u.providers()}),s.length>0&&(t={...t,...l.providers()}),t},state(t){return E(c,t)?u.state(t):l.state(t)},async suggestAndConnect(t,o){return E(c,t)?u.suggestAndConnect(t,o):await l.suggestAndConnect(t,o)}}}i(ye,"useProviders");function Me(e){let n=ye(e);return Ue.createElement(x.Provider,{value:n},e.children)}i(Me,"Provider");var Ye=Me;var Ge=(u=>(u.CONNECTED="connected",u.CONNECTING="connecting",u.REACHABLE="reachable",u.INSTALLED="installed",u.ACCOUNTS="accounts",u.NETWORK="network",u))(Ge||{});export{Ge as Events,Ye as Provider,z as availableWallets,Q as checkWalletProviders,tt as choose,F as clearPersistance,K as connectedWallets,R as defaultWalletState,nt as isAsync,O as makeEventHandler,ot as needsCheckInstallation,q as stateReducer,J as tryPersistWallet,X as tryRemoveWalletFromPersistance,Se as useWallets};
|
|
1
|
+
var he=Object.defineProperty;var i=(e,n)=>he(e,"name",{value:n,configurable:!0});import{Persistor as ve}from"@rango-dev/wallets-core/legacy";var h="last-connected-wallets",C="hub-v1-last-connected-wallets";import{Persistor as A}from"@rango-dev/wallets-core/legacy";var P=class{static{i(this,"LastConnectedWalletsFromStorage")}#e;constructor(n){this.#e=n}addWallet(n,a){if(this.#e===C)return this.#t(n,a);if(this.#e===h)return this.#a(n);throw new Error("Not implemented")}removeWallets(n){if(this.#e===C)return this.#n(n);if(this.#e===h)return this.#c(n);throw new Error("Not implemented")}list(){if(this.#e===C)return this.#r();if(this.#e===h)return this.#o();throw new Error("Not implemented")}removeNamespacesFromWallet(n,a){if(this.#e===C)return this.#s(n,a);throw new Error("Not implemented")}#o(){let a=new A().getItem(h)||[],s={};return a.forEach(c=>{s[c]=[]}),s}#r(){return new A().getItem(C)||{}}#t(n,a){let s=new A,c=s.getItem(this.#e)||{};s.setItem(this.#e,{...c,[n]:a})}#a(n){let a=new A,s=a.getItem(this.#e)||[];a.setItem(h,s.concat(n))}#n(n){let a=new A,s=a.getItem(this.#e)||{};if(!n){a.setItem(this.#e,{});return}n.forEach(c=>{s[c]&&delete s[c]}),a.setItem(this.#e,s)}#s(n,a){let u=(new A().getItem(this.#e)||{})[n].filter(r=>!a.includes(r.namespace));this.#n([n]),this.#t(n,u)}#c(n){let a=new A,s=a.getItem(this.#e)||[];if(!n){a.setItem(this.#e,[]);return}a.setItem(h,s.filter(c=>!n.includes(c)))}};function st(e,n){return e.find(a=>a.type===n)||null}i(st,"choose");var F={connected:!1,connecting:!1,reachable:!1,installed:!1,accounts:null,network:null};function K(e,n){if(n.type==="new_state"){let a=e[n.wallet];return a?{...e,[n.wallet]:{...a,[n.name]:n.value}}:{...e,[n.wallet]:{...F,[n.name]:n.value}}}return e}i(K,"stateReducer");function z(e){return Object.entries(e).filter(([,n])=>n?.connected).map(([n])=>n)}i(z,"connectedWallets");function Q(e){return Object.entries(e).map(([n])=>n)}i(Q,"availableWallets");function J(e){let n=new Map;return e.forEach(a=>{let{config:s,...c}=a;n.set(s.type,{actions:c,config:s})}),n}i(J,"checkWalletProviders");function ct(e){return e?.constructor?.name==="AsyncFunction"}i(ct,"isAsync");function it(e){let{checkInstallation:n=!0}=e.config;return n}i(it,"needsCheckInstallation");async function X({type:e,walletActions:n,getState:a}){if(n.canEagerConnect){let s=new P(h),d=!!s.list()[e];d&&!a(e).connected&&O(),d||s.addWallet(e,[])}}i(X,"tryPersistWallet");function Z({type:e,walletActions:n}){n.canEagerConnect&&new P(h).removeWallets([e])}i(Z,"tryRemoveWalletFromPersistance");function O(){let e=new ve;e.getItem(h)&&e.removeItem(h)}i(O,"clearPersistance");function _(e,n){return i((s,c,d,u,r)=>{e({type:"new_state",wallet:s,name:c,value:d}),n&&n(s,c,d,u,r)},"handler")}i(_,"makeEventHandler");import qe from"react";import{createContext as we}from"react";var k="Context hasn't been initialized yet.",Ce={async connect(){throw new Error(k)},async disconnect(){throw new Error(k)},async disconnectAll(){throw new Error(k)},async suggestAndConnect(){throw new Error(k)},state(){throw new Error(k)},canSwitchNetworkTo(){throw new Error(k)},providers(){throw new Error(k)},getWalletInfo(){throw new Error(k)},getSigners(){throw new Error(k)}},T=we(Ce);import{guessProviderStateSelector as ae,namespaceStateSelector as se}from"@rango-dev/wallets-core";import{LegacyEvents as N}from"@rango-dev/wallets-core/legacy";import{generateStoreId as He}from"@rango-dev/wallets-core/utils";import{pickVersion as j}from"@rango-dev/wallets-core/utils";import{convertEvmBlockchainMetaToEvmChainInfo as Re}from"@rango-dev/wallets-shared";import{isEvmBlockchain as Be}from"rango-types";import{useEffect as D,useReducer as Ae}from"react";async function ee(e,n){let a=new P(h),s=a.list(),c=Object.keys(s);if(c.length){let d=[];c.forEach(t=>{let o=e.get(t);if(o){let l=n(o);d.push({walletType:t,eagerConnect:l.eagerConnect.bind(l)})}});let u=await Promise.allSettled(d.map(async({eagerConnect:t})=>t())),r=[];u.forEach((t,o)=>{let{status:l}=t;l==="rejected"&&r.push(d[o].walletType)}),r.length&&a.removeWallets(r)}}i(ee,"autoConnect");import{LegacyWallet as Pe}from"@rango-dev/wallets-core/legacy";import{useContext as We,useRef as Ee}from"react";function te(e){let n=Ee({});function a(s){let c=s.config.type;return typeof n.current[c]>"u"&&(n.current[c]=new Pe({config:s.config,handler:e},s.actions)),n.current[c]}return i(a,"updater"),a}i(te,"useInitializers");function ke(){let e=We(T);if(!e)throw Error("useWallet can only be used within the Provider component");return e}i(ke,"useWallets");import{useEffect as Se,useRef as Le}from"react";function ne(e){return!!e.allBlockChains?.length&&!!e.autoConnect}i(ne,"shouldTryAutoConnect");function b(e){let n=Le(!1);Se(()=>{ne(e)&&!n.current&&(n.current=!0,e.autoConnectHandler())},[e.autoConnect,e.allBlockChains])}i(b,"useAutoConnect");function V(e){let[n,a]=Ae(K,{}),s=te(_(a,e.onUpdateState)),c=e.providers,d=J(c);b({allBlockChains:e.allBlockChains,autoConnect:e.autoConnect,autoConnectHandler:async()=>ee(d,s)});let u={async connect(r,t){let o=d.get(r);if(!o)throw new Error(`You should add ${r} to provider first.`);let l;t&&t.length>0&&(l=t.find(g=>!!g.network)?.network);let m=await s(o).connect(l,t);return e.autoConnect&&X({type:r,walletActions:o.actions,getState:u.state}),[m]},async disconnect(r){let t=d.get(r);if(!t)throw new Error(`You should add ${r} to provider first.`);await s(t).disconnect(),e.autoConnect&&Z({type:r,walletActions:t.actions})},async disconnectAll(){let r=[];return z(n).forEach(t=>{let o=d.get(t);if(o){let l=s(o);r.push(l.disconnect())}}),e.autoConnect&&O(),await Promise.allSettled(r)},async suggestAndConnect(r,t){let o=d.get(r);if(!o)throw new Error(`You should add ${r} to provider first.`);return await s(o).suggestAndConnect(t)},state(r){return n[r]||F},canSwitchNetworkTo(r,t){let o=d.get(r);if(!o)return!1;let l=s(o);return l.canSwitchNetworkTo?l.canSwitchNetworkTo(t,l.provider):!1},providers(){let r={};return Q(n).forEach(t=>{let o=d.get(t);if(o){let l=s(o);r[t]=l.provider}}),r},getWalletInfo(r){let t=d.get(r);if(!t)throw new Error(`You should add ${r} to provider first.`);return t.actions.getWalletInfo(e.allBlockChains||[])},async getSigners(r){let t=d.get(r);if(!t)throw new Error(`You should add ${r} to provider first.`);let o=s(t),l=o.provider;return o.getSigners(l)}};return D(()=>{d.forEach(r=>{let t=s(r),o=i(()=>{t.onInit&&t.onInit()},"runOnInit"),l=i(p=>{p.target&&p.target.readyState==="complete"&&(o(),document.removeEventListener("readystatechange",l))},"initWhenPageIsReady");o(),document.addEventListener("readystatechange",l)})},[]),D(()=>{e.allBlockChains&&d.forEach(t=>{let o=s(t),l=o.getWalletInfo(e.allBlockChains||[]);o.setInfo({supportedBlockchains:l.supportedChains,isContractWallet:!!l.isContractWallet})})},[e.allBlockChains]),D(()=>{d.forEach(r=>{s(r).setHandler(_(a,e.onUpdateState))})},[e.onUpdateState]),u}i(V,"useLegacyProviders");import{legacyFormatAddressWithNetwork as Ne}from"@rango-dev/wallets-core/legacy";import{CAIP as Ie}from"@rango-dev/wallets-core/utils";import{Err as xe,Ok as Te}from"ts-results";function be(e){return typeof e=="string"?e:["solana"].includes(e.namespace.toLowerCase())?e.namespace.toUpperCase():e.namespace.toLowerCase()==="eip155"?"ETH":e.reference}i(be,"mapCaipNamespaceToLegacyNetworkName");function H(e){let{chainId:n,address:a}=Ie.AccountId.parse(e),s=be(n);return Ne(a,s)}i(H,"fromAccountIdToLegacyAddressFormat");async function R(e){return e.reduce(async(n,a)=>{let s=await n;try{let c=await a();return[...s,new Te(c)]}catch(c){return[...s,new xe(c)]}},Promise.resolve([]))}i(R,"runSequentiallyWithoutFailure");function oe(e){return typeof e=="object"&&!Array.isArray(e)}i(oe,"isConnectResultEvm");function re(e){return Array.isArray(e)}i(re,"isConnectResultSolana");function U(e){let n="0.0.0",a="1.0.0",s=[],c=[];return e.forEach(d=>{try{let u=j(d,a);c.push(u[1])}catch{let u=j(d,n);s.push(u[1])}}),[s,c]}i(U,"separateLegacyAndHubProviders");function S(e,n){return e.find(a=>a.id===n)}i(S,"findProviderByType");var Fe=new P(C);function ce(e,n,a,s,c,d){e.getAll().forEach((u,r)=>{let t=ae(n,r),o=ae(a,r),l=[],p=!1,m=!1,g=!1,v=!1,y=null,E=[];u.getAll().forEach(I=>{let $=He(r,I.namespaceId),x=se(n,$),B=se(a,$);if(x.network!==null&&(y=x.network),x.network!==B.network&&(m=!0),x.accounts){v=!0,B.accounts?.slice().sort().toString()!==x.accounts?.slice().sort().toString()&&(p=!0);let q=x.accounts.map(H);l?l=[...l,...q]:l=[...q]}else B.accounts&&(E.push(I.namespaceId),p=!0)}),E.length>0&&Fe.removeNamespacesFromWallet(r,E),E.length>0&&!v&&(l=null,g=!0);let f;try{f=L(c,r)}catch(I){console.warn("Having legacy provider is required for including some information like supported chain. ",I)}let w={connected:t.connected,connecting:t.connecting,installed:t.installed,accounts:l,network:y,reachable:!0},W={supportedBlockchains:f?.getWalletInfo(d||[]).supportedChains||[],isContractWallet:!1,isHub:!0};o.installed!==t.installed&&s(r,N.INSTALLED,t.installed,w,W),o.connecting!==t.connecting&&s(r,N.CONNECTING,t.connecting,w,W),o.connected!==t.connected&&s(r,N.CONNECTED,t.connected,w,W),p&&(s(r,N.ACCOUNTS,null,w,W),s(r,N.ACCOUNTS,l,w,W)),g&&s(r,N.ACCOUNTS,null,w,W),m&&s(r,N.NETWORK,y,w,W)})}i(ce,"checkHubStateAndTriggerEvents");function ie(e){let n="0.0.0",a=[];return e.forEach(s=>{let c=j(s,n);a.push(c[1])}),a}i(ie,"getAllLegacyProviders");function L(e,n){let s=ie(e).find(c=>c.config.type===n);if(!s)throw console.warn(`You have a provider that doesn't have legacy provider. It causes some problems since we need some legacy functionality. Provider Id: ${n}`),new Error(`You need to have legacy implementation to use some methods. Provider Id: ${n}`);return s}i(L,"getLegacyProvider");function M(e,n){if(!e.network)return;let a=n.filter(Be);return Re(a)[e.network]}i(M,"convertNamespaceNetworkToEvmChainId");function le(e,n){return M(e,n)||e.network}i(le,"tryConvertNamespaceNetworkToChainInfo");function de(e){return oe(e)?{accounts:e.accounts,network:e.network,provider:void 0}:re(e)?{accounts:e,network:null,provider:void 0}:{accounts:[e],network:null,provider:void 0}}i(de,"transformHubResultToLegacyResult");function ue(e,n){let a=e.map(c=>c.id).sort().toString(),s=n.map(c=>c.id).sort().toString();return a===s}i(ue,"checkProviderListsEquality");import"@rango-dev/wallets-shared";import{useEffect as ge,useRef as Me,useState as Ye}from"react";import{Ok as Ge,Result as $e}from"ts-results";import{legacyEagerConnectHandler as Oe,legacyIsEvmNamespace as _e}from"@rango-dev/wallets-core/legacy";import{Result as De}from"ts-results";var Y=new P(C);async function Ve(e,n,a){let{getHub:s,allBlockChains:c}=a,d=s().get(e);if(!d)throw new Error(`You should add ${e} to provider first then call 'connect'.`);if(!n)throw new Error("Passing namespace to `connect` is required. ");let u=[];n.forEach(p=>{let m=p.namespace,g=d.findByNamespace(m);if(!g)throw new Error(`We couldn't find any provider matched with your request namespace. (requested namespace: ${p.namespace})`);u.push([p,g])});let r=u.map(([p,m])=>{let v=(_e(p)?M(p,c||[]):void 0)||p.network;return async()=>await m.connect(v).catch(y=>{throw y instanceof Error?y:new Error(y)})}),t=await R(r),o=[];if(t.forEach((p,m)=>{p.err&&o.push(u[m][0])}),o.length>0&&Y.removeNamespacesFromWallet(e,o.map(p=>p.namespace)),!t.some(p=>p.ok))throw new Error(`No namespace connected for ${e}`);return De.all(...t).unwrap()}i(Ve,"eagerConnect");async function pe(e){let{getHub:n,allBlockChains:a,getLegacyProvider:s,wallets:c}=e,d=Y.list(),u=Object.keys(d),r=[];if(u.length){let t=[];u.forEach(o=>{if(c&&!c.includes(o)){console.warn("Trying to run auto connect for a wallet which is not included in config. Desired wallet:",o),r.push(o);return}let l=s(o),p;try{p=l.getInstance()}catch{console.warn("It seems instance isn't available yet for auto connect. This can happen when extension not loaded yet (sometimes when opening browser for first time) or extension is disabled. Desired wallet:",o);return}let m=d[o].map(y=>({namespace:y.namespace,network:y.network})),g=i(async()=>{if(!l.canEagerConnect)throw new Error(`${o} provider hasn't implemented canEagerConnect.`);return await l.canEagerConnect({instance:p,meta:l.getWalletInfo(a||[]).supportedChains})},"canEagerConnect"),v=i(async()=>Ve(o,m,{allBlockChains:a,getHub:n}),"connectHandler");t.push(Oe({canEagerConnect:g,connectHandler:v,providerName:o}).catch(y=>{r.push(o),console.warn(y)}))}),await Promise.all(t),Y.removeWallets(r)}}i(pe,"autoConnect");import{createStore as je,Hub as Ue}from"@rango-dev/wallets-core";import{useRef as me}from"react";function fe(e){let n=me(null),a=me(null);function s(){let u=new Ue({store:c()});return e.forEach(r=>{u.add(r.id,r)}),a.current=u,u}i(s,"createHub");function c(){if(n.current!==null)return n.current;let u=je();return n.current=u,u}i(c,"getStore");function d(){let u=a.current?.getAll();return!a.current||!u||!ue(Array.from(u.values()),e)?s():a.current}return i(d,"getHub"),{getStore:c,getHub:d}}i(fe,"useHubRefs");function G(e){let{getStore:n,getHub:a}=fe(e.providers),[,s]=Ye(0),c=Me({onUpdateState:e.onUpdateState,allVersionedProviders:e.allVersionedProviders,allBlockChains:e.allBlockChains});ge(()=>{c.current={onUpdateState:e.onUpdateState,allVersionedProviders:e.allVersionedProviders,allBlockChains:e.allBlockChains}},[e]),ge(()=>{let r=i(()=>{a().init(),s(o=>o+1)},"runOnInit"),t=i(o=>{o.target&&o.target.readyState==="complete"&&(r(),document.removeEventListener("readystatechange",t))},"initHubWhenPageIsReady");r(),document.addEventListener("readystatechange",t),n().subscribe((o,l)=>{c.current.onUpdateState&&ce(a(),o,l,c.current.onUpdateState,c.current.allVersionedProviders,c.current.allBlockChains),s(p=>p+1)})},[]),b({autoConnect:e.autoConnect,allBlockChains:e.allBlockChains,autoConnectHandler:()=>{pe({getLegacyProvider:L.bind(null,e.allVersionedProviders),allBlockChains:e.allBlockChains,getHub:a,wallets:e.configs?.wallets})}});let d=new P(C);return{canSwitchNetworkTo(r,t){let o=L(e.allVersionedProviders,r),l=o.canSwitchNetworkTo;return l?l({network:t,meta:e.allBlockChains||[],provider:o.getInstance()}):!1},async connect(r,t){let o=a().get(r);if(!o)throw new Error(`You should add ${r} to provider first then call 'connect'.`);if(!t)throw new Error("Passing namespace to `connect` is required.");let l=[];t.forEach(f=>{let w=f.namespace,W=o.findByNamespace(w);if(!W)throw new Error(`We couldn't find any provider matched with your request namespace. (requested namespace: ${f.namespace})`);l.push([f,W])});let p=l.map(([f,w])=>{let W=le(f,e.allBlockChains||[]);return async()=>w.connect(W).then(de).then(I=>({response:I,input:{namespace:f.namespace,network:f.network}}))}),m=await R(p),g=m.filter(f=>f.ok).map(f=>({namespace:f.val.input.namespace,network:f.val.input.network}));L(e.allVersionedProviders,r).canEagerConnect&&g.length>0&&d.addWallet(r,g);let y=m.map(f=>f.andThen(w=>new Ge(w.response))),E=$e.all(...y);if(E.err)throw E.val;return E.unwrap()},async disconnect(r){let t=a().get(r);if(!t)throw new Error(`You should add ${r} to provider first then call 'disconnect'.`);t.getAll().forEach(o=>o.disconnect()),e.autoConnect&&d.removeWallets([r])},async disconnectAll(){let r=Array.from(a().getAll().values()).map(async t=>this.disconnect(t.id));return await Promise.allSettled(r)},async getSigners(r){let t=L(e.allVersionedProviders,r);return t.getSigners(t.getInstance())},getWalletInfo(r){let t=a().get(r);if(!t)throw new Error(`You should add ${r} to provider first.`);let o=t.info();if(!o)throw new Error("Your provider should have required `info`.");let l=L(e.allVersionedProviders,r),p={DEFAULT:""};Object.keys(o.extensions).forEach(g=>{let v=g;if(o.extensions[v]==="homepage"&&(p.DEFAULT=o.extensions[v]||""),["firefox","chrome","brave","edge"].includes(v)){let E=v.toUpperCase();p[E]=o.extensions[v]||""}});let m=l.getWalletInfo(e.allBlockChains||[]);return{name:o.name,img:o.icon,installLink:p,color:"red",supportedChains:m.supportedChains,isContractWallet:!1,mobileWallet:!1,showOnMobile:void 0,needsNamespace:m.needsNamespace,needsDerivationPath:m.needsDerivationPath,isHub:!0,properties:t.info()?.properties}},providers(){let r={};return Array.from(a().getAll().keys()).forEach(t=>{try{let o=L(e.allVersionedProviders,t);r[t]=o.getInstance()}catch(o){console.warn(o)}}),r},state(r){let o=a().state()[r];if(!o)throw new Error(`It seems your requested provider doesn't exist in hub. Provider Id: ${r}`);let l=o.namespaces.filter(m=>m.connected).flatMap(m=>m.accounts?.map(H)).filter(m=>!!m);return{connected:o.connected,connecting:o.connecting,installed:o.installed,reachable:!0,accounts:l,network:null}},suggestAndConnect(r,t){throw new Error("`suggestAndConnect` is not implemented")}}}i(G,"useHubAdapter");function ye(e){let{providers:n,...a}=e,[s,c]=U(n),d=V({...a,providers:s}),u=G({...a,providers:c,allVersionedProviders:n});return{canSwitchNetworkTo(t,o){return S(c,t)?u.canSwitchNetworkTo(t,o):d.canSwitchNetworkTo(t,o)},async connect(t,o){return S(c,t)?await u.connect(t,o):await d.connect(t,o)},async disconnect(t){return S(c,t)?await u.disconnect(t):await d.disconnect(t)},async disconnectAll(){return await Promise.allSettled([u.disconnectAll(),d.disconnectAll()])},async getSigners(t){return S(c,t)?u.getSigners(t):d.getSigners(t)},getWalletInfo(t){return S(c,t)?u.getWalletInfo(t):d.getWalletInfo(t)},providers(){let t={};return c.length>0&&(t={...t,...u.providers()}),s.length>0&&(t={...t,...d.providers()}),t},state(t){return S(c,t)?u.state(t):d.state(t)},async suggestAndConnect(t,o){return S(c,t)?u.suggestAndConnect(t,o):await d.suggestAndConnect(t,o)}}}i(ye,"useProviders");function Ke(e){let n=ye(e);return qe.createElement(T.Provider,{value:n},e.children)}i(Ke,"Provider");var ze=Ke;var Qe=(u=>(u.CONNECTED="connected",u.CONNECTING="connecting",u.REACHABLE="reachable",u.INSTALLED="installed",u.ACCOUNTS="accounts",u.NETWORK="network",u))(Qe||{});export{Qe as Events,ze as Provider,Q as availableWallets,J as checkWalletProviders,st as choose,O as clearPersistance,z as connectedWallets,F as defaultWalletState,ct as isAsync,_ as makeEventHandler,it as needsCheckInstallation,K as stateReducer,X as tryPersistWallet,Z as tryRemoveWalletFromPersistance,ke as useWallets};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|