diff --git a/src/interfaces.ts b/src/interfaces.ts index 1536da6cf..f6cc8ba7f 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -95,6 +95,9 @@ export interface Helpers { createLegacyProviderInterface: (provider: any) => WalletInterface createModernProviderInterface: (provider: any) => WalletInterface BigNumber: any + getAddress: (provider: any) => Promise + getNetwork: (provider: any) => Promise + getBalance: (provider: any) => Promise } export interface WalletInterface { @@ -216,7 +219,7 @@ export interface QuerablePromise extends CancelablePromise { } export interface CancelablePromise extends Promise { - cancel: () => void + cancel: (func: () => void) => void isFulfilled: () => boolean isResolved: () => boolean isRejected: () => boolean diff --git a/src/modules/select/wallets/dapper.ts b/src/modules/select/wallets/dapper.ts index 50fa6ad00..ab04f0927 100644 --- a/src/modules/select/wallets/dapper.ts +++ b/src/modules/select/wallets/dapper.ts @@ -10,48 +10,14 @@ function dapper(): WalletModule { iconSrc: dapperIcon, iconSrcSet: dapperIcon2x, wallet: (helpers: Helpers) => { - const { getProviderName, BigNumber } = helpers + const { createModernProviderInterface, getProviderName } = helpers const provider = (window as any).ethereum return { provider, interface: provider && getProviderName(provider) === "Dapper" - ? { - name: "Dapper", - connect: provider.enable, - address: { - get: () => - Promise.resolve(provider.cachedResults.eth_coinbase.result) - }, - network: { - get: () => - Promise.resolve(provider.cachedResults.net_version.result) - }, - balance: { - get: () => - new Promise(resolve => { - if (!provider.cachedResults.eth_coinbase.result) { - resolve(null) - return - } - - provider.sendAsync( - { - method: "eth_getBalance", - params: [ - provider.cachedResults.eth_coinbase.result, - "latest" - ], - id: 1 - }, - (e: any, res: any) => { - resolve(BigNumber(res.result).toString(10)) - } - ) - }) - } - } + ? createModernProviderInterface(provider) : null } }, diff --git a/src/utilities.ts b/src/utilities.ts index 2ec1d6ab7..4f98e5022 100644 --- a/src/utilities.ts +++ b/src/utilities.ts @@ -7,52 +7,91 @@ import { CancelablePromise } from "./interfaces" +export function getNetwork(provider: any): Promise { + return new Promise((resolve, reject) => { + provider.sendAsync( + { + method: "net_version", + params: [], + id: 42 + }, + (e: any, res: any) => { + e && reject(e) + resolve(Number(res && res.result)) + } + ) + }) +} + +export function getAddress(provider: any): Promise { + return new Promise((resolve, reject) => { + provider.sendAsync( + { + method: "eth_accounts", + params: [], + id: 42 + }, + (e: any, res: any) => { + e && reject(e) + resolve(res && res.result && res.result[0]) + } + ) + }) +} + +export function getBalance(provider: any): Promise { + return new Promise(async (resolve, reject) => { + const currentAddress = await getAddress(provider) + + if (!currentAddress) { + resolve(null) + return + } + + provider.sendAsync( + { + method: "eth_getBalance", + params: [currentAddress, "latest"], + id: 42 + }, + (e: any, res: any) => { + e && reject(e) + resolve(res && res.result && new BigNumber(res.result).toString(10)) + } + ) + }) +} + export function createModernProviderInterface(provider: any): WalletInterface { provider.autoRefreshOnNetworkChange = false - return { - address: { - get: () => { - return Promise.resolve(provider.selectedAddress || null) - } + const onFuncExists = typeof provider.on === "function" - // METAMASK BUG NEEDS TO BE FIXED FOR CHROME: https://github.com/MetaMask/metamask-extension/issues/7101 - // onChange: func => { - // // give the initial value if it exists - // if (provider.selectedAddress) { - // func(provider.selectedAddress) - // } - // provider.on("accountsChanged", accounts => func(accounts[0])) - // } - }, - network: { - onChange: (func: (val: string | number) => void) => { - // give the initial value if it exists - if (provider.networkVersion) { - func(provider.networkVersion) + return { + address: onFuncExists + ? { + onChange: func => { + // get the initial value + getAddress(provider).then(func) + provider.on("accountsChanged", (accounts: string[]) => + func(accounts[0]) + ) + } } - provider.on("networkChanged", func) - } - }, - balance: { - get: () => - new Promise((resolve: (val: any) => void) => { - if (!provider.selectedAddress) { - resolve(null) - return + : { + get: () => getAddress(provider) + }, + network: onFuncExists + ? { + onChange: (func: (val: string | number) => void) => { + // get initial value + getNetwork(provider).then(func) + provider.on("networkChanged", func) } - - provider.sendAsync( - { - method: "eth_getBalance", - params: [provider.selectedAddress, "latest"], - id: 1 - }, - (e: any, res: any) => { - resolve(new BigNumber(res.result).toString(10)) - } - ) - }) + } + : { get: () => getNetwork(provider) }, + balance: { + get: () => getBalance(provider) }, connect: () => new Promise( @@ -74,24 +113,13 @@ export function createModernProviderInterface(provider: any): WalletInterface { export function createLegacyProviderInterface(provider: any): WalletInterface { return { address: { - get: () => Promise.resolve(provider._address || provider.address) + get: () => getAddress(provider) }, network: { - get: () => Promise.resolve(provider._chainId || provider.chainId) + get: () => getNetwork(provider) }, balance: { - get: () => - new Promise((resolve: (val: string | number | null) => void) => { - provider.sendAsync( - { - method: "eth_getBalance", - params: [provider._address, "latest"] - }, - (e: any, res: any) => { - resolve(new BigNumber(res.result).toString(10)) - } - ) - }) + get: () => getBalance(provider) }, name: getProviderName(provider) || "unknown" } diff --git a/src/views/WalletSelect.svelte b/src/views/WalletSelect.svelte index 343b19cc7..3d0def92d 100644 --- a/src/views/WalletSelect.svelte +++ b/src/views/WalletSelect.svelte @@ -17,7 +17,10 @@ import { getProviderName, createLegacyProviderInterface, - createModernProviderInterface + createModernProviderInterface, + getAddress, + getBalance, + getNetwork } from "../utilities"; import { @@ -102,7 +105,10 @@ getProviderName, createLegacyProviderInterface, createModernProviderInterface, - BigNumber + BigNumber, + getNetwork, + getAddress, + getBalance }); // if no interface then the user does not have the wallet they selected installed or available