From 3e76b1880c98f55e4a313d43e041845dd33e4ee2 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Fri, 25 Jul 2025 20:58:01 +0000 Subject: [PATCH 1/6] improve(HubPoolClient): Resolve LP tokens via multicall Squashes ~18 eth_call queries down to 1 on each HubPoolClient update. --- src/clients/HubPoolClient.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/clients/HubPoolClient.ts b/src/clients/HubPoolClient.ts index b272c0976..ab1239d6a 100644 --- a/src/clients/HubPoolClient.ts +++ b/src/clients/HubPoolClient.ts @@ -1021,11 +1021,16 @@ export class HubPoolClient extends BaseAbstractClient { // only run iff a new token has been enabled. Will only append iff the info is not there already. // Filter out any duplicate addresses. This might happen due to enabling, disabling and re-enabling a token. if (eventsToQuery.includes("L1TokenEnabledForLiquidityProvision")) { - const uniqueL1Tokens = dedupArray( + const uniqueL1Tokens: string[] = dedupArray( events["L1TokenEnabledForLiquidityProvision"].map((event) => String(event.args["l1Token"])) ); - const [tokenInfo, lpTokenInfo] = await Promise.all([ + const { hubPool } = this; + + // Generate multicall input for pooledTokens query. + const _pooledTokens = uniqueL1Tokens.map((token) => hubPool.interface.encodeFunctionData("pooledTokens", [token])); + + const [tokenInfo, lpTokenMulticall] = await Promise.all([ Promise.all( uniqueL1Tokens.map(async (l1Token: string) => { const tokenInfo = await fetchTokenInfo(l1Token, this.hubPool.provider); @@ -1035,12 +1040,10 @@ export class HubPoolClient extends BaseAbstractClient { }; }) ), - Promise.all( - uniqueL1Tokens.map( - async (l1Token: string) => await this.hubPool.pooledTokens(l1Token, { blockTag: update.searchEndBlock }) - ) - ), + hubPool.callStatic.multicall(_pooledTokens, { blockTag: update.searchEndBlock }) ]); + + const lpTokenInfo = lpTokenMulticall.map((lpToken: string) => hubPool.interface.decodeFunctionResult("pooledTokens", lpToken)); for (const info of tokenInfo) { if (!this.l1Tokens.find((token) => token.address.eq(info.address))) { if (info.decimals > 0 && info.decimals <= 18) { @@ -1051,7 +1054,7 @@ export class HubPoolClient extends BaseAbstractClient { } } - uniqueL1Tokens.forEach((token: string, i) => { + uniqueL1Tokens.forEach((token, i) => { this.lpTokens[token] = { lastLpFeeUpdate: lpTokenInfo[i].lastLpFeeUpdate, liquidReserves: lpTokenInfo[i].liquidReserves, From 35d9ee43bda4d0a66a5eccbfd250d142dd5b9836 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Fri, 25 Jul 2025 21:05:52 +0000 Subject: [PATCH 2/6] lint --- src/clients/HubPoolClient.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/clients/HubPoolClient.ts b/src/clients/HubPoolClient.ts index ab1239d6a..74f84cb76 100644 --- a/src/clients/HubPoolClient.ts +++ b/src/clients/HubPoolClient.ts @@ -1028,7 +1028,9 @@ export class HubPoolClient extends BaseAbstractClient { const { hubPool } = this; // Generate multicall input for pooledTokens query. - const _pooledTokens = uniqueL1Tokens.map((token) => hubPool.interface.encodeFunctionData("pooledTokens", [token])); + const multicall = uniqueL1Tokens.map((token) => + hubPool.interface.encodeFunctionData("pooledTokens", [token]) + ); const [tokenInfo, lpTokenMulticall] = await Promise.all([ Promise.all( @@ -1040,10 +1042,12 @@ export class HubPoolClient extends BaseAbstractClient { }; }) ), - hubPool.callStatic.multicall(_pooledTokens, { blockTag: update.searchEndBlock }) + hubPool.callStatic.multicall(multicall, { blockTag: update.searchEndBlock }), ]); - const lpTokenInfo = lpTokenMulticall.map((lpToken: string) => hubPool.interface.decodeFunctionResult("pooledTokens", lpToken)); + const lpTokenInfo = lpTokenMulticall.map((lpToken: string) => + hubPool.interface.decodeFunctionResult("pooledTokens", lpToken) + ); for (const info of tokenInfo) { if (!this.l1Tokens.find((token) => token.address.eq(info.address))) { if (info.decimals > 0 && info.decimals <= 18) { From 0a659d21fc5b19f428ae37cb1c4ca48f2c019f69 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Fri, 25 Jul 2025 21:06:37 +0000 Subject: [PATCH 3/6] standardise --- src/clients/HubPoolClient.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/clients/HubPoolClient.ts b/src/clients/HubPoolClient.ts index 74f84cb76..495d95e95 100644 --- a/src/clients/HubPoolClient.ts +++ b/src/clients/HubPoolClient.ts @@ -1028,8 +1028,9 @@ export class HubPoolClient extends BaseAbstractClient { const { hubPool } = this; // Generate multicall input for pooledTokens query. + const pooledTokensFn = "pooledTokens"; const multicall = uniqueL1Tokens.map((token) => - hubPool.interface.encodeFunctionData("pooledTokens", [token]) + hubPool.interface.encodeFunctionData(pooledTokensFn, [token]) ); const [tokenInfo, lpTokenMulticall] = await Promise.all([ @@ -1046,7 +1047,7 @@ export class HubPoolClient extends BaseAbstractClient { ]); const lpTokenInfo = lpTokenMulticall.map((lpToken: string) => - hubPool.interface.decodeFunctionResult("pooledTokens", lpToken) + hubPool.interface.decodeFunctionResult(pooledTokensFn, lpToken) ); for (const info of tokenInfo) { if (!this.l1Tokens.find((token) => token.address.eq(info.address))) { From bece4b51d235c4a895b9154f497660695d4d0e3c Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Fri, 25 Jul 2025 21:07:27 +0000 Subject: [PATCH 4/6] tweak --- src/clients/HubPoolClient.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clients/HubPoolClient.ts b/src/clients/HubPoolClient.ts index 495d95e95..9ab8c2ca5 100644 --- a/src/clients/HubPoolClient.ts +++ b/src/clients/HubPoolClient.ts @@ -1035,7 +1035,7 @@ export class HubPoolClient extends BaseAbstractClient { const [tokenInfo, lpTokenMulticall] = await Promise.all([ Promise.all( - uniqueL1Tokens.map(async (l1Token: string) => { + uniqueL1Tokens.map(async (l1Token) => { const tokenInfo = await fetchTokenInfo(l1Token, this.hubPool.provider); return { ...tokenInfo, @@ -1045,10 +1045,10 @@ export class HubPoolClient extends BaseAbstractClient { ), hubPool.callStatic.multicall(multicall, { blockTag: update.searchEndBlock }), ]); - const lpTokenInfo = lpTokenMulticall.map((lpToken: string) => hubPool.interface.decodeFunctionResult(pooledTokensFn, lpToken) ); + for (const info of tokenInfo) { if (!this.l1Tokens.find((token) => token.address.eq(info.address))) { if (info.decimals > 0 && info.decimals <= 18) { From 264320f5e3cc2d570c623e8a523283dd868b5c20 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Fri, 25 Jul 2025 21:11:03 +0000 Subject: [PATCH 5/6] lint --- src/clients/HubPoolClient.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/clients/HubPoolClient.ts b/src/clients/HubPoolClient.ts index 9ab8c2ca5..f57ec4a80 100644 --- a/src/clients/HubPoolClient.ts +++ b/src/clients/HubPoolClient.ts @@ -1029,9 +1029,7 @@ export class HubPoolClient extends BaseAbstractClient { // Generate multicall input for pooledTokens query. const pooledTokensFn = "pooledTokens"; - const multicall = uniqueL1Tokens.map((token) => - hubPool.interface.encodeFunctionData(pooledTokensFn, [token]) - ); + const multicall = uniqueL1Tokens.map((token) => hubPool.interface.encodeFunctionData(pooledTokensFn, [token])); const [tokenInfo, lpTokenMulticall] = await Promise.all([ Promise.all( From 1e70833a5d72448d272d464476991e35a2f3a890 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Fri, 25 Jul 2025 21:13:15 +0000 Subject: [PATCH 6/6] update --- src/clients/HubPoolClient.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clients/HubPoolClient.ts b/src/clients/HubPoolClient.ts index f57ec4a80..b567b4bfe 100644 --- a/src/clients/HubPoolClient.ts +++ b/src/clients/HubPoolClient.ts @@ -1043,8 +1043,8 @@ export class HubPoolClient extends BaseAbstractClient { ), hubPool.callStatic.multicall(multicall, { blockTag: update.searchEndBlock }), ]); - const lpTokenInfo = lpTokenMulticall.map((lpToken: string) => - hubPool.interface.decodeFunctionResult(pooledTokensFn, lpToken) + const lpTokenInfo = lpTokenMulticall.map((result: string) => + hubPool.interface.decodeFunctionResult(pooledTokensFn, result) ); for (const info of tokenInfo) {