Commit 3b6213f4 authored by Noah Zinsmeister's avatar Noah Zinsmeister

Merge remote-tracking branch 'refs/remotes/origin/main'

parents a5251f55 d846c83a
...@@ -115,7 +115,7 @@ export function useBestV3TradeExactOut( ...@@ -115,7 +115,7 @@ export function useBestV3TradeExactOut(
]) ])
}, [amountOut, routes]) }, [amountOut, routes])
const quotesResults = useSingleContractMultipleData(quoter, 'quoteExactInput', quoteExactOutInputs) const quotesResults = useSingleContractMultipleData(quoter, 'quoteExactOutput', quoteExactOutInputs)
return useMemo(() => { return useMemo(() => {
if (!amountOut || !currencyIn || quotesResults.some(({ valid }) => !valid)) { if (!amountOut || !currencyIn || quotesResults.some(({ valid }) => !valid)) {
......
import { BigNumber } from 'ethers'
import { useEffect, useMemo, useRef } from 'react' import { useEffect, useMemo, useRef } from 'react'
import { useDispatch, useSelector } from 'react-redux' import { useDispatch, useSelector } from 'react-redux'
import { Multicall2 } from '../../abis/types' import { Multicall2 } from '../../abis/types'
...@@ -32,21 +31,24 @@ async function fetchChunk( ...@@ -32,21 +31,24 @@ async function fetchChunk(
blockNumber: number blockNumber: number
}> { }> {
console.debug('Fetching chunk', multicall2Contract, chunk, minBlockNumber) console.debug('Fetching chunk', multicall2Contract, chunk, minBlockNumber)
let resultsBlockNumber: BigNumber let resultsBlockNumber: number
let results: { success: boolean; returnData: string }[] let results: { success: boolean; returnData: string }[]
try { try {
;[resultsBlockNumber, , results] = await multicall2Contract.callStatic.blockAndAggregate( const { blockNumber, returnData } = await multicall2Contract.callStatic.tryBlockAndAggregate(
false,
chunk.map((obj) => ({ target: obj.address, callData: obj.callData })) chunk.map((obj) => ({ target: obj.address, callData: obj.callData }))
) )
resultsBlockNumber = blockNumber.toNumber()
results = returnData
} catch (error) { } catch (error) {
console.debug('Failed to fetch chunk inside retry', error) console.debug('Failed to fetch chunk inside retry', error)
throw error throw error
} }
if (resultsBlockNumber.toNumber() < minBlockNumber) { if (resultsBlockNumber < minBlockNumber) {
console.debug(`Fetched results for old block number: ${resultsBlockNumber.toString()} vs. ${minBlockNumber}`) console.debug(`Fetched results for old block number: ${resultsBlockNumber.toString()} vs. ${minBlockNumber}`)
throw new RetryableError('Fetched for old block number') throw new RetryableError('Fetched for old block number')
} }
return { results, blockNumber: resultsBlockNumber.toNumber() } return { results, blockNumber: resultsBlockNumber }
} }
/** /**
...@@ -175,27 +177,43 @@ export default function Updater(): null { ...@@ -175,27 +177,43 @@ export default function Updater(): null {
const slice = outdatedCallKeys.slice(firstCallKeyIndex, lastCallKeyIndex) const slice = outdatedCallKeys.slice(firstCallKeyIndex, lastCallKeyIndex)
dispatch( // split the returned slice into errors and success
updateMulticallResults({ const { erroredCalls, results } = slice.reduce<{
chainId, erroredCalls: Call[]
results: slice.reduce<{ [callKey: string]: string | null }>((memo, callKey, i) => { results: { [callKey: string]: string | null }
}>(
(memo, callKey, i) => {
if (returnData[i].success) { if (returnData[i].success) {
memo[callKey] = returnData[i].returnData ?? null memo.results[callKey] = returnData[i].returnData ?? null
} else {
memo.erroredCalls.push(parseCallKey(callKey))
} }
return memo return memo
}, {}), },
{ erroredCalls: [], results: {} }
)
// dispatch any new results
if (Object.keys(results).length > 0)
dispatch(
updateMulticallResults({
chainId,
results,
blockNumber: fetchBlockNumber, blockNumber: fetchBlockNumber,
}) })
) )
// todo: dispatch an error for each call that failed, i.e. returnData[i].success === false // dispatch any errored calls
// dispatch( if (erroredCalls.length > 0) {
// errorFetchingMulticallResults({ console.debug('Errored calls', erroredCalls)
// calls: // todo: compute this, dispatch(
// chainId, errorFetchingMulticallResults({
// fetchingBlockNumber: latestBlockNumber, calls: erroredCalls,
// }) chainId,
// ) fetchingBlockNumber: latestBlockNumber,
})
)
}
}) })
.catch((error: any) => { .catch((error: any) => {
if (error instanceof CancelledError) { if (error instanceof CancelledError) {
......
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