Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ jobs:
- checkout
- install-just
- run: just lint-all
- run:
name: check git tree is clean
command: git diff --exit-code
golang-modules-tidy:
executor:
name: go/default # is based on cimg/go
Expand Down
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Your chain must be listed in https://github.com/ethereum-lists/chains
# And you must use the exact same name in this field:
SCR_CHAIN_NAME=awesomechain
SCR_CHAIN_NAME="awesomechain"

# The superchain that this chain will belong to (mainnet or sepolia)
SCR_SUPERCHAIN_TARGET=mainnet
Expand Down
194 changes: 68 additions & 126 deletions add-chain/addresses.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package main

import (
"encoding/json"
"errors"
"fmt"
"os"
"path/filepath"
"strings"

"github.com/BurntSushi/toml"
"github.com/ethereum-optimism/superchain-registry/superchain"
Expand All @@ -15,195 +15,137 @@ type AddressData struct {
Address string `json:"address"`
}

var (
// Addresses to retrieve from JSON
AddressManager = "AddressManager"
L1CrossDomainMessengerProxy = "L1CrossDomainMessengerProxy"
L1ERC721BridgeProxy = "L1ERC721BridgeProxy"
L1StandardBridgeProxy = "L1StandardBridgeProxy"
OptimismMintableERC20FactoryProxy = "OptimismMintableERC20FactoryProxy"
SystemConfigProxy = "SystemConfigProxy"
OptimismPortalProxy = "OptimismPortalProxy"
ProxyAdmin = "ProxyAdmin"

// Addresses to retrieve from chain
SuperchainConfig = "SuperchainConfig"
Guardian = "Guardian"
Challenger = "Challenger"
ProxyAdminOwner = "ProxyAdminOwner"
SystemConfigOwner = "SystemConfigOwner"
Proposer = "Proposer"
UnsafeBlockSigner = "UnsafeBlockSigner"
BatchSubmitter = "BatchSubmitter"

// Non Fault Proof contracts
L2OutputOracleProxy = "L2OutputOracleProxy"

// Fault Proof contracts:
AnchorStateRegistryProxy = "AnchorStateRegistryProxy"
DelayedWETHProxy = "DelayedWETHProxy"
DisputeGameFactoryProxy = "DisputeGameFactoryProxy"
FaultDisputeGame = "FaultDisputeGame"
MIPS = "MIPS"
PermissionedDisputeGame = "PermissionedDisputeGame"
PreimageOracle = "PreimageOracle"
)

func readAddressesFromChain(addresses map[string]string, l1RpcUrl string, isFaultProofs bool) error {
func readAddressesFromChain(addresses *superchain.AddressList, l1RpcUrl string, isFaultProofs bool) error {
Comment thread
bitwiseguy marked this conversation as resolved.
// SuperchainConfig
address, err := castCall(addresses[OptimismPortalProxy], "superchainConfig()(address)", l1RpcUrl)
if err != nil {
addresses[SuperchainConfig] = ""
} else {
addresses[SuperchainConfig] = address
address, err := castCall(addresses.OptimismPortalProxy, "superchainConfig()(address)", l1RpcUrl)
if err == nil {
addresses.SuperchainConfig = superchain.MustHexToAddress(address)
}

// Guardian
address, err = castCall(addresses[SuperchainConfig], "guardian()(address)", l1RpcUrl)
address, err = castCall(addresses.SuperchainConfig, "guardian()(address)", l1RpcUrl)
if err != nil {
address, err = castCall(addresses[OptimismPortalProxy], "guardian()(address)", l1RpcUrl)
address, err = castCall(addresses.OptimismPortalProxy, "guardian()(address)", l1RpcUrl)
if err != nil {
return fmt.Errorf("could not retrieve address for Guardian %w", err)
}
}
addresses[Guardian] = address
addresses.Guardian = superchain.MustHexToAddress(address)

// ProxyAdminOwner
address, err = castCall(addresses[ProxyAdmin], "owner()(address)", l1RpcUrl)
address, err = castCall(addresses.ProxyAdmin, "owner()(address)", l1RpcUrl)
if err != nil {
return fmt.Errorf("could not retrieve address for ProxyAdminOwner")
}
addresses[ProxyAdminOwner] = address
addresses.ProxyAdminOwner = superchain.MustHexToAddress(address)

// SystemConfigOwner
address, err = castCall(addresses[SystemConfigProxy], "owner()(address)", l1RpcUrl)
address, err = castCall(addresses.SystemConfigProxy, "owner()(address)", l1RpcUrl)
if err != nil {
return fmt.Errorf("could not retrieve address for SystemConfigOwner")
}
addresses[SystemConfigOwner] = address
addresses.SystemConfigOwner = superchain.MustHexToAddress(address)

// UnsafeBlockSigner
address, err = castCall(addresses[SystemConfigProxy], "unsafeBlockSigner()(address)", l1RpcUrl)
address, err = castCall(addresses.SystemConfigProxy, "unsafeBlockSigner()(address)", l1RpcUrl)
if err != nil {
return fmt.Errorf("could not retrieve address for UnsafeBlockSigner")
}
addresses[UnsafeBlockSigner] = address
addresses.UnsafeBlockSigner = superchain.MustHexToAddress(address)

// BatchSubmitter
hash, err := castCall(addresses[SystemConfigProxy], "batcherHash()(bytes32)", l1RpcUrl)
hash, err := castCall(addresses.SystemConfigProxy, "batcherHash()(bytes32)", l1RpcUrl)
if err != nil {
return fmt.Errorf("could not retrieve batcherHash")
}
addresses[BatchSubmitter] = "0x" + hash[26:66]
batchSubmitter := "0x" + hash[26:66]
addresses.BatchSubmitter = superchain.MustHexToAddress(batchSubmitter)

if isFaultProofs {
// Proposer
address, err = castCall(addresses[PermissionedDisputeGame], "proposer()(address)", l1RpcUrl)
address, err = castCall(addresses.PermissionedDisputeGame, "proposer()(address)", l1RpcUrl)
if err != nil {
return fmt.Errorf("could not retrieve address for Proposer")
}
addresses[Proposer] = address
addresses.Proposer = superchain.MustHexToAddress(address)

// Challenger
address, err = castCall(addresses[PermissionedDisputeGame], "challenger()(address)", l1RpcUrl)
address, err = castCall(addresses.PermissionedDisputeGame, "challenger()(address)", l1RpcUrl)
if err != nil {
return fmt.Errorf("could not retrieve address for Challenger")
}
addresses[Challenger] = address
addresses.Challenger = superchain.MustHexToAddress(address)
} else {
// Proposer
address, err = castCall(addresses[L2OutputOracleProxy], "PROPOSER()(address)", l1RpcUrl)
address, err = castCall(addresses.L2OutputOracleProxy, "PROPOSER()(address)", l1RpcUrl)
if err != nil {
return fmt.Errorf("could not retrieve address for Proposer")
}
addresses[Proposer] = address
addresses.Proposer = superchain.MustHexToAddress(address)

// Challenger
address, err = castCall(addresses[L2OutputOracleProxy], "CHALLENGER()(address)", l1RpcUrl)
address, err = castCall(addresses.L2OutputOracleProxy, "CHALLENGER()(address)", l1RpcUrl)
if err != nil {
return fmt.Errorf("could not retrieve address for Challenger")
}
addresses[Challenger] = address
addresses.Challenger = superchain.MustHexToAddress(address)
}

fmt.Printf("Addresses read from chain\n")
return nil
}

func readAddressesFromJSON(contractAddresses map[string]string, deploymentsDir string) error {
contractsFromJSON := []string{
AddressManager,
L1CrossDomainMessengerProxy,
L1ERC721BridgeProxy,
L1StandardBridgeProxy,
OptimismMintableERC20FactoryProxy,
SystemConfigProxy,
OptimismPortalProxy,
ProxyAdmin,
}

contractsFromJSONFaultProofs := append(contractsFromJSON, []string{
AnchorStateRegistryProxy,
DelayedWETHProxy,
DisputeGameFactoryProxy,
FaultDisputeGame,
MIPS,
PermissionedDisputeGame,
PreimageOracle,
}...)
contractsFromJSONNonFaultProofs := append(contractsFromJSON, L2OutputOracleProxy)

contracts := contractsFromJSONFaultProofs

deployFilePath := filepath.Join(deploymentsDir, ".deploy")
_, err := os.Stat(deployFilePath)

func readAddressesFromJSON(addressList *superchain.AddressList, deploymentsDir string) error {
Comment thread
sebastianst marked this conversation as resolved.
// Check for the following
// 1. filepath == deploymentsDir
// 2. filepath == deploymentsDir/.deploy
// 3. filepath == deploymentsDir/<contract-name>.json
deployFilePath := filepath.Join(deploymentsDir)
fileInfo, err := os.Stat(deployFilePath)
if err != nil {
fmt.Printf("failed to find .deploy file. Will look for legacy .json files")
// Use legacy deployment artifact schema
return fmt.Errorf("invalid deployment filepath provided: %w", err)
}

_, err := os.ReadFile(filepath.Join(deploymentsDir, AnchorStateRegistryProxy+".json"))
if errors.Is(err, os.ErrNotExist) {
contracts = contractsFromJSONNonFaultProofs
}
for _, name := range contracts {
path := filepath.Join(deploymentsDir, name+".json")
file, err := os.ReadFile(path)
if err != nil {
return fmt.Errorf("failed to read file: %w", err)
}
var data AddressData
if err = json.Unmarshal(file, &data); err != nil {
return fmt.Errorf("failed to unmarshal json: %w", err)
}
contractAddresses[name] = data.Address
}
} else {
var addressList superchain.AddressList
rawData, err := os.ReadFile(deployFilePath)
if fileInfo.IsDir() {
deployFilePath = filepath.Join(deploymentsDir, ".deploy")
_, err = os.Stat(deployFilePath)
if err != nil {
return fmt.Errorf("failed to read file: %w", err)
}

if err = json.Unmarshal(rawData, &addressList); err != nil {
return fmt.Errorf("failed to unmarshal json: %w", err)
// Use legacy deployment artifact schema
contractAddresses := make(map[string]string)
fmt.Printf("failed to find .deploy file. Will look for legacy .json files")
files, _ := os.ReadDir(deploymentsDir)
for _, file := range files {
if file.IsDir() {
continue
}
contractName := strings.TrimSuffix(file.Name(), filepath.Ext(file.Name()))
fileContents, err := os.ReadFile(filepath.Join(deploymentsDir, file.Name()))
if err != nil {
return fmt.Errorf("failed to read file: %w", err)
}
var data AddressData
if err = json.Unmarshal(fileContents, &data); err != nil {
return fmt.Errorf("failed to unmarshal json: %w", err)
}
contractAddresses[contractName] = data.Address
err = mapToAddressList(contractAddresses, addressList)
if err != nil {
return fmt.Errorf("failed to convert contracts map into AddressList: %w", err)
}
}
return nil
}
}

_, err = addressList.AddressFor(AnchorStateRegistryProxy)
if err != nil {
contracts = contractsFromJSONNonFaultProofs
}
rawData, err := os.ReadFile(deployFilePath)
if err != nil {
return fmt.Errorf("failed to read file: %w", err)
}

for _, name := range contracts {
address, err := addressList.AddressFor(name)
if err != nil {
return fmt.Errorf("failed to retrieve %s address from list: %w", name, err)
}
contractAddresses[name] = address.String()
}
if err = json.Unmarshal(rawData, &addressList); err != nil {
return fmt.Errorf("failed to unmarshal json: %w", err)
}

fmt.Printf("Contract addresses read from deployments directory: %s\n", deploymentsDir)
return nil
}

Expand Down
7 changes: 7 additions & 0 deletions add-chain/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ var tests = []struct {
rollupConfigFile: "./testdata/monorepo/op-node/rollup_baseline.json",
deploymentsDir: "./testdata/monorepo/deployments",
},
{
name: "baseline_legacy",
chainName: "testchain_baseline_legacy",
chainShortName: "testchain_bl",
rollupConfigFile: "./testdata/monorepo/op-node/rollup_baseline_legacy.json",
deploymentsDir: "./testdata/monorepo/deployments-legacy",
},
{
name: "zorasep",
chainName: "testchain_zorasep",
Expand Down
6 changes: 3 additions & 3 deletions add-chain/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ require (
github.com/google/go-cmp v0.6.0
github.com/joho/godotenv v1.5.1
github.com/stretchr/testify v1.9.0
github.com/urfave/cli/v2 v2.27.1
github.com/urfave/cli/v2 v2.27.3
)

require (
Expand All @@ -30,7 +30,7 @@ require (
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/consensys/bavard v0.1.13 // indirect
github.com/consensys/gnark-crypto v0.12.1 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect
github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
Expand Down Expand Up @@ -78,7 +78,7 @@ require (
github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
golang.org/x/crypto v0.23.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
Expand Down
12 changes: 6 additions & 6 deletions add-chain/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/Yj
github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M=
github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ=
github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs=
github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA=
Expand Down Expand Up @@ -225,10 +225,10 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U=
github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
github.com/urfave/cli/v2 v2.27.3 h1:/POWahRmdh7uztQ3CYnaDddk0Rm90PyOgIxgW2rr41M=
github.com/urfave/cli/v2 v2.27.3/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
Expand Down
Loading