-
Notifications
You must be signed in to change notification settings - Fork 3.8k
Contracts: connectL1Contracts & connectL2Contracts #713
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 56 commits
fe2db8b
7b989f3
c0cea77
d642cc4
0313ffe
5cbf73d
1603d36
9579011
124ddc7
018b7a6
1c729b2
0f9b310
ae767c5
55d9185
34e72c5
d160c62
3623970
c17c23b
4c95bd1
a2a7979
a4f4669
dd5d8c3
896215f
a427428
da6b1ee
f7bf8ad
63fdc73
091c51f
1473872
cb8758e
a5f5ddb
0676535
c83a925
5fe6611
270b2be
e7fe03a
9d2ff99
ce54f66
673716d
f4a7e90
fcf9f94
5794bcf
69c3b39
a8752e5
7f64a4c
4e35993
5e1f9f0
4e5ad78
485bbd5
30c0477
119d69c
7421d2e
b9f5bb7
3ec6749
8f20999
203d31c
7c9be02
307cc99
6ebdc72
da2d549
86eead5
70ae054
d7b60db
89e886c
88bacaf
9520802
41ed33f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| --- | ||
| '@eth-optimism/contracts': minor | ||
| --- | ||
|
|
||
| "Adds connectL1Contracts and connectL2Contracts utility functions" | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,123 @@ | ||
| import { Signer, Contract, providers, ethers } from 'ethers' | ||
| import { Provider } from '@ethersproject/abstract-provider' | ||
| import { getL1ContractData, getL2ContractData } from './contract-data' | ||
|
|
||
| export type Network = 'goerli' | 'kovan' | 'mainnet' | ||
| interface L1Contracts { | ||
| addressManager: Contract | ||
smartcontracts marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| canonicalTransactionChain: Contract | ||
| executionManager: Contract | ||
| fraudVerifier: Contract | ||
| ethGateway: Contract | ||
| multiMessageRelayer: Contract | ||
| stateCommitmentChain: Contract | ||
| xDomainMessengerProxy: Contract | ||
| l1EthGatewayProxy: Contract | ||
| bondManager: Contract | ||
| } | ||
|
|
||
| interface L2Contracts { | ||
| eth: Contract | ||
| xDomainMessenger: Contract | ||
| messagePasser: Contract | ||
| messageSender: Contract | ||
| deployerWhiteList: Contract | ||
| ecdsaContractAccount: Contract | ||
| sequencerEntrypoint: Contract | ||
| erc1820Registry: Contract | ||
| addressManager: Contract | ||
| } | ||
|
|
||
| /** | ||
| * Validates user provided a singer or provider & throws error if not | ||
| * @param signerOrProvider | ||
| */ | ||
| const checkSignerType = (signerOrProvider: Signer | Provider) => { | ||
smartcontracts marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| if (!signerOrProvider) { | ||
| throw Error('signerOrProvider argument is undefined') | ||
| } | ||
| if ( | ||
| !Provider.isProvider(signerOrProvider) && | ||
| !Signer.isSigner(signerOrProvider) | ||
| ) { | ||
| throw Error('signerOrProvider argument is the wrong type') | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * Connects a signer/provider to layer 1 contracts on a given network | ||
| * @param signerOrProvider ethers signer or provider | ||
| * @param network string denoting network | ||
| * @returns l1 contracts connected to signer/provider | ||
| */ | ||
| export const connectL1Contracts = async ( | ||
| signerOrProvider: Signer | Provider, | ||
| network: Network | ||
| ): Promise<L1Contracts> => { | ||
| checkSignerType(signerOrProvider) | ||
|
|
||
| console.log(network) | ||
gigamesh marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| if (!['mainnet', 'kovan', 'goerli'].includes(network)) { | ||
| throw Error('Must specify network: mainnet, kovan, or goerli.') | ||
| } | ||
|
|
||
| const l1ContractData = getL1ContractData(network) | ||
|
|
||
| const toEthersContract = (data) => | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nit: this function is defined twice
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's technically 2 definitions. The signerOrProvider comes from outside its scope. I don't have a strong preference but Liam asked for several changes to minimize code. If the signerOrProvider is required as an argument, it results in a lot of repetition and ends up kind of becoming a pointless helper.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does making |
||
| new Contract(data.address, data.abi, signerOrProvider) | ||
|
|
||
| return { | ||
| addressManager: toEthersContract(l1ContractData.Lib_AddressManager), | ||
| canonicalTransactionChain: toEthersContract( | ||
| l1ContractData.OVM_CanonicalTransactionChain | ||
| ), | ||
| executionManager: toEthersContract(l1ContractData.OVM_ExecutionManager), | ||
| fraudVerifier: toEthersContract(l1ContractData.OVM_FraudVerifier), | ||
| ethGateway: toEthersContract(l1ContractData.OVM_L1ETHGateway), | ||
| multiMessageRelayer: toEthersContract( | ||
| l1ContractData.OVM_L1MultiMessageRelayer | ||
| ), | ||
| stateCommitmentChain: toEthersContract( | ||
| l1ContractData.OVM_StateCommitmentChain | ||
| ), | ||
| xDomainMessengerProxy: toEthersContract( | ||
| l1ContractData.Proxy__OVM_L1CrossDomainMessenger | ||
| ), | ||
| l1EthGatewayProxy: toEthersContract(l1ContractData.Proxy__OVM_L1ETHGateway), | ||
| // TODO: update this with actual bond manager when its ready | ||
| bondManager: toEthersContract(l1ContractData.mockOVM_BondManager), | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * Connects a signer/provider to layer 2 contracts (network agnostic) | ||
| * @param signerOrProvider ethers signer or provider | ||
| * @returns l2 contracts connected to signer/provider | ||
| */ | ||
| export const connectL2Contracts = async ( | ||
| signerOrProvider | ||
| ): Promise<L2Contracts> => { | ||
| const l2ContractData = await getL2ContractData() | ||
| checkSignerType(signerOrProvider) | ||
|
|
||
| const toEthersContract = (data) => | ||
| new Contract(data.address, data.abi, signerOrProvider) | ||
|
|
||
| return { | ||
| eth: toEthersContract(l2ContractData.OVM_ETH), | ||
| xDomainMessenger: toEthersContract( | ||
| l2ContractData.OVM_L2CrossDomainMessenger | ||
| ), | ||
| messagePasser: toEthersContract(l2ContractData.OVM_L2ToL1MessagePasser), | ||
| messageSender: toEthersContract(l2ContractData.OVM_L1MessageSender), | ||
| deployerWhiteList: toEthersContract(l2ContractData.OVM_DeployerWhitelist), | ||
| ecdsaContractAccount: toEthersContract( | ||
| l2ContractData.OVM_ECDSAContractAccount | ||
| ), | ||
| sequencerEntrypoint: toEthersContract( | ||
| l2ContractData.OVM_SequencerEntrypoint | ||
| ), | ||
| erc1820Registry: toEthersContract(l2ContractData.ERC1820Registry), | ||
| addressManager: toEthersContract(l2ContractData.Lib_AddressManager), | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,179 @@ | ||
| import { predeploys as l2Addresses } from './predeploys' | ||
| import { Network } from './connect-contracts' | ||
|
|
||
| /** | ||
| * This file is necessarily not DRY because it needs to be usable | ||
| * in a browser context and can't take advantage of dynamic imports | ||
| * (ie: the json needs to all be imported when transpiled) | ||
| */ | ||
|
|
||
| const Mainnet__Lib_AddressManager = require('../deployments/mainnet/Lib_AddressManager.json') | ||
smartcontracts marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| const Mainnet__OVM_CanonicalTransactionChain = require('../deployments/mainnet/OVM_CanonicalTransactionChain.json') | ||
| const Mainnet__OVM_ExecutionManager = require('../deployments/mainnet/OVM_ExecutionManager.json') | ||
| const Mainnet__OVM_FraudVerifier = require('../deployments/mainnet/OVM_FraudVerifier.json') | ||
| const Mainnet__OVM_L1CrossDomainMessenger = require('../deployments/mainnet/OVM_L1CrossDomainMessenger.json') | ||
| const Mainnet__OVM_L1ETHGateway = require('../deployments/mainnet/OVM_L1ETHGateway.json') | ||
| const Mainnet__OVM_L1MultiMessageRelayer = require('../deployments/mainnet/OVM_L1MultiMessageRelayer.json') | ||
| const Mainnet__OVM_SafetyChecker = require('../deployments/mainnet/OVM_SafetyChecker.json') | ||
| const Mainnet__OVM_StateCommitmentChain = require('../deployments/mainnet/OVM_StateCommitmentChain.json') | ||
| const Mainnet__OVM_StateManagerFactory = require('../deployments/mainnet/OVM_StateManagerFactory.json') | ||
| const Mainnet__OVM_StateTransitionerFactory = require('../deployments/mainnet/OVM_StateTransitionerFactory.json') | ||
| const Mainnet__Proxy__OVM_L1CrossDomainMessenger = require('../deployments/mainnet/Proxy__OVM_L1CrossDomainMessenger.json') | ||
| const Mainnet__Proxy__OVM_L1ETHGateway = require('../deployments/mainnet/Proxy__OVM_L1ETHGateway.json') | ||
| const Mainnet__mockOVM_BondManager = require('../deployments/mainnet/mockOVM_BondManager.json') | ||
|
|
||
| const Kovan__Lib_AddressManager = require('../deployments/kovan/Lib_AddressManager.json') | ||
| const Kovan__OVM_CanonicalTransactionChain = require('../deployments/kovan/OVM_CanonicalTransactionChain.json') | ||
| const Kovan__OVM_ExecutionManager = require('../deployments/kovan/OVM_ExecutionManager.json') | ||
| const Kovan__OVM_FraudVerifier = require('../deployments/kovan/OVM_FraudVerifier.json') | ||
| const Kovan__OVM_L1CrossDomainMessenger = require('../deployments/kovan/OVM_L1CrossDomainMessenger.json') | ||
| const Kovan__OVM_L1ETHGateway = require('../deployments/kovan/OVM_L1ETHGateway.json') | ||
| const Kovan__OVM_L1MultiMessageRelayer = require('../deployments/kovan/OVM_L1MultiMessageRelayer.json') | ||
| const Kovan__OVM_SafetyChecker = require('../deployments/kovan/OVM_SafetyChecker.json') | ||
| const Kovan__OVM_StateCommitmentChain = require('../deployments/kovan/OVM_StateCommitmentChain.json') | ||
| const Kovan__OVM_StateManagerFactory = require('../deployments/kovan/OVM_StateManagerFactory.json') | ||
| const Kovan__OVM_StateTransitionerFactory = require('../deployments/kovan/OVM_StateTransitionerFactory.json') | ||
| const Kovan__Proxy__OVM_L1CrossDomainMessenger = require('../deployments/kovan/Proxy__OVM_L1CrossDomainMessenger.json') | ||
| const Kovan__Proxy__OVM_L1ETHGateway = require('../deployments/kovan/Proxy__OVM_L1ETHGateway.json') | ||
| const Kovan__mockOVM_BondManager = require('../deployments/kovan/mockOVM_BondManager.json') | ||
|
|
||
| const Goerli__Lib_AddressManager = require('../deployments/goerli/Lib_AddressManager.json') | ||
| const Goerli__OVM_CanonicalTransactionChain = require('../deployments/goerli/OVM_CanonicalTransactionChain.json') | ||
| const Goerli__OVM_ExecutionManager = require('../deployments/goerli/OVM_ExecutionManager.json') | ||
| const Goerli__OVM_FraudVerifier = require('../deployments/goerli/OVM_FraudVerifier.json') | ||
| const Goerli__OVM_L1CrossDomainMessenger = require('../deployments/goerli/OVM_L1CrossDomainMessenger.json') | ||
| const Goerli__OVM_L1ETHGateway = require('../deployments/goerli/OVM_L1ETHGateway.json') | ||
| const Goerli__OVM_L1MultiMessageRelayer = require('../deployments/goerli/OVM_L1MultiMessageRelayer.json') | ||
| const Goerli__OVM_SafetyChecker = require('../deployments/goerli/OVM_SafetyChecker.json') | ||
| const Goerli__OVM_StateCommitmentChain = require('../deployments/goerli/OVM_StateCommitmentChain.json') | ||
| const Goerli__OVM_StateManagerFactory = require('../deployments/goerli/OVM_StateManagerFactory.json') | ||
| const Goerli__OVM_StateTransitionerFactory = require('../deployments/goerli/OVM_StateTransitionerFactory.json') | ||
| const Goerli__Proxy__OVM_L1CrossDomainMessenger = require('../deployments/goerli/Proxy__OVM_L1CrossDomainMessenger.json') | ||
| const Goerli__Proxy__OVM_L1ETHGateway = require('../deployments/goerli/Proxy__OVM_L1ETHGateway.json') | ||
| const Goerli__mockOVM_BondManager = require('../deployments/goerli/mockOVM_BondManager.json') | ||
|
|
||
| export const getL1ContractData = (network: Network) => { | ||
| return { | ||
| Lib_AddressManager: { | ||
| mainnet: Mainnet__Lib_AddressManager, | ||
| kovan: Kovan__Lib_AddressManager, | ||
| goerli: Goerli__Lib_AddressManager, | ||
| }[network], | ||
| OVM_CanonicalTransactionChain: { | ||
| mainnet: Mainnet__OVM_CanonicalTransactionChain, | ||
| kovan: Kovan__OVM_CanonicalTransactionChain, | ||
| goerli: Goerli__OVM_CanonicalTransactionChain, | ||
| }[network], | ||
| OVM_ExecutionManager: { | ||
| mainnet: Mainnet__OVM_ExecutionManager, | ||
| kovan: Kovan__OVM_ExecutionManager, | ||
| goerli: Goerli__OVM_ExecutionManager, | ||
| }[network], | ||
| OVM_FraudVerifier: { | ||
| mainnet: Mainnet__OVM_FraudVerifier, | ||
| kovan: Kovan__OVM_FraudVerifier, | ||
| goerli: Goerli__OVM_FraudVerifier, | ||
| }[network], | ||
| OVM_L1CrossDomainMessenger: { | ||
| mainnet: Mainnet__OVM_L1CrossDomainMessenger, | ||
| kovan: Kovan__OVM_L1CrossDomainMessenger, | ||
| goerli: Goerli__OVM_L1CrossDomainMessenger, | ||
| }[network], | ||
| OVM_L1ETHGateway: { | ||
| mainnet: Mainnet__OVM_L1ETHGateway, | ||
| kovan: Kovan__OVM_L1ETHGateway, | ||
| goerli: Goerli__OVM_L1ETHGateway, | ||
| }[network], | ||
| OVM_L1MultiMessageRelayer: { | ||
| mainnet: Mainnet__OVM_L1MultiMessageRelayer, | ||
| kovan: Kovan__OVM_L1MultiMessageRelayer, | ||
| goerli: Goerli__OVM_L1MultiMessageRelayer, | ||
| }[network], | ||
| OVM_SafetyChecker: { | ||
| mainnet: Mainnet__OVM_SafetyChecker, | ||
| kovan: Kovan__OVM_SafetyChecker, | ||
| goerli: Goerli__OVM_SafetyChecker, | ||
| }[network], | ||
| OVM_StateCommitmentChain: { | ||
| mainnet: Mainnet__OVM_StateCommitmentChain, | ||
| kovan: Kovan__OVM_StateCommitmentChain, | ||
| goerli: Goerli__OVM_StateCommitmentChain, | ||
| }[network], | ||
| OVM_StateManagerFactory: { | ||
| mainnet: Mainnet__OVM_StateManagerFactory, | ||
| kovan: Kovan__OVM_StateManagerFactory, | ||
| goerli: Goerli__OVM_StateManagerFactory, | ||
| }[network], | ||
| OVM_StateTransitionerFactory: { | ||
| mainnet: Mainnet__OVM_StateTransitionerFactory, | ||
| kovan: Kovan__OVM_StateTransitionerFactory, | ||
| goerli: Goerli__OVM_StateTransitionerFactory, | ||
| }[network], | ||
| Proxy__OVM_L1CrossDomainMessenger: { | ||
| mainnet: Mainnet__Proxy__OVM_L1CrossDomainMessenger, | ||
| kovan: Kovan__Proxy__OVM_L1CrossDomainMessenger, | ||
| goerli: Goerli__Proxy__OVM_L1CrossDomainMessenger, | ||
| }[network], | ||
| Proxy__OVM_L1ETHGateway: { | ||
| mainnet: Mainnet__Proxy__OVM_L1ETHGateway, | ||
| kovan: Kovan__Proxy__OVM_L1ETHGateway, | ||
| goerli: Goerli__Proxy__OVM_L1ETHGateway, | ||
| }[network], | ||
| mockOVM_BondManager: { | ||
| mainnet: Mainnet__mockOVM_BondManager, | ||
| kovan: Kovan__mockOVM_BondManager, | ||
| goerli: Goerli__mockOVM_BondManager, | ||
| }[network], | ||
| } | ||
| } | ||
|
|
||
| const OVM_ETH = require('../artifacts-ovm/contracts/optimistic-ethereum/OVM/predeploys/OVM_ETH.sol/OVM_ETH.json') | ||
| const OVM_L2CrossDomainMessenger = require('../artifacts-ovm/contracts/optimistic-ethereum/OVM/bridge/messaging/OVM_L2CrossDomainMessenger.sol/OVM_L2CrossDomainMessenger.json') | ||
| const OVM_L2ToL1MessagePasser = require('../artifacts-ovm/contracts/optimistic-ethereum/OVM/predeploys/OVM_L2ToL1MessagePasser.sol/OVM_L2ToL1MessagePasser.json') | ||
| const OVM_L1MessageSender = require('../artifacts-ovm/contracts/optimistic-ethereum/OVM/predeploys/OVM_L1MessageSender.sol/OVM_L1MessageSender.json') | ||
| const OVM_DeployerWhitelist = require('../artifacts-ovm/contracts/optimistic-ethereum/OVM/predeploys/OVM_DeployerWhitelist.sol/OVM_DeployerWhitelist.json') | ||
| const OVM_ECDSAContractAccount = require('../artifacts-ovm/contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol/OVM_ECDSAContractAccount.json') | ||
| const OVM_SequencerEntrypoint = require('../artifacts-ovm/contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol/OVM_SequencerEntrypoint.json') | ||
| const ERC1820Registry = require('../artifacts-ovm/contracts/optimistic-ethereum/OVM/predeploys/ERC1820Registry.sol/ERC1820Registry.json') | ||
| const Lib_AddressManager = require('../artifacts-ovm/contracts/optimistic-ethereum/libraries/resolver/Lib_AddressManager.sol/Lib_AddressManager.json') | ||
|
|
||
| export const getL2ContractData = () => { | ||
| return { | ||
| OVM_ETH: { | ||
| abi: OVM_ETH.abi, | ||
| address: l2Addresses.OVM_ETH, | ||
| }, | ||
| OVM_L2CrossDomainMessenger: { | ||
| abi: OVM_L2CrossDomainMessenger.abi, | ||
| address: l2Addresses.OVM_L2CrossDomainMessenger, | ||
| }, | ||
| OVM_L2ToL1MessagePasser: { | ||
| abi: OVM_L2ToL1MessagePasser.abi, | ||
| address: l2Addresses.OVM_L2ToL1MessagePasser, | ||
| }, | ||
| OVM_L1MessageSender: { | ||
| abi: OVM_L1MessageSender.abi, | ||
| address: l2Addresses.OVM_L1MessageSender, | ||
| }, | ||
| OVM_DeployerWhitelist: { | ||
| abi: OVM_DeployerWhitelist.abi, | ||
| address: l2Addresses.OVM_DeployerWhitelist, | ||
| }, | ||
| OVM_ECDSAContractAccount: { | ||
| abi: OVM_ECDSAContractAccount.abi, | ||
| address: l2Addresses.OVM_ECDSAContractAccount, | ||
| }, | ||
| OVM_SequencerEntrypoint: { | ||
| abi: OVM_SequencerEntrypoint.abi, | ||
| address: l2Addresses.OVM_SequencerEntrypoint, | ||
| }, | ||
| ERC1820Registry: { | ||
| abi: ERC1820Registry.abi, | ||
| address: l2Addresses.ERC1820Registry, | ||
| }, | ||
| Lib_AddressManager: { | ||
| abi: Lib_AddressManager.abi, | ||
| address: l2Addresses.Lib_AddressManager, | ||
| }, | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be a
patch