Skip to content

Commit 67458e8

Browse files
authored
Merge pull request #133 from liquality/wallet-error
Wallet errors and fixes
2 parents 2360bb8 + 86cb23e commit 67458e8

File tree

4 files changed

+39
-14
lines changed

4 files changed

+39
-14
lines changed

src/errors.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ export const NoProviderError = createError('NoProviderError')
1414
export const UnsupportedMethodError = createError('UnsupportedMethodError')
1515
export const UnimplementedMethodError = createError('UnimplementedMethodError')
1616
export const InvalidProviderResponseError = createError('InvalidProviderResponseError')
17+
export const WalletError = createError('WalletError')

src/providers/LedgerProvider.js

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import Provider from '../Provider'
2-
31
import Transport from '@ledgerhq/hw-transport-node-hid'
4-
// import bitcoinjs from 'bitcoinjs-lib'
2+
import Provider from '../Provider'
3+
import { WalletError } from '../errors'
54

65
export default class LedgerProvider extends Provider {
76
static isSupported () {
@@ -26,11 +25,33 @@ export default class LedgerProvider extends Provider {
2625
}
2726
}
2827

28+
errorProxy (target, func) {
29+
if (Object.getOwnPropertyNames(target).includes(func)) {
30+
const method = target[func]
31+
return async (...args) => {
32+
try {
33+
const result = await method.bind(target)(...args)
34+
return result
35+
} catch (e) {
36+
const { name, ...errorNoName } = e
37+
throw new WalletError(e.toString(), errorNoName)
38+
}
39+
}
40+
} else {
41+
return target[func]
42+
}
43+
}
44+
2945
async getApp () {
30-
await this.createTransport()
46+
try {
47+
await this.createTransport()
48+
} catch (e) {
49+
const { name, ...errorNoName } = e
50+
throw new WalletError(e.toString(), errorNoName)
51+
}
3152

3253
if (!this._appInstance) {
33-
this._appInstance = new this._App(LedgerProvider.transport)
54+
this._appInstance = new Proxy(new this._App(LedgerProvider.transport), { get: this.errorProxy })
3455
}
3556

3657
return this._appInstance

src/providers/bitcoin/BitcoinLedgerProvider.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export default class BitcoinLedgerProvider extends LedgerProvider {
2929
return this._walletPublicKeyCache[path]
3030
}
3131

32-
const walletPublicKey = this._getWalletPublicKey(path)
32+
const walletPublicKey = await this._getWalletPublicKey(path)
3333
this._walletPublicKeyCache[path] = walletPublicKey
3434
return walletPublicKey
3535
}

src/providers/ethereum/EthereumMetaMaskProvider.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import Provider from '../../Provider'
2-
31
import { isFunction } from 'lodash'
4-
import { formatEthResponse, ensureHexEthFormat, ensureHexStandardFormat } from './EthereumUtil'
52
import { BigNumber } from 'bignumber.js'
3+
import Provider from '../../Provider'
4+
import { formatEthResponse, ensureHexEthFormat, ensureHexStandardFormat } from './EthereumUtil'
5+
import { WalletError } from '../../errors'
66

77
export default class EthereumMetaMaskProvider extends Provider {
88
constructor (metamaskProvider, network) {
@@ -20,18 +20,19 @@ export default class EthereumMetaMaskProvider extends Provider {
2020
this
2121
._metamaskProvider
2222
.sendAsync({ method, params }, (err, data) => {
23-
if (err) {
24-
reject(err)
23+
const error = err || data.error
24+
if (error) {
25+
reject(new WalletError(error.toString(), error))
2526
return
2627
}
2728

2829
if (!data) {
29-
reject(new Error('Something went wrong'))
30+
reject(new WalletError('Metamask response was empty'))
3031
return
3132
}
3233

3334
if (typeof data.result === 'undefined') {
34-
reject(new Error('Something went wrong'))
35+
reject(new WalletError('Metamask response was empty'))
3536
return
3637
}
3738

@@ -44,7 +45,9 @@ export default class EthereumMetaMaskProvider extends Provider {
4445

4546
async getAddresses () {
4647
const addresses = await this._toMM('eth_accounts')
47-
48+
if (addresses.length === 0) {
49+
throw new WalletError('Metamask: No addresses available from wallet')
50+
}
4851
return addresses.map((address) => { return { address: address } })
4952
}
5053

0 commit comments

Comments
 (0)