2021-04-14 11:40:28 -07:00
|
|
|
import { useEffect } from 'react'
|
2021-03-30 15:47:08 -07:00
|
|
|
import Wallet from '@project-serum/sol-wallet-adapter'
|
|
|
|
import useLocalStorageState from './useLocalStorageState'
|
2021-04-13 16:41:04 -07:00
|
|
|
import useMangoStore, { INITIAL_STATE } from '../stores/useMangoStore'
|
2021-04-11 21:17:23 -07:00
|
|
|
import { notify } from '../utils/notifications'
|
2021-04-13 22:23:50 -07:00
|
|
|
import {
|
|
|
|
PhantomWalletAdapter,
|
|
|
|
SolletExtensionAdapter,
|
|
|
|
} from '../utils/wallet-adapters'
|
|
|
|
|
|
|
|
const ASSET_URL =
|
|
|
|
'https://cdn.jsdelivr.net/gh/solana-labs/oyster@main/assets/wallets'
|
2021-03-30 15:47:08 -07:00
|
|
|
|
|
|
|
export const WALLET_PROVIDERS = [
|
2021-04-13 22:23:50 -07:00
|
|
|
{
|
|
|
|
name: 'Sollet.io',
|
|
|
|
url: 'https://www.sollet.io',
|
|
|
|
icon: `${ASSET_URL}/sollet.svg`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'Sollet Extension',
|
|
|
|
url: 'https://www.sollet.io/extension',
|
|
|
|
icon: `${ASSET_URL}/sollet.svg`,
|
|
|
|
adapter: SolletExtensionAdapter as any,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'Phantom',
|
|
|
|
url: 'https://www.phantom.app',
|
|
|
|
icon: `https://www.phantom.app/img/logo.png`,
|
|
|
|
adapter: PhantomWalletAdapter,
|
|
|
|
},
|
2021-03-30 15:47:08 -07:00
|
|
|
]
|
|
|
|
|
2021-04-02 11:26:21 -07:00
|
|
|
export default function useWallet() {
|
2021-04-05 07:32:11 -07:00
|
|
|
const setMangoStore = useMangoStore((state) => state.set)
|
2021-04-13 22:23:50 -07:00
|
|
|
const { current: wallet, connected, providerUrl } = useMangoStore(
|
|
|
|
(state) => state.wallet
|
|
|
|
)
|
2021-04-05 07:32:11 -07:00
|
|
|
const endpoint = useMangoStore((state) => state.connection.endpoint)
|
2021-04-09 17:01:00 -07:00
|
|
|
const fetchWalletBalances = useMangoStore(
|
|
|
|
(s) => s.actions.fetchWalletBalances
|
|
|
|
)
|
2021-04-13 22:23:50 -07:00
|
|
|
const [savedProviderUrl, setSavedProviderUrl] = useLocalStorageState(
|
2021-03-30 15:47:08 -07:00
|
|
|
'walletProvider',
|
|
|
|
'https://www.sollet.io'
|
|
|
|
)
|
|
|
|
|
2021-04-02 11:26:21 -07:00
|
|
|
useEffect(() => {
|
2021-04-13 22:23:50 -07:00
|
|
|
if (providerUrl !== savedProviderUrl) {
|
|
|
|
setSavedProviderUrl(providerUrl || savedProviderUrl)
|
|
|
|
setMangoStore((state) => {
|
|
|
|
state.wallet.providerUrl = providerUrl || savedProviderUrl
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}, [providerUrl, savedProviderUrl, setSavedProviderUrl])
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (!providerUrl) return
|
|
|
|
const provider = WALLET_PROVIDERS.find(({ url }) => url === providerUrl)
|
|
|
|
const newWallet = new (provider?.adapter || Wallet)(providerUrl, endpoint)
|
|
|
|
console.log('wallet', newWallet)
|
2021-03-30 15:47:08 -07:00
|
|
|
|
2021-04-05 07:32:11 -07:00
|
|
|
setMangoStore((state) => {
|
2021-04-02 11:26:21 -07:00
|
|
|
state.wallet.current = newWallet
|
|
|
|
})
|
2021-04-13 22:23:50 -07:00
|
|
|
}, [endpoint, providerUrl, setMangoStore])
|
2021-03-30 15:47:08 -07:00
|
|
|
|
|
|
|
useEffect(() => {
|
2021-04-02 11:26:21 -07:00
|
|
|
if (!wallet) return
|
2021-03-30 15:47:08 -07:00
|
|
|
wallet.on('connect', () => {
|
2021-04-12 13:01:55 -07:00
|
|
|
console.log('connected')
|
|
|
|
|
2021-04-05 07:32:11 -07:00
|
|
|
setMangoStore((state) => {
|
2021-04-02 11:26:21 -07:00
|
|
|
state.wallet.connected = true
|
|
|
|
})
|
2021-04-11 21:17:23 -07:00
|
|
|
notify({
|
|
|
|
message: 'Wallet connected',
|
|
|
|
description:
|
|
|
|
'Connected to wallet ' +
|
|
|
|
wallet.publicKey.toString().substr(0, 5) +
|
|
|
|
'...' +
|
|
|
|
wallet.publicKey.toString().substr(-5),
|
|
|
|
})
|
2021-03-30 15:47:08 -07:00
|
|
|
})
|
|
|
|
wallet.on('disconnect', () => {
|
2021-04-05 07:32:11 -07:00
|
|
|
setMangoStore((state) => {
|
2021-04-13 16:41:04 -07:00
|
|
|
state.wallet = INITIAL_STATE.WALLET
|
2021-04-05 07:32:11 -07:00
|
|
|
state.marginAccounts = []
|
|
|
|
state.selectedMarginAccount.current = null
|
2021-04-02 11:26:21 -07:00
|
|
|
})
|
2021-04-11 21:17:23 -07:00
|
|
|
notify({
|
|
|
|
type: 'info',
|
|
|
|
message: 'Disconnected from wallet',
|
|
|
|
})
|
2021-03-30 15:47:08 -07:00
|
|
|
})
|
|
|
|
return () => {
|
2021-04-13 22:23:50 -07:00
|
|
|
if (wallet && wallet.connected) {
|
|
|
|
console.log('DISCONNECTING')
|
|
|
|
|
|
|
|
wallet.disconnect()
|
|
|
|
}
|
2021-04-05 07:32:11 -07:00
|
|
|
setMangoStore((state) => {
|
2021-04-13 16:41:04 -07:00
|
|
|
state.wallet = INITIAL_STATE.WALLET
|
2021-04-02 11:26:21 -07:00
|
|
|
})
|
2021-03-30 15:47:08 -07:00
|
|
|
}
|
2021-04-13 22:23:50 -07:00
|
|
|
}, [wallet, setMangoStore])
|
2021-03-30 15:47:08 -07:00
|
|
|
|
2021-04-09 17:01:00 -07:00
|
|
|
useEffect(() => {
|
|
|
|
fetchWalletBalances()
|
|
|
|
}, [connected, fetchWalletBalances])
|
|
|
|
|
2021-04-13 22:23:50 -07:00
|
|
|
return { connected, wallet }
|
2021-03-30 15:47:08 -07:00
|
|
|
}
|