Skip to content

Commit

Permalink
improve(relayer): Clear out token data explicitly and log token balances
Browse files Browse the repository at this point in the history
Based on an issue we're seeing where L1 to L2 rebalances are still getting duplicated, even after wrapping ETH, perhaps suggesting that the `tokenClient` is using stale data

the logic written [here](https://github.com/across-protocol/relayer-v2/blob/master/src/relayer/RelayerClientHelper.ts#L159) should be reading updated balances post-ETH-unwrap but it may not.

This PR adds more logs we can use to better debug
  • Loading branch information
nicholaspai committed Oct 10, 2023
1 parent 459f787 commit 8729c46
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 25 deletions.
3 changes: 0 additions & 3 deletions src/clients/InventoryClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -634,9 +634,6 @@ export class InventoryClient {
}

async wrapL2EthIfAboveThreshold(): Promise<void> {
if (!this.isInventoryManagementEnabled()) {
return;
}
this.log("Checking ETH->WETH Wrap status");
await this.adapterManager.wrapEthIfAboveThreshold(this.inventoryConfig, this.simMode);
}
Expand Down
19 changes: 18 additions & 1 deletion src/clients/TokenClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ export class TokenClient {
this.tokenShortfall = {};
}

clearTokenData(): void {
this.tokenData = {};
}

async setOriginTokenApprovals(): Promise<void> {
const tokensToApprove: { chainId: number; token: string }[] = [];
Object.entries(this.tokenData).forEach(([_chainId, tokenMap]) => {
Expand Down Expand Up @@ -191,7 +195,20 @@ export class TokenClient {
}
}

this.logger.debug({ at: "TokenBalanceClient", message: "TokenBalance client updated!" });
// Remove allowance from token data when logging.
const balanceData = Object.fromEntries(
Object.entries(this.tokenData).map(([chainId, tokenData]) => {
return [
chainId,
Object.fromEntries(
Object.entries(tokenData).map(([token, { balance }]) => {
return [token, balance];
})
),
];
})
);
this.logger.debug({ at: "TokenBalanceClient", message: "TokenBalance client updated!", balanceData });
}

async fetchTokenData(spokePoolClient: SpokePoolClient): Promise<{
Expand Down
7 changes: 7 additions & 0 deletions src/clients/bridges/ArbitrumAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,13 @@ export class ArbitrumAdapter extends BaseAdapter {
const value = ethBalance.sub(target);
this.logger.debug({ at: this.getName(), message: "Wrapping ETH", threshold, target, value, ethBalance });
return await this._wrapEthIfAboveThreshold(threshold, contract, value, simMode);
} else {
this.logger.debug({
at: this.getName(),
message: "ETH balance below threhsold",
threshold,
ethBalance,
});
}
return null;
}
Expand Down
7 changes: 7 additions & 0 deletions src/clients/bridges/ZKSyncAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,13 @@ export class ZKSyncAdapter extends BaseAdapter {
const value = ethBalance.sub(target);
this.logger.debug({ at: this.getName(), message: "Wrapping ETH", threshold, target, value, ethBalance });
return await this._wrapEthIfAboveThreshold(threshold, contract, value, simMode);
} else {
this.logger.debug({
at: this.getName(),
message: "ETH balance below threhsold",
threshold,
ethBalance,
});
}
return null;
}
Expand Down
7 changes: 7 additions & 0 deletions src/clients/bridges/op-stack/OpStackAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,13 @@ export class OpStackAdapter extends BaseAdapter {
const value = ethBalance.sub(target);
this.logger.debug({ at: this.getName(), message: "Wrapping ETH", threshold, target, value, ethBalance });
return await this._wrapEthIfAboveThreshold(threshold, contract, value, simMode);
} else {
this.logger.debug({
at: this.getName(),
message: "ETH balance below threhsold",
threshold,
ethBalance,
});
}
return null;
}
Expand Down
1 change: 1 addition & 0 deletions src/relayer/RelayerClientHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ export async function updateRelayerClients(clients: RelayerClients, config: Rela

// Update the token client after the inventory client has done its wrapping of L2 ETH to ensure latest WETH ballance.
// The token client needs route data, so wait for update before checking approvals.
clients.tokenClient.clearTokenData();
await clients.tokenClient.update();
if (config.sendingRelaysEnabled) {
await clients.tokenClient.setOriginTokenApprovals();
Expand Down
44 changes: 23 additions & 21 deletions src/relayer/RelayerConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,28 +108,30 @@ export class RelayerConfig extends CommonConfig {
);
}
});
Object.keys(this.inventoryConfig.tokenConfig).forEach((l1Token) => {
Object.keys(this.inventoryConfig.tokenConfig[l1Token]).forEach((chainId) => {
const { targetPct, thresholdPct, unwrapWethThreshold, unwrapWethTarget } =
this.inventoryConfig.tokenConfig[l1Token][chainId];
assert(
targetPct !== undefined && thresholdPct !== undefined,
`Bad config. Must specify targetPct, thresholdPct for ${l1Token} on ${chainId}`
);
assert(
toBN(thresholdPct).lte(toBN(targetPct)),
`Bad config. thresholdPct<=targetPct for ${l1Token} on ${chainId}`
);
this.inventoryConfig.tokenConfig[l1Token][chainId].targetPct = toBNWei(targetPct).div(100);
this.inventoryConfig.tokenConfig[l1Token][chainId].thresholdPct = toBNWei(thresholdPct).div(100);
if (unwrapWethThreshold !== undefined) {
this.inventoryConfig.tokenConfig[l1Token][chainId].unwrapWethThreshold = toBNWei(unwrapWethThreshold);
}
this.inventoryConfig.tokenConfig[l1Token][chainId].unwrapWethTarget = unwrapWethTarget
? toBNWei(unwrapWethTarget)
: toBNWei(2);
if (this.inventoryConfig.tokenConfig !== undefined) {
Object.keys(this.inventoryConfig.tokenConfig).forEach((l1Token) => {
Object.keys(this.inventoryConfig.tokenConfig[l1Token]).forEach((chainId) => {
const { targetPct, thresholdPct, unwrapWethThreshold, unwrapWethTarget } =
this.inventoryConfig.tokenConfig[l1Token][chainId];
assert(
targetPct !== undefined && thresholdPct !== undefined,
`Bad config. Must specify targetPct, thresholdPct for ${l1Token} on ${chainId}`
);
assert(
toBN(thresholdPct).lte(toBN(targetPct)),
`Bad config. thresholdPct<=targetPct for ${l1Token} on ${chainId}`
);
this.inventoryConfig.tokenConfig[l1Token][chainId].targetPct = toBNWei(targetPct).div(100);
this.inventoryConfig.tokenConfig[l1Token][chainId].thresholdPct = toBNWei(thresholdPct).div(100);
if (unwrapWethThreshold !== undefined) {
this.inventoryConfig.tokenConfig[l1Token][chainId].unwrapWethThreshold = toBNWei(unwrapWethThreshold);
}
this.inventoryConfig.tokenConfig[l1Token][chainId].unwrapWethTarget = unwrapWethTarget
? toBNWei(unwrapWethTarget)
: toBNWei(2);
});
});
});
}
}
this.debugProfitability = DEBUG_PROFITABILITY === "true";
this.relayerGasMultiplier = toBNWei(RELAYER_GAS_MULTIPLIER || Constants.DEFAULT_RELAYER_GAS_MULTIPLIER);
Expand Down

0 comments on commit 8729c46

Please sign in to comment.