Skip to content

Commit d30d839

Browse files
authored
refactor: allow arbitrary arguments to bridge adapters (#2249)
* refactor: allow arbitrary arguments to bridge adapters Signed-off-by: bennett <[email protected]> * comment Signed-off-by: bennett <[email protected]> --------- Signed-off-by: bennett <[email protected]>
1 parent 302b2ea commit d30d839

17 files changed

+26
-57
lines changed

src/adapter/bridges/ArbitrumOrbitBridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export class ArbitrumOrbitBridge extends BaseBridgeAdapter {
5757
const l1Abi = CONTRACT_ADDRESSES[hubChainId][`orbitErc20Gateway_${l2chainId}`].abi;
5858
const l2Abi = ARBITRUM_ERC20_GATEWAY_L2_ABI;
5959

60-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [EvmAddress.from(l1Address)]);
60+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(l1Address)]);
6161

6262
const nativeToken = PUBLIC_NETWORKS[l2chainId].nativeToken;
6363
// Only set nonstandard gas tokens.

src/adapter/bridges/BaseBridgeAdapter.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
BigNumber,
44
EventSearchConfig,
55
Signer,
6-
Provider,
76
getTranslatedTokenAddress,
87
assert,
98
isDefined,
@@ -34,7 +33,6 @@ export abstract class BaseBridgeAdapter {
3433
protected l2chainId: number,
3534
protected hubChainId: number,
3635
protected l1Signer: Signer,
37-
protected l2SignerOrProvider: Signer | Provider,
3836
public l1Gateways: EvmAddress[]
3937
) {}
4038

src/adapter/bridges/BinanceCEXBridge.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
isDefined,
1111
getTimestampForBlock,
1212
mapAsync,
13-
ethers,
1413
getBinanceApiClient,
1514
floatToBN,
1615
CHAIN_IDs,
@@ -25,6 +24,7 @@ export class BinanceCEXBridge extends BaseBridgeAdapter {
2524
protected readonly binanceApiClientPromise;
2625
protected binanceApiClient;
2726
protected tokenSymbol: string;
27+
protected l2Provider: Provider;
2828

2929
constructor(
3030
l2chainId: number,
@@ -37,7 +37,7 @@ export class BinanceCEXBridge extends BaseBridgeAdapter {
3737
throw new Error("Cannot define a binance CEX bridge on a non-production network");
3838
}
3939
// No L1 gateways needed since no L1 bridge transfers tokens from the EOA.
40-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, []);
40+
super(l2chainId, hubChainId, l1Signer, []);
4141
// Pull the binance API key from environment and throw if we cannot instantiate this bridge.
4242
this.binanceApiClientPromise = getBinanceApiClient(process.env["BINANCE_API_BASE"]);
4343

@@ -48,6 +48,9 @@ export class BinanceCEXBridge extends BaseBridgeAdapter {
4848
const _tokenSymbol = getTokenInfo(l1Token.toAddress(), this.hubChainId).symbol;
4949
// Handle the special case for when we are bridging WBNB to BNB on L2.
5050
this.tokenSymbol = _tokenSymbol === "WBNB" ? "BNB" : _tokenSymbol;
51+
52+
// Cast the input Signer | Provider to a Provider.
53+
this.l2Provider = l2SignerOrProvider instanceof Signer ? l2SignerOrProvider.provider : l2SignerOrProvider;
5154
}
5255

5356
async constructL1ToL2Txn(
@@ -137,12 +140,8 @@ export class BinanceCEXBridge extends BaseBridgeAdapter {
137140
return {};
138141
}
139142
// We must typecast the l2 signer or provider into specifically an ethers Provider type so we can call `getTransactionReceipt` and `getBlockByNumber` on it.
140-
const l2Provider =
141-
this.l2SignerOrProvider instanceof ethers.providers.Provider
142-
? (this.l2SignerOrProvider as ethers.providers.Provider)
143-
: (this.l2SignerOrProvider as ethers.Signer).provider;
144143
assert(l1Token.toAddress() === this.getL1Bridge().address);
145-
const fromTimestamp = (await getTimestampForBlock(l2Provider, eventConfig.fromBlock)) * 1_000; // Convert timestamp to ms.
144+
const fromTimestamp = (await getTimestampForBlock(this.l2Provider, eventConfig.fromBlock)) * 1_000; // Convert timestamp to ms.
146145

147146
const binanceApiClient = await this.getBinanceClient();
148147
// Fetch the deposit address from the binance API.
@@ -156,7 +155,7 @@ export class BinanceCEXBridge extends BaseBridgeAdapter {
156155
);
157156
const withdrawalTxReceipts = await mapAsync(
158157
withdrawalHistory.map((withdrawal) => withdrawal.txId as string),
159-
async (transactionHash) => l2Provider.getTransactionReceipt(transactionHash as string)
158+
async (transactionHash) => this.l2Provider.getTransactionReceipt(transactionHash as string)
160159
);
161160
const { decimals: l1Decimals } = getTokenInfo(l1Token.toAddress(), this.hubChainId);
162161

@@ -177,13 +176,9 @@ export class BinanceCEXBridge extends BaseBridgeAdapter {
177176
}
178177

179178
private async isL1OrL2Contract(address: EvmAddress): Promise<boolean> {
180-
const l2Provider =
181-
this.l2SignerOrProvider instanceof ethers.providers.Provider
182-
? (this.l2SignerOrProvider as ethers.providers.Provider)
183-
: (this.l2SignerOrProvider.provider as ethers.providers.Provider);
184179
const [isL1Contract, isL2Contract] = await Promise.all([
185180
isContractDeployedToAddress(address.toAddress(), this.l1Signer.provider),
186-
isContractDeployedToAddress(address.toAddress(), l2Provider),
181+
isContractDeployedToAddress(address.toAddress(), this.l2Provider),
187182
]);
188183
return isL1Contract || isL2Contract;
189184
}

src/adapter/bridges/BlastBridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export class BlastBridge extends BaseBridgeAdapter {
99
constructor(l2chainId: number, hubChainId: number, l1Signer: Signer, l2SignerOrProvider: Signer | Provider) {
1010
const { address: l1Address, abi: l1Abi } = CONTRACT_ADDRESSES[hubChainId].blastBridge;
1111
const { address: l2Address, abi: l2Abi } = CONTRACT_ADDRESSES[l2chainId].blastBridge;
12-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [EvmAddress.from(l1Address)]);
12+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(l1Address)]);
1313

1414
this.l1Bridge = new Contract(l1Address, l1Abi, l1Signer);
1515
this.l2Bridge = new Contract(l2Address, l2Abi, l2SignerOrProvider);

src/adapter/bridges/LineaBridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export class LineaBridge extends BaseBridgeAdapter {
77
constructor(l2chainId: number, hubChainId: number, l1Signer: Signer, l2SignerOrProvider: Signer | Provider) {
88
const { address: l1Address, abi: l1Abi } = CONTRACT_ADDRESSES[hubChainId].lineaL1TokenBridge;
99
const { address: l2Address, abi: l2Abi } = CONTRACT_ADDRESSES[l2chainId].lineaL2TokenBridge;
10-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [EvmAddress.from(l1Address)]);
10+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(l1Address)]);
1111

1212
this.l1Bridge = new Contract(l1Address, l1Abi, l1Signer);
1313
this.l2Bridge = new Contract(l2Address, l2Abi, l2SignerOrProvider);

src/adapter/bridges/LineaWethBridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class LineaWethBridge extends BaseBridgeAdapter {
2626
const { address: l1Address, abi: l1Abi } = CONTRACT_ADDRESSES[hubChainId].lineaMessageService;
2727
const { address: l2Address, abi: l2Abi } = CONTRACT_ADDRESSES[l2chainId].l2MessageService;
2828
const { address: atomicDepositorAddress, abi: atomicDepositorAbi } = CONTRACT_ADDRESSES[hubChainId].atomicDepositor;
29-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [EvmAddress.from(atomicDepositorAddress)]);
29+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(atomicDepositorAddress)]);
3030

3131
this.atomicDepositor = new Contract(atomicDepositorAddress, atomicDepositorAbi, l1Signer);
3232
this.l1Bridge = new Contract(l1Address, l1Abi, l1Signer);

src/adapter/bridges/OpStackDefaultErc20Bridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export class OpStackDefaultERC20Bridge extends BaseBridgeAdapter {
77
private readonly l2Gas = 200000;
88

99
constructor(l2chainId: number, hubChainId: number, l1Signer: Signer, l2SignerOrProvider: Signer | Provider) {
10-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [
10+
super(l2chainId, hubChainId, l1Signer, [
1111
EvmAddress.from(CONTRACT_ADDRESSES[hubChainId][`ovmStandardBridge_${l2chainId}`].address),
1212
]);
1313

src/adapter/bridges/OpStackUSDCBridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export class OpStackUSDCBridge extends BaseBridgeAdapter {
99
constructor(l2chainId: number, hubChainId: number, l1Signer: Signer, l2SignerOrProvider: Signer | Provider) {
1010
const { address: l1Address, abi: l1Abi } = CONTRACT_ADDRESSES[hubChainId][`opUSDCBridge_${l2chainId}`];
1111
const { address: l2Address, abi: l2Abi } = CONTRACT_ADDRESSES[l2chainId].opUSDCBridge;
12-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [EvmAddress.from(l1Address)]);
12+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(l1Address)]);
1313

1414
this.l1Bridge = new Contract(l1Address, l1Abi, l1Signer);
1515
this.l2Bridge = new Contract(l2Address, l2Abi, l2SignerOrProvider);

src/adapter/bridges/OpStackWethBridge.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export class OpStackWethBridge extends BaseBridgeAdapter {
3030
l2chainId,
3131
hubChainId,
3232
l1Signer,
33-
l2SignerOrProvider,
3433
// To keep existing logic, we should use atomic depositor as the l1 bridge
3534
[EvmAddress.from(CONTRACT_ADDRESSES[hubChainId].atomicDepositor.address)]
3635
);

src/adapter/bridges/PolygonERC20Bridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export class PolygonERC20Bridge extends BaseBridgeAdapter {
3333
// up-to-date.
3434
const { address: l1Address, abi: l1Abi } = CONTRACT_ADDRESSES[hubChainId].polygonBridge;
3535
const { address: l1GatewayAddress, abi: l1GatewayAbi } = CONTRACT_ADDRESSES[hubChainId].polygonRootChainManager;
36-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [EvmAddress.from(l1Address)]);
36+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(l1Address)]);
3737

3838
this.l1Bridge = new Contract(l1Address, l1Abi, l1Signer);
3939
this.l1Gateway = new Contract(l1GatewayAddress, l1GatewayAbi, l1Signer);

src/adapter/bridges/PolygonWethBridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export class PolygonWethBridge extends BaseBridgeAdapter {
3838
const { address: atomicDepositorAddress, abi: atomicDepositorAbi } = CONTRACT_ADDRESSES[hubChainId].atomicDepositor;
3939
const { address: rootChainManagerAddress, abi: rootChainManagerAbi } =
4040
CONTRACT_ADDRESSES[hubChainId].polygonRootChainManager;
41-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [EvmAddress.from(atomicDepositorAddress)]);
41+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(atomicDepositorAddress)]);
4242

4343
this.l1Bridge = new Contract(l1Address, l1Abi, l1Signer);
4444
this.atomicDepositor = new Contract(atomicDepositorAddress, atomicDepositorAbi, l1Signer);

src/adapter/bridges/ScrollERC20Bridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export class ScrollERC20Bridge extends BaseBridgeAdapter {
4444

4545
const { address: gasPriceOracleAddress, abi: gasPriceOracleAbi } =
4646
CONTRACT_ADDRESSES[hubChainId].scrollGasPriceOracle;
47-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [EvmAddress.from(l1Address)]);
47+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(l1Address)]);
4848

4949
this.l1Bridge = new Contract(l1BridgeAddress, l1Abi, l1Signer);
5050
this.l2Bridge = new Contract(l2BridgeAddress, l2Abi, l2SignerOrProvider);

src/adapter/bridges/SnxOptimismBridge.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ import { processEvent } from "../utils";
1414

1515
export class SnxOptimismBridge extends BaseBridgeAdapter {
1616
constructor(l2chainId: number, hubChainId: number, l1Signer: Signer, l2SignerOrProvider: Signer | Provider) {
17-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [
18-
EvmAddress.from(CONTRACT_ADDRESSES[hubChainId].snxOptimismBridge.address),
19-
]);
17+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(CONTRACT_ADDRESSES[hubChainId].snxOptimismBridge.address)]);
2018

2119
const { address: l1Address, abi: l1Abi } = CONTRACT_ADDRESSES[hubChainId].snxOptimismBridge;
2220
this.l1Bridge = new Contract(l1Address, l1Abi, l1Signer);

src/adapter/bridges/UsdcCCTPBridge.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ export class UsdcCCTPBridge extends BaseBridgeAdapter {
2424
private readonly l1UsdcTokenAddress: EvmAddress;
2525

2626
constructor(l2chainId: number, hubChainId: number, l1Signer: Signer, l2SignerOrProvider: Signer | Provider) {
27-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [
28-
EvmAddress.from(getCctpTokenMessenger(l2chainId, hubChainId).address),
29-
]);
27+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(getCctpTokenMessenger(l2chainId, hubChainId).address)]);
3028
assert(
3129
getCctpDomainForChainId(l2chainId) !== CCTP_NO_DOMAIN && getCctpDomainForChainId(hubChainId) !== CCTP_NO_DOMAIN,
3230
"Unknown CCTP domain ID"

src/adapter/bridges/UsdcTokenSplitterBridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export class UsdcTokenSplitterBridge extends BaseBridgeAdapter {
3232
l1Token
3333
);
3434

35-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [
35+
super(l2chainId, hubChainId, l1Signer, [
3636
EvmAddress.from(CONTRACT_ADDRESSES[hubChainId].cctpTokenMessenger.address),
3737
canonicalBridge.l1Gateways[0], // Canonical Bridge should have a single L1 Gateway.
3838
]);

src/adapter/bridges/ZKStackBridge.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export class ZKStackBridge extends BaseBridgeAdapter {
5050
_l1Token: EvmAddress
5151
) {
5252
const { address: sharedBridgeAddress, abi: sharedBridgeAbi } = CONTRACT_ADDRESSES[hubChainId].zkStackSharedBridge;
53-
super(l2chainId, hubChainId, l1Signer, l2SignerOrProvider, [EvmAddress.from(sharedBridgeAddress)]);
53+
super(l2chainId, hubChainId, l1Signer, [EvmAddress.from(sharedBridgeAddress)]);
5454
this.sharedBridge = new Contract(sharedBridgeAddress, sharedBridgeAbi, l1Signer);
5555

5656
const nativeToken = PUBLIC_NETWORKS[l2chainId].nativeToken;

src/common/Constants.ts

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -376,19 +376,12 @@ export const TOKEN_APPROVALS_TO_FIRST_ZERO: Record<number, string[]> = {
376376
],
377377
};
378378

379+
// Type alias for a function which takes in arbitrary arguments and outputs a BaseBridgeAdapter class.
380+
type L1BridgeConstructor<T extends BaseBridgeAdapter> = new (...args: any[]) => T;
381+
379382
// Map of chain IDs to all "canonical bridges" for the given chain. Canonical is loosely defined -- in this
380383
// case, it is the default bridge for the given chain.
381-
export const CANONICAL_BRIDGE: {
382-
[chainId: number]: {
383-
new (
384-
l2chainId: number,
385-
hubChainId: number,
386-
l1Signer: Signer,
387-
l2SignerOrProvider: Signer | Provider,
388-
l1Token?: EvmAddress
389-
): BaseBridgeAdapter;
390-
};
391-
} = {
384+
export const CANONICAL_BRIDGE: Record<number, L1BridgeConstructor<BaseBridgeAdapter>> = {
392385
[CHAIN_IDs.ALEPH_ZERO]: ArbitrumOrbitBridge,
393386
[CHAIN_IDs.ARBITRUM]: ArbitrumOrbitBridge,
394387
[CHAIN_IDs.BASE]: OpStackDefaultERC20Bridge,
@@ -442,19 +435,7 @@ export const CANONICAL_L2_BRIDGE: {
442435

443436
// Custom Bridges are all bridges between chains which only support a small number (typically one) of tokens.
444437
// In addition to mapping a chain to the custom bridges, we also need to specify which token the bridge supports.
445-
export const CUSTOM_BRIDGE: {
446-
[chainId: number]: {
447-
[tokenAddress: string]: {
448-
new (
449-
l2chainId: number,
450-
hubChainId: number,
451-
l1Signer: Signer,
452-
l2SignerOrProvider: Signer | Provider,
453-
l1Token?: EvmAddress
454-
): BaseBridgeAdapter;
455-
};
456-
};
457-
} = {
438+
export const CUSTOM_BRIDGE: Record<number, Record<string, L1BridgeConstructor<BaseBridgeAdapter>>> = {
458439
[CHAIN_IDs.ARBITRUM]: {
459440
[TOKEN_SYMBOLS_MAP.USDC.addresses[CHAIN_IDs.MAINNET]]: UsdcTokenSplitterBridge,
460441
},

0 commit comments

Comments
 (0)