-
Notifications
You must be signed in to change notification settings - Fork 504
/
sagas.js
64 lines (54 loc) · 2.19 KB
/
sagas.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { call, put, select } from 'redux-saga/effects'
import { filter, findIndex, forEach, propEq } from 'ramda'
import * as A from './actions'
import * as actions from '../../actions'
import { selectors } from '../../index'
import settings from 'config'
import { Types } from 'blockchain-wallet-v4/src'
export default ({ api }) => {
const toggleUsedAddresses = function * () {
yield put(actions.modals.closeAllModals())
}
const deriveAddresses = function (account, receiveIndex) {
let i = 0
let addrs = []
while (i <= receiveIndex.data) {
addrs.push(Types.HDAccount.getReceiveAddress(account, i, settings.NETWORK_BITCOIN))
i++
}
return addrs
}
const fetchUsedAddresses = function * (action) {
const { walletIndex } = action.payload
yield put(A.fetchUsedAddressesLoading(walletIndex))
const wallet = yield select(selectors.core.wallet.getWallet)
const account = Types.Wallet.selectHDAccounts(wallet).get(walletIndex)
// get current receive index of wallet
const receiveIndex = yield select(selectors.core.data.bitcoin.getReceiveIndex(account.xpub))
// derive previous addresses
const derivedAddrs = yield call(deriveAddresses, account, receiveIndex)
// fetch blockchain data for each address
const derivedAddrsFull = yield call(api.fetchBlockchainData, derivedAddrs)
// fetch label indexes and derive those addresses
const labels = Types.HDAccount.selectAddressLabels(account).reverse().toArray()
const labeledAddrs = labels.map(l => {
return { address: Types.HDAccount.getReceiveAddress(account, l.index, settings.NETWORK_BITCOIN), index: l.index, label: l.label }
})
// filter only addresses with tx's
const usedAddresses = filter(a => a.n_tx > 0, derivedAddrsFull.addresses)
// match labels with addresses
if (labeledAddrs.length) {
forEach((labeledAddr) => {
let idx = findIndex(propEq('address', labeledAddr.address))(usedAddresses)
if (idx !== -1) {
usedAddresses[idx].label = labeledAddr.label
}
}, labeledAddrs)
}
yield put(A.fetchUsedAddressesSuccess(walletIndex, usedAddresses))
}
return {
fetchUsedAddresses,
toggleUsedAddresses
}
}