Skip to content

Commit c048f52

Browse files
authored
Merge pull request #136 from liquality/is-wallet-available
WalletProvider: implement isWalletAvailable for ledger and metamask
2 parents dd0453a + 185e1c3 commit c048f52

File tree

6 files changed

+39
-4
lines changed

6 files changed

+39
-4
lines changed

src/Client.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,10 @@ export default class Client {
538538
return this.getMethod('refundSwap')(initiationTxHash, recipientAddress, refundAddress, secretHash, expiration)
539539
}
540540

541+
async isWalletAvailable () {
542+
return this.getMethod('isWalletAvailable')()
543+
}
544+
541545
async getWalletNetworkId () {
542546
return this.getMethod('getWalletNetworkId')()
543547
}

src/providers/LedgerProvider.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ export default class LedgerProvider extends WalletProvider {
77
return Transport.isSupported()
88
}
99

10-
constructor (App, baseDerivationPath, network) {
10+
constructor (App, baseDerivationPath, network, ledgerScrambleKey) {
1111
super(network)
1212

1313
this._App = App
1414
this._baseDerivationPath = baseDerivationPath
1515
this._network = network
16+
// The ledger scramble key is required to be set on the ledger transport
17+
// if communicating with the device using `transport.send` for the first time
18+
this._ledgerScrambleKey = ledgerScrambleKey
1619
this._addressCache = {}
1720
}
1821

@@ -58,6 +61,24 @@ export default class LedgerProvider extends WalletProvider {
5861
return this._appInstance
5962
}
6063

64+
async isWalletAvailable () {
65+
const app = await this.getApp()
66+
if (!app.transport.scrambleKey) { // scramble key required before calls
67+
app.transport.setScrambleKey(this._ledgerScrambleKey)
68+
}
69+
const exchangeTimeout = app.transport.exchangeTimeout
70+
app.transport.setExchangeTimeout(2000)
71+
try {
72+
// https://ledgerhq.github.io/btchip-doc/bitcoin-technical-beta.html#_get_random
73+
await LedgerProvider.transport.send(0xe0, 0xc0, 0x00, 0x00)
74+
} catch (e) {
75+
return false
76+
} finally {
77+
app.transport.setExchangeTimeout(exchangeTimeout)
78+
}
79+
return true
80+
}
81+
6182
async getConnectedNetwork () {
6283
// Ledger apps do not provide connected network. It is separated in firmware.
6384
return this._network

src/providers/WalletProvider.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ export default class WalletProvider extends Provider {
1111
'constructor',
1212
'_networkMatchProxy',
1313
'getConnectedNetwork',
14-
'assertNetworkMatch'
14+
'assertNetworkMatch',
15+
'isWalletAvailable'
1516
].includes(method))
1617
return network ? new Proxy(this, { get: this._networkMatchProxy.bind(this) }) : this
1718
}
@@ -35,6 +36,10 @@ export default class WalletProvider extends Provider {
3536
}
3637
}
3738

39+
isWalletAvailable () {
40+
throw new Error('isWalletAvailable not implemented.')
41+
}
42+
3843
getAddresses () {
3944
throw new Error('getAddresses not implemented.')
4045
}

src/providers/bitcoin/BitcoinLedgerProvider.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import bip32 from 'bip32'
1010

1111
export default class BitcoinLedgerProvider extends LedgerProvider {
1212
constructor (chain = { network: networks.bitcoin, segwit: false }, numberOfBlockConfirmation = 1) {
13-
super(Bitcoin, `${chain.segwit ? '49' : '44'}'/${chain.network.coinType}'/0'/`, chain.network)
13+
super(Bitcoin, `${chain.segwit ? '49' : '44'}'/${chain.network.coinType}'/0'/`, chain.network, 'BTC')
1414
this._derivationPath = `${chain.segwit ? '49' : '44'}'/${chain.network.coinType}'/0'/`
1515
this._network = chain.network
1616
this._bjsnetwork = chain.network.name.replace('bitcoin_', '') // for bitcoin js

src/providers/ethereum/EthereumLedgerProvider.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Address from '../../Address'
66

77
export default class EthereumLedgerProvider extends LedgerProvider {
88
constructor (chain = { network: networks.mainnet }) {
9-
super(Ethereum, `44'/${chain.network.coinType}'/0'/`)
9+
super(Ethereum, `44'/${chain.network.coinType}'/0'/`, chain.network, 'w0w') // srs!
1010
}
1111

1212
async getAddressFromDerivationPath (path) {

src/providers/ethereum/EthereumMetaMaskProvider.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ export default class EthereumMetaMaskProvider extends WalletProvider {
1616
this._network = network
1717
}
1818

19+
async isWalletAvailable () {
20+
const addresses = await this._toMM('eth_accounts')
21+
return addresses.length > 0
22+
}
23+
1924
_toMM (method, ...params) {
2025
return new Promise((resolve, reject) => {
2126
this

0 commit comments

Comments
 (0)