Commit 5f64149f authored by Zach Pomerantz's avatar Zach Pomerantz Committed by GitHub

feat: trace quote (#6160)

* feat: trace quote

* fix: include more data
parent 7115729e
...@@ -5,6 +5,7 @@ import { RPC_PROVIDERS } from 'constants/providers' ...@@ -5,6 +5,7 @@ import { RPC_PROVIDERS } from 'constants/providers'
import { getClientSideQuote, toSupportedChainId } from 'lib/hooks/routing/clientSideSmartOrderRouter' import { getClientSideQuote, toSupportedChainId } from 'lib/hooks/routing/clientSideSmartOrderRouter'
import ms from 'ms.macro' import ms from 'ms.macro'
import qs from 'qs' import qs from 'qs'
import { trace } from 'tracing'
import { GetQuoteResult } from './types' import { GetQuoteResult } from './types'
...@@ -64,34 +65,59 @@ const PRICE_PARAMS = { ...@@ -64,34 +65,59 @@ const PRICE_PARAMS = {
distributionPercent: 100, distributionPercent: 100,
} }
interface GetQuoteArgs {
tokenInAddress: string
tokenInChainId: ChainId
tokenInDecimals: number
tokenInSymbol?: string
tokenOutAddress: string
tokenOutChainId: ChainId
tokenOutDecimals: number
tokenOutSymbol?: string
amount: string
routerPreference: RouterPreference
type: 'exactIn' | 'exactOut'
}
export const routingApi = createApi({ export const routingApi = createApi({
reducerPath: 'routingApi', reducerPath: 'routingApi',
baseQuery: fetchBaseQuery({ baseQuery: fetchBaseQuery({
baseUrl: 'https://api.uniswap.org/v1/', baseUrl: 'https://api.uniswap.org/v1/',
}), }),
endpoints: (build) => ({ endpoints: (build) => ({
getQuote: build.query< getQuote: build.query<GetQuoteResult, GetQuoteArgs>({
GetQuoteResult, async onQueryStarted(args: GetQuoteArgs, { queryFulfilled }) {
{ trace(
tokenInAddress: string 'quote',
tokenInChainId: ChainId async ({ setTraceError, setTraceStatus }) => {
tokenInDecimals: number try {
tokenInSymbol?: string await queryFulfilled
tokenOutAddress: string } catch (error: unknown) {
tokenOutChainId: ChainId if (error && typeof error === 'object' && 'error' in error) {
tokenOutDecimals: number const queryError = (error as Record<'error', FetchBaseQueryError>).error
tokenOutSymbol?: string if (typeof queryError.status === 'number') {
amount: string setTraceStatus(queryError.status)
routerPreference: RouterPreference }
type: 'exactIn' | 'exactOut' setTraceError(queryError)
} } else {
>({ throw error
}
}
},
{
data: {
...args,
isPrice: args.routerPreference === RouterPreference.PRICE,
isAutoRouter: args.routerPreference === RouterPreference.API,
},
tags: { is_widget: false },
}
)
},
async queryFn(args, _api, _extraOptions, fetch) { async queryFn(args, _api, _extraOptions, fetch) {
const { tokenInAddress, tokenInChainId, tokenOutAddress, tokenOutChainId, amount, routerPreference, type } = const { tokenInAddress, tokenInChainId, tokenOutAddress, tokenOutChainId, amount, routerPreference, type } =
args args
let result
try { try {
if (routerPreference === RouterPreference.API) { if (routerPreference === RouterPreference.API) {
const query = qs.stringify({ const query = qs.stringify({
...@@ -103,10 +129,10 @@ export const routingApi = createApi({ ...@@ -103,10 +129,10 @@ export const routingApi = createApi({
amount, amount,
type, type,
}) })
result = await fetch(`quote?${query}`) return (await fetch(`quote?${query}`)) as { data: GetQuoteResult } | { error: FetchBaseQueryError }
} else { } else {
const router = getRouter(args.tokenInChainId) const router = getRouter(args.tokenInChainId)
result = await getClientSideQuote( return await getClientSideQuote(
args, args,
router, router,
// TODO(zzmp): Use PRICE_PARAMS for RouterPreference.PRICE. // TODO(zzmp): Use PRICE_PARAMS for RouterPreference.PRICE.
...@@ -114,12 +140,10 @@ export const routingApi = createApi({ ...@@ -114,12 +140,10 @@ export const routingApi = createApi({
CLIENT_PARAMS CLIENT_PARAMS
) )
} }
} catch (error) {
return { data: result.data as GetQuoteResult }
} catch (e) {
// TODO: fall back to client-side quoter when auto router fails. // TODO: fall back to client-side quoter when auto router fails.
// deprecate 'legacy' v2/v3 routers first. // deprecate 'legacy' v2/v3 routers first.
return { error: e as FetchBaseQueryError } return { error: { status: 'CUSTOM_ERROR', error: error.toString(), data: error } }
} }
}, },
keepUnusedDataFor: ms`10s`, keepUnusedDataFor: ms`10s`,
......
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