Commit cb00e0ba authored by Noah Zinsmeister's avatar Noah Zinsmeister Committed by GitHub

migrate full away from ethers v4 to v5 (#728)

move some pacakges from dependencies to dev dependencies

bump versions
parent 4ccbd0c3
...@@ -5,28 +5,29 @@ ...@@ -5,28 +5,29 @@
"homepage": "https://uniswap.exchange", "homepage": "https://uniswap.exchange",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@ethersproject/address": "^5.0.0-beta.134",
"@ethersproject/bignumber": "^5.0.0-beta.138",
"@ethersproject/constants": "^5.0.0-beta.133",
"@ethersproject/contracts": "^5.0.0-beta.151",
"@ethersproject/providers": "5.0.0-beta.162",
"@ethersproject/strings": "^5.0.0-beta.136",
"@ethersproject/units": "^5.0.0-beta.132", "@ethersproject/units": "^5.0.0-beta.132",
"@material-ui/core": "^4.9.5", "@material-ui/core": "^4.9.5",
"@reach/dialog": "^0.2.8", "@reach/dialog": "^0.2.8",
"@reach/tooltip": "^0.2.0", "@reach/tooltip": "^0.2.0",
"@types/jest": "^25.1.3",
"@types/node": "^13.7.4",
"@types/react": "^16.9.21",
"@types/react-dom": "^16.9.5",
"@uniswap/sdk": "^2.0.3", "@uniswap/sdk": "^2.0.3",
"@uniswap/v2-core": "1.0.0", "@uniswap/v2-core": "1.0.0",
"@uniswap/v2-periphery": "1.0.0-beta.0", "@uniswap/v2-periphery": "1.0.0-beta.0",
"@web3-react/core": "^6.0.2", "@web3-react/core": "^6.0.9",
"@web3-react/fortmatic-connector": "^6.0.2", "@web3-react/fortmatic-connector": "^6.0.9",
"@web3-react/injected-connector": "^6.0.3", "@web3-react/injected-connector": "^6.0.7",
"@web3-react/network-connector": "^6.0.4", "@web3-react/network-connector": "^6.0.9",
"@web3-react/portis-connector": "^6.0.2", "@web3-react/portis-connector": "^6.0.9",
"@web3-react/walletconnect-connector": "^6.0.2", "@web3-react/walletconnect-connector": "^6.0.9",
"@web3-react/walletlink-connector": "^6.0.2", "@web3-react/walletlink-connector": "^6.0.9",
"copy-to-clipboard": "^3.2.0", "copy-to-clipboard": "^3.2.0",
"cross-env": "^7.0.2", "cross-env": "^7.0.2",
"escape-string-regexp": "^2.0.0", "escape-string-regexp": "^2.0.0",
"ethers": "^4.0.44",
"history": "^4.9.0", "history": "^4.9.0",
"i18next": "^15.0.9", "i18next": "^15.0.9",
"i18next-browser-languagedetector": "^3.0.1", "i18next-browser-languagedetector": "^3.0.1",
...@@ -35,22 +36,28 @@ ...@@ -35,22 +36,28 @@
"polished": "^3.3.2", "polished": "^3.3.2",
"prettier": "^1.17.0", "prettier": "^1.17.0",
"qrcode.react": "^0.9.3", "qrcode.react": "^0.9.3",
"react": "^16.8.6", "react": "^16.13.1",
"react-device-detect": "^1.6.2", "react-device-detect": "^1.6.2",
"react-dom": "^16.8.6", "react-dom": "^16.13.1",
"react-feather": "^2.0.8", "react-feather": "^2.0.8",
"react-ga": "^2.5.7", "react-ga": "^2.5.7",
"react-i18next": "^10.7.0", "react-i18next": "^10.7.0",
"react-router-dom": "^5.0.0", "react-router-dom": "^5.0.0",
"react-scripts": "^3.0.1", "react-scripts": "^3.4.1",
"react-spring": "^8.0.27", "react-spring": "^8.0.27",
"react-switch": "^5.0.1",
"react-use-gesture": "^6.0.14", "react-use-gesture": "^6.0.14",
"rebass": "^4.0.7", "rebass": "^4.0.7",
"styled-components": "^4.2.0", "styled-components": "^4.2.0",
"typescript": "^3.7.5",
"use-media": "^1.4.0" "use-media": "^1.4.0"
}, },
"devDependencies": {
"@types/jest": "^25.2.1",
"@types/node": "^13.13.5",
"@types/react": "^16.9.34",
"@types/react-dom": "^16.9.7",
"prettier": "^1.17.0",
"typescript": "^3.8.3"
},
"scripts": { "scripts": {
"start": "cross-env REACT_APP_GIT_COMMIT_HASH=$(git show -s --format=%H) react-scripts start", "start": "cross-env REACT_APP_GIT_COMMIT_HASH=$(git show -s --format=%H) react-scripts start",
"build": "cross-env REACT_APP_GIT_COMMIT_HASH=$(git show -s --format=%H) react-scripts build", "build": "cross-env REACT_APP_GIT_COMMIT_HASH=$(git show -s --format=%H) react-scripts build",
......
This diff is collapsed.
...@@ -2,8 +2,7 @@ import React from 'react' ...@@ -2,8 +2,7 @@ import React from 'react'
import ReactDOM from 'react-dom' import ReactDOM from 'react-dom'
import ReactGA from 'react-ga' import ReactGA from 'react-ga'
import { Web3ReactProvider, createWeb3ReactRoot } from '@web3-react/core' import { Web3ReactProvider, createWeb3ReactRoot } from '@web3-react/core'
import { ethers } from 'ethers' import { Web3Provider } from '@ethersproject/providers'
import { Web3Provider } from 'ethers/providers'
import { NetworkContextName } from './constants' import { NetworkContextName } from './constants'
import { isMobile } from 'react-device-detect' import { isMobile } from 'react-device-detect'
...@@ -21,7 +20,7 @@ import './i18n' ...@@ -21,7 +20,7 @@ import './i18n'
const Web3ProviderNetwork = createWeb3ReactRoot(NetworkContextName) const Web3ProviderNetwork = createWeb3ReactRoot(NetworkContextName)
function getLibrary(provider): Web3Provider { function getLibrary(provider): Web3Provider {
const library = new ethers.providers.Web3Provider(provider) const library = new Web3Provider(provider)
library.pollingInterval = 10000 library.pollingInterval = 10000
return library return library
} }
...@@ -58,9 +57,9 @@ function ContextProviders({ children }) { ...@@ -58,9 +57,9 @@ function ContextProviders({ children }) {
function Updaters() { function Updaters() {
return ( return (
<> <>
<ApplicationContextUpdater/> <ApplicationContextUpdater />
<TransactionContextUpdater/> <TransactionContextUpdater />
<BalancesContextUpdater/> <BalancesContextUpdater />
</> </>
) )
} }
...@@ -69,11 +68,11 @@ ReactDOM.render( ...@@ -69,11 +68,11 @@ ReactDOM.render(
<Web3ReactProvider getLibrary={getLibrary}> <Web3ReactProvider getLibrary={getLibrary}>
<Web3ProviderNetwork getLibrary={getLibrary}> <Web3ProviderNetwork getLibrary={getLibrary}>
<ContextProviders> <ContextProviders>
<Updaters/> <Updaters />
<ThemeProvider> <ThemeProvider>
<> <>
<GlobalStyle/> <GlobalStyle />
<App/> <App />
</> </>
</ThemeProvider> </ThemeProvider>
</ContextProviders> </ContextProviders>
......
import React, { useReducer, useState, useCallback, useEffect } from 'react' import React, { useReducer, useState, useCallback, useEffect } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
import { ethers } from 'ethers'
import { withRouter } from 'react-router-dom' import { withRouter } from 'react-router-dom'
import { parseUnits, parseEther } from '@ethersproject/units' import { parseUnits, parseEther } from '@ethersproject/units'
import { MaxUint256, Zero } from '@ethersproject/constants'
import { Contract } from '@ethersproject/contracts'
import { WETH, TokenAmount, JSBI, Percent, Route, Token, Pair, Price } from '@uniswap/sdk' import { WETH, TokenAmount, JSBI, Percent, Route, Token, Pair, Price } from '@uniswap/sdk'
import TokenLogo from '../../components/TokenLogo' import TokenLogo from '../../components/TokenLogo'
...@@ -26,9 +27,9 @@ import { usePair, useTotalSupply } from '../../contexts/Pairs' ...@@ -26,9 +27,9 @@ import { usePair, useTotalSupply } from '../../contexts/Pairs'
import { useWeb3React, useTokenContract } from '../../hooks' import { useWeb3React, useTokenContract } from '../../hooks'
import { useTransactionAdder, usePendingApproval } from '../../contexts/Transactions' import { useTransactionAdder, usePendingApproval } from '../../contexts/Transactions'
import { BigNumber } from 'ethers/utils'
import { ROUTER_ADDRESS } from '../../constants' import { ROUTER_ADDRESS } from '../../constants'
import { getRouterContract, calculateGasMargin, isWETH } from '../../utils' import { getRouterContract, calculateGasMargin, isWETH } from '../../utils'
import { BigNumber } from '@ethersproject/bignumber'
// denominated in bips // denominated in bips
const ALLOWED_SLIPPAGE = 50 const ALLOWED_SLIPPAGE = 50
...@@ -36,8 +37,6 @@ const ALLOWED_SLIPPAGE = 50 ...@@ -36,8 +37,6 @@ const ALLOWED_SLIPPAGE = 50
// denominated in seconds // denominated in seconds
const DEADLINE_FROM_NOW = 60 * 20 const DEADLINE_FROM_NOW = 60 * 20
const GAS_MARGIN: BigNumber = ethers.utils.bigNumberify(1000)
const Wrapper = styled.div` const Wrapper = styled.div`
position: relative; position: relative;
` `
...@@ -179,8 +178,8 @@ function AddLiquidity({ token0, token1, step = false }) { ...@@ -179,8 +178,8 @@ function AddLiquidity({ token0, token1, step = false }) {
} }
// token contracts for approvals and direct sends // token contracts for approvals and direct sends
const tokenContractInput: ethers.Contract = useTokenContract(tokens[Field.INPUT]?.address) const tokenContractInput: Contract = useTokenContract(tokens[Field.INPUT]?.address)
const tokenContractOutput: ethers.Contract = useTokenContract(tokens[Field.OUTPUT]?.address) const tokenContractOutput: Contract = useTokenContract(tokens[Field.OUTPUT]?.address)
// check on pending approvals for token amounts // check on pending approvals for token amounts
const pendingApprovalInput = usePendingApproval(tokens[Field.INPUT]?.address) const pendingApprovalInput = usePendingApproval(tokens[Field.INPUT]?.address)
...@@ -409,7 +408,7 @@ function AddLiquidity({ token0, token1, step = false }) { ...@@ -409,7 +408,7 @@ function AddLiquidity({ token0, token1, step = false }) {
// format ETH value for transaction // format ETH value for transaction
function hex(value: JSBI) { function hex(value: JSBI) {
return ethers.utils.bigNumberify(value.toString()) return BigNumber.from(value.toString())
} }
// calculate slippage bounds based on current reserves // calculate slippage bounds based on current reserves
...@@ -435,7 +434,7 @@ function AddLiquidity({ token0, token1, step = false }) { ...@@ -435,7 +434,7 @@ function AddLiquidity({ token0, token1, step = false }) {
if (tokens[Field.INPUT] === WETH[chainId] || tokens[Field.OUTPUT] === WETH[chainId]) { if (tokens[Field.INPUT] === WETH[chainId] || tokens[Field.OUTPUT] === WETH[chainId]) {
method = router.addLiquidityETH method = router.addLiquidityETH
estimate = router.estimate.addLiquidityETH estimate = router.estimateGas.addLiquidityETH
args = [ args = [
tokens[Field.OUTPUT] === WETH[chainId] ? tokens[Field.INPUT].address : tokens[Field.OUTPUT].address, // token tokens[Field.OUTPUT] === WETH[chainId] ? tokens[Field.INPUT].address : tokens[Field.OUTPUT].address, // token
...@@ -454,7 +453,7 @@ function AddLiquidity({ token0, token1, step = false }) { ...@@ -454,7 +453,7 @@ function AddLiquidity({ token0, token1, step = false }) {
) )
} else { } else {
method = router.addLiquidity method = router.addLiquidity
estimate = router.estimate.addLiquidity estimate = router.estimateGas.addLiquidity
args = [ args = [
tokens[Field.INPUT].address, tokens[Field.INPUT].address,
tokens[Field.OUTPUT].address, tokens[Field.OUTPUT].address,
...@@ -465,18 +464,17 @@ function AddLiquidity({ token0, token1, step = false }) { ...@@ -465,18 +464,17 @@ function AddLiquidity({ token0, token1, step = false }) {
account, account,
deadline deadline
] ]
value = ethers.constants.Zero value = Zero
} }
const estimatedGasLimit = await estimate(...args, { await estimate(...args, {
value: value value: value
}) })
.then(estimatedGasLimit =>
method(...args, { method(...args, {
gasLimit: calculateGasMargin(estimatedGasLimit, GAS_MARGIN), gasLimit: calculateGasMargin(estimatedGasLimit),
value: value value: value
}) }).then(response => {
.then(response => {
setTxHash(response.hash) setTxHash(response.hash)
addTransaction( addTransaction(
response, response,
...@@ -491,6 +489,7 @@ function AddLiquidity({ token0, token1, step = false }) { ...@@ -491,6 +489,7 @@ function AddLiquidity({ token0, token1, step = false }) {
) )
setPendingConfirmation(false) setPendingConfirmation(false)
}) })
)
.catch((e: Error) => { .catch((e: Error) => {
console.log(e) console.log(e)
setPendingConfirmation(true) setPendingConfirmation(true)
...@@ -500,21 +499,18 @@ function AddLiquidity({ token0, token1, step = false }) { ...@@ -500,21 +499,18 @@ function AddLiquidity({ token0, token1, step = false }) {
} }
async function approveAmount(field) { async function approveAmount(field) {
let estimatedGas
let useUserBalance = false let useUserBalance = false
const tokenContract = field === Field.INPUT ? tokenContractInput : tokenContractOutput const tokenContract = field === Field.INPUT ? tokenContractInput : tokenContractOutput
estimatedGas = await tokenContract.estimate.approve(ROUTER_ADDRESS, ethers.constants.MaxUint256).catch(e => { const estimatedGas = await tokenContract.estimateGas.approve(ROUTER_ADDRESS, MaxUint256).catch(() => {
console.log('Error setting max token approval.')
})
if (!estimatedGas) {
// general fallback for tokens who restrict approval amounts // general fallback for tokens who restrict approval amounts
estimatedGas = await tokenContract.estimate.approve(ROUTER_ADDRESS, userBalances[field])
useUserBalance = true useUserBalance = true
} return tokenContract.estimateGas.approve(ROUTER_ADDRESS, userBalances[field])
})
tokenContract tokenContract
.approve(ROUTER_ADDRESS, useUserBalance ? userBalances[field] : ethers.constants.MaxUint256, { .approve(ROUTER_ADDRESS, useUserBalance ? userBalances[field] : MaxUint256, {
gasLimit: calculateGasMargin(estimatedGas, GAS_MARGIN) gasLimit: calculateGasMargin(estimatedGas)
}) })
.then(response => { .then(response => {
addTransaction(response, 'Approve ' + tokens[field]?.symbol, { approval: tokens[field]?.address }) addTransaction(response, 'Approve ' + tokens[field]?.symbol, { approval: tokens[field]?.address })
......
import React, { useReducer, useState, useCallback, useEffect } from 'react' import React, { useReducer, useState, useCallback, useEffect } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
import { ethers } from 'ethers'
import { parseUnits } from '@ethersproject/units' import { parseUnits } from '@ethersproject/units'
import { Zero } from '@ethersproject/constants'
import { Contract } from '@ethersproject/contracts'
import { TokenAmount, JSBI, Route, WETH, Percent, Token, Pair } from '@uniswap/sdk' import { TokenAmount, JSBI, Route, WETH, Percent, Token, Pair } from '@uniswap/sdk'
import Slider from '../../components/Slider' import Slider from '../../components/Slider'
...@@ -26,7 +27,6 @@ import { usePairContract } from '../../hooks' ...@@ -26,7 +27,6 @@ import { usePairContract } from '../../hooks'
import { useTransactionAdder } from '../../contexts/Transactions' import { useTransactionAdder } from '../../contexts/Transactions'
import { usePair, useTotalSupply } from '../../contexts/Pairs' import { usePair, useTotalSupply } from '../../contexts/Pairs'
import { BigNumber } from 'ethers/utils'
import { splitSignature } from '@ethersproject/bytes' import { splitSignature } from '@ethersproject/bytes'
import { ROUTER_ADDRESS } from '../../constants' import { ROUTER_ADDRESS } from '../../constants'
import { getRouterContract, calculateGasMargin } from '../../utils' import { getRouterContract, calculateGasMargin } from '../../utils'
...@@ -34,8 +34,6 @@ import { getRouterContract, calculateGasMargin } from '../../utils' ...@@ -34,8 +34,6 @@ import { getRouterContract, calculateGasMargin } from '../../utils'
// denominated in seconds // denominated in seconds
const DEADLINE_FROM_NOW = 60 * 20 const DEADLINE_FROM_NOW = 60 * 20
const GAS_MARGIN: BigNumber = ethers.utils.bigNumberify(1000)
const Wrapper = styled.div` const Wrapper = styled.div`
position: relative; position: relative;
` `
...@@ -167,7 +165,7 @@ export default function RemoveLiquidity({ token0, token1 }) { ...@@ -167,7 +165,7 @@ export default function RemoveLiquidity({ token0, token1 }) {
} }
const pair: Pair = usePair(inputToken, outputToken) const pair: Pair = usePair(inputToken, outputToken)
const pairContract: ethers.Contract = usePairContract(pair?.liquidityToken.address) const pairContract: Contract = usePairContract(pair?.liquidityToken.address)
// pool token data // pool token data
const totalPoolTokens: TokenAmount = useTotalSupply(tokens[Field.TOKEN0], tokens[Field.TOKEN1]) const totalPoolTokens: TokenAmount = useTotalSupply(tokens[Field.TOKEN0], tokens[Field.TOKEN1])
...@@ -435,7 +433,7 @@ export default function RemoveLiquidity({ token0, token1 }) { ...@@ -435,7 +433,7 @@ export default function RemoveLiquidity({ token0, token1 }) {
// removal with ETH // removal with ETH
if (tokens[Field.TOKEN0] === WETH[chainId] || tokens[Field.TOKEN1] === WETH[chainId]) { if (tokens[Field.TOKEN0] === WETH[chainId] || tokens[Field.TOKEN1] === WETH[chainId]) {
method = router.removeLiquidityETHWithPermit method = router.removeLiquidityETHWithPermit
estimate = router.estimate.removeLiquidityETHWithPermit estimate = router.estimateGas.removeLiquidityETHWithPermit
args = [ args = [
tokens[Field.TOKEN1] === WETH[chainId] ? tokens[Field.TOKEN0].address : tokens[Field.TOKEN1].address, tokens[Field.TOKEN1] === WETH[chainId] ? tokens[Field.TOKEN0].address : tokens[Field.TOKEN1].address,
parsedAmounts[Field.LIQUIDITY].raw.toString(), parsedAmounts[Field.LIQUIDITY].raw.toString(),
...@@ -456,7 +454,7 @@ export default function RemoveLiquidity({ token0, token1 }) { ...@@ -456,7 +454,7 @@ export default function RemoveLiquidity({ token0, token1 }) {
//removal without ETH //removal without ETH
else { else {
method = router.removeLiquidityWithPermit method = router.removeLiquidityWithPermit
estimate = router.estimate.removeLiquidityWithPermit estimate = router.estimateGas.removeLiquidityWithPermit
args = [ args = [
tokens[Field.TOKEN0].address, tokens[Field.TOKEN0].address,
tokens[Field.TOKEN1].address, tokens[Field.TOKEN1].address,
...@@ -472,17 +470,13 @@ export default function RemoveLiquidity({ token0, token1 }) { ...@@ -472,17 +470,13 @@ export default function RemoveLiquidity({ token0, token1 }) {
] ]
} }
const estimatedGasLimit = await estimate(...args, { await estimate(...args, {
value: ethers.constants.Zero value: Zero
}).catch(() => {
resetModalState()
setShowConfirm(false)
}) })
.then(estimatedGasLimit =>
method(...args, { method(...args, {
gasLimit: calculateGasMargin(estimatedGasLimit, GAS_MARGIN) gasLimit: calculateGasMargin(estimatedGasLimit)
}) }).then(response => {
.then(response => {
setPendingConfirmation(false) setPendingConfirmation(false)
setTxHash(response.hash) setTxHash(response.hash)
addTransaction( addTransaction(
...@@ -497,6 +491,7 @@ export default function RemoveLiquidity({ token0, token1 }) { ...@@ -497,6 +491,7 @@ export default function RemoveLiquidity({ token0, token1 }) {
tokens[Field.TOKEN1]?.symbol tokens[Field.TOKEN1]?.symbol
) )
}) })
)
.catch(e => { .catch(e => {
console.log(e) console.log(e)
resetModalState() resetModalState()
......
import { Contract } from '@ethersproject/contracts'
import { getAddress } from '@ethersproject/address'
import { AddressZero } from '@ethersproject/constants'
import { parseBytes32String } from '@ethersproject/strings'
import { BigNumber } from '@ethersproject/bignumber'
import { WETH } from '@uniswap/sdk' import { WETH } from '@uniswap/sdk'
import {abi as IUniswapV2PairABI} from '@uniswap/v2-core/build/IUniswapV2Pair.json' import { abi as IUniswapV2PairABI } from '@uniswap/v2-core/build/IUniswapV2Pair.json'
import { abi as IUniswapV2Router01ABI } from '@uniswap/v2-periphery/build/IUniswapV2Router01.json' import { abi as IUniswapV2Router01ABI } from '@uniswap/v2-periphery/build/IUniswapV2Router01.json'
import { Contract, ethers, Signer } from 'ethers'
import { JsonRpcProvider, Provider } from 'ethers/providers'
import { ROUTER_ADDRESS, SUPPORTED_THEMES } from '../constants' import { ROUTER_ADDRESS, SUPPORTED_THEMES } from '../constants'
import ERC20_ABI from '../constants/abis/erc20.json' import ERC20_ABI from '../constants/abis/erc20.json'
import ERC20_BYTES32_ABI from '../constants/abis/erc20_bytes32.json' import ERC20_BYTES32_ABI from '../constants/abis/erc20_bytes32.json'
import UncheckedJsonRpcSigner from './signer'
export enum ERROR_CODES { export enum ERROR_CODES {
TOKEN_SYMBOL = 1, TOKEN_SYMBOL = 1,
TOKEN_DECIMALS = 2 TOKEN_DECIMALS = 2
...@@ -80,7 +81,7 @@ export function getAllQueryParams(): QueryParams { ...@@ -80,7 +81,7 @@ export function getAllQueryParams(): QueryParams {
inputTokenAddress: parseUrlAddress('inputTokenAddress'), inputTokenAddress: parseUrlAddress('inputTokenAddress'),
outputTokenAddress: parseUrlAddress('outputTokenAddress'), outputTokenAddress: parseUrlAddress('outputTokenAddress'),
inputTokenAmount: parseUrlTokenAmount('inputTokenAmount'), inputTokenAmount: parseUrlTokenAmount('inputTokenAmount'),
outputTokenAmount: parseUrlTokenAmount('outputTokenAmount'), outputTokenAmount: parseUrlTokenAmount('outputTokenAmount')
} }
} }
...@@ -125,34 +126,30 @@ export function shortenTransactionHash(hash, digits = 4) { ...@@ -125,34 +126,30 @@ export function shortenTransactionHash(hash, digits = 4) {
return `${hash.substring(0, digits + 2)}...${hash.substring(66 - digits)}` return `${hash.substring(0, digits + 2)}...${hash.substring(66 - digits)}`
} }
export function isAddress(value): string | false { export function isAddress(value: any): string | false {
try { try {
return ethers.utils.getAddress(value.toLowerCase()) return getAddress(value.toLowerCase())
} catch { } catch {
return false return false
} }
} }
export function calculateGasMargin(value, margin) { export function calculateGasMargin(value: BigNumber) {
if (value) { return value.mul(BigNumber.from(10000).add(BigNumber.from(1000))).div(BigNumber.from(10000)) // add 10%
const offset = value.mul(margin).div(ethers.utils.bigNumberify(10000))
return value.add(offset)
}
return null
} }
// account is optional // account is optional
export function getProviderOrSigner(library: JsonRpcProvider, account?: string): Signer | Provider { export function getProviderOrSigner(library: any, account?: string): any {
return account ? new UncheckedJsonRpcSigner(library.getSigner(account)) : library return account ? library.getSigner(account).connectUnchecked() : library
} }
// account is optional // account is optional
export function getContract(address: string, ABI: any, library: JsonRpcProvider, account?: string): Contract { export function getContract(address: string, ABI: any, library: any, account?: string): Contract {
if (!isAddress(address) || address === ethers.constants.AddressZero) { if (!isAddress(address) || address === AddressZero) {
throw Error(`Invalid 'address' parameter '${address}'.`) throw Error(`Invalid 'address' parameter '${address}'.`)
} }
return new ethers.Contract(address, ABI, getProviderOrSigner(library, account)) return new Contract(address, ABI, getProviderOrSigner(library, account))
} }
// account is optional // account is optional
...@@ -176,7 +173,7 @@ export async function getTokenName(tokenAddress, library) { ...@@ -176,7 +173,7 @@ export async function getTokenName(tokenAddress, library) {
.catch(() => .catch(() =>
getContract(tokenAddress, ERC20_BYTES32_ABI, library) getContract(tokenAddress, ERC20_BYTES32_ABI, library)
.name() .name()
.then(bytes32 => ethers.utils.parseBytes32String(bytes32)) .then(parseBytes32String)
) )
.catch(error => { .catch(error => {
error.code = ERROR_CODES.TOKEN_SYMBOL error.code = ERROR_CODES.TOKEN_SYMBOL
...@@ -194,7 +191,7 @@ export async function getTokenSymbol(tokenAddress, library) { ...@@ -194,7 +191,7 @@ export async function getTokenSymbol(tokenAddress, library) {
.symbol() .symbol()
.catch(() => { .catch(() => {
const contractBytes32 = getContract(tokenAddress, ERC20_BYTES32_ABI, library) const contractBytes32 = getContract(tokenAddress, ERC20_BYTES32_ABI, library)
return contractBytes32.symbol().then(bytes32 => ethers.utils.parseBytes32String(bytes32)) return contractBytes32.symbol().then(parseBytes32String)
}) })
.catch(error => { .catch(error => {
error.code = ERROR_CODES.TOKEN_SYMBOL error.code = ERROR_CODES.TOKEN_SYMBOL
...@@ -237,7 +234,7 @@ export async function getTokenBalance(tokenAddress, address, library) { ...@@ -237,7 +234,7 @@ export async function getTokenBalance(tokenAddress, address, library) {
export async function getTokenAllowance(address, tokenAddress, spenderAddress, library) { export async function getTokenAllowance(address, tokenAddress, spenderAddress, library) {
if (!isAddress(address) || !isAddress(tokenAddress) || !isAddress(spenderAddress)) { if (!isAddress(address) || !isAddress(tokenAddress) || !isAddress(spenderAddress)) {
throw Error( throw Error(
'Invalid \'address\' or \'tokenAddress\' or \'spenderAddress\' parameter' + "Invalid 'address' or 'tokenAddress' or 'spenderAddress' parameter" +
`'${address}' or '${tokenAddress}' or '${spenderAddress}'.` `'${address}' or '${tokenAddress}' or '${spenderAddress}'.`
) )
} }
......
This diff is collapsed.
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