Skip to content

Commit

Permalink
fix unused address delete and adding code comments
Browse files Browse the repository at this point in the history
  • Loading branch information
schnogz committed Jun 4, 2018
1 parent 0283269 commit d0f470b
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 38 deletions.
Expand Up @@ -101,7 +101,7 @@
"components.alerts.wallet_upgrade_error": "Failed to upgrade to HD and save wallet.",
"components.alerts.yubikey_verify_error": "Failed to verify Yubikey",
"components.alerts.yubikey_verify_success": "Yubikey verified",
"components.alerts.uknown_error": "An error has occured.",
"components.alerts.unknown_error": "An error has occurred.",
"coinify.banktransferdetails.header": "Bank Transfer Order Details",
"coinify.banktransferdetails.directions": "Funds must come from your bank account, which needs to be in the same name as your government issued ID. Coinify will reject any transfers from third party accounts not in your name.",
"coinify.banktransferdetails.recipientname": "Recipient Name:",
Expand Down
Expand Up @@ -37,10 +37,11 @@ const selectHeader = nature => {
const selectMessage = (message, data = undefined) => {
switch (message) {
case C.ADDRESS_ADD_ERROR: return <FormattedMessage id='components.alerts.addresserroradd' defaultMessage='Error adding address.' />
case C.ADDRESS_DELETE_ERROR: return <FormattedMessage id='components.alerts.address_delete_error' defaultMessage='Failed to delete address label.' />
case C.ADDRESS_DELETE_SUCCESS: return <FormattedMessage id='components.alerts.address_delete_success' defaultMessage='Address deleted successfully.' />
case C.ADDRESS_DOES_NOT_EXIST_ERROR: return <FormattedMessage id='components.alerts.address_does_not_exist_error' defaultMessage='This address already exists in your wallet.' />
case C.ADDRESS_FORMAT_NOT_SUPPORTED_ERROR: return <FormattedMessage id='components.alerts.address_format_not_supported_error' defaultMessage='This address format is not supported.' />
case C.ADDRESS_LABEL_MAXIMUM_ERROR: return <FormattedMessage id='components.alerts.address_label_maximum_error' defaultMessage='You cannot have more than 15 unused addresses. Please send some Bitcoin to at least one of them.' />
case C.ADDRESS_LABEL_UPDATE_SUCCESS: return <FormattedMessage id='components.alerts.address_label_update_success' defaultMessage='Address label updated.' />
case C.AUTHORIZATION_REQUIRED_INFO: return <FormattedMessage id='components.alerts.authorization_required_info' defaultMessage='Authorization required. Please check your mailbox.' />
case C.AUTOLOGOUT_UPDATE_ERROR: return <FormattedMessage id='components.alerts.autologout_update_error' defaultMessage='Failed to update auto logout' />
case C.AUTOLOGOUT_UPDATE_SUCCESS: return <FormattedMessage id='components.alerts.autologout_update_success' defaultMessage='Auto logout has been successfully updated' />
Expand All @@ -58,6 +59,8 @@ const selectMessage = (message, data = undefined) => {
case C.EXCHANGE_REFRESH_TRADES_ERROR: return <FormattedMessage id='components.alerts.exchange_refresh_trades_error' defaultMessage='Failed to refresh all trades statuses.' />
case C.EXCHANGE_REFRESH_TRADE_ERROR: return <FormattedMessage id='components.alerts.exchange_refresh_trade_error' defaultMessage='Failed to refresh trade status.' />
case C.EXCHANGE_TRANSACTION_ERROR: return <FormattedMessage id='components.alerts.exchange_transaction_error' defaultMessage='The transaction failed to send. Please try again later.' />
case C.FETCH_USED_ADDRESSES_ERROR: return <FormattedMessage id='components.alerts.fetch_used_addresses_error' defaultMessage='Failed to retrieve used addresses.' />
case C.FETCH_UNUSED_ADDRESSES_ERROR: return <FormattedMessage id='components.alerts.fetch_unused_addresses_error' defaultMessage='Failed to retrieve unused addresses.' />
case C.GET_GOOGLEAUTH_SECRET_ERROR: return <FormattedMessage id='components.alerts.get_googleauth_secret_error' defaultMessage='Could not retrieve Google Authenticator secret.' />
case C.GOOGLE_AUTH_VERIFY_ERROR: return <FormattedMessage id='components.alerts.google_auth_verify_error' defaultMessage='Failed to verify Google Authenticator code' />
case C.GOOGLE_AUTH_VERIFY_SUCCESS: return <FormattedMessage id='components.alerts.google_auth_verify_success' defaultMessage='Google auth verified' />
Expand Down Expand Up @@ -89,6 +92,7 @@ const selectMessage = (message, data = undefined) => {
case C.MOBILE_VERIFY_ERROR: return <FormattedMessage id='components.alerts.mobile_verify_error' defaultMessage='Failed to verify mobile number' />
case C.MOBILE_VERIFY_SUCCESS: return <FormattedMessage id='components.alerts.mobile_verify_success' defaultMessage='Mobile number has been verified' />
case C.NEW_WALLET_CREATE_ERROR: return <FormattedMessage id='components.alerts.new_wallet_create_error' defaultMessage='Failed to create new wallet' />
case C.NEW_ADDRESS_GENERATE_ERROR: return <FormattedMessage id='components.alerts.new_address_generate_error' defaultMessage='Failed to generate new address.' />
case C.NEW_WALLET_CREATE_SUCCESS: return <FormattedMessage id='components.alerts.new_wallet_create_success' defaultMessage='Successfully created new wallet' />
case C.PBKDF2_UPDATE_SUCCESS: return <FormattedMessage id='components.alerts.pbkdf2_update_success' defaultMessage='PBKDF2 iterations changed successfully' />
case C.REGISTER_ERROR: return <FormattedMessage id='components.alerts.register_error' defaultMessage='Wallet could not be created' />
Expand Down Expand Up @@ -130,12 +134,14 @@ const selectMessage = (message, data = undefined) => {
case C.TWOFA_UPDATE_SUCCESS: return <FormattedMessage id='components.alerts.twofa_update_success' defaultMessage='2FA has been successfully updated' />
case C.TWOFA_YUBIKEY_ENABLE_ERROR: return <FormattedMessage id='components.alerts.yubikey_enable_error' defaultMessage='Failed to update Yubikey 2FA' />
case C.TWOFA_YUBIKEY_ENABLE_SUCCESS: return <FormattedMessage id='components.alerts.yubikey_enable_success' defaultMessage='2FA (Yubikey) has been successfully enabled' />
case C.UPDATE_ADDRESS_LABEL_SUCCESS: return <FormattedMessage id='components.alerts.update_address_label_success' defaultMessage='Address label updated.' />
case C.UPDATE_ADDRESS_LABEL_ERROR: return <FormattedMessage id='components.alerts.update_address_label_error' defaultMessage='Failed to update address label.' />
case C.WALLET_LOADING_ERROR: return <FormattedMessage id='components.alerts.wallet_loading_error' defaultMessage='Could not retrieve essential data. Try again later.' />
case C.WALLET_SESSION_ERROR: return <FormattedMessage id='components.alerts.wallet_session_error' defaultMessage='Error establishing the session' />
case C.WALLET_UPGRADE_ERROR: return <FormattedMessage id='components.alerts.wallet_upgrade_error' defaultMessage='Failed to upgrade to HD and save wallet.' />
case C.YUBIKEY_VERIFY_ERROR: return <FormattedMessage id='components.alerts.yubikey_verify_error' defaultMessage='Failed to verify Yubikey' />
case C.YUBIKEY_VERIFY_SUCCESS: return <FormattedMessage id='components.alerts.yubikey_verify_success' defaultMessage='Yubikey verified' />
default: return <FormattedMessage id='components.alerts.uknown_error' defaultMessage='An error has occured.' />
default: return <FormattedMessage id='components.alerts.unknown_error' defaultMessage='An error has occurred.' />
}
}

Expand Down
Expand Up @@ -43,7 +43,7 @@ export default ({ api }) => {
} catch (e) {
yield put(A.generateNextReceiveAddressError(walletIndex, e))
yield put(actions.logs.logErrorMessage(logLocation, 'generateNextReceiveAddress', e))
yield put(actions.alerts.displayError('Failed to generate new address.'))
yield put(actions.alerts.displayError(C.NEW_ADDRESS_GENERATE_ERROR))
}
}

Expand All @@ -54,25 +54,31 @@ export default ({ api }) => {
yield put(A.fetchUnusedAddressesLoading(walletIndex))
const wallet = yield select(selectors.core.wallet.getWallet)
const account = Types.Wallet.selectHDAccounts(wallet).get(walletIndex)
// get all indexes for labeled addresses
const labels = Types.HDAccount.selectAddressLabels(account).reverse().toArray()
// derive addresses from label indexes
const labeledAddrs = labels.map(la => ({
address: Types.HDAccount.getReceiveAddress(account, la.index, settings.NETWORK_BITCOIN), index: la.index, label: la.label
}))
// fetch blockchain data for each address
const labeledAddrsFull = yield call(api.fetchBlockchainData, pluck('address', labeledAddrs))
// filter only addresses with 0 txs
const unusedAddresses = filter(a => a.n_tx === 0, labeledAddrsFull.addresses)

// map labels back to unused addresses
forEach((labeledAddr) => {
let idx = findIndex(propEq('address', labeledAddr.address))(unusedAddresses)
if (idx !== -1) {
unusedAddresses[idx].derivationIndex = labeledAddr.index
unusedAddresses[idx].label = labeledAddr.label
}
}, labeledAddrs)

yield put(A.fetchUnusedAddressesSuccess(walletIndex, sort((a, b) => { return a.derivationIndex - b.derivationIndex }, unusedAddresses)))
} catch (e) {
yield put(A.fetchUnusedAddressesError(walletIndex, e))
yield put(actions.logs.logErrorMessage(logLocation, 'fetchUnusedAddresses', e))
yield put(actions.alerts.displayError('Failed to retrieve unused addresses.'))
yield put(actions.alerts.displayError(C.FETCH_UNUSED_ADDRESSES_ERROR))
}
}

Expand All @@ -98,7 +104,7 @@ export default ({ api }) => {
// filter only addresses with tx's
const usedAddresses = filter(a => a.n_tx > 0, derivedAddrsFull.addresses)

// match labels with addresses
// map labels back to used addresses
forEach((labeledAddr) => {
let idx = findIndex(propEq('address', labeledAddr.address))(usedAddresses)
if (idx !== -1) {
Expand All @@ -110,7 +116,7 @@ export default ({ api }) => {
} catch (e) {
yield put(A.fetchUsedAddressesError(walletIndex, e))
yield put(actions.logs.logErrorMessage(logLocation, 'fetchUsedAddresses', e))
yield put(actions.alerts.displayError('Failed to retrieve used addresses.'))
yield put(actions.alerts.displayError(C.FETCH_USED_ADDRESSES_ERROR))
}
}

Expand All @@ -121,13 +127,13 @@ export default ({ api }) => {
yield put(A.editAddressLabelLoading(accountIndex))
let newLabel = yield call(promptForInput, { title: 'Rename Address Label' })
yield put(actions.core.wallet.setHdAddressLabel(accountIndex, addressIndex, newLabel))
yield put(actions.alerts.displaySuccess(C.ADDRESS_LABEL_UPDATE_SUCCESS))
yield put(A.fetchUnusedAddresses(walletIndex))
yield put(A.editAddressLabelSuccess(walletIndex))
yield put(actions.alerts.displaySuccess(C.UPDATE_ADDRESS_LABEL_SUCCESS))
} catch (e) {
yield put(A.editAddressLabelError(walletIndex, e))
yield put(actions.logs.logErrorMessage(logLocation, 'editAddressLabel', e))
yield put(actions.alerts.displayError('Failed to update address label.'))
yield put(actions.alerts.displayError(C.UPDATE_ADDRESS_LABEL_ERROR))
}
}

Expand All @@ -136,19 +142,16 @@ export default ({ api }) => {

try {
yield put(A.deleteAddressLabelLoading(accountIdx))
// yield put(actions.core.wallet.deleteHdAddressLabel(accountIdx, addressIdx))
yield call(function * () {
yield put(actions.core.wallet.deleteHdAddressLabel(accountIdx, addressIdx, walletIdx))
}, accountIdx, addressIdx)
// let t = yield call(actions.core.wallet.deleteHdAddressLabel, {accountIdx}, {addressIdx})
// console.log('123')
yield put(actions.alerts.displaySuccess('Address was deleted successfully.'))
yield put(A.deleteAddressLabelSuccess(walletIdx))
yield put(A.fetchUnusedAddresses(walletIdx))
yield put(actions.alerts.displaySuccess(C.ADDRESS_DELETE_SUCCESS))
} catch (e) {
yield put(A.deleteAddressLabelError(walletIdx, e))
yield put(actions.logs.logErrorMessage(logLocation, 'deleteAddressLabel', e))
yield put(actions.alerts.displayError('Failed to delete address label.'))
yield put(actions.alerts.displayError(C.ADDRESS_DELETE_ERROR))
}
}

Expand Down
Expand Up @@ -17,7 +17,7 @@ const UnusedAddressesTemplate = ({ account, currentReceiveIndex, unusedAddresses
<TableCell width='40%'>
<Text size='13px'>{entry.label}</Text>
</TableCell>
<TableCell style={{ display: 'flex', justifyContent: 'flex-end' }} width='20%'>
<TableCell width='20%' style={{ display: 'flex', justifyContent: 'flex-end' }}>
<Icon cursor name='pencil' onClick={() => onEditLabel(entry.derivationIndex)} style={{ marginRight: 10 }} />
<Icon cursor name='trash' onClick={() => onDeleteLabel(entry.derivationIndex)} />
</TableCell>
Expand All @@ -26,7 +26,9 @@ const UnusedAddressesTemplate = ({ account, currentReceiveIndex, unusedAddresses
})

return unusedAddresses.length === 0
? <Text weight={300} style={{ marginTop: 20, textAlign: 'center' }}><FormattedMessage id='scenes.settings.addresses.btc.manageaddresses.usedaddresses.usedaddressestable.nousedmessage' defaultMessage='This wallet has no unused addresses.'/></Text>
? (<Text weight={300} style={{ marginTop: 20, textAlign: 'center' }}>
<FormattedMessage id='scenes.settings.addresses.btc.manageaddresses.usedaddresses.usedaddressestable.nousedmessage' defaultMessage='This wallet has no unused addresses.'/>
</Text>)
: (<Table>
<TableHeader>
<TableCell width='40%'>
Expand Down
Expand Up @@ -36,35 +36,37 @@ const UsedTableEntry = ({ address, search }) => {

return !isMatch()
? null
: (
<TableRow>
<TableCell width='40%'>
<Link href={`https://blockchain.info/address/${address.address}`} size='small' weight={300} target='_blank'>
{address.address}
</Link>
</TableCell>
<TableCell width='40%'>
<Text size='13px'>
{address.label}
</Text>
</TableCell>
<TableCell style={{display: 'flex', justifyContent: 'flex-end'}} width='20%'>
<Text size='13px'>
<CoinDisplay coin={'BTC'} size='13px' weight={300}>{address.final_balance}</CoinDisplay>
</Text>
</TableCell>
</TableRow>
)
: (<TableRow>
<TableCell width='40%'>
<Link href={`https://blockchain.info/address/${address.address}`} size='small' weight={300} target='_blank'>
{address.address}
</Link>
</TableCell>
<TableCell width='40%'>
<Text size='13px'>
{address.label}
</Text>
</TableCell>
<TableCell width='20%' style={{display: 'flex', justifyContent: 'flex-end'}}>
<Text size='13px'>
<CoinDisplay coin={'BTC'} size='13px' weight={300}>{address.final_balance}</CoinDisplay>
</Text>
</TableCell>
</TableRow>)
}

const UsedAddressesTable = ({ usedAddresses, search }) => (
const UsedAddressesTable = ({ usedAddresses, search, onEditLabel }) => (
<React.Fragment>
<Text weight={200} size='small' style={{ marginTop: 10, marginBottom: 15 }}>
<FormattedMessage id='scenes.settings.addresses.btc.manageaddresses.usedaddresses.usedaddressestable.message' defaultMessage='Previously used addresses are helpful for debugging purposes and viewing associated balances. For privacy reasons, we do not recommend re-using these addresses. Change addresses are not included here.'/>
</Text>
{ usedAddresses.length
? <UsedTable>{usedAddresses.map((address, i) => (<UsedTableEntry key={i} address={address} search={search} />))}</UsedTable>
: <Text weight={300} style={{ marginTop: 20, textAlign: 'center' }}><FormattedMessage id='scenes.settings.addresses.btc.manageaddresses.usedaddresses.usedaddressestable.nousedmessage' defaultMessage='This wallet has no previously used addresses.'/></Text>
? (<UsedTable>{usedAddresses.map((address, i) => (
<UsedTableEntry key={i} address={address} search={search} />))}
</UsedTable>)
: (<Text weight={300} style={{ marginTop: 20, textAlign: 'center' }}>
<FormattedMessage id='scenes.settings.addresses.btc.manageaddresses.usedaddresses.usedaddressestable.nousedmessage' defaultMessage='This wallet has no previously used addresses.'/>
</Text>)
}
</React.Fragment>
)
Expand Down

0 comments on commit d0f470b

Please sign in to comment.