diff --git a/src/providers/token-fee-fetcher.ts b/src/providers/token-fee-fetcher.ts index 029b279d3..7f652482c 100644 --- a/src/providers/token-fee-fetcher.ts +++ b/src/providers/token-fee-fetcher.ts @@ -4,7 +4,7 @@ import { ChainId } from '@uniswap/sdk-core'; import { TokenFeeDetector__factory } from '../types/other/factories/TokenFeeDetector__factory'; import { TokenFeeDetector } from '../types/other/TokenFeeDetector'; -import { log, WRAPPED_NATIVE_CURRENCY } from '../util'; +import { log, metric, MetricLoggerUnit, WRAPPED_NATIVE_CURRENCY } from '../util'; import { ProviderConfig } from './provider'; @@ -93,12 +93,18 @@ export class OnChainTokenFeeFetcher implements ITokenFeeFetcher { blockTag: providerConfig?.blockNumber, } ); + + metric.putMetric("TokenFeeFetcherFetchFeesSuccess", 1, MetricLoggerUnit.Count) + return { address, ...feeResult }; } catch (err) { log.error( { err }, `Error calling validate on-chain for token ${address}` ); + + metric.putMetric("TokenFeeFetcherFetchFeesFailure", 1, MetricLoggerUnit.Count) + // in case of FOT token fee fetch failure, we return null // so that they won't get returned from the token-fee-fetcher // and thus no fee will be applied, and the cache won't cache on FOT tokens with failed fee fetching diff --git a/src/providers/token-properties-provider.ts b/src/providers/token-properties-provider.ts index 1b8027355..c8e63005e 100644 --- a/src/providers/token-properties-provider.ts +++ b/src/providers/token-properties-provider.ts @@ -1,6 +1,6 @@ import { ChainId, Token } from '@uniswap/sdk-core'; -import { log } from '../util'; +import { log, metric, MetricLoggerUnit } from '../util'; import { ICache } from './cache'; import { ProviderConfig } from './provider'; import { @@ -89,6 +89,8 @@ export class TokenPropertiesProvider implements ITokenPropertiesProvider { for (const address of addressesRaw) { const cachedValue = tokenProperties[address]; if (cachedValue) { + metric.putMetric("TokenPropertiesProviderBatchGetCacheHit", 1, MetricLoggerUnit.Count) + tokenToResult[address] = cachedValue; } else if ( tokenToResult[address]?.tokenValidationResult === @@ -116,6 +118,8 @@ export class TokenPropertiesProvider implements ITokenPropertiesProvider { await Promise.all( addressesToFetchFeesOnchain.map((address) => { const tokenFee = tokenFeeMap[address]; + metric.putMetric(`TokenPropertiesProviderTokenFeeResultExists${tokenFee && (tokenFee.buyFeeBps || tokenFee.sellFeeBps)}`, 1, MetricLoggerUnit.Count) + if (tokenFee && (tokenFee.buyFeeBps || tokenFee.sellFeeBps)) { const tokenResultForAddress = tokenToResult[address]; @@ -123,6 +127,8 @@ export class TokenPropertiesProvider implements ITokenPropertiesProvider { tokenResultForAddress.tokenFeeResult = tokenFee; } + metric.putMetric("TokenPropertiesProviderBatchGetCacheMiss", 1, MetricLoggerUnit.Count) + // update cache concurrently // at this point, we are confident that the tokens are FOT, so we can hardcode the validation result return this.tokenPropertiesCache.set( diff --git a/src/providers/token-validator-provider.ts b/src/providers/token-validator-provider.ts index 446bd7171..d90af117c 100644 --- a/src/providers/token-validator-provider.ts +++ b/src/providers/token-validator-provider.ts @@ -2,7 +2,7 @@ import { ChainId, Token } from '@uniswap/sdk-core'; import _ from 'lodash'; import { ITokenValidator__factory } from '../types/other/factories/ITokenValidator__factory'; -import { log, WRAPPED_NATIVE_CURRENCY } from '../util'; +import { log, metric, MetricLoggerUnit, WRAPPED_NATIVE_CURRENCY } from '../util'; import { ICache } from './cache'; import { IMulticallProvider } from './multicall-provider'; @@ -89,6 +89,8 @@ export class TokenValidatorProvider implements ITokenValidatorProvider { (await this.tokenValidationCache.get( this.CACHE_KEY(this.chainId, address) ))!; + + metric.putMetric("TokenValidatorProviderValidateCacheHit", 1, MetricLoggerUnit.Count) } else { addresses.push(address); } @@ -140,7 +142,9 @@ export class TokenValidatorProvider implements ITokenValidatorProvider { // Could happen if the tokens transfer consumes too much gas so we revert. Just // drop the token in that case. if (!resultWrapper.success) { - log.info( + metric.putMetric("TokenValidatorProviderValidateFailed", 1, MetricLoggerUnit.Count) + + log.error( { result: resultWrapper }, `Failed to validate token ${token.symbol}` ); @@ -148,6 +152,8 @@ export class TokenValidatorProvider implements ITokenValidatorProvider { continue; } + metric.putMetric("TokenValidatorProviderValidateSuccess", 1, MetricLoggerUnit.Count) + const validationResult = resultWrapper.result[0]!; tokenToResult[token.address.toLowerCase()] = @@ -157,6 +163,9 @@ export class TokenValidatorProvider implements ITokenValidatorProvider { this.CACHE_KEY(this.chainId, token.address.toLowerCase()), tokenToResult[token.address.toLowerCase()]! ); + + metric.putMetric("TokenValidatorProviderValidateCacheMiss", 1, MetricLoggerUnit.Count) + metric.putMetric(`TokenValidatorProviderValidateResult${tokenToResult[token.address.toLowerCase()]?.toString()}`, 1, MetricLoggerUnit.Count) } return {