Commit 77bd8dfc authored by Kelvin Fichter's avatar Kelvin Fichter

feat(sdk): refactor into single messenger class

parent ceea12f3
......@@ -45,7 +45,7 @@ export class DAIBridgeAdapter extends StandardBridgeAdapter {
type: 'function',
},
],
this.provider.l1Provider
this.messenger.l1Provider
)
const allowedL1Token = await l1Bridge.l1Token()
......
......@@ -10,7 +10,7 @@ import { hexStringEquals } from '@eth-optimism/core-utils'
import {
IBridgeAdapter,
ICrossChainProvider,
ICrossChainMessenger,
NumberLike,
AddressLike,
TokenBridgeMessage,
......@@ -22,7 +22,7 @@ import { toAddress } from '../utils'
* Bridge adapter for any token bridge that uses the standard token bridge interface.
*/
export class StandardBridgeAdapter implements IBridgeAdapter {
public provider: ICrossChainProvider
public messenger: ICrossChainMessenger
public l1Bridge: Contract
public l2Bridge: Contract
......@@ -30,25 +30,25 @@ export class StandardBridgeAdapter implements IBridgeAdapter {
* Creates a StandardBridgeAdapter instance.
*
* @param opts Options for the adapter.
* @param opts.provider Provider used to make queries related to cross-chain interactions.
* @param opts.messenger Provider used to make queries related to cross-chain interactions.
* @param opts.l1Bridge L1 bridge contract.
* @param opts.l2Bridge L2 bridge contract.
*/
constructor(opts: {
provider: ICrossChainProvider
messenger: ICrossChainMessenger
l1Bridge: AddressLike
l2Bridge: AddressLike
}) {
this.provider = opts.provider
this.messenger = opts.messenger
this.l1Bridge = new Contract(
toAddress(opts.l1Bridge),
getContractInterface('L1StandardBridge'),
this.provider.l1Provider
this.messenger.l1Provider
)
this.l2Bridge = new Contract(
toAddress(opts.l2Bridge),
getContractInterface('IL2ERC20Bridge'),
this.provider.l2Provider
this.messenger.l2Provider
)
}
......@@ -167,7 +167,7 @@ export class StandardBridgeAdapter implements IBridgeAdapter {
const contract = new Contract(
toAddress(l2Token),
getContractInterface('L2StandardERC20'),
this.provider.l2Provider
this.messenger.l2Provider
)
// Don't support ETH deposits or withdrawals via this bridge.
......@@ -287,7 +287,7 @@ export class StandardBridgeAdapter implements IBridgeAdapter {
overrides?: Overrides
}
): Promise<BigNumber> => {
return this.provider.l1Provider.estimateGas(
return this.messenger.l1Provider.estimateGas(
await this.populateTransaction.deposit(l1Token, l2Token, amount, opts)
)
},
......@@ -300,7 +300,7 @@ export class StandardBridgeAdapter implements IBridgeAdapter {
overrides?: Overrides
}
): Promise<BigNumber> => {
return this.provider.l2Provider.estimateGas(
return this.messenger.l2Provider.estimateGas(
await this.populateTransaction.withdraw(l1Token, l2Token, amount, opts)
)
},
......
This diff is collapsed.
This diff is collapsed.
export * from './interfaces'
export * from './utils'
export * from './cross-chain-provider'
export * from './cross-chain-messenger'
export * from './adapters'
......@@ -11,7 +11,7 @@ import {
MessageDirection,
TokenBridgeMessage,
} from './types'
import { ICrossChainProvider } from './cross-chain-provider'
import { ICrossChainMessenger } from './cross-chain-messenger'
/**
* Represents an adapter for an L1<>L2 token bridge. Each custom bridge currently needs its own
......@@ -21,7 +21,7 @@ export interface IBridgeAdapter {
/**
* Provider used to make queries related to cross-chain interactions.
*/
provider: ICrossChainProvider
messenger: ICrossChainMessenger
/**
* L1 bridge contract.
......
This diff is collapsed.
export * from './bridge-adapter'
export * from './cross-chain-messenger'
export * from './cross-chain-provider'
export * from './l2-provider'
export * from './types'
......@@ -6,7 +6,7 @@ import {
import { Signer } from '@ethersproject/abstract-signer'
import { Contract, BigNumber } from 'ethers'
import { ICrossChainProvider } from './cross-chain-provider'
import { ICrossChainMessenger } from './cross-chain-messenger'
import { IBridgeAdapter } from './bridge-adapter'
/**
......@@ -76,7 +76,7 @@ export interface OEContractsLike {
export interface BridgeAdapterData {
[name: string]: {
Adapter: new (opts: {
provider: ICrossChainProvider
messenger: ICrossChainMessenger
l1Bridge: AddressLike
l2Bridge: AddressLike
}) => IBridgeAdapter
......
......@@ -5,27 +5,32 @@ import {
TransactionReceipt,
TransactionResponse,
} from '@ethersproject/abstract-provider'
import { Signer } from '@ethersproject/abstract-signer'
import { ethers, BigNumber } from 'ethers'
import {
ProviderLike,
SignerOrProviderLike,
TransactionLike,
NumberLike,
AddressLike,
} from '../interfaces'
/**
* Converts a ProviderLike into a provider. Assumes that if the ProviderLike is a string then
* it is a JSON-RPC url.
* Converts a SignerOrProviderLike into a Signer or a Provider. Assumes that if the input is a
* string then it is a JSON-RPC url.
*
* @param provider ProviderLike to turn into a provider.
* @returns ProviderLike as a provider.
* @param signerOrProvider SignerOrProviderLike to turn into a Signer or Provider.
* @returns Input as a Signer or Provider.
*/
export const toProvider = (provider: ProviderLike): Provider => {
if (typeof provider === 'string') {
return new ethers.providers.JsonRpcProvider(provider)
} else if (Provider.isProvider(provider)) {
return provider
export const toSignerOrProvider = (
signerOrProvider: SignerOrProviderLike
): Signer | Provider => {
if (typeof signerOrProvider === 'string') {
return new ethers.providers.JsonRpcProvider(signerOrProvider)
} else if (Provider.isProvider(signerOrProvider)) {
return signerOrProvider as Provider
} else if (Signer.isSigner(signerOrProvider)) {
return signerOrProvider as Signer
} else {
throw new Error('Invalid provider')
}
......
......@@ -12,7 +12,7 @@ import {
AddressLike,
BridgeAdapters,
BridgeAdapterData,
ICrossChainProvider,
ICrossChainMessenger,
} from '../interfaces'
import {
StandardBridgeAdapter,
......@@ -291,14 +291,14 @@ export const getAllOEContracts = (
* Gets a series of bridge adapters for the given L1 chain ID.
*
* @param l1ChainId L1 chain ID for the L1 network where the custom bridges are deployed.
* @param provider Cross chain provider to connect to the bridge adapters
* @param messenger Cross chain messenger to connect to the bridge adapters
* @param opts Additional options for connecting to the custom bridges.
* @param opts.overrides Custom bridge adapters.
* @returns An object containing all bridge adapters
*/
export const getBridgeAdapters = (
l1ChainId: number,
provider: ICrossChainProvider,
messenger: ICrossChainMessenger,
opts?: {
overrides?: BridgeAdapterData
}
......@@ -309,7 +309,7 @@ export const getBridgeAdapters = (
...(opts?.overrides || {}),
})) {
adapters[bridgeName] = new bridgeData.Adapter({
provider,
messenger,
l1Bridge: bridgeData.l1Bridge,
l2Bridge: bridgeData.l2Bridge,
})
......
This diff is collapsed.
......@@ -3,17 +3,17 @@ import { Contract } from 'ethers'
import { ethers } from 'hardhat'
import { expect } from '../setup'
import { toProvider, toTransactionHash } from '../../src'
import { toSignerOrProvider, toTransactionHash } from '../../src'
describe('type coercion utils', () => {
describe('toProvider', () => {
describe('toSignerOrProvider', () => {
it('should convert a string to a JsonRpcProvider', () => {
const provider = toProvider('http://localhost:8545')
const provider = toSignerOrProvider('http://localhost:8545')
expect(Provider.isProvider(provider)).to.be.true
})
it('should not do anything with a provider', () => {
const provider = toProvider(ethers.provider)
const provider = toSignerOrProvider(ethers.provider)
expect(provider).to.deep.equal(ethers.provider)
})
})
......
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