From 31175625b446cb5d18b17db23018bca8b14d280c Mon Sep 17 00:00:00 2001
From: Chi Kei Chan <chikeichan@gmail.com>
Date: Thu, 21 Mar 2019 16:03:30 -0700
Subject: Folder restructure (#6304)

* Remove ui/app/keychains/

* Remove ui/app/img/ (unused images)

* Move conversion-util to helpers/utils/

* Move token-util to helpers/utils/

* Move /helpers/*.js inside /helpers/utils/

* Move util tests inside /helpers/utils/

* Renameand move confirm-transaction/util.js to helpers/utils/

* Move higher-order-components to helpers/higher-order-components/

* Move infura-conversion.json to helpers/constants/

* Move all utility functions to helpers/utils/

* Move pages directory to top-level

* Move all constants to helpers/constants/

* Move metametrics inside helpers/

* Move app and root inside pages/

* Move routes inside helpers/

* Re-organize ducks/

* Move reducers to ducks/

* Move selectors inside selectors/

* Move test out of test folder

* Move action, reducer, store inside store/

* Move ui components inside ui/

* Move UI components inside ui/

* Move connected components inside components/app/

* Move i18n-helper inside helpers/

* Fix unit tests

* Fix unit test

* Move pages components

* Rename routes component

* Move reducers to ducks/index

* Fix bad path in unit test
---
 ui/app/helpers/utils/token-util.js | 118 +++++++++++++++++++++++++++++++++++++
 1 file changed, 118 insertions(+)
 create mode 100644 ui/app/helpers/utils/token-util.js

(limited to 'ui/app/helpers/utils/token-util.js')

diff --git a/ui/app/helpers/utils/token-util.js b/ui/app/helpers/utils/token-util.js
new file mode 100644
index 000000000..35a19a69f
--- /dev/null
+++ b/ui/app/helpers/utils/token-util.js
@@ -0,0 +1,118 @@
+const log = require('loglevel')
+const util = require('./util')
+const BigNumber = require('bignumber.js')
+import contractMap from 'eth-contract-metadata'
+
+const casedContractMap = Object.keys(contractMap).reduce((acc, base) => {
+  return {
+    ...acc,
+    [base.toLowerCase()]: contractMap[base],
+  }
+}, {})
+
+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)
+  }
+}
+
+async function getDecimalsFromContract (tokenAddress) {
+  const token = util.getContractAtAddress(tokenAddress)
+
+  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
+    }
+  }
+
+  return decimals
+}
+
+export async function getSymbolAndDecimals (tokenAddress, existingTokens = []) {
+  const existingToken = existingTokens.find(({ address }) => tokenAddress === address)
+
+  if (existingToken) {
+    return {
+      symbol: existingToken.symbol,
+      decimals: existingToken.decimals,
+    }
+  }
+
+  let symbol, decimals
+
+  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)
+  }
+
+  return {
+    symbol: symbol || DEFAULT_SYMBOL,
+    decimals: decimals || DEFAULT_DECIMALS,
+  }
+}
+
+export function tokenInfoGetter () {
+  const tokens = {}
+
+  return async (address) => {
+    if (tokens[address]) {
+      return tokens[address]
+    }
+
+    tokens[address] = await getSymbolAndDecimals(address)
+
+    return tokens[address]
+  }
+}
+
+export function calcTokenAmount (value, decimals) {
+  const multiplier = Math.pow(10, Number(decimals || 0))
+  return new BigNumber(String(value)).div(multiplier)
+}
+
+export function getTokenValue (tokenParams = []) {
+  const valueData = tokenParams.find(param => param.name === '_value')
+  return valueData && valueData.value
+}
-- 
cgit