diff --git a/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/index.tsx b/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/index.tsx index 2db37f8799..5a7a56fbce 100644 --- a/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/index.tsx +++ b/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/index.tsx @@ -2,6 +2,7 @@ import { ReactNode, createContext, useCallback, useContext, useEffect, useState import { APP_PATHS } from 'constants/index' +import { createFordefiProvider } from './providers/fordefi' import { createLedgerProvider } from './providers/ledger' import { createOkxProvider } from './providers/okx' import { createUnisatProvider } from './providers/unisat' @@ -77,6 +78,7 @@ export const BitcoinWalletProvider = ({ children }: { children: ReactNode }) => const xverseProvider = enhanceProvider(createXverseProvider(createProviderPrams)) const okxProvider = enhanceProvider(createOkxProvider(createProviderPrams)) const unisatProvider = enhanceProvider(createUnisatProvider(createProviderPrams)) + const fordefiProvider = enhanceProvider(createFordefiProvider(createProviderPrams)) // const bitgetProvider = enhanceProvider(createBitgetProvider(createProviderPrams)) const ledgerProvider = enhanceProvider(createLedgerProvider(createProviderPrams)) @@ -84,6 +86,7 @@ export const BitcoinWalletProvider = ({ children }: { children: ReactNode }) => // providers.push(bitgetProvider) providers.push(okxProvider) providers.push(unisatProvider) + providers.push(fordefiProvider) providers.push(ledgerProvider) if (window.location.pathname === APP_PATHS.CROSS_CHAIN) { diff --git a/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/providers/fordefi.ts b/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/providers/fordefi.ts new file mode 100644 index 0000000000..4affd3ba95 --- /dev/null +++ b/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/providers/fordefi.ts @@ -0,0 +1,87 @@ +import { BitcoinWalletBase, CreateProviderParams, SendBitcoinParams } from '../types' + +const getFordefiUnisatProvider = () => window.FordefiProviders?.UtxoProvider?.unisatProvider + +export const createFordefiProvider = ({ + connectingWallet, + setConnectingWallet, + setWalletInfo, + defaultInfo, +}: CreateProviderParams): BitcoinWalletBase => { + const handleAccountsChanged = async (accounts: string[]) => { + if (accounts.length === 0) { + setWalletInfo(defaultInfo) + localStorage.removeItem('bitcoinWallet') + } else { + try { + const provider = getFordefiUnisatProvider() + const publicKey = await provider?.getPublicKey() + setWalletInfo({ + isConnected: true, + address: accounts[0], + publicKey, + walletType: 'fordefi', + }) + } catch (error) { + console.log('Error updating Fordefi wallet info after account change:', error) + } + } + } + + const handleDisconnect = () => { + setWalletInfo(defaultInfo) + localStorage.removeItem('bitcoinWallet') + } + + const setupEventListeners = () => { + const provider = getFordefiUnisatProvider() + provider?.on?.('accountsChanged', handleAccountsChanged) + provider?.on?.('disconnect', handleDisconnect) + } + + const removeEventListeners = () => { + const provider = getFordefiUnisatProvider() + provider?.removeListener?.('accountsChanged', handleAccountsChanged) + provider?.removeListener?.('disconnect', handleDisconnect) + } + + return { + name: 'Fordefi', + logo: 'https://storage.googleapis.com/ks-setting-1d682dca/5b0d4c33-2378-4f4b-9c5b-a7791b08b1af1780471044959.png', + type: 'fordefi' as const, + isInstalled: () => !!getFordefiUnisatProvider(), + connect: async () => { + const provider = getFordefiUnisatProvider() + if (!provider) { + window.open('https://www.fordefi.com/', '_blank') + return + } + if (!!connectingWallet) { + return + } + setConnectingWallet('fordefi') + const currentNetwork = await provider.getNetwork() + if (currentNetwork !== 'livenet') { + await provider.switchNetwork('livenet') + } + const [accounts, publicKey] = await Promise.all([provider.requestAccounts(), provider.getPublicKey()]) + + setWalletInfo({ + isConnected: true, + address: accounts[0], + publicKey, + walletType: 'fordefi', + }) + setConnectingWallet(null) + setupEventListeners() + }, + disconnect: async () => { + removeEventListeners() + localStorage.removeItem('bitcoinWallet') + setWalletInfo(defaultInfo) + }, + sendBitcoin: async ({ recipient, amount, options }: SendBitcoinParams) => { + return await getFordefiUnisatProvider()?.sendBitcoin(recipient, Number(amount), options) + }, + } +} diff --git a/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/types.ts b/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/types.ts index 4f0b38b6b1..234f290499 100644 --- a/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/types.ts +++ b/apps/kyberswap-interface/src/components/Web3Provider/BitcoinProvider/types.ts @@ -1,4 +1,4 @@ -export type WalletType = 'xverse' | 'okx' | 'unisat' | 'bitget' | 'ledger' +export type WalletType = 'xverse' | 'okx' | 'unisat' | 'fordefi' | 'bitget' | 'ledger' export interface SendBitcoinParams { sender?: string // required for ledger diff --git a/apps/kyberswap-interface/src/react-app-env.d.ts b/apps/kyberswap-interface/src/react-app-env.d.ts index 5de4064d6a..53499f1068 100644 --- a/apps/kyberswap-interface/src/react-app-env.d.ts +++ b/apps/kyberswap-interface/src/react-app-env.d.ts @@ -51,5 +51,6 @@ interface Window { zESettings?: any XverseProviders?: { BitcoinProvider: any } + FordefiProviders?: { UtxoProvider?: { unisatProvider?: any } } bitkeep?: any }