Skip to content

Commit 4a7af86

Browse files
committed
Make create provider interface functions more robust
1 parent 2ee1a9e commit 4a7af86

File tree

4 files changed

+96
-93
lines changed

4 files changed

+96
-93
lines changed

src/interfaces.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ export interface Helpers {
9595
createLegacyProviderInterface: (provider: any) => WalletInterface
9696
createModernProviderInterface: (provider: any) => WalletInterface
9797
BigNumber: any
98+
getAddress: (provider: any) => Promise<string | any>
99+
getNetwork: (provider: any) => Promise<number | any>
100+
getBalance: (provider: any) => Promise<string | any>
98101
}
99102

100103
export interface WalletInterface {
@@ -216,7 +219,7 @@ export interface QuerablePromise extends CancelablePromise {
216219
}
217220

218221
export interface CancelablePromise extends Promise<any> {
219-
cancel: () => void
222+
cancel: (func: () => void) => void
220223
isFulfilled: () => boolean
221224
isResolved: () => boolean
222225
isRejected: () => boolean

src/modules/select/wallets/dapper.ts

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,48 +10,14 @@ function dapper(): WalletModule {
1010
iconSrc: dapperIcon,
1111
iconSrcSet: dapperIcon2x,
1212
wallet: (helpers: Helpers) => {
13-
const { getProviderName, BigNumber } = helpers
13+
const { createModernProviderInterface, getProviderName } = helpers
1414
const provider = (window as any).ethereum
1515

1616
return {
1717
provider,
1818
interface:
1919
provider && getProviderName(provider) === "Dapper"
20-
? {
21-
name: "Dapper",
22-
connect: provider.enable,
23-
address: {
24-
get: () =>
25-
Promise.resolve(provider.cachedResults.eth_coinbase.result)
26-
},
27-
network: {
28-
get: () =>
29-
Promise.resolve(provider.cachedResults.net_version.result)
30-
},
31-
balance: {
32-
get: () =>
33-
new Promise(resolve => {
34-
if (!provider.cachedResults.eth_coinbase.result) {
35-
resolve(null)
36-
return
37-
}
38-
39-
provider.sendAsync(
40-
{
41-
method: "eth_getBalance",
42-
params: [
43-
provider.cachedResults.eth_coinbase.result,
44-
"latest"
45-
],
46-
id: 1
47-
},
48-
(e: any, res: any) => {
49-
resolve(BigNumber(res.result).toString(10))
50-
}
51-
)
52-
})
53-
}
54-
}
20+
? createModernProviderInterface(provider)
5521
: null
5622
}
5723
},

src/utilities.ts

Lines changed: 82 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -7,52 +7,91 @@ import {
77
CancelablePromise
88
} from "./interfaces"
99

10+
export function getNetwork(provider: any): Promise<number | any> {
11+
return new Promise((resolve, reject) => {
12+
provider.sendAsync(
13+
{
14+
method: "net_version",
15+
params: [],
16+
id: 42
17+
},
18+
(e: any, res: any) => {
19+
e && reject(e)
20+
resolve(Number(res && res.result))
21+
}
22+
)
23+
})
24+
}
25+
26+
export function getAddress(provider: any): Promise<string | any> {
27+
return new Promise((resolve, reject) => {
28+
provider.sendAsync(
29+
{
30+
method: "eth_accounts",
31+
params: [],
32+
id: 42
33+
},
34+
(e: any, res: any) => {
35+
e && reject(e)
36+
resolve(res && res.result && res.result[0])
37+
}
38+
)
39+
})
40+
}
41+
42+
export function getBalance(provider: any): Promise<string | any> {
43+
return new Promise(async (resolve, reject) => {
44+
const currentAddress = await getAddress(provider)
45+
46+
if (!currentAddress) {
47+
resolve(null)
48+
return
49+
}
50+
51+
provider.sendAsync(
52+
{
53+
method: "eth_getBalance",
54+
params: [currentAddress, "latest"],
55+
id: 42
56+
},
57+
(e: any, res: any) => {
58+
e && reject(e)
59+
resolve(res && res.result && new BigNumber(res.result).toString(10))
60+
}
61+
)
62+
})
63+
}
64+
1065
export function createModernProviderInterface(provider: any): WalletInterface {
1166
provider.autoRefreshOnNetworkChange = false
1267

13-
return {
14-
address: {
15-
get: () => {
16-
return Promise.resolve(provider.selectedAddress || null)
17-
}
68+
const onFuncExists = typeof provider.on === "function"
1869

19-
// METAMASK BUG NEEDS TO BE FIXED FOR CHROME: https://github.com/MetaMask/metamask-extension/issues/7101
20-
// onChange: func => {
21-
// // give the initial value if it exists
22-
// if (provider.selectedAddress) {
23-
// func(provider.selectedAddress)
24-
// }
25-
// provider.on("accountsChanged", accounts => func(accounts[0]))
26-
// }
27-
},
28-
network: {
29-
onChange: (func: (val: string | number) => void) => {
30-
// give the initial value if it exists
31-
if (provider.networkVersion) {
32-
func(provider.networkVersion)
70+
return {
71+
address: onFuncExists
72+
? {
73+
onChange: func => {
74+
// get the initial value
75+
getAddress(provider).then(func)
76+
provider.on("accountsChanged", (accounts: string[]) =>
77+
func(accounts[0])
78+
)
79+
}
3380
}
34-
provider.on("networkChanged", func)
35-
}
36-
},
37-
balance: {
38-
get: () =>
39-
new Promise((resolve: (val: any) => void) => {
40-
if (!provider.selectedAddress) {
41-
resolve(null)
42-
return
81+
: {
82+
get: () => getAddress(provider)
83+
},
84+
network: onFuncExists
85+
? {
86+
onChange: (func: (val: string | number) => void) => {
87+
// get initial value
88+
getNetwork(provider).then(func)
89+
provider.on("networkChanged", func)
4390
}
44-
45-
provider.sendAsync(
46-
{
47-
method: "eth_getBalance",
48-
params: [provider.selectedAddress, "latest"],
49-
id: 1
50-
},
51-
(e: any, res: any) => {
52-
resolve(new BigNumber(res.result).toString(10))
53-
}
54-
)
55-
})
91+
}
92+
: { get: () => getNetwork(provider) },
93+
balance: {
94+
get: () => getBalance(provider)
5695
},
5796
connect: () =>
5897
new Promise(
@@ -74,24 +113,13 @@ export function createModernProviderInterface(provider: any): WalletInterface {
74113
export function createLegacyProviderInterface(provider: any): WalletInterface {
75114
return {
76115
address: {
77-
get: () => Promise.resolve(provider._address || provider.address)
116+
get: () => getAddress(provider)
78117
},
79118
network: {
80-
get: () => Promise.resolve(provider._chainId || provider.chainId)
119+
get: () => getNetwork(provider)
81120
},
82121
balance: {
83-
get: () =>
84-
new Promise((resolve: (val: string | number | null) => void) => {
85-
provider.sendAsync(
86-
{
87-
method: "eth_getBalance",
88-
params: [provider._address, "latest"]
89-
},
90-
(e: any, res: any) => {
91-
resolve(new BigNumber(res.result).toString(10))
92-
}
93-
)
94-
})
122+
get: () => getBalance(provider)
95123
},
96124
name: getProviderName(provider) || "unknown"
97125
}

src/views/WalletSelect.svelte

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
import {
1818
getProviderName,
1919
createLegacyProviderInterface,
20-
createModernProviderInterface
20+
createModernProviderInterface,
21+
getAddress,
22+
getBalance,
23+
getNetwork
2124
} from "../utilities";
2225
2326
import {
@@ -102,7 +105,10 @@
102105
getProviderName,
103106
createLegacyProviderInterface,
104107
createModernProviderInterface,
105-
BigNumber
108+
BigNumber,
109+
getNetwork,
110+
getAddress,
111+
getBalance
106112
});
107113
108114
// if no interface then the user does not have the wallet they selected installed or available

0 commit comments

Comments
 (0)