Commit 3fd956f4 authored by smartcontracts's avatar smartcontracts Committed by GitHub

Merge pull request #8155 from ethereum-optimism/sc/sdk-bridge-check-bug

fix(sdk): bug in supportsTokenPair
parents 38c102aa 2534eabb
---
'@eth-optimism/sdk': patch
---
Fixed bug with tokenBridge checks throwing
...@@ -156,46 +156,33 @@ export class StandardBridgeAdapter implements IBridgeAdapter { ...@@ -156,46 +156,33 @@ export class StandardBridgeAdapter implements IBridgeAdapter {
l1Token: AddressLike, l1Token: AddressLike,
l2Token: AddressLike l2Token: AddressLike
): Promise<boolean> { ): Promise<boolean> {
try { const contract = new Contract(
const contract = new Contract( toAddress(l2Token),
toAddress(l2Token), optimismMintableERC20.abi,
optimismMintableERC20.abi, this.messenger.l2Provider
this.messenger.l2Provider )
) // Don't support ETH deposits or withdrawals via this bridge.
// Don't support ETH deposits or withdrawals via this bridge. if (
if ( hexStringEquals(toAddress(l1Token), ethers.constants.AddressZero) ||
hexStringEquals(toAddress(l1Token), ethers.constants.AddressZero) || hexStringEquals(toAddress(l2Token), predeploys.OVM_ETH)
hexStringEquals(toAddress(l2Token), predeploys.OVM_ETH) ) {
) { return false
return false }
}
// Make sure the L1 token matches.
const remoteL1Token = await contract.l1Token()
if (!hexStringEquals(remoteL1Token, toAddress(l1Token))) { // Make sure the L1 token matches.
return false const remoteL1Token = await contract.l1Token()
}
// Make sure the L2 bridge matches. if (!hexStringEquals(remoteL1Token, toAddress(l1Token))) {
const remoteL2Bridge = await contract.l2Bridge() return false
if (!hexStringEquals(remoteL2Bridge, this.l2Bridge.address)) { }
return false
}
return true // Make sure the L2 bridge matches.
} catch (err) { const remoteL2Bridge = await contract.l2Bridge()
// If the L2 token is not an L2StandardERC20, it may throw an error. If there's a call if (!hexStringEquals(remoteL2Bridge, this.l2Bridge.address)) {
// exception then we assume that the token is not supported. Other errors are thrown. Since
// the JSON-RPC API is not well-specified, we need to handle multiple possible error codes.
if (
!err?.message?.toString().includes('CALL_EXCEPTION') &&
!err?.stack?.toString().includes('execution reverted')
) {
console.error('Unexpected error when checking bridge', err)
}
return false return false
} }
return true
} }
public async approval( public async approval(
......
...@@ -490,8 +490,17 @@ export class CrossChainMessenger { ...@@ -490,8 +490,17 @@ export class CrossChainMessenger {
): Promise<IBridgeAdapter> { ): Promise<IBridgeAdapter> {
const bridges: IBridgeAdapter[] = [] const bridges: IBridgeAdapter[] = []
for (const bridge of Object.values(this.bridges)) { for (const bridge of Object.values(this.bridges)) {
if (await bridge.supportsTokenPair(l1Token, l2Token)) { try {
bridges.push(bridge) if (await bridge.supportsTokenPair(l1Token, l2Token)) {
bridges.push(bridge)
}
} catch (err) {
if (
!err?.message?.toString().includes('CALL_EXCEPTION') &&
!err?.stack?.toString().includes('execution reverted')
) {
console.error('Unexpected error when checking bridge', err)
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment