Skip to content

Commit

Permalink
Merge pull request #51 from blocknative/fix/create-interface
Browse files Browse the repository at this point in the history
Make create provider interface functions more robust
  • Loading branch information
lnbc1QWFyb24 authored Nov 5, 2019
2 parents 8ec8417 + 4a7af86 commit 9cc28c1
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 93 deletions.
5 changes: 4 additions & 1 deletion src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ export interface Helpers {
createLegacyProviderInterface: (provider: any) => WalletInterface
createModernProviderInterface: (provider: any) => WalletInterface
BigNumber: any
getAddress: (provider: any) => Promise<string | any>
getNetwork: (provider: any) => Promise<number | any>
getBalance: (provider: any) => Promise<string | any>
}

export interface WalletInterface {
Expand Down Expand Up @@ -216,7 +219,7 @@ export interface QuerablePromise extends CancelablePromise {
}

export interface CancelablePromise extends Promise<any> {
cancel: () => void
cancel: (func: () => void) => void
isFulfilled: () => boolean
isResolved: () => boolean
isRejected: () => boolean
Expand Down
38 changes: 2 additions & 36 deletions src/modules/select/wallets/dapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
},
Expand Down
136 changes: 82 additions & 54 deletions src/utilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,52 +7,91 @@ import {
CancelablePromise
} from "./interfaces"

export function getNetwork(provider: any): Promise<number | any> {
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<string | any> {
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<string | any> {
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(
Expand All @@ -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"
}
Expand Down
10 changes: 8 additions & 2 deletions src/views/WalletSelect.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@
import {
getProviderName,
createLegacyProviderInterface,
createModernProviderInterface
createModernProviderInterface,
getAddress,
getBalance,
getNetwork
} from "../utilities";
import {
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 9cc28c1

Please sign in to comment.