/* * Copyright (c) 2022 @automata-network/wallet-sdk authors and contributors. * This software may be modified and distributed under the terms of UNLICENSED * license. Refer to the LICENSE file for details. */ import { WalletAdapter } from '@solana/wallet-adapter-base' import type { Chain as OnboardChain, WalletInit } from '@web3-onboard/common' import Onboard from '@web3-onboard/core' import injectedModule from '@web3-onboard/injected-wallets' import { ChainType, Chains, EVMProviderConfigs, PolkadotExtensionModule, PolkadotProviderConfigs, ProviderConfigs, SolanaProviderConfigs } from './interfaces' import { evmProviderGetters, getInjectedExtensionModule, polkadotExtensionModuleGetters, solanaWalletAdapterGetters } from './providers' const injectedWallets = injectedModule() export function getEvmWalletsProvider(providerConfigs: ProviderConfigs): WalletInit[] { const { evm: evmProviderConfigs = {} } = providerConfigs const providers = Object.keys(evmProviderConfigs) .map((walletKey) => { const getter = evmProviderGetters[walletKey as keyof EVMProviderConfigs] if (!getter) { return } return getter(evmProviderConfigs) }) .filter((item) => item != null) as WalletInit[] return providers } export function instantiateOnboard(providerConfigs: ProviderConfigs, chains: Chains) { const evmChains = chains .filter((item) => item.type === ChainType.EVM) .map((chain) => { const { rpcUrls, chainId, blockExplorerUrls, iconUrl, chainName, nativeCurrency } = chain const onBoardChain: OnboardChain | undefined = chainId && chainName && nativeCurrency && rpcUrls.length ? { id: chainId, rpcUrl: rpcUrls[0], label: chainName, token: nativeCurrency.symbol, icon: iconUrl, blockExplorerUrl: blockExplorerUrls && blockExplorerUrls.length ? blockExplorerUrls[0] : undefined } : undefined return onBoardChain }) .filter((item) => item != null) as OnboardChain[] const providers = getEvmWalletsProvider(providerConfigs) return Onboard({ wallets: [injectedWallets, ...providers], chains: evmChains, connect: { showSidebar: false }, accountCenter: { desktop: { enabled: false }, mobile: { enabled: false } } }) } export function getPolkadotExtensionModule( providerConfigs: ProviderConfigs ): PolkadotExtensionModule[] { const { polkadot: polkadotProviderConfigs = {} } = providerConfigs const extensionModules = Object.keys(polkadotProviderConfigs) .map((walletKey) => { const getter = polkadotExtensionModuleGetters[walletKey as keyof PolkadotProviderConfigs] if (!getter) { return } return getter(polkadotProviderConfigs) }) .filter((item) => item != null) as PolkadotExtensionModule[] return getInjectedExtensionModule(extensionModules) } export function getSolanaWalletAdapters(providerConfigs: ProviderConfigs): WalletAdapter[] { const { solana: solanaProviderConfigs = {} } = providerConfigs const walletAdapters = Object.keys(solanaProviderConfigs) .map((walletKey) => { const getter = solanaWalletAdapterGetters[walletKey as keyof SolanaProviderConfigs] if (!getter) { return } return getter(solanaProviderConfigs) }) .filter((item) => item != null) as WalletAdapter[] return walletAdapters }