From b644f3a0a950ae112e90dfaf63e1825400fbc3e5 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Tue, 13 Jul 2021 16:07:50 +0800 Subject: [PATCH 01/13] refactor: debug mode --- .../src/extension/background-script/EthereumServices/send.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/send.ts b/packages/maskbook/src/extension/background-script/EthereumServices/send.ts index da32c7337ea7..82cd20692cd3 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/send.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/send.ts @@ -10,6 +10,7 @@ import { addRecentTransaction, getWallet } from '../../../plugins/Wallet/service import { commitNonce, getNonce, resetNonce } from './nonce' import { getGasPrice } from './network' import { currentAccountSettings, currentProviderSettings } from '../../../plugins/Wallet/settings' +import { debugModeSetting } from '../../../settings/settings' /** * This API is only used internally. Please use requestSend instead in order to share the same payload id globally. @@ -22,7 +23,7 @@ export async function INTERNAL_send( callback: (error: Error | null, response?: JsonRpcResponse) => void, rpc?: string, ) { - if (process.env.NODE_ENV === 'development') { + if (process.env.NODE_ENV === 'development' && debugModeSetting.value) { console.table(payload) console.debug(new Error().stack) } From 3d2604319f2de7e022fc8001c3a93777a6dc6099 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Tue, 13 Jul 2021 16:34:37 +0800 Subject: [PATCH 02/13] fix: connect to external providers --- .../EthereumServices/providers/MetaMask.ts | 10 ++-------- .../providers/WalletConnect.ts | 18 +++++++++--------- .../src/plugins/Wallet/services/account.ts | 2 ++ 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts index f035e819bb57..9fe53dce2afe 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts @@ -60,22 +60,15 @@ export function createWeb3() { export async function requestAccounts() { const web3 = createWeb3() - - // update accounts const accounts = await web3.eth.requestAccounts() - await updateWalletInDB(first(accounts) ?? '', true) - - // update chain id const chainId = await web3.eth.getChainId() - onChainIdChanged(chainId.toString(16)) - return { chainId, accounts, } } -async function updateWalletInDB(address: string, setAsDefault: boolean = false) { +async function updateWalletInDB(address: string, chainId?: ChainId, setAsDefault: boolean = false) { const providerType = currentProviderSettings.value // validate address @@ -90,6 +83,7 @@ async function updateWalletInDB(address: string, setAsDefault: boolean = false) // update chain account await updateAccount({ account: setAsDefault || providerType === ProviderType.MetaMask ? address : undefined, + chainId, providerType: setAsDefault ? ProviderType.MetaMask : undefined, }) } diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts index 7f780e5096ee..ce294fcbeed1 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts @@ -87,10 +87,7 @@ export async function requestAccounts() { const onConnect = async () => { if (!connector?.accounts.length) return - await updateAccount({ - chainId: connector.chainId, - }) - await updateWalletInDB(first(connector.accounts) ?? '', connector.peerMeta?.name, true) + await updateWalletInDB(first(connector.accounts) ?? '', connector.chainId, connector.peerMeta?.name, true) } const onUpdate = async ( @@ -104,10 +101,7 @@ const onUpdate = async ( ) => { if (error) return if (!connector?.accounts.length) return - await updateAccount({ - chainId: connector.chainId, - }) - await updateWalletInDB(first(connector.accounts) ?? '', connector.peerMeta?.name, false) + await updateWalletInDB(first(connector.accounts) ?? '', connector.chainId, connector.peerMeta?.name, false) } const onDisconnect = async (error: Error | null) => { @@ -120,7 +114,12 @@ const onDisconnect = async (error: Error | null) => { }) } -async function updateWalletInDB(address: string, name: string = 'WalletConnect', setAsDefault: boolean = false) { +async function updateWalletInDB( + address: string, + chainId?: ChainId, + name: string = 'WalletConnect', + setAsDefault: boolean = false, +) { const providerType = currentProviderSettings.value // validate address @@ -135,6 +134,7 @@ async function updateWalletInDB(address: string, name: string = 'WalletConnect', // update chain account await updateAccount({ account: setAsDefault || providerType === ProviderType.WalletConnect ? address : undefined, + chainId, providerType: setAsDefault ? ProviderType.WalletConnect : undefined, }) } diff --git a/packages/maskbook/src/plugins/Wallet/services/account.ts b/packages/maskbook/src/plugins/Wallet/services/account.ts index d459aad93aac..5efa6d4185d8 100644 --- a/packages/maskbook/src/plugins/Wallet/services/account.ts +++ b/packages/maskbook/src/plugins/Wallet/services/account.ts @@ -20,6 +20,8 @@ export async function updateAccount( providerType?: ProviderType } = {}, ) { + console.debug('DEBUG: update account') + console.debug(options) if (!options?.chainId && options.networkType) options.chainId = getChainIdFromNetworkType(options.networkType) if (options?.chainId && !options?.networkType) options.networkType = getNetworkTypeFromChainId(options.chainId) if (options?.account) currentAccountSettings.value = options?.account From b163cf048274410e4bf3608ed43bb0875ab1dd34 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Fri, 16 Jul 2021 21:47:36 +0800 Subject: [PATCH 03/13] fix: update account --- .../EthereumServices/providers/MetaMask.ts | 48 ++++++----------- .../providers/WalletConnect.ts | 15 +++++- .../src/plugins/Wallet/services/account.ts | 51 +++++++++++++++---- 3 files changed, 68 insertions(+), 46 deletions(-) diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts index 9fe53dce2afe..be11b9aff093 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts @@ -1,18 +1,21 @@ import Web3 from 'web3' import type { provider as Provider } from 'web3-core' import { first } from 'lodash-es' -import { EthereumAddress } from 'wallet.ts' import createMetaMaskProvider, { MetaMaskInpageProvider } from '@dimensiondev/metamask-extension-provider' -import { ChainId, NetworkType, ProviderType } from '@masknet/web3-shared' -import { updateAccount, updateExoticWalletFromSource } from '../../../../plugins/Wallet/services' +import { ChainId, ProviderType } from '@masknet/web3-shared' +import { resetAccount, updateAccount } from '../../../../plugins/Wallet/services' import { currentIsMetamaskLockedSettings, currentProviderSettings } from '../../../../plugins/Wallet/settings' let provider: MetaMaskInpageProvider | null = null let web3: Web3 | null = null async function onAccountsChanged(accounts: string[]) { - await updateWalletInDB(first(accounts) ?? '') currentIsMetamaskLockedSettings.value = !(await provider!._metamask?.isUnlocked()) && accounts.length === 0 + await updateAccount({ + account: first(accounts), + chainId: typeof provider?.chainId === 'string' ? Number.parseInt(provider.chainId, 16) : undefined, + providerType: ProviderType.MetaMask, + }) } async function onChainIdChanged(id: string) { @@ -20,19 +23,18 @@ async function onChainIdChanged(id: string) { const chainId_ = Number.parseInt(id, 16) const chainId = chainId_ === 0 ? ChainId.Mainnet : chainId_ currentIsMetamaskLockedSettings.value = !(await provider!._metamask?.isUnlocked()) - if (currentProviderSettings.value !== ProviderType.MetaMask) return - await updateAccount({ - chainId, - }) + if (currentProviderSettings.value === ProviderType.MetaMask) + await updateAccount({ + chainId, + }) } async function onError(error: string) { if (typeof error !== 'string' || !/Lost Connection to MetaMask/i.test(error)) return - if (currentProviderSettings.value !== ProviderType.MetaMask) return - await updateAccount({ - account: '', - networkType: NetworkType.Ethereum, - }) + if (currentProviderSettings.value === ProviderType.MetaMask) + await resetAccount({ + providerType: ProviderType.MetaMask, + }) } export function createProvider() { @@ -67,23 +69,3 @@ export async function requestAccounts() { accounts, } } - -async function updateWalletInDB(address: string, chainId?: ChainId, setAsDefault: boolean = false) { - const providerType = currentProviderSettings.value - - // validate address - if (!EthereumAddress.isValid(address)) { - if (providerType === ProviderType.MetaMask) await updateAccount({ account: '' }) - return - } - - // update wallet in the DB - await updateExoticWalletFromSource(ProviderType.MetaMask, new Map([[address, { address }]])) - - // update chain account - await updateAccount({ - account: setAsDefault || providerType === ProviderType.MetaMask ? address : undefined, - chainId, - providerType: setAsDefault ? ProviderType.MetaMask : undefined, - }) -} diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts index ce294fcbeed1..c26d1ed72895 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts @@ -87,7 +87,12 @@ export async function requestAccounts() { const onConnect = async () => { if (!connector?.accounts.length) return - await updateWalletInDB(first(connector.accounts) ?? '', connector.chainId, connector.peerMeta?.name, true) + await updateAccount({ + name: connector.peerMeta?.name, + account: first(connector.accounts), + chainId: connector.chainId, + providerType: ProviderType.WalletConnect, + }) } const onUpdate = async ( @@ -101,7 +106,13 @@ const onUpdate = async ( ) => { if (error) return if (!connector?.accounts.length) return - await updateWalletInDB(first(connector.accounts) ?? '', connector.chainId, connector.peerMeta?.name, false) + if (currentProviderSettings.value === ProviderType.WalletConnect) + await updateAccount({ + name: connector.peerMeta?.name, + account: first(connector.accounts), + chainId: connector.chainId, + providerType: ProviderType.WalletConnect, + }) } const onDisconnect = async (error: Error | null) => { diff --git a/packages/maskbook/src/plugins/Wallet/services/account.ts b/packages/maskbook/src/plugins/Wallet/services/account.ts index 5efa6d4185d8..5c628345f18b 100644 --- a/packages/maskbook/src/plugins/Wallet/services/account.ts +++ b/packages/maskbook/src/plugins/Wallet/services/account.ts @@ -5,15 +5,19 @@ import { getNetworkTypeFromChainId, getChainIdFromNetworkType, } from '@masknet/web3-shared' +import { EthereumAddress } from 'wallet.ts' +import type { WalletRecord } from '../database/types' import { currentAccountSettings, currentChainIdSettings, currentNetworkSettings, currentProviderSettings, } from '../settings' +import { updateExoticWalletFromSource } from './wallet' export async function updateAccount( options: { + name?: string account?: string chainId?: ChainId networkType?: NetworkType @@ -22,17 +26,42 @@ export async function updateAccount( ) { console.debug('DEBUG: update account') console.debug(options) - if (!options?.chainId && options.networkType) options.chainId = getChainIdFromNetworkType(options.networkType) - if (options?.chainId && !options?.networkType) options.networkType = getNetworkTypeFromChainId(options.chainId) - if (options?.account) currentAccountSettings.value = options?.account - if (options?.chainId) currentChainIdSettings.value = options?.chainId - if (options?.providerType) currentProviderSettings.value = options?.providerType - if (options?.networkType) currentNetworkSettings.value = options?.networkType + + if (options.chainId && !options.networkType) options.networkType = getNetworkTypeFromChainId(options.chainId) + if (!options.chainId && options.networkType) options.chainId = getChainIdFromNetworkType(options.networkType) + + const { name, account, chainId, providerType, networkType } = options + + // update wallet in the DB + if (account && providerType && EthereumAddress.isValid(account) && providerType !== ProviderType.Maskbook) { + const updates: Partial = { address: account } + if (name) updates.name = name + await updateExoticWalletFromSource(providerType, new Map([[account, updates]])) + } + + // update global settings + if (account) currentAccountSettings.value = account + if (chainId) currentChainIdSettings.value = chainId + if (providerType) currentProviderSettings.value = providerType + if (networkType) currentNetworkSettings.value = networkType } -export async function resetAccount() { - currentAccountSettings.value = '' - currentChainIdSettings.value = ChainId.Mainnet - currentNetworkSettings.value = NetworkType.Ethereum - currentProviderSettings.value = ProviderType.Maskbook +export async function resetAccount( + options: { + account?: string + chainId?: ChainId + networkType?: NetworkType + providerType?: ProviderType + } = {}, +) { + const { + account = '', + chainId = ChainId.Mainnet, + networkType = NetworkType.Ethereum, + providerType = ProviderType.Maskbook, + } = options + currentAccountSettings.value = account + currentChainIdSettings.value = chainId + currentNetworkSettings.value = networkType + currentProviderSettings.value = providerType } From 3bd3e2da5ad83d109ccdc741163a522e1a3067d1 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Wed, 21 Jul 2021 21:54:31 +0800 Subject: [PATCH 04/13] chore: add rpc overrides --- .../EthereumServices/network.ts | 154 +++++++++++------- .../EthereumServices/providers/MetaMask.ts | 30 ++-- .../providers/WalletConnect.ts | 63 ++----- .../EthereumServices/request.ts | 6 +- .../EthereumServices/send.ts | 37 +++-- .../EthereumServices/web3.ts | 8 +- .../DashboardDialogs/Wallet/DeleteConfirm.tsx | 7 +- .../hooks/useClaimablePoolsByWeb3.ts | 4 +- .../SNSAdaptor/ConnectWalletDialog/index.tsx | 46 +++--- .../SNSAdaptor/SelectProviderDialog/index.tsx | 4 +- .../Wallet/SNSAdaptor/SelectWalletDialog.tsx | 6 +- 11 files changed, 191 insertions(+), 174 deletions(-) diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/network.ts b/packages/maskbook/src/extension/background-script/EthereumServices/network.ts index 299635d803e1..bf658217211e 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/network.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/network.ts @@ -9,79 +9,114 @@ import type { import { first } from 'lodash-es' import { ChainId, EthereumChainDetailed, EthereumMethodType, getRPCConstants } from '@masknet/web3-shared' import { request } from './request' +import type { SendOverrides } from './send' -export async function getGasPrice() { - return request({ - method: EthereumMethodType.ETH_GAS_PRICE, - }) +export async function getGasPrice(overrides?: SendOverrides) { + return request( + { + method: EthereumMethodType.ETH_GAS_PRICE, + }, + overrides, + ) } -export async function getBlockNumber() { - const blockNumber = await request({ - method: EthereumMethodType.ETH_BLOCK_NUMBER, - }) +export async function getBlockNumber(overrides?: SendOverrides) { + const blockNumber = await request( + { + method: EthereumMethodType.ETH_BLOCK_NUMBER, + }, + overrides, + ) return Number.parseInt(blockNumber, 16) } -export async function getBalance(address: string) { - return request({ - method: EthereumMethodType.ETH_GET_BALANCE, - params: [address, 'latest'], - }) +export async function getBalance(address: string, overrides?: SendOverrides) { + return request( + { + method: EthereumMethodType.ETH_GET_BALANCE, + params: [address, 'latest'], + }, + overrides, + ) } -export async function getTransactionByHash(hash: string) { - return request({ - method: EthereumMethodType.ETH_GET_TRANSACTION_BY_HASH, - params: [hash], - }) +export async function getTransactionByHash(hash: string, overrides?: SendOverrides) { + return request( + { + method: EthereumMethodType.ETH_GET_TRANSACTION_BY_HASH, + params: [hash], + }, + overrides, + ) } -export async function getTransactionReceipt(hash: string) { - return request({ - method: EthereumMethodType.ETH_GET_TRANSACTION_RECEIPT, - params: [hash], - }) +export async function getTransactionReceipt(hash: string, overrides?: SendOverrides) { + return request( + { + method: EthereumMethodType.ETH_GET_TRANSACTION_RECEIPT, + params: [hash], + }, + overrides, + ) } -export async function getTransactionCount(address: string) { - const count = await request({ - method: EthereumMethodType.ETH_GET_TRANSACTION_COUNT, - params: [address, 'latest'], - }) +export async function getTransactionCount(address: string, overrides?: SendOverrides) { + const count = await request( + { + method: EthereumMethodType.ETH_GET_TRANSACTION_COUNT, + params: [address, 'latest'], + }, + overrides, + ) return Number.parseInt(count, 16) } -export async function estimateGas(config: TransactionConfig) { - const gas = await request({ - method: EthereumMethodType.ETH_ESTIMATE_GAS, - params: [config], - }) +export async function estimateGas(config: TransactionConfig, overrides?: SendOverrides) { + const gas = await request( + { + method: EthereumMethodType.ETH_ESTIMATE_GAS, + params: [config], + }, + overrides, + ) return Number.parseInt(gas, 16) } -export async function sign(dataToSign: string, address: string) { - return request({ - method: EthereumMethodType.ETH_SIGN, - params: [dataToSign, address], - }) +export async function sign(dataToSign: string, address: string, overrides?: SendOverrides) { + return request( + { + method: EthereumMethodType.ETH_SIGN, + params: [dataToSign, address], + }, + overrides, + ) } -export async function personalSign(dataToSign: string, address: string, password?: string) { - return request({ - method: EthereumMethodType.PERSONAL_SIGN, - params: [dataToSign, address, password].filter((x) => typeof x !== 'undefined'), - }) +export async function personalSign(dataToSign: string, address: string, password?: string, overrides?: SendOverrides) { + return request( + { + method: EthereumMethodType.PERSONAL_SIGN, + params: [dataToSign, address, password].filter((x) => typeof x !== 'undefined'), + }, + overrides, + ) } -export async function addEthereumChain(chainDetailed: EthereumChainDetailed, address?: string) { - return request({ - method: EthereumMethodType.WALLET_ADD_ETHEREUM_CHAIN, - params: [chainDetailed, address].filter(Boolean), - }) +export async function addEthereumChain( + chainDetailed: EthereumChainDetailed, + address?: string, + overrides?: SendOverrides, +) { + return request( + { + method: EthereumMethodType.WALLET_ADD_ETHEREUM_CHAIN, + params: [chainDetailed, address].filter(Boolean), + }, + overrides, + ) } -export async function switchEthereumChain(chainId: ChainId) { +export async function switchEthereumChain(chainId: ChainId, overrides?: SendOverrides) { return request({ method: EthereumMethodType.WALLET_SWITCH_ETHEREUM_CHAIN, params: [ @@ -89,25 +124,26 @@ export async function switchEthereumChain(chainId: ChainId) { chainId: `0x${chainId.toString(16)}`, }, ], + overrides, }) } -export async function signTransaction(config: TransactionConfig) { - return request({ - method: EthereumMethodType.ETH_SIGN_TRANSACTION, - params: [config], - }) +export async function signTransaction(config: TransactionConfig, overrides?: SendOverrides) { + return request( + { + method: EthereumMethodType.ETH_SIGN_TRANSACTION, + params: [config], + }, + overrides, + ) } -export async function getPastLogs(config: PastLogsOptions, chainId: ChainId) { - const { RPC } = getRPCConstants(chainId) - const provderURL = first(RPC) - if (!provderURL) throw new Error('Unknown chain id.') +export async function getPastLogs(config: PastLogsOptions, overrides?: SendOverrides) { return request( { method: EthereumMethodType.ETH_GET_LOGS, params: [config], }, - provderURL, + overrides, ) } diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts index be11b9aff093..67138d5702e6 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts @@ -4,13 +4,18 @@ import { first } from 'lodash-es' import createMetaMaskProvider, { MetaMaskInpageProvider } from '@dimensiondev/metamask-extension-provider' import { ChainId, ProviderType } from '@masknet/web3-shared' import { resetAccount, updateAccount } from '../../../../plugins/Wallet/services' -import { currentIsMetamaskLockedSettings, currentProviderSettings } from '../../../../plugins/Wallet/settings' +import { + currentChainIdSettings, + currentIsMetamaskLockedSettings, + currentProviderSettings, +} from '../../../../plugins/Wallet/settings' let provider: MetaMaskInpageProvider | null = null let web3: Web3 | null = null async function onAccountsChanged(accounts: string[]) { currentIsMetamaskLockedSettings.value = !(await provider!._metamask?.isUnlocked()) && accounts.length === 0 + if (currentProviderSettings.value !== ProviderType.MetaMask) return await updateAccount({ account: first(accounts), chainId: typeof provider?.chainId === 'string' ? Number.parseInt(provider.chainId, 16) : undefined, @@ -19,22 +24,23 @@ async function onAccountsChanged(accounts: string[]) { } async function onChainIdChanged(id: string) { - // learn more: https://docs.metamask.io/guide/ethereum-provider.html#chain-ids and https://chainid.network/ - const chainId_ = Number.parseInt(id, 16) - const chainId = chainId_ === 0 ? ChainId.Mainnet : chainId_ currentIsMetamaskLockedSettings.value = !(await provider!._metamask?.isUnlocked()) - if (currentProviderSettings.value === ProviderType.MetaMask) - await updateAccount({ - chainId, - }) + if (currentProviderSettings.value !== ProviderType.MetaMask) return + + // learn more: https://docs.metamask.io/guide/ethereum-provider.html#chain-ids and https://chainid.network/ + const chainId = Number.parseInt(id, 16) || ChainId.Mainnet + if (currentChainIdSettings.value === chainId) return + await updateAccount({ + chainId, + }) } async function onError(error: string) { if (typeof error !== 'string' || !/Lost Connection to MetaMask/i.test(error)) return - if (currentProviderSettings.value === ProviderType.MetaMask) - await resetAccount({ - providerType: ProviderType.MetaMask, - }) + if (currentProviderSettings.value !== ProviderType.MetaMask) return + await resetAccount({ + providerType: ProviderType.MetaMask, + }) } export function createProvider() { diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts index c26d1ed72895..b801ab33fb01 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts @@ -1,11 +1,10 @@ import type { JsonRpcResponse } from 'web3-core-helpers' import { first } from 'lodash-es' -import { EthereumAddress } from 'wallet.ts' import WalletConnect from '@walletconnect/client' import type { IJsonRpcRequest } from '@walletconnect/types' -import { ProviderType, NetworkType, ChainId } from '@masknet/web3-shared' +import { ProviderType, ChainId } from '@masknet/web3-shared' import * as Maskbook from '../providers/Maskbook' -import { updateAccount, updateExoticWalletFromSource } from '../../../../plugins/Wallet/services' +import { resetAccount, updateAccount } from '../../../../plugins/Wallet/services' import { currentChainIdSettings, currentProviderSettings } from '../../../../plugins/Wallet/settings' let connector: WalletConnect | null = null @@ -55,7 +54,7 @@ export async function sendCustomRequest(payload: IJsonRpcRequest) { // Wrap promise as PromiEvent because WalletConnect returns transaction hash only // docs: https://docs.walletconnect.org/client-api -export function createWeb3(chainId = currentChainIdSettings.value) { +export function createWeb3({ chainId = currentChainIdSettings.value }: { chainId: ChainId }) { return Maskbook.createWeb3({ chainId, }) @@ -85,19 +84,11 @@ export async function requestAccounts() { }) } -const onConnect = async () => { - if (!connector?.accounts.length) return - await updateAccount({ - name: connector.peerMeta?.name, - account: first(connector.accounts), - chainId: connector.chainId, - providerType: ProviderType.WalletConnect, - }) -} +const onConnect = () => onUpdate(null) const onUpdate = async ( error: Error | null, - payload: { + payload?: { params: { chainId: number accounts: string[] @@ -106,46 +97,20 @@ const onUpdate = async ( ) => { if (error) return if (!connector?.accounts.length) return - if (currentProviderSettings.value === ProviderType.WalletConnect) - await updateAccount({ - name: connector.peerMeta?.name, - account: first(connector.accounts), - chainId: connector.chainId, - providerType: ProviderType.WalletConnect, - }) + if (currentProviderSettings.value !== ProviderType.WalletConnect) return + await updateAccount({ + name: connector.peerMeta?.name, + account: first(connector.accounts), + chainId: connector.chainId, + providerType: ProviderType.WalletConnect, + }) } const onDisconnect = async (error: Error | null) => { if (connector?.connected) await connector.killSession() connector = null if (currentProviderSettings.value !== ProviderType.WalletConnect) return - await updateAccount({ - account: '', - networkType: NetworkType.Ethereum, - }) -} - -async function updateWalletInDB( - address: string, - chainId?: ChainId, - name: string = 'WalletConnect', - setAsDefault: boolean = false, -) { - const providerType = currentProviderSettings.value - - // validate address - if (!EthereumAddress.isValid(address)) { - if (providerType === ProviderType.WalletConnect) await updateAccount({ account: '' }) - return - } - - // update wallet in the DB - await updateExoticWalletFromSource(ProviderType.WalletConnect, new Map([[address, { name, address }]])) - - // update chain account - await updateAccount({ - account: setAsDefault || providerType === ProviderType.WalletConnect ? address : undefined, - chainId, - providerType: setAsDefault ? ProviderType.WalletConnect : undefined, + await resetAccount({ + providerType: ProviderType.WalletConnect, }) } diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/request.ts b/packages/maskbook/src/extension/background-script/EthereumServices/request.ts index 3f3e4ff5fd12..45bca93aa905 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/request.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/request.ts @@ -1,10 +1,10 @@ import type { RequestArguments } from 'web3-core' import type { JsonRpcPayload, JsonRpcResponse } from 'web3-core-helpers' -import { INTERNAL_send } from './send' +import { INTERNAL_send, SendOverrides } from './send' let id = 0 -export async function request(requestArguments: RequestArguments, rpc?: string) { +export async function request(requestArguments: RequestArguments, overrides?: SendOverrides) { return new Promise((resolve, reject) => { id++ INTERNAL_send( @@ -18,7 +18,7 @@ export async function request(requestArguments: RequestArgume if (error || response?.error) reject(error ?? response?.error) else resolve(response?.result) }, - rpc, + overrides, ) }) } diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/send.ts b/packages/maskbook/src/extension/background-script/EthereumServices/send.ts index 82cd20692cd3..f02fa53038ec 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/send.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/send.ts @@ -1,7 +1,7 @@ import { EthereumAddress } from 'wallet.ts' import type { HttpProvider, TransactionConfig } from 'web3-core' import type { JsonRpcPayload, JsonRpcResponse } from 'web3-core-helpers' -import { addGasMargin, EthereumMethodType, ProviderType } from '@masknet/web3-shared' +import { addGasMargin, ChainId, EthereumMethodType, ProviderType } from '@masknet/web3-shared' import type { IJsonRpcRequest } from '@walletconnect/types' import { safeUnreachable } from '@dimensiondev/kit' import { createWeb3 } from './web3' @@ -9,9 +9,19 @@ import * as WalletConnect from './providers/WalletConnect' import { addRecentTransaction, getWallet } from '../../../plugins/Wallet/services' import { commitNonce, getNonce, resetNonce } from './nonce' import { getGasPrice } from './network' -import { currentAccountSettings, currentProviderSettings } from '../../../plugins/Wallet/settings' +import { + currentAccountSettings, + currentChainIdSettings, + currentProviderSettings, +} from '../../../plugins/Wallet/settings' import { debugModeSetting } from '../../../settings/settings' +export interface SendOverrides { + chainId?: ChainId + account?: string + providerType?: ProviderType +} + /** * This API is only used internally. Please use requestSend instead in order to share the same payload id globally. * @param payload @@ -21,18 +31,22 @@ import { debugModeSetting } from '../../../settings/settings' export async function INTERNAL_send( payload: JsonRpcPayload, callback: (error: Error | null, response?: JsonRpcResponse) => void, - rpc?: string, + { + chainId = currentChainIdSettings.value, + account = currentAccountSettings.value, + providerType = currentProviderSettings.value, + }: SendOverrides = {}, ) { if (process.env.NODE_ENV === 'development' && debugModeSetting.value) { console.table(payload) console.debug(new Error().stack) } - const account = currentAccountSettings.value - const providerType = currentProviderSettings.value const wallet = providerType === ProviderType.Maskbook ? await getWallet() : null const web3 = createWeb3({ + chainId, privKeys: wallet?._private_key_ ? [wallet._private_key_] : [], + providerType, }) const provider = web3.currentProvider as HttpProvider | undefined @@ -142,18 +156,7 @@ export async function INTERNAL_send( await sendTransaction() break default: - if (rpc) { - fetch(rpc, { - method: 'POST', - body: JSON.stringify(payload), - }) - .catch((error: Error) => callback(error)) - .then(async (res) => { - if (res) callback(null, (await res.json()) as JsonRpcResponse) - }) - } else { - provider.send(payload, callback) - } + provider.send(payload, callback) break } } catch (error) { diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/web3.ts b/packages/maskbook/src/extension/background-script/EthereumServices/web3.ts index 02ecf3d03e0d..babfbe7e6f6e 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/web3.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/web3.ts @@ -19,9 +19,13 @@ export function createWeb3({ case ProviderType.MetaMask: return MetaMask.createWeb3() case ProviderType.WalletConnect: - return WalletConnect.createWeb3() + return WalletConnect.createWeb3({ + chainId, + }) case ProviderType.CustomNetwork: - return WalletConnect.createWeb3() + return WalletConnect.createWeb3({ + chainId, + }) default: unreachable(providerType) } diff --git a/packages/maskbook/src/extension/options-page/DashboardDialogs/Wallet/DeleteConfirm.tsx b/packages/maskbook/src/extension/options-page/DashboardDialogs/Wallet/DeleteConfirm.tsx index 7db8ae5af18c..21ca37d89805 100644 --- a/packages/maskbook/src/extension/options-page/DashboardDialogs/Wallet/DeleteConfirm.tsx +++ b/packages/maskbook/src/extension/options-page/DashboardDialogs/Wallet/DeleteConfirm.tsx @@ -14,12 +14,7 @@ export function DashboardWalletDeleteConfirmDialog(props: WrappedDialogProps { await WalletRPC.removeWallet(wallet.address) - await WalletRPC.updateAccount({ - account: '', // delete account - chainId: ChainId.Mainnet, - networkType: NetworkType.Ethereum, - providerType: ProviderType.Maskbook, - }) + await WalletRPC.resetAccount() }, [wallet.address], props.onClose, diff --git a/packages/maskbook/src/plugins/ITO/SNSAdaptor/hooks/useClaimablePoolsByWeb3.ts b/packages/maskbook/src/plugins/ITO/SNSAdaptor/hooks/useClaimablePoolsByWeb3.ts index 8b0fba95e7d2..668422e6d59c 100644 --- a/packages/maskbook/src/plugins/ITO/SNSAdaptor/hooks/useClaimablePoolsByWeb3.ts +++ b/packages/maskbook/src/plugins/ITO/SNSAdaptor/hooks/useClaimablePoolsByWeb3.ts @@ -46,7 +46,9 @@ export function useClaimablePoolsByWeb3() { return useAsyncRetry(async () => { const logs = flatten( await Promise.all( - queryParams.map((queryParam: PastLogsOptions) => Services.Ethereum.getPastLogs(queryParam, chainId)), + queryParams.map((queryParam: PastLogsOptions) => Services.Ethereum.getPastLogs(queryParam, { + chainId, + })), ), ) return logs.reduce((acc, log) => { diff --git a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx index 0a78cbd29136..f39bc2d4a0b2 100644 --- a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx +++ b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx @@ -15,7 +15,7 @@ import { useStylesExtends } from '../../../../components/custom-ui-helper' import { InjectedDialog } from '../../../../components/shared/InjectedDialog' import { delay } from '../../../../utils' import { useRemoteControlledDialog } from '@masknet/shared' -import { WalletMessages } from '../../messages' +import { WalletMessages, WalletRPC } from '../../messages' import { ConnectionProgress } from './ConnectionProgress' import Services from '../../../../extension/service' @@ -92,27 +92,33 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { // connection failed if (!account || !networkType) throw new Error(`Failed to connect ${resolveProviderName(providerType)}.`) - // no need to switch the chain - if (chainId === Number.parseInt(chainDetailedCAIP.chainId)) return true - - // request ethereum-compatiable network - try { - await Promise.race([ - (async () => { - await delay(30 /* seconds */ * 1000 /* milliseconds */) - throw new Error('Timeout!') - })(), - networkType === NetworkType.Ethereum - ? Services.Ethereum.switchEthereumChain(ChainId.Mainnet) - : Services.Ethereum.addEthereumChain(chainDetailedCAIP, account), - ]) - } catch (e) { - throw new Error(`Make sure your wallet is on the ${resolveNetworkName(networkType)} network.`) + // need to switch chain + if (chainId !== Number.parseInt(chainDetailedCAIP.chainId, 16)) { + try { + const overrides = { + chainId, + providerType, + } + await Promise.race([ + (async () => { + await delay(30 /* seconds */ * 1000 /* milliseconds */) + throw new Error('Timeout!') + })(), + networkType === NetworkType.Ethereum + ? Services.Ethereum.switchEthereumChain(ChainId.Mainnet, overrides) + : Services.Ethereum.addEthereumChain(chainDetailedCAIP, account, overrides), + ]) + } catch (e) { + throw new Error(`Make sure your wallet is on the ${resolveNetworkName(networkType)} network.`) + } } - // wait for settings to be synced - await delay(1000) - + // update account + await WalletRPC.updateAccount({ + account, + providerType, + networkType, + }) return true as const }, [networkType], diff --git a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectProviderDialog/index.tsx b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectProviderDialog/index.tsx index 5439ac75157b..865bfc82880d 100644 --- a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectProviderDialog/index.tsx +++ b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectProviderDialog/index.tsx @@ -188,9 +188,7 @@ function SelectProviderDialogUI(props: SelectProviderDialogUIProps) { // create a new wallet if (isEnvironment(Environment.ManifestOptions)) history.push(`${DashboardRoute.Wallets}?create=${Date.now()}`) - else { - openCreateImportDialog() - } + else openCreateImportDialog() break case ProviderType.MetaMask: case ProviderType.WalletConnect: diff --git a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx index fe01d5b55a53..26f1a4de4b12 100644 --- a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx +++ b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx @@ -2,7 +2,7 @@ import { useCallback } from 'react' import { useHistory } from 'react-router-dom' import { Button, DialogActions, DialogContent, makeStyles } from '@material-ui/core' import { isEnvironment, Environment } from '@dimensiondev/holoflows-kit' -import { ProviderType, useWallets, useWallet, NetworkType } from '@masknet/web3-shared' +import { ProviderType, useWallets, useWallet, NetworkType, useChainId } from '@masknet/web3-shared' import { delay, useI18N } from '../../../utils' import { useRemoteControlledDialog } from '@masknet/shared' import { useStylesExtends } from '../../../components/custom-ui-helper' @@ -26,6 +26,7 @@ function SelectWalletDialogUI(props: SelectWalletDialogUIProps) { const { t } = useI18N() const classes = useStylesExtends(useStyles(), props) + const chainId = useChainId() const wallets = useWallets(ProviderType.Maskbook) const selectedWallet = useWallet() @@ -42,11 +43,12 @@ function SelectWalletDialogUI(props: SelectWalletDialogUIProps) { closeDialog() await WalletRPC.updateAccount({ account: address, + chainId, providerType: ProviderType.Maskbook, networkType, }) }, - [networkType, closeDialog], + [chainId, networkType, closeDialog], ) //#region create new wallet From 2bf70e9139caa3bbb7c459666826c9b8022240fe Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Sun, 18 Jul 2021 23:00:55 +0800 Subject: [PATCH 05/13] fix: reduce mm warnings --- .../background-script/EthereumServices/providers/MetaMask.ts | 1 + .../EthereumServices/providers/WalletConnect.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts index 67138d5702e6..9426942ffbae 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts @@ -48,6 +48,7 @@ export function createProvider() { provider.off('accountsChanged', onAccountsChanged) provider.off('chainChanged', onChainIdChanged) provider.off('error', onError) + provider.removeAllListeners() } provider = createMetaMaskProvider() if (!provider) throw new Error('Unable to create in page provider.') diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts index b801ab33fb01..4bdfdc7d67c8 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts @@ -54,7 +54,7 @@ export async function sendCustomRequest(payload: IJsonRpcRequest) { // Wrap promise as PromiEvent because WalletConnect returns transaction hash only // docs: https://docs.walletconnect.org/client-api -export function createWeb3({ chainId = currentChainIdSettings.value }: { chainId: ChainId }) { +export function createWeb3({ chainId = currentChainIdSettings.value }: { chainId?: ChainId } = {} ) { return Maskbook.createWeb3({ chainId, }) From fd58174c998e2e8014878a487d26ed98c1fe4436 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Mon, 19 Jul 2021 08:54:34 +0800 Subject: [PATCH 06/13] fix: select mask wallet --- .../Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx | 5 +++-- .../src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx | 7 +++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx index f39bc2d4a0b2..0c7e8d80a940 100644 --- a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx +++ b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx @@ -93,10 +93,11 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { if (!account || !networkType) throw new Error(`Failed to connect ${resolveProviderName(providerType)}.`) // need to switch chain - if (chainId !== Number.parseInt(chainDetailedCAIP.chainId, 16)) { + const expectedChainId = Number.parseInt(chainDetailedCAIP.chainId, 16) + if (chainId !== expectedChainId) { try { const overrides = { - chainId, + chainId: expectedChainId, providerType, } await Promise.race([ diff --git a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx index 26f1a4de4b12..40ca86052eac 100644 --- a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx +++ b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx @@ -2,7 +2,7 @@ import { useCallback } from 'react' import { useHistory } from 'react-router-dom' import { Button, DialogActions, DialogContent, makeStyles } from '@material-ui/core' import { isEnvironment, Environment } from '@dimensiondev/holoflows-kit' -import { ProviderType, useWallets, useWallet, NetworkType, useChainId } from '@masknet/web3-shared' +import { ProviderType, useWallets, useWallet, NetworkType, ChainId } from '@masknet/web3-shared' import { delay, useI18N } from '../../../utils' import { useRemoteControlledDialog } from '@masknet/shared' import { useStylesExtends } from '../../../components/custom-ui-helper' @@ -26,7 +26,6 @@ function SelectWalletDialogUI(props: SelectWalletDialogUIProps) { const { t } = useI18N() const classes = useStylesExtends(useStyles(), props) - const chainId = useChainId() const wallets = useWallets(ProviderType.Maskbook) const selectedWallet = useWallet() @@ -43,12 +42,12 @@ function SelectWalletDialogUI(props: SelectWalletDialogUIProps) { closeDialog() await WalletRPC.updateAccount({ account: address, - chainId, + chainId: ChainId.Mainnet, providerType: ProviderType.Maskbook, networkType, }) }, - [chainId, networkType, closeDialog], + [networkType, closeDialog], ) //#region create new wallet From c672d399ca87a9ce803914d95c95911a92bca5a6 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Mon, 19 Jul 2021 09:01:19 +0800 Subject: [PATCH 07/13] chore: specify undefined fields --- .../EthereumServices/providers/MetaMask.ts | 1 + .../EthereumServices/providers/WalletConnect.ts | 1 + .../Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx | 5 +++-- .../plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx | 4 ++-- .../maskbook/src/plugins/Wallet/services/chain.ts | 12 +++--------- 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts index 9426942ffbae..add55420e27b 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts @@ -20,6 +20,7 @@ async function onAccountsChanged(accounts: string[]) { account: first(accounts), chainId: typeof provider?.chainId === 'string' ? Number.parseInt(provider.chainId, 16) : undefined, providerType: ProviderType.MetaMask, + networkType: undefined, }) } diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts index 4bdfdc7d67c8..dce2660d80e1 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts @@ -103,6 +103,7 @@ const onUpdate = async ( account: first(connector.accounts), chainId: connector.chainId, providerType: ProviderType.WalletConnect, + networkType: undefined, }) } diff --git a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx index 0c7e8d80a940..16cfea76fbe7 100644 --- a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx +++ b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx @@ -53,7 +53,8 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { if (!networkType) throw new Error('Unknown network type.') // read the chain detailed from the built-in chain list - const chainDetailedCAIP = getChainDetailedCAIP(getChainIdFromNetworkType(networkType)) + const expectedChainId = getChainIdFromNetworkType(networkType) + const chainDetailedCAIP = getChainDetailedCAIP(expectedChainId) if (!chainDetailedCAIP) throw new Error('Unknown network type.') // a short time loading makes the user fells better @@ -93,7 +94,6 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { if (!account || !networkType) throw new Error(`Failed to connect ${resolveProviderName(providerType)}.`) // need to switch chain - const expectedChainId = Number.parseInt(chainDetailedCAIP.chainId, 16) if (chainId !== expectedChainId) { try { const overrides = { @@ -117,6 +117,7 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { // update account await WalletRPC.updateAccount({ account, + chainId: expectedChainId, providerType, networkType, }) diff --git a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx index 40ca86052eac..ab4287d64fde 100644 --- a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx +++ b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/SelectWalletDialog.tsx @@ -2,7 +2,7 @@ import { useCallback } from 'react' import { useHistory } from 'react-router-dom' import { Button, DialogActions, DialogContent, makeStyles } from '@material-ui/core' import { isEnvironment, Environment } from '@dimensiondev/holoflows-kit' -import { ProviderType, useWallets, useWallet, NetworkType, ChainId } from '@masknet/web3-shared' +import { ProviderType, useWallets, useWallet, NetworkType } from '@masknet/web3-shared' import { delay, useI18N } from '../../../utils' import { useRemoteControlledDialog } from '@masknet/shared' import { useStylesExtends } from '../../../components/custom-ui-helper' @@ -42,7 +42,7 @@ function SelectWalletDialogUI(props: SelectWalletDialogUIProps) { closeDialog() await WalletRPC.updateAccount({ account: address, - chainId: ChainId.Mainnet, + chainId: undefined, providerType: ProviderType.Maskbook, networkType, }) diff --git a/packages/maskbook/src/plugins/Wallet/services/chain.ts b/packages/maskbook/src/plugins/Wallet/services/chain.ts index 08ec56f2d00c..45edc083ec1b 100644 --- a/packages/maskbook/src/plugins/Wallet/services/chain.ts +++ b/packages/maskbook/src/plugins/Wallet/services/chain.ts @@ -18,19 +18,13 @@ export async function kickToUpdateChainState() { beats.push(true) } -export async function updateChainState(chainId?: ChainId) { +export async function updateChainState() { // reset the polling task cause it will be called from service call resetPoolTask() // forget those passed beats beats.length = 0 - // update network type - if (chainId) - await updateAccount({ - chainId, - }) - // update chain state try { const wallet = await getWallet() @@ -68,8 +62,8 @@ effect(() => { // revalidate chain state if the chainId of current provider was changed effect(() => - currentChainIdSettings.addListener((chainId) => { - updateChainState(chainId) + currentChainIdSettings.addListener(() => { + updateChainState() if (currentProviderSettings.value === ProviderType.Maskbook) resetAllNonce() }), ) From 0e13e4dfa6fdcb0f7d2687090f36330ea0465061 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Mon, 19 Jul 2021 09:23:12 +0800 Subject: [PATCH 08/13] refactor: prettier --- .../EthereumServices/providers/WalletConnect.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts index dce2660d80e1..db10e89ddba1 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/WalletConnect.ts @@ -54,7 +54,7 @@ export async function sendCustomRequest(payload: IJsonRpcRequest) { // Wrap promise as PromiEvent because WalletConnect returns transaction hash only // docs: https://docs.walletconnect.org/client-api -export function createWeb3({ chainId = currentChainIdSettings.value }: { chainId?: ChainId } = {} ) { +export function createWeb3({ chainId = currentChainIdSettings.value }: { chainId?: ChainId } = {}) { return Maskbook.createWeb3({ chainId, }) From 739f1d001da69772f53020dd2caabb1c08659bc1 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Mon, 19 Jul 2021 09:25:43 +0800 Subject: [PATCH 09/13] refactor: remove unused code --- packages/maskbook/src/plugins/Wallet/services/account.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/maskbook/src/plugins/Wallet/services/account.ts b/packages/maskbook/src/plugins/Wallet/services/account.ts index 5c628345f18b..e5b9bb4c42d1 100644 --- a/packages/maskbook/src/plugins/Wallet/services/account.ts +++ b/packages/maskbook/src/plugins/Wallet/services/account.ts @@ -24,9 +24,6 @@ export async function updateAccount( providerType?: ProviderType } = {}, ) { - console.debug('DEBUG: update account') - console.debug(options) - if (options.chainId && !options.networkType) options.networkType = getNetworkTypeFromChainId(options.chainId) if (!options.chainId && options.networkType) options.chainId = getChainIdFromNetworkType(options.networkType) From 91e07cc1e868d82b16d13548c3388eed605bcbea Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Mon, 19 Jul 2021 10:43:36 +0800 Subject: [PATCH 10/13] feat: request evm network --- .../src/web3/UI/EthereumChainBoundary.tsx | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/maskbook/src/web3/UI/EthereumChainBoundary.tsx b/packages/maskbook/src/web3/UI/EthereumChainBoundary.tsx index 51845a8e8449..edd16980b356 100644 --- a/packages/maskbook/src/web3/UI/EthereumChainBoundary.tsx +++ b/packages/maskbook/src/web3/UI/EthereumChainBoundary.tsx @@ -8,6 +8,7 @@ import { isChainIdValid, NetworkType, ProviderType, + resolveNetworkName, useAccount, useChainId, } from '@masknet/web3-shared' @@ -58,8 +59,23 @@ export function EthereumChainBoundary(props: EthereumChainBoundaryProps) { // request ethereum-compatiable network const networkType = getNetworkTypeFromChainId(expectedChainId) if (!networkType) return - if (networkType === NetworkType.Ethereum) await Services.Ethereum.switchEthereumChain(expectedChainId) - else await Services.Ethereum.addEthereumChain(chainDetailedCAIP, account) + try { + const overrides = { + chainId: expectedChainId, + providerType, + } + await Promise.race([ + (async () => { + await delay(30 /* seconds */ * 1000 /* milliseconds */) + throw new Error('Timeout!') + })(), + networkType === NetworkType.Ethereum + ? Services.Ethereum.switchEthereumChain(ChainId.Mainnet, overrides) + : Services.Ethereum.addEthereumChain(chainDetailedCAIP, account, overrides), + ]) + } catch (e) { + throw new Error(`Make sure your wallet is on the ${resolveNetworkName(networkType)} network.`) + } }, [account, isAllowed, providerType, expectedChainId]) // matched From 63ca09aeb4f30af6e99597860f62f9dc284bbbe3 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Tue, 20 Jul 2021 14:23:57 +0800 Subject: [PATCH 11/13] refactor: prettier --- .../options-page/DashboardDialogs/Wallet/DeleteConfirm.tsx | 1 - packages/maskbook/src/plugins/Wallet/services/chain.ts | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/maskbook/src/extension/options-page/DashboardDialogs/Wallet/DeleteConfirm.tsx b/packages/maskbook/src/extension/options-page/DashboardDialogs/Wallet/DeleteConfirm.tsx index 21ca37d89805..6c95e5756619 100644 --- a/packages/maskbook/src/extension/options-page/DashboardDialogs/Wallet/DeleteConfirm.tsx +++ b/packages/maskbook/src/extension/options-page/DashboardDialogs/Wallet/DeleteConfirm.tsx @@ -1,6 +1,5 @@ import { Button } from '@material-ui/core' import { CreditCard as CreditCardIcon } from 'react-feather' -import { ChainId, NetworkType, ProviderType } from '@masknet/web3-shared' import { useI18N } from '../../../../utils' import { WalletRPC } from '../../../../plugins/Wallet/messages' import { DebounceButton } from '../../DashboardComponents/ActionButton' diff --git a/packages/maskbook/src/plugins/Wallet/services/chain.ts b/packages/maskbook/src/plugins/Wallet/services/chain.ts index 45edc083ec1b..d452cc287503 100644 --- a/packages/maskbook/src/plugins/Wallet/services/chain.ts +++ b/packages/maskbook/src/plugins/Wallet/services/chain.ts @@ -1,4 +1,4 @@ -import { ChainId, ProviderType } from '@masknet/web3-shared' +import { ProviderType } from '@masknet/web3-shared' import { getBalance, getBlockNumber, resetAllNonce } from '../../../extension/background-script/EthereumService' import { pollingTask, startEffects } from '../../../utils' import { UPDATE_CHAIN_STATE_DELAY } from '../constants' @@ -10,7 +10,6 @@ import { currentChainIdSettings, currentProviderSettings, } from '../settings' -import { updateAccount } from './account' const beats: true[] = [] From 0694c6309f8efc675150327b1550078fbe99b825 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Wed, 21 Jul 2021 23:29:08 +0800 Subject: [PATCH 12/13] refactor: hooks --- .../background-script/EthereumServices/network.ts | 3 +-- .../EthereumServices/providers/MetaMask.ts | 10 +++------- .../background-script/EthereumServices/web3.ts | 4 +--- .../DashboardComponents/CollectibleList/index.tsx | 7 +++---- .../DashboardComponents/WalletAssetsTable.tsx | 5 ++--- .../Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx | 9 ++++----- .../src/plugins/Wallet/SNSAdaptor/GasNowDialog.tsx | 3 +-- .../maskbook/src/plugins/Wallet/hooks/useAssets.ts | 1 - .../src/plugins/Wallet/hooks/useAssetsFromChain.ts | 1 - .../src/plugins/Wallet/hooks/useAssetsFromProvider.ts | 1 - .../src/plugins/Wallet/hooks/useAssetsMerged.ts | 1 - .../src/plugins/Wallet/hooks/useCollectibles.ts | 1 - .../src/plugins/Wallet/hooks/useERC20Tokens.ts | 1 - .../src/plugins/Wallet/hooks/useTransactions.ts | 10 ++++++---- packages/maskbook/src/web3/UI/TxFeeEstimation.tsx | 2 +- packages/web3-constants/data/rpc.json | 4 ++-- packages/web3-shared/src/context/index.tsx | 4 ++-- .../web3-shared/src/hooks/useAssetsFromProvider.ts | 2 ++ packages/web3-shared/src/hooks/useTokensBalance.ts | 4 +++- 19 files changed, 31 insertions(+), 42 deletions(-) delete mode 100644 packages/maskbook/src/plugins/Wallet/hooks/useAssets.ts delete mode 100644 packages/maskbook/src/plugins/Wallet/hooks/useAssetsFromChain.ts delete mode 100644 packages/maskbook/src/plugins/Wallet/hooks/useAssetsFromProvider.ts delete mode 100644 packages/maskbook/src/plugins/Wallet/hooks/useAssetsMerged.ts delete mode 100644 packages/maskbook/src/plugins/Wallet/hooks/useCollectibles.ts delete mode 100644 packages/maskbook/src/plugins/Wallet/hooks/useERC20Tokens.ts diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/network.ts b/packages/maskbook/src/extension/background-script/EthereumServices/network.ts index bf658217211e..8d4a78fd036e 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/network.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/network.ts @@ -6,8 +6,7 @@ import type { PastLogsOptions, Log, } from 'web3-core' -import { first } from 'lodash-es' -import { ChainId, EthereumChainDetailed, EthereumMethodType, getRPCConstants } from '@masknet/web3-shared' +import { ChainId, EthereumChainDetailed, EthereumMethodType } from '@masknet/web3-shared' import { request } from './request' import type { SendOverrides } from './send' diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts index add55420e27b..5b19b5290a07 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/providers/MetaMask.ts @@ -18,8 +18,8 @@ async function onAccountsChanged(accounts: string[]) { if (currentProviderSettings.value !== ProviderType.MetaMask) return await updateAccount({ account: first(accounts), - chainId: typeof provider?.chainId === 'string' ? Number.parseInt(provider.chainId, 16) : undefined, providerType: ProviderType.MetaMask, + chainId: typeof provider?.chainId === 'string' ? Number.parseInt(provider.chainId, 16) : undefined, networkType: undefined, }) } @@ -33,6 +33,7 @@ async function onChainIdChanged(id: string) { if (currentChainIdSettings.value === chainId) return await updateAccount({ chainId, + networkType: undefined, }) } @@ -45,12 +46,7 @@ async function onError(error: string) { } export function createProvider() { - if (provider) { - provider.off('accountsChanged', onAccountsChanged) - provider.off('chainChanged', onChainIdChanged) - provider.off('error', onError) - provider.removeAllListeners() - } + if (provider) return provider provider = createMetaMaskProvider() if (!provider) throw new Error('Unable to create in page provider.') provider.on('accountsChanged', onAccountsChanged as (...args: unknown[]) => void) diff --git a/packages/maskbook/src/extension/background-script/EthereumServices/web3.ts b/packages/maskbook/src/extension/background-script/EthereumServices/web3.ts index babfbe7e6f6e..3c0872dea55f 100644 --- a/packages/maskbook/src/extension/background-script/EthereumServices/web3.ts +++ b/packages/maskbook/src/extension/background-script/EthereumServices/web3.ts @@ -23,9 +23,7 @@ export function createWeb3({ chainId, }) case ProviderType.CustomNetwork: - return WalletConnect.createWeb3({ - chainId, - }) + throw new Error('To be implemented.') default: unreachable(providerType) } diff --git a/packages/maskbook/src/extension/options-page/DashboardComponents/CollectibleList/index.tsx b/packages/maskbook/src/extension/options-page/DashboardComponents/CollectibleList/index.tsx index 8cea5e7ae10b..d1101acb3fe3 100644 --- a/packages/maskbook/src/extension/options-page/DashboardComponents/CollectibleList/index.tsx +++ b/packages/maskbook/src/extension/options-page/DashboardComponents/CollectibleList/index.tsx @@ -1,9 +1,8 @@ -import { useValueRef } from '@masknet/shared' -import { EthereumTokenType, formatEthereumAddress, useAccount, Wallet } from '@masknet/web3-shared' -import { Box, Button, makeStyles, Skeleton, TablePagination, Typography } from '@material-ui/core' import { createContext, useState } from 'react' import { useUpdateEffect } from 'react-use' -import { useCollectibles } from '../../../../plugins/Wallet/hooks/useCollectibles' +import { useValueRef } from '@masknet/shared' +import { EthereumTokenType, formatEthereumAddress, useAccount, useCollectibles, Wallet } from '@masknet/web3-shared' +import { Box, Button, makeStyles, Skeleton, TablePagination, Typography } from '@material-ui/core' import { currentCollectibleDataProviderSettings } from '../../../../plugins/Wallet/settings' import { useI18N } from '../../../../utils' import { CollectibleCard } from './CollectibleCard' diff --git a/packages/maskbook/src/extension/options-page/DashboardComponents/WalletAssetsTable.tsx b/packages/maskbook/src/extension/options-page/DashboardComponents/WalletAssetsTable.tsx index 48245b3654d8..d12ea60cc93b 100644 --- a/packages/maskbook/src/extension/options-page/DashboardComponents/WalletAssetsTable.tsx +++ b/packages/maskbook/src/extension/options-page/DashboardComponents/WalletAssetsTable.tsx @@ -19,7 +19,7 @@ import BigNumber from 'bignumber.js' import classNames from 'classnames' import ExpandLessIcon from '@material-ui/icons/ExpandLess' import ExpandMoreIcon from '@material-ui/icons/ExpandMore' -import type { Asset } from '@masknet/web3-shared' +import { Asset, useTrustedERC20Tokens } from '@masknet/web3-shared' import { CurrencyType, currySameAddress, @@ -37,7 +37,6 @@ import { useStylesExtends } from '../../../components/custom-ui-helper' import { FormattedCurrency, TokenIcon } from '@masknet/shared' import { useI18N, useMatchXS } from '../../../utils' import { ActionsBarFT } from './ActionsBarFT' -import { useTrustedERC20TokensFromDB } from '../../../plugins/Wallet/hooks/useERC20Tokens' import { getTokenUSDValue } from '../../../plugins/Wallet/helpers' const useStyles = makeStyles< @@ -199,7 +198,7 @@ export function WalletAssetsTable(props: WalletAssetsTableProps) { ...(isMobile ? [] : ['']), ] as const - const erc20Tokens = useTrustedERC20TokensFromDB() + const erc20Tokens = useTrustedERC20Tokens() const { value: detailedTokens, error: detailedTokensError, diff --git a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx index 16cfea76fbe7..a0f2ba756c2e 100644 --- a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx +++ b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx @@ -48,9 +48,9 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { //#endregion const connectTo = useCallback( - async (providerType: ProviderType) => { - // unknown network type + async () => { if (!networkType) throw new Error('Unknown network type.') + if (!providerType) throw new Error('Unknown provider type.') // read the chain detailed from the built-in chain list const expectedChainId = getChainIdFromNetworkType(networkType) @@ -123,15 +123,14 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { }) return true as const }, - [networkType], + [networkType, providerType], ) const connection = useAsyncRetry(async () => { if (!open) return true - if (!providerType) throw new Error('Unknown provider type.') // connect to the specific provider - await connectTo(providerType) + await connectTo() // switch to the wallet status dialog closeDialog() diff --git a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/GasNowDialog.tsx b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/GasNowDialog.tsx index b5b066b90cff..218bd9a340b1 100644 --- a/packages/maskbook/src/plugins/Wallet/SNSAdaptor/GasNowDialog.tsx +++ b/packages/maskbook/src/plugins/Wallet/SNSAdaptor/GasNowDialog.tsx @@ -1,5 +1,5 @@ import { useValueRef, useRemoteControlledDialog } from '@masknet/shared' -import { EthereumTokenType, formatWeiToGwei, GasNow } from '@masknet/web3-shared' +import { EthereumTokenType, formatWeiToGwei, GasNow, useAssets } from '@masknet/web3-shared' import { DialogContent, List, ListItem, makeStyles, Skeleton, TextField, Theme, Typography } from '@material-ui/core' import FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord' import BigNumber from 'bignumber.js' @@ -9,7 +9,6 @@ import { InjectedDialog } from '../../../components/shared/InjectedDialog' import ActionButton from '../../../extension/options-page/DashboardComponents/ActionButton' import { useI18N } from '../../../utils' import { EthereumWalletConnectedBoundary } from '../../../web3/UI/EthereumWalletConnectedBoundary' -import { useAssets } from '../hooks/useAssets' import { currentGasNowSettings, currentGasPriceSettings } from '../settings' import { WalletMessages } from '../../Wallet/messages' diff --git a/packages/maskbook/src/plugins/Wallet/hooks/useAssets.ts b/packages/maskbook/src/plugins/Wallet/hooks/useAssets.ts deleted file mode 100644 index 2db29d80e453..000000000000 --- a/packages/maskbook/src/plugins/Wallet/hooks/useAssets.ts +++ /dev/null @@ -1 +0,0 @@ -export { useAssets } from '@masknet/web3-shared' diff --git a/packages/maskbook/src/plugins/Wallet/hooks/useAssetsFromChain.ts b/packages/maskbook/src/plugins/Wallet/hooks/useAssetsFromChain.ts deleted file mode 100644 index c85f3a152556..000000000000 --- a/packages/maskbook/src/plugins/Wallet/hooks/useAssetsFromChain.ts +++ /dev/null @@ -1 +0,0 @@ -export { useAssetsFromChain } from '@masknet/web3-shared' diff --git a/packages/maskbook/src/plugins/Wallet/hooks/useAssetsFromProvider.ts b/packages/maskbook/src/plugins/Wallet/hooks/useAssetsFromProvider.ts deleted file mode 100644 index b3598fb2c822..000000000000 --- a/packages/maskbook/src/plugins/Wallet/hooks/useAssetsFromProvider.ts +++ /dev/null @@ -1 +0,0 @@ -export { useAssetsFromProvider } from '@masknet/web3-shared' diff --git a/packages/maskbook/src/plugins/Wallet/hooks/useAssetsMerged.ts b/packages/maskbook/src/plugins/Wallet/hooks/useAssetsMerged.ts deleted file mode 100644 index 63d297f214f3..000000000000 --- a/packages/maskbook/src/plugins/Wallet/hooks/useAssetsMerged.ts +++ /dev/null @@ -1 +0,0 @@ -export { useAssetsMerged } from '@masknet/web3-shared' diff --git a/packages/maskbook/src/plugins/Wallet/hooks/useCollectibles.ts b/packages/maskbook/src/plugins/Wallet/hooks/useCollectibles.ts deleted file mode 100644 index 8a9f0c7f981f..000000000000 --- a/packages/maskbook/src/plugins/Wallet/hooks/useCollectibles.ts +++ /dev/null @@ -1 +0,0 @@ -export { useCollectibles } from '@masknet/web3-shared' diff --git a/packages/maskbook/src/plugins/Wallet/hooks/useERC20Tokens.ts b/packages/maskbook/src/plugins/Wallet/hooks/useERC20Tokens.ts deleted file mode 100644 index 142917b75e9b..000000000000 --- a/packages/maskbook/src/plugins/Wallet/hooks/useERC20Tokens.ts +++ /dev/null @@ -1 +0,0 @@ -export { useERC20Tokens, useTrustedERC20Tokens as useTrustedERC20TokensFromDB } from '@masknet/web3-shared' diff --git a/packages/maskbook/src/plugins/Wallet/hooks/useTransactions.ts b/packages/maskbook/src/plugins/Wallet/hooks/useTransactions.ts index 04a40e249857..6b917c432ee8 100644 --- a/packages/maskbook/src/plugins/Wallet/hooks/useTransactions.ts +++ b/packages/maskbook/src/plugins/Wallet/hooks/useTransactions.ts @@ -5,17 +5,19 @@ import type { AsyncStateRetry } from 'react-use/lib/useAsyncRetry' import { WalletRPC } from '../messages' import { currentPortfolioDataProviderSettings } from '../settings' import { PortfolioProvider, Transaction } from '../types' -import { useNetworkType } from '@masknet/web3-shared' +import { getNetworkTypeFromChainId, useChainId, useNetworkType } from '@masknet/web3-shared' export function useTransactions( address: string, page?: number, ): AsyncStateRetry<{ transactions: Transaction[]; hasNextPage: boolean }> { + const chainId = useChainId() const provider = useValueRef(currentPortfolioDataProviderSettings) - const network = useNetworkType() return useAsyncRetry(async () => { - if (!address) + const network = getNetworkTypeFromChainId(chainId) + + if (!address || !network) return { transactions: [], hasNextPage: false, @@ -29,5 +31,5 @@ export function useTransactions( default: unreachable(provider) } - }, [address, network, provider, page]) + }, [address, chainId, provider, page]) } diff --git a/packages/maskbook/src/web3/UI/TxFeeEstimation.tsx b/packages/maskbook/src/web3/UI/TxFeeEstimation.tsx index 5636795087d9..1b093b1cc015 100644 --- a/packages/maskbook/src/web3/UI/TxFeeEstimation.tsx +++ b/packages/maskbook/src/web3/UI/TxFeeEstimation.tsx @@ -10,10 +10,10 @@ import { useGasPrice, GasNow, ChainId, + useAssets, } from '@masknet/web3-shared' import { useI18N } from '../../utils' import { Image } from '../../components/shared/Image' -import { useAssets } from '../../plugins/Wallet/hooks/useAssets' import { WalletMessages } from '../../plugins/Wallet/messages' import { useStylesExtends } from '../../components/custom-ui-helper' import { currentGasNowSettings } from '../../plugins/Wallet/settings' diff --git a/packages/web3-constants/data/rpc.json b/packages/web3-constants/data/rpc.json index 074ff1fe1afe..ee94c56b31cc 100644 --- a/packages/web3-constants/data/rpc.json +++ b/packages/web3-constants/data/rpc.json @@ -7,8 +7,8 @@ "Gorli": ["https://goerli.infura.io/v3/d65858b010d249419cf8687eca12b094"], "BSC": ["https://bsc-dataseed.binance.org/"], "BSCT": ["https://data-seed-prebsc-1-s1.binance.org:8545/"], - "Matic": ["https://matic-mainnet--jsonrpc.datahub.figment.io/apikey/ade4322bac48ecb3fad64b13105b5e65/"], - "Mumbai": ["https://matic-mumbai--jsonrpc.datahub.figment.io/apikey/ade4322bac48ecb3fad64b13105b5e65/"] + "Matic": ["https://polygon-mainnet.infura.io/v3/d65858b010d249419cf8687eca12b094"], + "Mumbai": ["https://polygon-mumbai.infura.io/v3/d65858b010d249419cf8687eca12b094"] }, "RPC_WEIGHTS": { "Mainnet": [0, 0, 0, 0], diff --git a/packages/web3-shared/src/context/index.tsx b/packages/web3-shared/src/context/index.tsx index 6d7035ee3e5e..c4e7904679a6 100644 --- a/packages/web3-shared/src/context/index.tsx +++ b/packages/web3-shared/src/context/index.tsx @@ -1,4 +1,4 @@ -import { useContext, createContext } from 'react' +import { useMemo, useContext, createContext } from 'react' import { createContainer } from 'unstated-next' import { useSubscription } from 'use-subscription' import type { Web3ProviderType } from './type' @@ -27,7 +27,7 @@ export function useWeb3State() { const networkType = useSubscription(_.networkType) const wallets = useSubscription(_.wallets) const chainId = useSubscription(_.chainId) - const chainDetailed = getChainDetailed(chainId) + const chainDetailed = useMemo(() => getChainDetailed(chainId), [chainId]) const erc20Tokens = useSubscription(_.erc20Tokens) const erc20TokensCount = useSubscription(_.erc20TokensCount) const portfolioProvider = useSubscription(_.portfolioProvider) diff --git a/packages/web3-shared/src/hooks/useAssetsFromProvider.ts b/packages/web3-shared/src/hooks/useAssetsFromProvider.ts index 33f50153eecb..a0009446c097 100644 --- a/packages/web3-shared/src/hooks/useAssetsFromProvider.ts +++ b/packages/web3-shared/src/hooks/useAssetsFromProvider.ts @@ -3,6 +3,7 @@ import { useChainDetailed } from './useChainDetailed' import { useWeb3Context, useWeb3State } from '../context' import { useAsyncRetry } from 'react-use' import { useNetworkType } from './useNetworkType' +import { getNetworkTypeFromChainId } from '../utils' export function useAssetsFromProvider() { const { getAssetList } = useWeb3Context() @@ -14,6 +15,7 @@ export function useAssetsFromProvider() { return useAsyncRetry(async () => { if (!account) return [] if (chainDetailed?.network !== 'mainnet') return [] + if (getNetworkTypeFromChainId(chainDetailed.chainId) !== network) return [] return getAssetList(account.toLowerCase(), network, portfolioProvider) }, [account, network, portfolioProvider, chainDetailed]) } diff --git a/packages/web3-shared/src/hooks/useTokensBalance.ts b/packages/web3-shared/src/hooks/useTokensBalance.ts index c2439263f0fb..c31dfa89c54f 100644 --- a/packages/web3-shared/src/hooks/useTokensBalance.ts +++ b/packages/web3-shared/src/hooks/useTokensBalance.ts @@ -1,6 +1,7 @@ import { useAsyncRetry } from 'react-use' import { useBalanceCheckerContract } from '../contracts/useBalanceChecker' import { useAccount } from './useAccount' +import { useChainId } from './useChainId' /** * Fetch balance of multiple tokens from chain @@ -9,6 +10,7 @@ import { useAccount } from './useAccount' */ export function useTokensBalance(listOfAddress: string[]) { const account = useAccount() + const chainId = useChainId() const balanceCheckerContract = useBalanceCheckerContract() return useAsyncRetry(async () => { @@ -17,5 +19,5 @@ export function useTokensBalance(listOfAddress: string[]) { // cannot check the sender's balance in the same contract from: undefined, }) - }, [account, listOfAddress.join(), balanceCheckerContract]) + }, [chainId, account, listOfAddress.join(), balanceCheckerContract]) } From fdd6534b93361a93c5566e21046c689ee4639526 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Thu, 22 Jul 2021 15:39:00 +0800 Subject: [PATCH 13/13] fix: ts error --- .../options-page/DashboardComponents/WalletAssetsTable.tsx | 5 ++--- .../maskbook/src/plugins/Wallet/hooks/useTransactions.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/maskbook/src/extension/options-page/DashboardComponents/WalletAssetsTable.tsx b/packages/maskbook/src/extension/options-page/DashboardComponents/WalletAssetsTable.tsx index 4ca06d4fa425..9b557ef67c60 100644 --- a/packages/maskbook/src/extension/options-page/DashboardComponents/WalletAssetsTable.tsx +++ b/packages/maskbook/src/extension/options-page/DashboardComponents/WalletAssetsTable.tsx @@ -19,7 +19,7 @@ import BigNumber from 'bignumber.js' import classNames from 'classnames' import ExpandLessIcon from '@material-ui/icons/ExpandLess' import ExpandMoreIcon from '@material-ui/icons/ExpandMore' -import type { Asset } from '@masknet/web3-shared' +import { Asset, useTrustedERC20Tokens } from '@masknet/web3-shared' import { CurrencyType, currySameAddress, @@ -39,7 +39,6 @@ import { useI18N, useMatchXS } from '../../../utils' import { ActionsBarFT } from './ActionsBarFT' import { getTokenUSDValue } from '../../../plugins/Wallet/helpers' import { currentEtherPriceSettings } from '../../../plugins/Wallet/settings' -import { useTrustedERC721TokensFromDB } from '../../../plugins/Wallet/hooks/useERC721Tokens' const useStyles = makeStyles< Theme, @@ -206,7 +205,7 @@ export function WalletAssetsTable(props: WalletAssetsTableProps) { ...(isMobile ? [] : ['']), ] as const - const erc20Tokens = useTrustedERC721TokensFromDB() + const erc20Tokens = useTrustedERC20Tokens() const { value: detailedTokens, error: detailedTokensError, diff --git a/packages/maskbook/src/plugins/Wallet/hooks/useTransactions.ts b/packages/maskbook/src/plugins/Wallet/hooks/useTransactions.ts index 6b917c432ee8..f0d243f2a534 100644 --- a/packages/maskbook/src/plugins/Wallet/hooks/useTransactions.ts +++ b/packages/maskbook/src/plugins/Wallet/hooks/useTransactions.ts @@ -5,7 +5,7 @@ import type { AsyncStateRetry } from 'react-use/lib/useAsyncRetry' import { WalletRPC } from '../messages' import { currentPortfolioDataProviderSettings } from '../settings' import { PortfolioProvider, Transaction } from '../types' -import { getNetworkTypeFromChainId, useChainId, useNetworkType } from '@masknet/web3-shared' +import { getNetworkTypeFromChainId, useChainId } from '@masknet/web3-shared' export function useTransactions( address: string,