Skip to content

Commit 077d561

Browse files
authored
Merge pull request #287 from blocknative/develop
Release 1.7.0
2 parents 80c3a0f + 20260c3 commit 077d561

File tree

9 files changed

+155
-20
lines changed

9 files changed

+155
-20
lines changed

.prettierrc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
"tabWidth": 2,
44
"useTabs": false,
55
"semi": false,
6-
"singleQuote": true
6+
"singleQuote": true,
7+
"trailingComma": "none",
8+
"arrowParens": "avoid"
79
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bnc-onboard",
3-
"version": "1.6.0",
3+
"version": "1.7.0",
44
"description": "Onboard users to web3 by allowing them to select a wallet, get that wallet ready to transact and have access to synced wallet state.",
55
"keywords": [
66
"ethereum",

src/interfaces.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export interface Helpers {
102102
networkName: (id: number) => string
103103
getAddress: (provider: any) => Promise<string | any>
104104
getNetwork: (provider: any) => Promise<number | any>
105-
getBalance: (provider: any) => Promise<string | any>
105+
getBalance: (provider: any, address?: string) => Promise<string | any>
106106
resetWalletState: (options?: {
107107
disconnected: boolean
108108
walletName: string

src/modules/select/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ function getModule(name: string): Promise<any> | undefined {
8282
return import('./wallets/trezor')
8383
case 'ledger':
8484
return import('./wallets/ledger')
85+
case 'imToken':
86+
return import('./wallets/imtoken')
8587
case 'unilogin':
8688
return import('./wallets/unilogin')
8789
default:
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const imTokenIcon = `
2+
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 93 93">
3+
<defs>
4+
<linearGradient id="a" x1="97.185%" x2="-.038%" y1="3.105%" y2="99.699%">
5+
<stop offset="0%" stop-color="#11C4D1"/>
6+
<stop offset="100%" stop-color="#0062AD"/>
7+
</linearGradient>
8+
</defs>
9+
<g fill="none" fill-rule="nonzero">
10+
<path fill="url(#a)" d="M92.755 63.804s0 9.64-1.028 13.78c-1.028 4.187-2.985 7.06-5.09 9.202-2.154 2.142-4.993 4.09-9.3 5.112-4.356 1.023-13.754.974-13.754.974H29.417s-9.642 0-13.803-1.022c-4.16-1.071-7.097-2.97-9.25-5.113-2.155-2.142-4.112-4.966-5.091-9.3-1.028-4.333-.98-13.682-.98-13.682V29.671s0-9.64 1.029-13.78c1.027-4.187 2.985-7.06 5.09-9.202 2.154-2.142 4.993-4.09 9.3-5.113C20.068.554 29.466.603 29.466.603h34.166s9.642 0 13.803 1.022c4.16 1.071 7.097 2.97 9.25 5.113 2.154 2.142 4.112 4.966 5.091 9.3.98 4.333.98 13.682.98 13.682v34.084z"/>
11+
<path fill="#FFF" d="M78.267 28.795c1.909 26.244-15.614 38.71-31.326 40.073-14.587 1.265-28.292-7.304-29.467-20.597-.979-10.955 6.07-15.678 11.6-16.117 5.679-.486 10.427 3.263 10.867 7.84.392 4.382-2.447 6.427-4.454 6.573-1.566.146-3.524-.78-3.72-2.727-.147-1.704.538-1.899.342-3.7-.293-3.214-3.181-3.555-4.747-3.409-1.91.146-5.385 2.338-4.944 7.694.49 5.404 5.874 9.69 12.922 9.056 7.636-.682 12.971-6.378 13.363-14.412 0-.439.098-.828.293-1.218.098-.146.147-.292.294-.438.196-.292.392-.536.636-.779l.686-.682c3.328-3.019 15.37-10.225 26.676-7.985.098 0 .196.049.245.097.44 0 .685.341.734.73"/>
12+
</g>
13+
</svg>
14+
`
15+
16+
export default imTokenIcon

src/modules/select/wallets/imtoken.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { mobileWalletInstallMessage } from '../content'
2+
import { WalletModule, Helpers, CommonWalletOptions } from '../../../interfaces'
3+
4+
import imTokenIcon from '../wallet-icons/icon-imtoken'
5+
6+
function imtoken(
7+
options: CommonWalletOptions & { rpcUrl: string }
8+
): WalletModule {
9+
const { preferred, label, iconSrc, svg, rpcUrl } = options
10+
11+
return {
12+
name: label || 'imToken',
13+
iconSrc,
14+
svg: svg || imTokenIcon,
15+
wallet: async (helpers: Helpers) => {
16+
const { getProviderName, getBalance } = helpers
17+
const imTokenProvider = (window as any).ethereum
18+
const isImToken = getProviderName(imTokenProvider) === 'imToken'
19+
let createProvider
20+
21+
if (isImToken && rpcUrl) {
22+
createProvider = (await import('./providerEngine')).default
23+
}
24+
25+
const provider = createProvider ? createProvider({ rpcUrl }) : null
26+
27+
let warned = false
28+
29+
return {
30+
provider: imTokenProvider,
31+
interface: isImToken
32+
? {
33+
address: {
34+
get: () => Promise.resolve(imTokenProvider.selectedAddress)
35+
},
36+
network: {
37+
get: () =>
38+
Promise.resolve(Number(imTokenProvider.networkVersion))
39+
},
40+
balance: {
41+
get: () => {
42+
if (!provider) {
43+
if (!warned) {
44+
console.warn(
45+
'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.'
46+
)
47+
warned = true
48+
}
49+
50+
return Promise.resolve(null)
51+
}
52+
53+
return getBalance(provider, imTokenProvider.selectedAddress)
54+
}
55+
},
56+
name: getProviderName(imTokenProvider),
57+
connect: () => imTokenProvider.enable()
58+
}
59+
: null
60+
}
61+
},
62+
type: 'injected',
63+
link: `imtokenv2://navigate?screen=DappView&url=${window.location.href}`,
64+
installMessage: mobileWalletInstallMessage,
65+
mobile: true,
66+
preferred
67+
}
68+
}
69+
70+
export default imtoken

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

src/modules/select/wallets/trust.ts

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,62 @@ import { WalletModule, Helpers, CommonWalletOptions } from '../../../interfaces'
33

44
import trustIcon from '../wallet-icons/icon-trust'
55

6-
function trust (options: CommonWalletOptions): WalletModule {
7-
const { preferred, label, iconSrc, svg } = options
6+
function trust(
7+
options: CommonWalletOptions & { rpcUrl: string }
8+
): WalletModule {
9+
const { preferred, label, iconSrc, svg, rpcUrl } = options
810

911
return {
1012
name: label || 'Trust',
1113
svg: svg || trustIcon,
1214
iconSrc,
1315
wallet: async (helpers: Helpers) => {
14-
const { getProviderName, createLegacyProviderInterface } = helpers
15-
const provider =
16+
const { getProviderName, getAddress, getNetwork, getBalance } = helpers
17+
const trustProvider =
1618
(window as any).web3 && (window as any).web3.currentProvider
1719

20+
const isTrust = getProviderName(trustProvider) === 'Trust'
21+
let createProvider
22+
23+
if (isTrust && rpcUrl) {
24+
createProvider = (await import('./providerEngine')).default
25+
}
26+
27+
const provider = createProvider ? createProvider({ rpcUrl }) : null
28+
29+
let warned = false
30+
1831
return {
19-
provider,
20-
interface:
21-
provider && getProviderName(provider) === 'Trust'
22-
? createLegacyProviderInterface(provider)
23-
: null
32+
provider: trustProvider,
33+
interface: isTrust
34+
? {
35+
address: {
36+
get: () => getAddress(trustProvider)
37+
},
38+
network: {
39+
get: () => getNetwork(trustProvider)
40+
},
41+
balance: {
42+
get: async () => {
43+
if (!provider) {
44+
if (!warned) {
45+
console.warn(
46+
'The Trust provider does not allow rpc calls preventing Onboard.js from getting the balance. You can pass in a "rpcUrl" to the Trust wallet initialization object to get the balance.'
47+
)
48+
warned = true
49+
}
50+
51+
return null
52+
}
53+
54+
const address = await getAddress(trustProvider)
55+
56+
return getBalance(provider, address)
57+
}
58+
},
59+
name: getProviderName(trustProvider)
60+
}
61+
: null
2462
}
2563
},
2664
type: 'injected',

src/utilities.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,12 @@ export function getAddress(provider: any): Promise<string | any> {
5353
})
5454
}
5555

56-
export function getBalance(provider: any): Promise<string | any> {
56+
export function getBalance(
57+
provider: any,
58+
address?: string
59+
): Promise<string | any> {
5760
return new Promise(async (resolve, reject) => {
58-
const currentAddress = await getAddress(provider)
61+
const currentAddress = address || (await getAddress(provider))
5962

6063
if (!currentAddress) {
6164
resolve(null)
@@ -153,13 +156,12 @@ export function createLegacyProviderInterface(provider: any): WalletInterface {
153156
export function getProviderName(provider: any): string | undefined {
154157
if (!provider) return
155158

156-
// Torus also exports isMetamask to be true for backward compatibility
157159
if (provider.isTorus) {
158160
return 'Torus'
159161
}
160162

161-
if (provider.isMetaMask) {
162-
return 'MetaMask'
163+
if (provider.isImToken) {
164+
return 'imToken'
163165
}
164166

165167
if (provider.isDapper) {
@@ -194,6 +196,10 @@ export function getProviderName(provider: any): string | undefined {
194196
return 'Status'
195197
}
196198

199+
if (provider.isMetaMask) {
200+
return 'MetaMask'
201+
}
202+
197203
if (provider.host && provider.host.indexOf('localhost') !== -1) {
198204
return 'localhost'
199205
}

0 commit comments

Comments
 (0)