Merge pull request #5121 from MetaMask/i5099-approve
Prevent token symbol from showing as null in the confirm screenfeature/default_network_editable
commit
0259eb0214
@ -1,55 +1,113 @@ |
||||
const log = require('loglevel') |
||||
const util = require('./util') |
||||
const BigNumber = require('bignumber.js') |
||||
import contractMap from 'eth-contract-metadata' |
||||
|
||||
function tokenInfoGetter () { |
||||
const tokens = {} |
||||
const casedContractMap = Object.keys(contractMap).reduce((acc, base) => { |
||||
return { |
||||
...acc, |
||||
[base.toLowerCase()]: contractMap[base], |
||||
} |
||||
}, {}) |
||||
|
||||
return async (address) => { |
||||
if (tokens[address]) { |
||||
return tokens[address] |
||||
const DEFAULT_SYMBOL = '' |
||||
const DEFAULT_DECIMALS = '0' |
||||
|
||||
async function getSymbolFromContract (tokenAddress) { |
||||
const token = util.getContractAtAddress(tokenAddress) |
||||
|
||||
try { |
||||
const result = await token.symbol() |
||||
return result[0] |
||||
} catch (error) { |
||||
log.warn(`symbol() call for token at address ${tokenAddress} resulted in error:`, error) |
||||
} |
||||
} |
||||
|
||||
tokens[address] = await getSymbolAndDecimals(address) |
||||
async function getDecimalsFromContract (tokenAddress) { |
||||
const token = util.getContractAtAddress(tokenAddress) |
||||
|
||||
return tokens[address] |
||||
try { |
||||
const result = await token.decimals() |
||||
const decimalsBN = result[0] |
||||
return decimalsBN && decimalsBN.toString() |
||||
} catch (error) { |
||||
log.warn(`decimals() call for token at address ${tokenAddress} resulted in error:`, error) |
||||
} |
||||
} |
||||
|
||||
function getContractMetadata (tokenAddress) { |
||||
return tokenAddress && casedContractMap[tokenAddress.toLowerCase()] |
||||
} |
||||
|
||||
async function getSymbol (tokenAddress) { |
||||
let symbol = await getSymbolFromContract(tokenAddress) |
||||
|
||||
if (!symbol) { |
||||
const contractMetadataInfo = getContractMetadata(tokenAddress) |
||||
|
||||
if (contractMetadataInfo) { |
||||
symbol = contractMetadataInfo.symbol |
||||
} |
||||
} |
||||
|
||||
return symbol |
||||
} |
||||
|
||||
async function getDecimals (tokenAddress) { |
||||
let decimals = await getDecimalsFromContract(tokenAddress) |
||||
|
||||
if (!decimals || decimals === '0') { |
||||
const contractMetadataInfo = getContractMetadata(tokenAddress) |
||||
|
||||
if (contractMetadataInfo) { |
||||
decimals = contractMetadataInfo.decimals |
||||
} |
||||
} |
||||
|
||||
async function getSymbolAndDecimals (tokenAddress, existingTokens = []) { |
||||
return decimals |
||||
} |
||||
|
||||
export async function getSymbolAndDecimals (tokenAddress, existingTokens = []) { |
||||
const existingToken = existingTokens.find(({ address }) => tokenAddress === address) |
||||
|
||||
if (existingToken) { |
||||
return existingToken |
||||
return { |
||||
symbol: existingToken.symbol, |
||||
decimals: existingToken.decimals, |
||||
} |
||||
} |
||||
|
||||
let result = [] |
||||
try { |
||||
const token = util.getContractAtAddress(tokenAddress) |
||||
let symbol, decimals |
||||
|
||||
result = await Promise.all([ |
||||
token.symbol(), |
||||
token.decimals(), |
||||
]) |
||||
} catch (err) { |
||||
log.warn(`symbol() and decimal() calls for token at address ${tokenAddress} resulted in error:`, err) |
||||
try { |
||||
symbol = await getSymbol(tokenAddress) |
||||
decimals = await getDecimals(tokenAddress) |
||||
} catch (error) { |
||||
log.warn(`symbol() and decimal() calls for token at address ${tokenAddress} resulted in error:`, error) |
||||
} |
||||
|
||||
const [ symbol = [], decimals = [] ] = result |
||||
|
||||
return { |
||||
symbol: symbol[0] || null, |
||||
decimals: decimals[0] && decimals[0].toString() || null, |
||||
symbol: symbol || DEFAULT_SYMBOL, |
||||
decimals: decimals || DEFAULT_DECIMALS, |
||||
} |
||||
} |
||||
|
||||
function calcTokenAmount (value, decimals) { |
||||
const multiplier = Math.pow(10, Number(decimals || 0)) |
||||
return new BigNumber(String(value)).div(multiplier).toNumber() |
||||
export function tokenInfoGetter () { |
||||
const tokens = {} |
||||
|
||||
return async (address) => { |
||||
if (tokens[address]) { |
||||
return tokens[address] |
||||
} |
||||
|
||||
tokens[address] = await getSymbolAndDecimals(address) |
||||
|
||||
module.exports = { |
||||
tokenInfoGetter, |
||||
calcTokenAmount, |
||||
getSymbolAndDecimals, |
||||
return tokens[address] |
||||
} |
||||
} |
||||
|
||||
export function calcTokenAmount (value, decimals) { |
||||
const multiplier = Math.pow(10, Number(decimals || 0)) |
||||
return new BigNumber(String(value)).div(multiplier).toNumber() |
||||
} |
||||
|
Loading…
Reference in new issue