Commit 67df4959 authored by Moody Salem's avatar Moody Salem

Fix balance forever loading issue, ensure that all balances in the store are...

Fix balance forever loading issue, ensure that all balances in the store are keyed by checksummed addresses
parent 095beae0
...@@ -227,16 +227,16 @@ function SearchModal({ ...@@ -227,16 +227,16 @@ function SearchModal({
const tokenList = useMemo(() => { const tokenList = useMemo(() => {
return Object.keys(allTokens) return Object.keys(allTokens)
.sort((a, b): number => { .sort((tokenAddressA, tokenAddressB): number => {
if (a && allTokens[a]?.equals(WETH[chainId])) return -1 if (tokenAddressA && allTokens[tokenAddressA]?.equals(WETH[chainId])) return -1
if (b && allTokens[b]?.equals(WETH[chainId])) return 1 if (tokenAddressB && allTokens[tokenAddressB]?.equals(WETH[chainId])) return 1
if (allTokens[a].symbol && allTokens[b].symbol) { if (allTokens[tokenAddressA].symbol && allTokens[tokenAddressB].symbol) {
const aSymbol = allTokens[a].symbol.toLowerCase() const aSymbol = allTokens[tokenAddressA].symbol.toLowerCase()
const bSymbol = allTokens[b].symbol.toLowerCase() const bSymbol = allTokens[tokenAddressB].symbol.toLowerCase()
// sort by balance // sort by balance
const balanceA = allBalances?.[account]?.[a] const balanceA = allBalances?.[account]?.[tokenAddressA]
const balanceB = allBalances?.[account]?.[b] const balanceB = allBalances?.[account]?.[tokenAddressB]
if (balanceA?.greaterThan('0') && !balanceB?.greaterThan('0')) { if (balanceA?.greaterThan('0') && !balanceB?.greaterThan('0')) {
return sortDirection ? -1 : 1 return sortDirection ? -1 : 1
...@@ -249,12 +249,13 @@ function SearchModal({ ...@@ -249,12 +249,13 @@ function SearchModal({
return 0 return 0
} }
}) })
.map(k => { .filter(tokenAddress => isAddress(tokenAddress))
.map(tokenAddress => {
return { return {
name: allTokens[k].name, name: allTokens[tokenAddress].name,
symbol: allTokens[k].symbol, symbol: allTokens[tokenAddress].symbol,
address: k, address: isAddress(tokenAddress) as string, // always a string after filtering
balance: allBalances?.[account]?.[k] balance: allBalances?.[account]?.[tokenAddress]
} }
}) })
}, [allTokens, allBalances, account, sortDirection, chainId]) }, [allTokens, allBalances, account, sortDirection, chainId])
...@@ -459,6 +460,7 @@ function SearchModal({ ...@@ -459,6 +460,7 @@ function SearchModal({
const customAdded = userAddedTokens?.some(token => token.address === address) && !urlAdded const customAdded = userAddedTokens?.some(token => token.address === address) && !urlAdded
const zeroBalance = balance && JSBI.equal(JSBI.BigInt(0), balance.raw) const zeroBalance = balance && JSBI.equal(JSBI.BigInt(0), balance.raw)
console.log(balance, address)
// if token import page dont show preset list, else show all // if token import page dont show preset list, else show all
return ( return (
......
...@@ -9,6 +9,7 @@ import { ...@@ -9,6 +9,7 @@ import {
updateTokenBalances updateTokenBalances
} from './actions' } from './actions'
// all address keys are checksummed and valid addresses starting with 0x
interface WalletState { interface WalletState {
readonly tokenBalanceListeners: { readonly tokenBalanceListeners: {
readonly [address: string]: { readonly [address: string]: {
...@@ -52,57 +53,65 @@ export default createReducer(initialState, builder => ...@@ -52,57 +53,65 @@ export default createReducer(initialState, builder =>
builder builder
.addCase(startListeningForTokenBalances, (state, { payload: combos }) => { .addCase(startListeningForTokenBalances, (state, { payload: combos }) => {
combos.forEach(combo => { combos.forEach(combo => {
if (!isAddress(combo.tokenAddress) || !isAddress(combo.address)) { const [checksummedTokenAddress, checksummedAddress] = [isAddress(combo.tokenAddress), isAddress(combo.address)]
if (!checksummedAddress || !checksummedTokenAddress) {
console.error('invalid combo', combo) console.error('invalid combo', combo)
return return
} }
state.tokenBalanceListeners[combo.address] = state.tokenBalanceListeners[combo.address] ?? {} state.tokenBalanceListeners[checksummedAddress] = state.tokenBalanceListeners[checksummedAddress] ?? {}
state.tokenBalanceListeners[combo.address][combo.tokenAddress] = state.tokenBalanceListeners[checksummedAddress][checksummedTokenAddress] =
(state.tokenBalanceListeners[combo.address][combo.tokenAddress] ?? 0) + 1 (state.tokenBalanceListeners[checksummedAddress][checksummedTokenAddress] ?? 0) + 1
}) })
}) })
.addCase(stopListeningForTokenBalances, (state, { payload: combos }) => { .addCase(stopListeningForTokenBalances, (state, { payload: combos }) => {
combos.forEach(combo => { combos.forEach(combo => {
if (!isAddress(combo.tokenAddress) || !isAddress(combo.address)) { const [checksummedTokenAddress, checksummedAddress] = [isAddress(combo.tokenAddress), isAddress(combo.address)]
if (!checksummedAddress || !checksummedTokenAddress) {
console.error('invalid combo', combo) console.error('invalid combo', combo)
return return
} }
if (!state.tokenBalanceListeners[combo.address]) return if (!state.tokenBalanceListeners[checksummedAddress]) return
if (!state.tokenBalanceListeners[combo.address][combo.tokenAddress]) return if (!state.tokenBalanceListeners[checksummedAddress][checksummedTokenAddress]) return
if (state.tokenBalanceListeners[combo.address][combo.tokenAddress] === 1) { if (state.tokenBalanceListeners[checksummedAddress][checksummedTokenAddress] === 1) {
delete state.tokenBalanceListeners[combo.address][combo.tokenAddress] delete state.tokenBalanceListeners[checksummedAddress][checksummedTokenAddress]
} else { } else {
state.tokenBalanceListeners[combo.address][combo.tokenAddress]-- state.tokenBalanceListeners[checksummedAddress][checksummedTokenAddress]--
} }
}) })
}) })
.addCase(startListeningForBalance, (state, { payload: { addresses } }) => { .addCase(startListeningForBalance, (state, { payload: { addresses } }) => {
addresses.forEach(address => { addresses.forEach(address => {
if (!isAddress(address)) { const checksummedAddress = isAddress(address)
if (!checksummedAddress) {
console.error('invalid address', address) console.error('invalid address', address)
return return
} }
state.balanceListeners[address] = (state.balanceListeners[address] ?? 0) + 1 state.balanceListeners[checksummedAddress] = (state.balanceListeners[checksummedAddress] ?? 0) + 1
}) })
}) })
.addCase(stopListeningForBalance, (state, { payload: { addresses } }) => { .addCase(stopListeningForBalance, (state, { payload: { addresses } }) => {
addresses.forEach(address => { addresses.forEach(address => {
if (!isAddress(address)) { const checksummedAddress = isAddress(address)
if (!checksummedAddress) {
console.error('invalid address', address) console.error('invalid address', address)
return return
} }
if (!state.balanceListeners[address]) return if (!state.balanceListeners[checksummedAddress]) return
if (state.balanceListeners[address] === 1) { if (state.balanceListeners[checksummedAddress] === 1) {
delete state.balanceListeners[address] delete state.balanceListeners[checksummedAddress]
} else { } else {
state.balanceListeners[address]-- state.balanceListeners[checksummedAddress]--
} }
}) })
}) })
.addCase(updateTokenBalances, (state, { payload: { chainId, address, blockNumber, tokenBalances } }) => { .addCase(updateTokenBalances, (state, { payload: { chainId, address, blockNumber, tokenBalances } }) => {
const checksummedAddress = isAddress(address)
if (!checksummedAddress) return
Object.keys(tokenBalances).forEach(tokenAddress => { Object.keys(tokenBalances).forEach(tokenAddress => {
const balance = tokenBalances[tokenAddress] const checksummedTokenAddress = isAddress(tokenAddress)
const key = balanceKey({ chainId, address, tokenAddress }) if (!checksummedTokenAddress) return
const balance = tokenBalances[checksummedTokenAddress]
const key = balanceKey({ chainId, address: checksummedAddress, tokenAddress: checksummedTokenAddress })
const data = state.balances[key] const data = state.balances[key]
if (!data || data.blockNumber === undefined || data.blockNumber <= blockNumber) { if (!data || data.blockNumber === undefined || data.blockNumber <= blockNumber) {
state.balances[key] = { value: balance, blockNumber } state.balances[key] = { value: balance, blockNumber }
...@@ -111,8 +120,11 @@ export default createReducer(initialState, builder => ...@@ -111,8 +120,11 @@ export default createReducer(initialState, builder =>
}) })
.addCase(updateEtherBalances, (state, { payload: { etherBalances, chainId, blockNumber } }) => { .addCase(updateEtherBalances, (state, { payload: { etherBalances, chainId, blockNumber } }) => {
Object.keys(etherBalances).forEach(address => { Object.keys(etherBalances).forEach(address => {
const balance = etherBalances[address] const checksummedAddress = isAddress(address)
const key = balanceKey({ chainId, address }) if (!checksummedAddress) return
const balance = etherBalances[checksummedAddress]
const key = balanceKey({ chainId, address: checksummedAddress })
const data = state.balances[key] const data = state.balances[key]
if (!data || data.blockNumber === undefined || data.blockNumber <= blockNumber) { if (!data || data.blockNumber === undefined || data.blockNumber <= blockNumber) {
state.balances[key] = { value: balance, blockNumber } state.balances[key] = { value: balance, blockNumber }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment