fix: network token memoization (#4877)
* build: upgrade redux-multicall * fix: memoize network token * docs: invalid token
This commit is contained in:
parent
21e0faeb1e
commit
2fc3f3c00e
@ -135,7 +135,7 @@
|
|||||||
"@uniswap/governance": "^1.0.2",
|
"@uniswap/governance": "^1.0.2",
|
||||||
"@uniswap/liquidity-staker": "^1.0.2",
|
"@uniswap/liquidity-staker": "^1.0.2",
|
||||||
"@uniswap/merkle-distributor": "1.0.1",
|
"@uniswap/merkle-distributor": "1.0.1",
|
||||||
"@uniswap/redux-multicall": "^1.1.5",
|
"@uniswap/redux-multicall": "^1.1.6",
|
||||||
"@uniswap/router-sdk": "^1.3.0",
|
"@uniswap/router-sdk": "^1.3.0",
|
||||||
"@uniswap/sdk-core": "^3.0.1",
|
"@uniswap/sdk-core": "^3.0.1",
|
||||||
"@uniswap/smart-order-router": "^2.10.0",
|
"@uniswap/smart-order-router": "^2.10.0",
|
||||||
|
@ -31,50 +31,45 @@ function parseStringOrBytes32(str: string | undefined, bytes32: string | undefin
|
|||||||
*/
|
*/
|
||||||
export function useTokenFromNetwork(
|
export function useTokenFromNetwork(
|
||||||
tokenAddress: string | null | undefined,
|
tokenAddress: string | null | undefined,
|
||||||
chainId?: number
|
tokenChainId?: number
|
||||||
): Token | null | undefined {
|
): Token | null | undefined {
|
||||||
const web3ReactChainId = useWeb3React().chainId
|
const { chainId } = useWeb3React()
|
||||||
if (!chainId) chainId = web3ReactChainId
|
|
||||||
const supportedChain = isSupportedChain(chainId)
|
|
||||||
|
|
||||||
const formattedAddress = isAddress(tokenAddress)
|
const formattedAddress = isAddress(tokenAddress)
|
||||||
|
|
||||||
const tokenContract = useTokenContract(formattedAddress ? formattedAddress : undefined, false)
|
const tokenContract = useTokenContract(formattedAddress ? formattedAddress : undefined, false)
|
||||||
const tokenContractBytes32 = useBytes32TokenContract(formattedAddress ? formattedAddress : undefined, false)
|
const tokenContractBytes32 = useBytes32TokenContract(formattedAddress ? formattedAddress : undefined, false)
|
||||||
|
|
||||||
|
// TODO: Fix redux-multicall so that these values do not reload.
|
||||||
const tokenName = useSingleCallResult(tokenContract, 'name', undefined, NEVER_RELOAD)
|
const tokenName = useSingleCallResult(tokenContract, 'name', undefined, NEVER_RELOAD)
|
||||||
const tokenNameBytes32 = useSingleCallResult(tokenContractBytes32, 'name', undefined, NEVER_RELOAD)
|
const tokenNameBytes32 = useSingleCallResult(tokenContractBytes32, 'name', undefined, NEVER_RELOAD)
|
||||||
const symbol = useSingleCallResult(tokenContract, 'symbol', undefined, NEVER_RELOAD)
|
const symbol = useSingleCallResult(tokenContract, 'symbol', undefined, NEVER_RELOAD)
|
||||||
const symbolBytes32 = useSingleCallResult(tokenContractBytes32, 'symbol', undefined, NEVER_RELOAD)
|
const symbolBytes32 = useSingleCallResult(tokenContractBytes32, 'symbol', undefined, NEVER_RELOAD)
|
||||||
const decimals = useSingleCallResult(tokenContract, 'decimals', undefined, NEVER_RELOAD)
|
const decimals = useSingleCallResult(tokenContract, 'decimals', undefined, NEVER_RELOAD)
|
||||||
|
|
||||||
return useMemo(() => {
|
const isLoading = useMemo(
|
||||||
if (typeof tokenAddress !== 'string' || !supportedChain || !formattedAddress) return undefined
|
() => decimals.loading || symbol.loading || tokenName.loading,
|
||||||
if (decimals.loading || symbol.loading || tokenName.loading || !chainId) return null
|
[decimals.loading, symbol.loading, tokenName.loading]
|
||||||
if (decimals.result) {
|
|
||||||
return new Token(
|
|
||||||
chainId,
|
|
||||||
formattedAddress,
|
|
||||||
decimals.result[0],
|
|
||||||
parseStringOrBytes32(symbol.result?.[0], symbolBytes32.result?.[0], 'UNKNOWN'),
|
|
||||||
parseStringOrBytes32(tokenName.result?.[0], tokenNameBytes32.result?.[0], 'Unknown Token')
|
|
||||||
)
|
)
|
||||||
}
|
const parsedDecimals = useMemo(() => decimals.result?.[0], [decimals.result])
|
||||||
return undefined
|
const parsedSymbol = useMemo(
|
||||||
}, [
|
() => parseStringOrBytes32(symbol.result?.[0], symbolBytes32.result?.[0], 'UNKNOWN'),
|
||||||
formattedAddress,
|
[symbol.result, symbolBytes32.result]
|
||||||
chainId,
|
)
|
||||||
supportedChain,
|
const parsedName = useMemo(
|
||||||
decimals.loading,
|
() => parseStringOrBytes32(tokenName.result?.[0], tokenNameBytes32.result?.[0], 'Unknown Token'),
|
||||||
decimals.result,
|
[tokenName.result, tokenNameBytes32.result]
|
||||||
symbol.loading,
|
)
|
||||||
symbol.result,
|
|
||||||
symbolBytes32.result,
|
return useMemo(() => {
|
||||||
tokenAddress,
|
// If the token is on another chain, we cannot fetch it on-chain, and it is invalid.
|
||||||
tokenName.loading,
|
if (tokenChainId !== undefined && tokenChainId !== chainId) return undefined
|
||||||
tokenName.result,
|
if (typeof tokenAddress !== 'string' || !isSupportedChain(chainId) || !formattedAddress) return undefined
|
||||||
tokenNameBytes32.result,
|
|
||||||
])
|
if (isLoading || !chainId) return null
|
||||||
|
if (!parsedDecimals) return undefined
|
||||||
|
|
||||||
|
return new Token(chainId, formattedAddress, parsedDecimals, parsedSymbol, parsedName)
|
||||||
|
}, [tokenChainId, chainId, tokenAddress, formattedAddress, isLoading, parsedDecimals, parsedSymbol, parsedName])
|
||||||
}
|
}
|
||||||
|
|
||||||
type TokenMap = { [address: string]: Token }
|
type TokenMap = { [address: string]: Token }
|
||||||
@ -109,8 +104,7 @@ export function useCurrencyFromMap(tokens: TokenMap, currencyId?: string | null)
|
|||||||
|
|
||||||
const token = useTokenFromMapOrNetwork(tokens, isNative ? undefined : shorthandMatchAddress ?? currencyId)
|
const token = useTokenFromMapOrNetwork(tokens, isNative ? undefined : shorthandMatchAddress ?? currencyId)
|
||||||
|
|
||||||
const supportedChain = isSupportedChain(chainId)
|
if (currencyId === null || currencyId === undefined || !isSupportedChain(chainId)) return null
|
||||||
if (currencyId === null || currencyId === undefined || !supportedChain) return null
|
|
||||||
|
|
||||||
// this case so we use our builtin wrapped token instead of wrapped tokens on token lists
|
// this case so we use our builtin wrapped token instead of wrapped tokens on token lists
|
||||||
const wrappedNative = nativeCurrency?.wrapped
|
const wrappedNative = nativeCurrency?.wrapped
|
||||||
|
@ -4144,10 +4144,10 @@
|
|||||||
resolved "https://registry.npmjs.org/@uniswap/merkle-distributor/-/merkle-distributor-1.0.1.tgz"
|
resolved "https://registry.npmjs.org/@uniswap/merkle-distributor/-/merkle-distributor-1.0.1.tgz"
|
||||||
integrity sha512-5gDiTI5hrXIh5UWTrxKYjw30QQDnpl8ckDSpefldNenDlYO1RKkdUYMYpvrqGi2r7YzLYTlO6+TDlNs6O7hDRw==
|
integrity sha512-5gDiTI5hrXIh5UWTrxKYjw30QQDnpl8ckDSpefldNenDlYO1RKkdUYMYpvrqGi2r7YzLYTlO6+TDlNs6O7hDRw==
|
||||||
|
|
||||||
"@uniswap/redux-multicall@^1.1.1", "@uniswap/redux-multicall@^1.1.5":
|
"@uniswap/redux-multicall@^1.1.1", "@uniswap/redux-multicall@^1.1.6":
|
||||||
version "1.1.5"
|
version "1.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/@uniswap/redux-multicall/-/redux-multicall-1.1.5.tgz#7c097047d489c1624038c0fbbd3d76dc705bf153"
|
resolved "https://registry.yarnpkg.com/@uniswap/redux-multicall/-/redux-multicall-1.1.6.tgz#27e52d97e359b6de06410fbc6d0699b9e6422707"
|
||||||
integrity sha512-RSMhfuAX2rPimnevvAAiwoyV2bCGTIKhVHEBOLTMF+oVxYcKKe9hCwx/cffY12t/usXWHlEJ//V7JoxTKI1Lyg==
|
integrity sha512-B7kR63dtIJzr9iGITsNYAh8ktDfKEi9Ilsfq0oKxSzAChZmkq9Ss/EZ6/VKSvq1m4rPe+b9CPxZIBdRzpmf2/w==
|
||||||
|
|
||||||
"@uniswap/router-sdk@^1.3.0":
|
"@uniswap/router-sdk@^1.3.0":
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
|
Loading…
Reference in New Issue
Block a user