Skip to content

Commit

Permalink
feat: Add smart provider log setter (#4007)
Browse files Browse the repository at this point in the history
### Description
- Add logic to enable setting of log levels to the SmartProvider. 
- Add logic to set log level to `silent` in the beginning of
`deriveTokenType()`, and then resetting it after.

### Related issues
- Fixes #4006 

### Backward compatibility
Yes

### Testing
Manual
  • Loading branch information
ltyu committed Jun 21, 2024
1 parent 39f66df commit e38d316
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 6 deletions.
5 changes: 5 additions & 0 deletions .changeset/shiny-cups-help.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@hyperlane-xyz/sdk': minor
---

Add logic to set smart provider log level to disable provider logs during Warp TokenType derive
1 change: 0 additions & 1 deletion typescript/sdk/src/hook/EvmHookModule.hardhat-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,6 @@ describe('EvmHookModule', async () => {
async function createHook(
config: HookConfig,
): Promise<{ hook: EvmHookModule; initialHookAddress: Address }> {
console.log('Creating hook with config: ', stringifyObject(config));
const hook = await EvmHookModule.create({
chain,
config,
Expand Down
8 changes: 6 additions & 2 deletions typescript/sdk/src/providers/SmartProvider/SmartProvider.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BigNumber, providers, utils } from 'ethers';
import { Logger } from 'pino';
import pino, { Logger } from 'pino';

import {
raceWithContext,
Expand Down Expand Up @@ -97,6 +97,10 @@ export class HyperlaneSmartProvider
this.supportedMethods = [...supportedMethods.values()];
}

setLogLevel(level: pino.LevelWithSilentOrString) {
this.logger.level = level;
}

async getPriorityFee(): Promise<BigNumber> {
try {
return BigNumber.from(await this.perform('maxPriorityFeePerGas', {}));
Expand Down Expand Up @@ -271,7 +275,7 @@ export class HyperlaneSmartProvider
providerResultPromises.push(resultPromise);
pIndex += 1;
} else if (result.status === ProviderStatus.Error) {
this.logger.warn(
this.logger.debug(
`Error from provider #${pIndex}: ${result.error} - ${
!isLastProvider ? ' Triggering next provider.' : ''
}`,
Expand Down
33 changes: 30 additions & 3 deletions typescript/sdk/src/token/EvmERC20WarpRouteReader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ import {
TokenRouterConfig,
TokenType,
} from '@hyperlane-xyz/sdk';
import { Address, eqAddress, rootLogger } from '@hyperlane-xyz/utils';
import {
Address,
eqAddress,
getLogLevel,
rootLogger,
} from '@hyperlane-xyz/utils';

import { DEFAULT_CONTRACT_READ_CONCURRENCY } from '../consts/concurrency.js';
import { EvmHookReader } from '../hook/EvmHookReader.js';
Expand Down Expand Up @@ -90,12 +95,20 @@ export class EvmERC20WarpRouteReader {
},
};

// Temporarily turn off SmartProvider logging
// Provider errors are expected because deriving will call methods that may not exist in the Bytecode
this.setSmartProviderLogLevel('silent');

// First, try checking token specific methods
for (const [type, { factory, method }] of Object.entries(contractTypes)) {
for (const [tokenType, { factory, method }] of Object.entries(
contractTypes,
)) {
try {
const warpRoute = factory.connect(warpRouteAddress, this.provider);
await warpRoute[method]();
return type as TokenType;

this.setSmartProviderLogLevel(getLogLevel()); // returns to original level defined by rootLogger
return tokenType as TokenType;
} catch (e) {
continue;
}
Expand All @@ -114,6 +127,8 @@ export class EvmERC20WarpRouteReader {
throw Error(
`Error accessing token specific method, implying this is not a supported token.`,
);
} finally {
this.setSmartProviderLogLevel(getLogLevel()); // returns to original level defined by rootLogger
}
}

Expand Down Expand Up @@ -203,4 +218,16 @@ export class EvmERC20WarpRouteReader {

return { name, symbol, decimals, totalSupply: totalSupply.toString() };
}

/**
* Conditionally sets the log level for a smart provider.
*
* @param level - The log level to set, e.g. 'debug', 'info', 'warn', 'error'.
*/
protected setSmartProviderLogLevel(level: string) {
if ('setLogLevel' in this.provider) {
//@ts-ignore
this.provider.setLogLevel(level);
}
}
}

0 comments on commit e38d316

Please sign in to comment.