Skip to content

Commit 639fbcc

Browse files
committed
Create provider for imToken balance call
1 parent b88e319 commit 639fbcc

File tree

2 files changed

+29
-19
lines changed

2 files changed

+29
-19
lines changed

src/modules/select/wallets/imtoken.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,58 +2,67 @@ import { mobileWalletInstallMessage } from '../content'
22
import { WalletModule, Helpers, CommonWalletOptions } from '../../../interfaces'
33

44
import imTokenIcon from '../wallet-icons/icon-imtoken'
5+
import createProvider from './providerEngine'
56

67
function imtoken(options: CommonWalletOptions): WalletModule {
7-
const { preferred, label, iconSrc, svg } = options
8+
const { preferred, label, iconSrc, svg, rpcUrl } = options
89

910
return {
1011
name: label || 'imToken',
1112
iconSrc,
1213
svg: svg || imTokenIcon,
1314
wallet: async (helpers: Helpers) => {
14-
const { getProviderName, getBalance } = helpers
15+
const { getProviderName } = helpers
16+
const imTokenProvider = (window as any).ethereum
17+
const provider = rpcUrl ? createProvider({ rpcUrl }) : null
1518

16-
const provider =
17-
(window as any).ethereum ||
18-
((window as any).web3 && (window as any).web3.currentProvider)
19+
let warned = false
1920

2021
return {
21-
provider,
22+
provider: provider || imTokenProvider,
2223
interface:
23-
provider && getProviderName(provider) === 'imToken'
24+
imTokenProvider && getProviderName(imTokenProvider) === 'imToken'
2425
? {
2526
address: {
26-
get: () => Promise.resolve(provider.selectedAddress)
27+
get: () => Promise.resolve(imTokenProvider.selectedAddress),
2728
},
2829
network: {
29-
get: () => Promise.resolve(Number(provider.networkVersion))
30+
get: () =>
31+
Promise.resolve(Number(imTokenProvider.networkVersion)),
3032
},
3133
balance: {
3234
get: () => {
35+
if (!provider) {
36+
!warned &&
37+
console.warn(
38+
'The imToken provider does not allow rpc calls preventing Onboard.js from getting the balance. You can pass in a "rpcUrl" to the imToken wallet initialization object to get the balance.'
39+
)
40+
return Promise.resolve(null)
41+
}
3342
const params = {
3443
jsonrpc: '2.0',
3544
method: 'eth_getBalance',
36-
params: [provider.selectedAddress, 'latest'],
37-
id: 42
45+
params: [imTokenProvider.selectedAddress, 'latest'],
46+
id: 42,
3847
}
3948

4049
return provider.sendAsync(params).then((res: any) => {
4150
console.log('balance result:', res)
4251
return res
4352
})
44-
}
53+
},
4554
},
46-
name: getProviderName(provider),
47-
connect: () => provider.enable()
55+
name: getProviderName(imTokenProvider),
56+
connect: () => imTokenProvider.enable(),
4857
}
49-
: null
58+
: null,
5059
}
5160
},
5261
type: 'injected',
5362
link: `imtokenv2://navigate?screen=DappView&url=${window.location.href}`,
5463
installMessage: mobileWalletInstallMessage,
5564
mobile: true,
56-
preferred
65+
preferred,
5766
}
5867
}
5968

src/modules/select/wallets/providerEngine.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,18 @@ import FilterSubprovider from 'web3-provider-engine/subproviders/filters'
77
function createProvider(config: any) {
88
const { getAccounts, signTransaction, rpcUrl } = config
99

10-
const idMgmt = new HookedWalletSubprovider({ getAccounts, signTransaction })
10+
const idMgmt =
11+
getAccounts && new HookedWalletSubprovider({ getAccounts, signTransaction })
1112

1213
const rpcSubProvider = new RpcSource({
13-
rpcUrl: rpcUrl.includes('http') ? rpcUrl : `https://${rpcUrl}`
14+
rpcUrl: rpcUrl.includes('http') ? rpcUrl : `https://${rpcUrl}`,
1415
})
1516

1617
const provider = new Web3ProviderEngine()
1718

1819
provider.addProvider(new SubscriptionSubprovider())
1920
provider.addProvider(new FilterSubprovider())
20-
provider.addProvider(idMgmt)
21+
idMgmt && provider.addProvider(idMgmt)
2122
provider.addProvider(rpcSubProvider)
2223
provider.start()
2324

0 commit comments

Comments
 (0)