OP Stack Setting up L2 configuration ERROR - "json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"

i tried 5 times. still error :frowning:

Are you surely working with the avail-develop branch? @Thanh_Nguyen

yep

could you replace your ./op-node/cmd/gensis/cmd.go to my file with some logs to understand the situation? @Thanh_Nguyen

package genesis

import (
	"context"
	"encoding/json"
	"fmt"

	"math/big"
	"os"
	"path/filepath"

	"github.com/urfave/cli/v2"

	"github.com/ethereum/go-ethereum/core/types"

	"github.com/ethereum/go-ethereum/ethclient"

	"github.com/ethereum-optimism/optimism/op-bindings/hardhat"
	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"

	"github.com/ethereum/go-ethereum/log"
)

var Subcommands = cli.Commands{
	{
		Name:  "devnet",
		Usage: "Initialize new L1 and L2 genesis files and rollup config suitable for a local devnet",
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:  "deploy-config",
				Usage: "Path to hardhat deploy config file",
			},
			&cli.StringFlag{
				Name:  "outfile.l1",
				Usage: "Path to L1 genesis output file",
			},
			&cli.StringFlag{
				Name:  "outfile.l2",
				Usage: "Path to L2 genesis output file",
			},
			&cli.StringFlag{
				Name:  "outfile.rollup",
				Usage: "Path to rollup output file",
			},
		},
		Action: func(ctx *cli.Context) error {
			deployConfig := ctx.String("deploy-config")
			config, err := genesis.NewDeployConfig(deployConfig)
			if err != nil {
				return err
			}

			// Add the developer L1 addresses to the config
			if err := config.InitDeveloperDeployedAddresses(); err != nil {
				return err
			}

			if err := config.Check(); err != nil {
				return err
			}

			l1Genesis, err := genesis.BuildL1DeveloperGenesis(config)
			if err != nil {
				return err
			}

			l1StartBlock := l1Genesis.ToBlock()
			l2Genesis, err := genesis.BuildL2Genesis(config, l1StartBlock)
			if err != nil {
				return err
			}

			l2GenesisBlock := l2Genesis.ToBlock()
			rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
			if err != nil {
				return err
			}

			if err := writeGenesisFile(ctx.String("outfile.l1"), l1Genesis); err != nil {
				return err
			}
			if err := writeGenesisFile(ctx.String("outfile.l2"), l2Genesis); err != nil {
				return err
			}
			return writeGenesisFile(ctx.String("outfile.rollup"), rollupConfig)
		},
	},
	{
		Name:  "l2",
		Usage: "Generates an L2 genesis file and rollup config suitable for a deployed network",
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:  "l1-rpc",
				Usage: "L1 RPC URL",
			},
			&cli.StringFlag{
				Name:  "deploy-config",
				Usage: "Path to hardhat deploy config file",
			},
			&cli.StringFlag{
				Name:  "deployment-dir",
				Usage: "Path to deployment directory",
			},
			&cli.StringFlag{
				Name:  "outfile.l2",
				Usage: "Path to L2 genesis output file",
			},
			&cli.StringFlag{
				Name:  "outfile.rollup",
				Usage: "Path to rollup output file",
			},
		},
		Action: func(ctx *cli.Context) error {

			log.Info("Started generating l2 genesis file and rollup config")
			deployConfig := ctx.String("deploy-config")
			config, err := genesis.NewDeployConfig(deployConfig)
			if err != nil {
				return err
			}
			log.Info("Completed working on deploy-config, results:", config)

			depPath, network := filepath.Split(ctx.String("deployment-dir"))
			hh, err := hardhat.New(network, nil, []string{depPath})
			if err != nil {
				return err
			}

			// Read the appropriate deployment addresses from disk
			if err := config.GetDeployedAddresses(hh); err != nil {
				return err
			}
			// Sanity check the config
			if err := config.Check(); err != nil {
				return err
			}
			log.Info("Passed config check")

			client, err := ethclient.Dial(ctx.String("l1-rpc"))
			if err != nil {
				return fmt.Errorf("cannot dial %s: %w", ctx.String("l1-rpc"), err)
			}

			var l1StartBlock *types.Block
			if config.L1StartingBlockTag.BlockHash != nil {
				l1StartBlock, err = client.BlockByHash(context.Background(), *config.L1StartingBlockTag.BlockHash)
			} else if config.L1StartingBlockTag.BlockNumber != nil {
				l1StartBlock, err = client.BlockByNumber(context.Background(), big.NewInt(config.L1StartingBlockTag.BlockNumber.Int64()))
			}
			if err != nil {
				return fmt.Errorf("error getting l1 start block: %w", err)
			}

			// Build the developer L2 genesis block
			log.Info("Started working on building l2 genesis")
			l2Genesis, err := genesis.BuildL2Genesis(config, l1StartBlock)
			if err != nil {
				return fmt.Errorf("error creating l2 developer genesis: %w", err)
			}
			log.Info("Completed on building l2 genesis, results:", l2Genesis)

			l2GenesisBlock := l2Genesis.ToBlock()
			log.Info("Started working on building rollup config")
			rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
			if err != nil {
				return err
			}
			log.Info("Completed on building rollup config, results:", rollupConfig)

			if err := rollupConfig.Check(); err != nil {
				return fmt.Errorf("generated rollup config does not pass validation: %w", err)
			}

			if err := writeGenesisFile(ctx.String("outfile.l2"), l2Genesis); err != nil {
				return err
			}
			return writeGenesisFile(ctx.String("outfile.rollup"), rollupConfig)
		},
	},
}

func writeGenesisFile(outfile string, input any) error {
	f, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o755)
	if err != nil {
		return err
	}
	defer f.Close()

	enc := json.NewEncoder(f)
	enc.SetIndent("", "  ")
	return enc.Encode(input)
}

and then send me your logs for this

changed. still error

t=2023-11-29T10:16:39+0000 lvl=info msg="Started generating l2 genesis file and rollup config"
t=2023-11-29T10:16:39+0000 lvl=info msg="Completed working on deploy-config, results:" LOG15_ERROR= LOG15_ERROR="Normalized odd number of arguments by adding nil"
t=2023-11-29T10:16:39+0000 lvl=crit msg="Application failed" message="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
exit status 1

oh, okay, even your passed check is also not working, again change with this, I have added more logs

package genesis

import (
	"context"
	"encoding/json"
	"fmt"

	"math/big"
	"os"
	"path/filepath"

	"github.com/urfave/cli/v2"

	"github.com/ethereum/go-ethereum/core/types"

	"github.com/ethereum/go-ethereum/ethclient"

	"github.com/ethereum-optimism/optimism/op-bindings/hardhat"
	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"

	"github.com/ethereum/go-ethereum/log"
)

var Subcommands = cli.Commands{
	{
		Name:  "devnet",
		Usage: "Initialize new L1 and L2 genesis files and rollup config suitable for a local devnet",
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:  "deploy-config",
				Usage: "Path to hardhat deploy config file",
			},
			&cli.StringFlag{
				Name:  "outfile.l1",
				Usage: "Path to L1 genesis output file",
			},
			&cli.StringFlag{
				Name:  "outfile.l2",
				Usage: "Path to L2 genesis output file",
			},
			&cli.StringFlag{
				Name:  "outfile.rollup",
				Usage: "Path to rollup output file",
			},
		},
		Action: func(ctx *cli.Context) error {
			deployConfig := ctx.String("deploy-config")
			config, err := genesis.NewDeployConfig(deployConfig)
			if err != nil {
				return err
			}

			// Add the developer L1 addresses to the config
			if err := config.InitDeveloperDeployedAddresses(); err != nil {
				return err
			}

			if err := config.Check(); err != nil {
				return err
			}

			l1Genesis, err := genesis.BuildL1DeveloperGenesis(config)
			if err != nil {
				return err
			}

			l1StartBlock := l1Genesis.ToBlock()
			l2Genesis, err := genesis.BuildL2Genesis(config, l1StartBlock)
			if err != nil {
				return err
			}

			l2GenesisBlock := l2Genesis.ToBlock()
			rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
			if err != nil {
				return err
			}

			if err := writeGenesisFile(ctx.String("outfile.l1"), l1Genesis); err != nil {
				return err
			}
			if err := writeGenesisFile(ctx.String("outfile.l2"), l2Genesis); err != nil {
				return err
			}
			return writeGenesisFile(ctx.String("outfile.rollup"), rollupConfig)
		},
	},
	{
		Name:  "l2",
		Usage: "Generates an L2 genesis file and rollup config suitable for a deployed network",
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:  "l1-rpc",
				Usage: "L1 RPC URL",
			},
			&cli.StringFlag{
				Name:  "deploy-config",
				Usage: "Path to hardhat deploy config file",
			},
			&cli.StringFlag{
				Name:  "deployment-dir",
				Usage: "Path to deployment directory",
			},
			&cli.StringFlag{
				Name:  "outfile.l2",
				Usage: "Path to L2 genesis output file",
			},
			&cli.StringFlag{
				Name:  "outfile.rollup",
				Usage: "Path to rollup output file",
			},
		},
		Action: func(ctx *cli.Context) error {

			log.Info("Started generating l2 genesis file and rollup config")
			deployConfig := ctx.String("deploy-config")
			config, err := genesis.NewDeployConfig(deployConfig)
			if err != nil {
				return err
			}
			log.Info("Completed working on deploy-config, results:", config)

			depPath, network := filepath.Split(ctx.String("deployment-dir"))
			hh, err := hardhat.New(network, nil, []string{depPath})
			if err != nil {
				return err
			}

			log.Info("Reading deployment address from disk")
			// Read the appropriate deployment addresses from disk
			if err := config.GetDeployedAddresses(hh); err != nil {
				return err
			}

			log.Info("Started validating the config")
			// Sanity check the config
			if err := config.Check(); err != nil {
				return err
			}
			log.Info("Passed config check")

			client, err := ethclient.Dial(ctx.String("l1-rpc"))
			if err != nil {
				return fmt.Errorf("cannot dial %s: %w", ctx.String("l1-rpc"), err)
			}

			var l1StartBlock *types.Block
			if config.L1StartingBlockTag.BlockHash != nil {
				l1StartBlock, err = client.BlockByHash(context.Background(), *config.L1StartingBlockTag.BlockHash)
			} else if config.L1StartingBlockTag.BlockNumber != nil {
				l1StartBlock, err = client.BlockByNumber(context.Background(), big.NewInt(config.L1StartingBlockTag.BlockNumber.Int64()))
			}
			if err != nil {
				return fmt.Errorf("error getting l1 start block: %w", err)
			}

			// Build the developer L2 genesis block
			log.Info("Started working on building l2 genesis")
			l2Genesis, err := genesis.BuildL2Genesis(config, l1StartBlock)
			if err != nil {
				return fmt.Errorf("error creating l2 developer genesis: %w", err)
			}
			log.Info("Completed on building l2 genesis, results:", l2Genesis)

			l2GenesisBlock := l2Genesis.ToBlock()
			log.Info("Started working on building rollup config")
			rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
			if err != nil {
				return err
			}
			log.Info("Completed on building rollup config, results:", rollupConfig)

			if err := rollupConfig.Check(); err != nil {
				return fmt.Errorf("generated rollup config does not pass validation: %w", err)
			}

			if err := writeGenesisFile(ctx.String("outfile.l2"), l2Genesis); err != nil {
				return err
			}
			return writeGenesisFile(ctx.String("outfile.rollup"), rollupConfig)
		},
	},
}

func writeGenesisFile(outfile string, input any) error {
	f, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o755)
	if err != nil {
		return err
	}
	defer f.Close()

	enc := json.NewEncoder(f)
	enc.SetIndent("", "  ")
	return enc.Encode(input)
}

still error

t=2023-11-29T10:24:50+0000 lvl=info msg="Started generating l2 genesis file and rollup config"
t=2023-11-29T10:24:50+0000 lvl=info msg="Completed working on deploy-config, results:" LOG15_ERROR= LOG15_ERROR="Normalized odd number of arguments by adding nil"
t=2023-11-29T10:24:50+0000 lvl=crit msg="Application failed" message="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
exit status 1

I have add more logs, could you check on this?

package genesis

import (
	"context"
	"encoding/json"
	"fmt"

	"math/big"
	"os"
	"path/filepath"

	"github.com/urfave/cli/v2"

	"github.com/ethereum/go-ethereum/core/types"

	"github.com/ethereum/go-ethereum/ethclient"

	"github.com/ethereum-optimism/optimism/op-bindings/hardhat"
	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"

	"github.com/ethereum/go-ethereum/log"
)

var Subcommands = cli.Commands{
	{
		Name:  "devnet",
		Usage: "Initialize new L1 and L2 genesis files and rollup config suitable for a local devnet",
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:  "deploy-config",
				Usage: "Path to hardhat deploy config file",
			},
			&cli.StringFlag{
				Name:  "outfile.l1",
				Usage: "Path to L1 genesis output file",
			},
			&cli.StringFlag{
				Name:  "outfile.l2",
				Usage: "Path to L2 genesis output file",
			},
			&cli.StringFlag{
				Name:  "outfile.rollup",
				Usage: "Path to rollup output file",
			},
		},
		Action: func(ctx *cli.Context) error {
			deployConfig := ctx.String("deploy-config")
			config, err := genesis.NewDeployConfig(deployConfig)
			if err != nil {
				return err
			}

			// Add the developer L1 addresses to the config
			if err := config.InitDeveloperDeployedAddresses(); err != nil {
				return err
			}

			if err := config.Check(); err != nil {
				return err
			}

			l1Genesis, err := genesis.BuildL1DeveloperGenesis(config)
			if err != nil {
				return err
			}

			l1StartBlock := l1Genesis.ToBlock()
			l2Genesis, err := genesis.BuildL2Genesis(config, l1StartBlock)
			if err != nil {
				return err
			}

			l2GenesisBlock := l2Genesis.ToBlock()
			rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
			if err != nil {
				return err
			}

			if err := writeGenesisFile(ctx.String("outfile.l1"), l1Genesis); err != nil {
				return err
			}
			if err := writeGenesisFile(ctx.String("outfile.l2"), l2Genesis); err != nil {
				return err
			}
			return writeGenesisFile(ctx.String("outfile.rollup"), rollupConfig)
		},
	},
	{
		Name:  "l2",
		Usage: "Generates an L2 genesis file and rollup config suitable for a deployed network",
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:  "l1-rpc",
				Usage: "L1 RPC URL",
			},
			&cli.StringFlag{
				Name:  "deploy-config",
				Usage: "Path to hardhat deploy config file",
			},
			&cli.StringFlag{
				Name:  "deployment-dir",
				Usage: "Path to deployment directory",
			},
			&cli.StringFlag{
				Name:  "outfile.l2",
				Usage: "Path to L2 genesis output file",
			},
			&cli.StringFlag{
				Name:  "outfile.rollup",
				Usage: "Path to rollup output file",
			},
		},
		Action: func(ctx *cli.Context) error {

			log.Info("Started generating l2 genesis file and rollup config")
			deployConfig := ctx.String("deploy-config")
			config, err := genesis.NewDeployConfig(deployConfig)
			if err != nil {
				return err
			}
			log.Info("Completed working on deploy-config, results:", config)

			depPath, network := filepath.Split(ctx.String("deployment-dir"))
			hh, err := hardhat.New(network, nil, []string{depPath})
			if err != nil {
				log.Info("Hardhat one causing the problem", "network", network, "depPath", depPath, "err", err)
				return err
			}
			log.Info("Hardhat", "network", network, "depPath", depPath, "err", err)

			log.Info("Reading deployment address from disk")
			// Read the appropriate deployment addresses from disk
			if err := config.GetDeployedAddresses(hh); err != nil {
				return err
			}

			log.Info("Started validating the config")
			// Sanity check the config
			if err := config.Check(); err != nil {
				return err
			}
			log.Info("Passed config check")

			client, err := ethclient.Dial(ctx.String("l1-rpc"))
			if err != nil {
				return fmt.Errorf("cannot dial %s: %w", ctx.String("l1-rpc"), err)
			}

			var l1StartBlock *types.Block
			if config.L1StartingBlockTag.BlockHash != nil {
				l1StartBlock, err = client.BlockByHash(context.Background(), *config.L1StartingBlockTag.BlockHash)
			} else if config.L1StartingBlockTag.BlockNumber != nil {
				l1StartBlock, err = client.BlockByNumber(context.Background(), big.NewInt(config.L1StartingBlockTag.BlockNumber.Int64()))
			}
			if err != nil {
				return fmt.Errorf("error getting l1 start block: %w", err)
			}

			// Build the developer L2 genesis block
			log.Info("Started working on building l2 genesis")
			l2Genesis, err := genesis.BuildL2Genesis(config, l1StartBlock)
			if err != nil {
				return fmt.Errorf("error creating l2 developer genesis: %w", err)
			}
			log.Info("Completed on building l2 genesis, results:", l2Genesis)

			l2GenesisBlock := l2Genesis.ToBlock()
			log.Info("Started working on building rollup config")
			rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64())
			if err != nil {
				return err
			}
			log.Info("Completed on building rollup config, results:", rollupConfig)

			if err := rollupConfig.Check(); err != nil {
				return fmt.Errorf("generated rollup config does not pass validation: %w", err)
			}

			if err := writeGenesisFile(ctx.String("outfile.l2"), l2Genesis); err != nil {
				return err
			}
			return writeGenesisFile(ctx.String("outfile.rollup"), rollupConfig)
		},
	},
}

func writeGenesisFile(outfile string, input any) error {
	f, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o755)
	if err != nil {
		return err
	}
	defer f.Close()

	enc := json.NewEncoder(f)
	enc.SetIndent("", "  ")
	return enc.Encode(input)
}

now

t=2023-11-29T10:33:55+0000 lvl=info msg="Started generating l2 genesis file and rollup config"
t=2023-11-29T10:33:55+0000 lvl=info msg="Completed working on deploy-config, results:" LOG15_ERROR= LOG15_ERROR="Normalized odd number of arguments by adding nil"
t=2023-11-29T10:33:55+0000 lvl=info msg="Hardhat one causing the problem" network= depPath=../packages/contracts-bedrock/deployments/avail-optimism/ err="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
t=2023-11-29T10:33:55+0000 lvl=crit msg="Application failed"              message="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
exit status 1

Could you check in your ./op-bindings/hardhat/types.go, this looks like this for Deployment struct and also pls send me your types.go file

hi

could you check and change your ./op-bindings/hardhat/hardhat.go with my code

package hardhat

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

	"github.com/ethereum-optimism/optimism/op-bindings/solc"
	"github.com/ethereum/go-ethereum/log"
)

var (
	ErrCannotFindDeployment = errors.New("cannot find deployment")
	ErrCannotFindArtifact   = errors.New("cannot find artifact")
)

// `Hardhat` encapsulates all of the functionality required to interact
// with hardhat style artifacts.
type Hardhat struct {
	ArtifactPaths   []string
	DeploymentPaths []string

	network string

	amu sync.Mutex
	dmu sync.Mutex
	bmu sync.Mutex

	artifacts   []*Artifact
	deployments []*Deployment
	buildInfos  []*BuildInfo //nolint:unused
}

// New creates a new `Hardhat` struct and reads all of the files from
// disk so that they are cached for the end user. A network is passed
// that corresponds to the network that they deployments are associated
// with. A slice of artifact paths and deployment paths are passed
// so that a single `Hardhat` instance can operate on multiple sets
// of artifacts and deployments. The deployments paths should be
// the root of the deployments directory that contains additional
// directories for each particular network.
func New(network string, artifacts, deployments []string) (*Hardhat, error) {
	hh := &Hardhat{
		network:         network,
		ArtifactPaths:   artifacts,
		DeploymentPaths: deployments,
	}

	if err := hh.init(); err != nil {
		return nil, err
	}

	return hh, nil
}

// init is called in the constructor and will cache required files to disk.
func (h *Hardhat) init() error {
	h.amu.Lock()
	defer h.amu.Unlock()
	h.dmu.Lock()
	defer h.dmu.Unlock()

	if err := h.initArtifacts(); err != nil {
		return err
	}
	if err := h.initDeployments(); err != nil {
		return err
	}
	return nil
}

// initDeployments reads all of the deployment json files from disk and then
// caches the deserialized `Deployment` structs.
func (h *Hardhat) initDeployments() error {
	knownDeployments := make(map[string]string)
	for _, deploymentPath := range h.DeploymentPaths {
		fileSystem := os.DirFS(filepath.Join(deploymentPath, h.network))
		err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
			if err != nil {
				return err
			}
			if d.IsDir() {
				return nil
			}
			if strings.Contains(path, "solcInputs") {
				return nil
			}
			if !strings.HasSuffix(path, ".json") {
				return nil
			}

			name := filepath.Join(deploymentPath, h.network, path)
			file, err := os.ReadFile(name)
			if err != nil {
				return err
			}
			var deployment Deployment
			if err := json.Unmarshal(file, &deployment); err != nil {
				log.Info("Unmarshaling the deployments is causing the problem", "err", err)
				return err
			}

			deployment.Name = filepath.Base(name[:len(name)-5])
			if knownDeployments[deployment.Name] != "" {
				return fmt.Errorf(
					"discovered duplicate deployment %s. old: %s, new: %s",
					deployment.Name,
					knownDeployments[deployment.Name],
					name,
				)
			}
			h.deployments = append(h.deployments, &deployment)
			knownDeployments[deployment.Name] = name
			return nil
		})
		if err != nil {
			return err
		}
	}
	return nil
}

// initArtifacts reads all of the artifact json files from disk and then caches
// the deserialized `Artifact` structs.
func (h *Hardhat) initArtifacts() error {
	for _, artifactPath := range h.ArtifactPaths {
		fileSystem := os.DirFS(artifactPath)
		err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
			if err != nil {
				return err
			}
			if d.IsDir() {
				return nil
			}
			name := filepath.Join(artifactPath, path)

			if strings.Contains(name, "build-info") {
				return nil
			}
			if strings.HasSuffix(name, ".dbg.json") {
				return nil
			}
			file, err := os.ReadFile(name)
			if err != nil {
				return err
			}
			var artifact Artifact
			if err := json.Unmarshal(file, &artifact); err != nil {
				return err
			}

			h.artifacts = append(h.artifacts, &artifact)
			return nil
		})
		if err != nil {
			return err
		}
	}
	return nil
}

// GetArtifact returns the artifact that corresponds to the contract.
// This method supports just the contract name and the fully qualified
// contract name.
func (h *Hardhat) GetArtifact(name string) (*Artifact, error) {
	h.amu.Lock()
	defer h.amu.Unlock()

	if IsFullyQualifiedName(name) {
		fqn := ParseFullyQualifiedName(name)
		for _, artifact := range h.artifacts {
			contractNameMatches := artifact.ContractName == fqn.ContractName
			sourceNameMatches := artifact.SourceName == fqn.SourceName

			if contractNameMatches && sourceNameMatches {
				return artifact, nil
			}
		}
		return nil, fmt.Errorf("%w: %s", ErrCannotFindArtifact, name)
	}

	for _, artifact := range h.artifacts {
		if name == artifact.ContractName {
			return artifact, nil
		}
	}

	return nil, fmt.Errorf("%w: %s", ErrCannotFindArtifact, name)
}

// GetDeployment returns the deployment that corresponds to the contract.
// It does not support fully qualified contract names.
func (h *Hardhat) GetDeployment(name string) (*Deployment, error) {
	h.dmu.Lock()
	defer h.dmu.Unlock()

	fqn := ParseFullyQualifiedName(name)
	for _, deployment := range h.deployments {
		if deployment.Name == fqn.ContractName {
			return deployment, nil
		}
	}

	return nil, fmt.Errorf("%w: %s", ErrCannotFindDeployment, name)
}

// GetBuildInfo returns the build info that corresponds to the contract.
// It does not support fully qualified contract names.
func (h *Hardhat) GetBuildInfo(name string) (*BuildInfo, error) {
	h.bmu.Lock()
	defer h.bmu.Unlock()

	fqn := ParseFullyQualifiedName(name)
	buildInfos := make([]*BuildInfo, 0)

	for _, artifactPath := range h.ArtifactPaths {
		fileSystem := os.DirFS(artifactPath)
		err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
			if err != nil {
				return err
			}
			if d.IsDir() {
				return nil
			}
			name := filepath.Join(artifactPath, path)

			if !strings.HasSuffix(name, ".dbg.json") {
				return nil
			}

			// Remove ".dbg.json"
			target := filepath.Base(name[:len(name)-9])
			if fqn.ContractName != target {
				return nil
			}

			file, err := os.ReadFile(name)
			if err != nil {
				return err
			}
			var debugFile DebugFile
			if err := json.Unmarshal(file, &debugFile); err != nil {
				return err
			}
			relPath := filepath.Join(filepath.Dir(name), debugFile.BuildInfo)
			if err != nil {
				return err
			}
			debugPath, _ := filepath.Abs(relPath)

			buildInfoFile, err := os.ReadFile(debugPath)
			if err != nil {
				return err
			}

			var buildInfo BuildInfo
			if err := json.Unmarshal(buildInfoFile, &buildInfo); err != nil {
				return err
			}

			buildInfos = append(buildInfos, &buildInfo)

			return nil
		})
		if err != nil {
			return nil, err
		}
	}

	// TODO(tynes): handle multiple contracts with same name when required
	if len(buildInfos) > 1 {
		return nil, fmt.Errorf("Multiple contracts with name %s", name)
	}
	if len(buildInfos) == 0 {
		return nil, fmt.Errorf("Cannot find BuildInfo for %s", name)
	}

	return buildInfos[0], nil
}

// TODO(tynes): handle fully qualified names properly
func (h *Hardhat) GetStorageLayout(name string) (*solc.StorageLayout, error) {
	fqn := ParseFullyQualifiedName(name)

	buildInfo, err := h.GetBuildInfo(name)
	if err != nil {
		return nil, err
	}

	for _, source := range buildInfo.Output.Contracts {
		for name, contract := range source {
			if name == fqn.ContractName {
				return &contract.StorageLayout, nil
			}
		}
	}

	return nil, fmt.Errorf("contract not found for %s", fqn.ContractName)
}

hi

t=2023-11-29T11:29:50+0000 lvl=info msg="Started generating l2 genesis file and rollup config"
t=2023-11-29T11:29:50+0000 lvl=info msg="Completed working on deploy-config, results:" LOG15_ERROR= LOG15_ERROR="Normalized odd number of arguments by adding nil"
t=2023-11-29T11:29:50+0000 lvl=info msg="Unmarshaling the deployments is causing the problem" err="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
t=2023-11-29T11:29:50+0000 lvl=info msg="Hardhat one causing the problem" network= depPath=../packages/contracts-bedrock/deployments/avail-optimism/ err="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
t=2023-11-29T11:29:50+0000 lvl=crit msg="Application failed"              message="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
exit status 1

As you can see, unmarshaling the deployments is causing the problem here; pls check if your deploying smart contract step is working correctly and also check if every file in deployments/avail-optimism has an args field with an array of strings (or with an empty array)

Could you again change that ./op-bindings/hardhat/hardhat.go file with more log added file

package hardhat

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

	"github.com/ethereum-optimism/optimism/op-bindings/solc"
	"github.com/ethereum/go-ethereum/log"
)

var (
	ErrCannotFindDeployment = errors.New("cannot find deployment")
	ErrCannotFindArtifact   = errors.New("cannot find artifact")
)

// `Hardhat` encapsulates all of the functionality required to interact
// with hardhat style artifacts.
type Hardhat struct {
	ArtifactPaths   []string
	DeploymentPaths []string

	network string

	amu sync.Mutex
	dmu sync.Mutex
	bmu sync.Mutex

	artifacts   []*Artifact
	deployments []*Deployment
	buildInfos  []*BuildInfo //nolint:unused
}

// New creates a new `Hardhat` struct and reads all of the files from
// disk so that they are cached for the end user. A network is passed
// that corresponds to the network that they deployments are associated
// with. A slice of artifact paths and deployment paths are passed
// so that a single `Hardhat` instance can operate on multiple sets
// of artifacts and deployments. The deployments paths should be
// the root of the deployments directory that contains additional
// directories for each particular network.
func New(network string, artifacts, deployments []string) (*Hardhat, error) {
	hh := &Hardhat{
		network:         network,
		ArtifactPaths:   artifacts,
		DeploymentPaths: deployments,
	}

	if err := hh.init(); err != nil {
		return nil, err
	}

	return hh, nil
}

// init is called in the constructor and will cache required files to disk.
func (h *Hardhat) init() error {
	h.amu.Lock()
	defer h.amu.Unlock()
	h.dmu.Lock()
	defer h.dmu.Unlock()

	if err := h.initArtifacts(); err != nil {
		return err
	}
	if err := h.initDeployments(); err != nil {
		return err
	}
	return nil
}

// initDeployments reads all of the deployment json files from disk and then
// caches the deserialized `Deployment` structs.
func (h *Hardhat) initDeployments() error {
	knownDeployments := make(map[string]string)
	for _, deploymentPath := range h.DeploymentPaths {
		fileSystem := os.DirFS(filepath.Join(deploymentPath, h.network))
		err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
			if err != nil {
				return err
			}
			if d.IsDir() {
				return nil
			}
			if strings.Contains(path, "solcInputs") {
				return nil
			}
			if !strings.HasSuffix(path, ".json") {
				return nil
			}

			name := filepath.Join(deploymentPath, h.network, path)
			log.Info("The name for reading the deployment file", "name", name)
			file, err := os.ReadFile(name)
			if err != nil {
				return err
			}
			var deployment Deployment
			if err := json.Unmarshal(file, &deployment); err != nil {
				log.Info("Unmarshaling the deployments is causing the problem", "err", err)
				return err
			}

			deployment.Name = filepath.Base(name[:len(name)-5])
			if knownDeployments[deployment.Name] != "" {
				return fmt.Errorf(
					"discovered duplicate deployment %s. old: %s, new: %s",
					deployment.Name,
					knownDeployments[deployment.Name],
					name,
				)
			}
			h.deployments = append(h.deployments, &deployment)
			knownDeployments[deployment.Name] = name
			return nil
		})
		if err != nil {
			return err
		}
	}
	return nil
}

// initArtifacts reads all of the artifact json files from disk and then caches
// the deserialized `Artifact` structs.
func (h *Hardhat) initArtifacts() error {
	for _, artifactPath := range h.ArtifactPaths {
		fileSystem := os.DirFS(artifactPath)
		err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
			if err != nil {
				return err
			}
			if d.IsDir() {
				return nil
			}
			name := filepath.Join(artifactPath, path)

			if strings.Contains(name, "build-info") {
				return nil
			}
			if strings.HasSuffix(name, ".dbg.json") {
				return nil
			}
			file, err := os.ReadFile(name)
			if err != nil {
				return err
			}
			var artifact Artifact
			if err := json.Unmarshal(file, &artifact); err != nil {
				return err
			}

			h.artifacts = append(h.artifacts, &artifact)
			return nil
		})
		if err != nil {
			return err
		}
	}
	return nil
}

// GetArtifact returns the artifact that corresponds to the contract.
// This method supports just the contract name and the fully qualified
// contract name.
func (h *Hardhat) GetArtifact(name string) (*Artifact, error) {
	h.amu.Lock()
	defer h.amu.Unlock()

	if IsFullyQualifiedName(name) {
		fqn := ParseFullyQualifiedName(name)
		for _, artifact := range h.artifacts {
			contractNameMatches := artifact.ContractName == fqn.ContractName
			sourceNameMatches := artifact.SourceName == fqn.SourceName

			if contractNameMatches && sourceNameMatches {
				return artifact, nil
			}
		}
		return nil, fmt.Errorf("%w: %s", ErrCannotFindArtifact, name)
	}

	for _, artifact := range h.artifacts {
		if name == artifact.ContractName {
			return artifact, nil
		}
	}

	return nil, fmt.Errorf("%w: %s", ErrCannotFindArtifact, name)
}

// GetDeployment returns the deployment that corresponds to the contract.
// It does not support fully qualified contract names.
func (h *Hardhat) GetDeployment(name string) (*Deployment, error) {
	h.dmu.Lock()
	defer h.dmu.Unlock()

	fqn := ParseFullyQualifiedName(name)
	for _, deployment := range h.deployments {
		if deployment.Name == fqn.ContractName {
			return deployment, nil
		}
	}

	return nil, fmt.Errorf("%w: %s", ErrCannotFindDeployment, name)
}

// GetBuildInfo returns the build info that corresponds to the contract.
// It does not support fully qualified contract names.
func (h *Hardhat) GetBuildInfo(name string) (*BuildInfo, error) {
	h.bmu.Lock()
	defer h.bmu.Unlock()

	fqn := ParseFullyQualifiedName(name)
	buildInfos := make([]*BuildInfo, 0)

	for _, artifactPath := range h.ArtifactPaths {
		fileSystem := os.DirFS(artifactPath)
		err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
			if err != nil {
				return err
			}
			if d.IsDir() {
				return nil
			}
			name := filepath.Join(artifactPath, path)

			if !strings.HasSuffix(name, ".dbg.json") {
				return nil
			}

			// Remove ".dbg.json"
			target := filepath.Base(name[:len(name)-9])
			if fqn.ContractName != target {
				return nil
			}

			file, err := os.ReadFile(name)
			if err != nil {
				return err
			}
			var debugFile DebugFile
			if err := json.Unmarshal(file, &debugFile); err != nil {
				return err
			}
			relPath := filepath.Join(filepath.Dir(name), debugFile.BuildInfo)
			if err != nil {
				return err
			}
			debugPath, _ := filepath.Abs(relPath)

			buildInfoFile, err := os.ReadFile(debugPath)
			if err != nil {
				return err
			}

			var buildInfo BuildInfo
			if err := json.Unmarshal(buildInfoFile, &buildInfo); err != nil {
				return err
			}

			buildInfos = append(buildInfos, &buildInfo)

			return nil
		})
		if err != nil {
			return nil, err
		}
	}

	// TODO(tynes): handle multiple contracts with same name when required
	if len(buildInfos) > 1 {
		return nil, fmt.Errorf("Multiple contracts with name %s", name)
	}
	if len(buildInfos) == 0 {
		return nil, fmt.Errorf("Cannot find BuildInfo for %s", name)
	}

	return buildInfos[0], nil
}

// TODO(tynes): handle fully qualified names properly
func (h *Hardhat) GetStorageLayout(name string) (*solc.StorageLayout, error) {
	fqn := ParseFullyQualifiedName(name)

	buildInfo, err := h.GetBuildInfo(name)
	if err != nil {
		return nil, err
	}

	for _, source := range buildInfo.Output.Contracts {
		for name, contract := range source {
			if name == fqn.ContractName {
				return &contract.StorageLayout, nil
			}
		}
	}

	return nil, fmt.Errorf("contract not found for %s", fqn.ContractName)
}

t=2023-11-29T12:35:23+0000 lvl=info msg="Started generating l2 genesis file and rollup config"
t=2023-11-29T12:35:23+0000 lvl=info msg="Completed working on deploy-config, results:" LOG15_ERROR= LOG15_ERROR="Normalized odd number of arguments by adding nil"
t=2023-11-29T12:35:23+0000 lvl=info msg="The name for reading the deployment file" name=../packages/contracts-bedrock/deployments/avail-optimism/AddressManager.json
t=2023-11-29T12:35:23+0000 lvl=info msg="The name for reading the deployment file" name=../packages/contracts-bedrock/deployments/avail-optimism/L1CrossDomainMessenger.json
t=2023-11-29T12:35:23+0000 lvl=info msg="The name for reading the deployment file" name=../packages/contracts-bedrock/deployments/avail-optimism/L1CrossDomainMessengerProxy.json
t=2023-11-29T12:35:23+0000 lvl=info msg="Unmarshaling the deployments is causing the problem" err="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
t=2023-11-29T12:35:23+0000 lvl=info msg="Hardhat one causing the problem" network= depPath=../packages/contracts-bedrock/deployments/avail-optimism/ err="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
t=2023-11-29T12:35:23+0000 lvl=crit msg="Application failed"              message="json: cannot unmarshal string into Go struct field Deployment.args of type []interface {}"
exit status 1

could you check for args values for these files? and send me also

my ~/avail-op-stack-adapter/packages/contracts-bedrock/deployments/avail-optimism

deploy l1 log

root@vultr:~/avail-op-stack-adapter/packages/contracts-bedrock# forge script scripts/Deploy.s.sol:Deploy --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL

[⠔] Compiling...
Nothing to compile
Script ran successfully.

== Logs ==
  Connected to network with chainid 5
  Storing temp deployment data in /root/avail-op-stack-adapter/packages/contracts-bedrock/deployments/avail-optimism/.deploy
  DeployConfig: reading file /root/avail-op-stack-adapter/packages/contracts-bedrock/deploy-config/avail-optimism.json
  Deploying from Deploy
  Deployment context: avail-optimism
  Deploying L1 system
  AddressManager deployed at 0x4e384a27b145C8E60B2CCc4F83205121B503d200
  ProxyAdmin deployed at 0xd61184BdA87c792881C3d57E816eb7bad331E553
  OptimismPortalProxy deployed at 0x832FdBc85EAb56F6629dB0D7e9Dbf107F2594970
  L2OutputOracleProxy deployed at 0x18a13c44BBDE45C149297335737eE110259E939C
  SystemConfigProxy deployed at 0xC77BFd5017Bbb120dfb57B5ec6467D2bc1436145
  L1StandardBridgeProxy deployed at 0xD5214C69E7121A4e465583b7384551DeCf5A56a8
  L1CrossDomainMessengerProxy deployed at 0x7C2b38Bfb7A663dba97F49DA39665020ea09F041
  OptimismMintableERC20FactoryProxy deployed at 0x080DB34aa460C2f3CE27934AA569F7E9B2b8894f
  L1ERC721BridgeProxy deployed at 0x043077FDBb51373Ba9A276512C28ea324EFac154
  Portal guardian has no code: 0xdB7500834d0616E23bB244FC15bcDA630C611b05
  OptimismPortal deployed at 0x66EC29971D8Ae58fEbd932013e11867834412E45
  L1CrossDomainMessenger deployed at 0xfaC74843706170Ad11448De1Fb1EDF753f43d427
  L2OutputOracle deployed at 0xA1DD624A9E2d654f193028e669fd72bC270e1a20
  OptimismMintableERC20Factory deployed at 0x6D1faE7e50a76C140F962Be04Dc021759E37cD66
  SystemConfig deployed at 0xceAF96e04a18eA63c860bAE67F7ae2201C1E8F67
  L1StandardBridge deployed at 0x1c5bD7274255637DD7275bb954e4D74A60ec50a9
  L1ERC721Bridge deployed at 0xF12146C9f4b4749f423aDEe02eFCD928B479Fc10
  AddressManager ownership transferred to 0xd61184BdA87c792881C3d57E816eb7bad331E553
  SystemConfig version: 1.3.1
  L1StandardBridge version: 1.1.1
  L1ERC721Bridge version: 1.1.2
  OptimismMintableERC20Factory version: 1.1.1
  L1CrossDomainMessenger version: 1.4.1
  L2OutputOracle version: 1.3.1
  OptimismPortal version: 1.7.2

## Setting up 1 EVM.

==========================

Chain 5

Estimated gas price: 3.000000082 gwei

Estimated total gas used for script: 28393101

Estimated amount required: 0.085179305328234282 ETH

==========================

###
Finding wallets for all the necessary addresses...
##
Sending transactions [0 - 32].
⠚ [00:00:08] [############################################################################################################################################################################] 33/33 txes (0.0s)
Transactions saved to: /root/avail-op-stack-adapter/packages/contracts-bedrock/broadcast/Deploy.s.sol/5/run-latest.json

Sensitive values saved to: /root/avail-op-stack-adapter/packages/contracts-bedrock/cache/Deploy.s.sol/5/run-latest.json

##
Waiting for receipts.
⠒ [00:00:07] [########################################################################################################################################################################] 33/33 receipts (0.0s)
##### goerli
✅  [Success]Hash: 0xe1b9bf8eb5255b917871834b4bbaea6564556378bd6e3469f29091b2adf64bc4
Contract Address: 0x4e384a27b145C8E60B2CCc4F83205121B503d200
Block: 10127439
Paid: 0.001214328017000592 ETH (404776 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xf21be84226024d50d8b9e928c194542fedabc8d1a424fd263b412ab0da984f13
Contract Address: 0xd61184BdA87c792881C3d57E816eb7bad331E553
Block: 10127439
Paid: 0.004451847062325858 ETH (1483949 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x877468c7069196c977621d9e3819ac69143dcd48c520038cf51e9a1964c0624c
Block: 10127439
Paid: 0.000138066001932924 ETH (46022 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x710e2a4f6dea0b721d549212025de36a18a94bb087367e143401b4c598fce575
Contract Address: 0x832FdBc85EAb56F6629dB0D7e9Dbf107F2594970
Block: 10127439
Paid: 0.00157188002200632 ETH (523960 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xa9292749cc706a6f48ee2e751a30a307bc64b1ad7728d76e4d389b9019d46124
Contract Address: 0x18a13c44BBDE45C149297335737eE110259E939C
Block: 10127439
Paid: 0.00157188002200632 ETH (523960 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x9fb684515b26fa55f904548811a946b43b6400859526fc5349d69d2a11a230af
Contract Address: 0xC77BFd5017Bbb120dfb57B5ec6467D2bc1436145
Block: 10127439
Paid: 0.00157188002200632 ETH (523960 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x7835ad73a8e9f96e31f554f64f5e666e1f86af66abcd86a8a1ae2f56e0cc21d2
Contract Address: 0xD5214C69E7121A4e465583b7384551DeCf5A56a8
Block: 10127439
Paid: 0.001827462025584468 ETH (609154 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xb16b3c1429ff8f2d9d73e6600a38a9bb7a29ae854a41c0f65dad5f9b6395d2b6
Contract Address: 0x7C2b38Bfb7A663dba97F49DA39665020ea09F041
Block: 10127439
Paid: 0.000846582011852148 ETH (282194 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x5aaa31e0d546bcbbacb8f305c965be19f468f7f3c03e3eb6aeba33021ab7e0a3
Block: 10127439
Paid: 0.000148647002081058 ETH (49549 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xba90071a3172b5c65d0dedff9731ca1ade8ebb6c56d4052896ed2ae6efccfd3f
Contract Address: 0x080DB34aa460C2f3CE27934AA569F7E9B2b8894f
Block: 10127439
Paid: 0.00157188002200632 ETH (523960 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x23091365e15d3cd7be503b2f4969a55bb58b678c23f87671cdfd6e3eed1f8c59
Contract Address: 0x043077FDBb51373Ba9A276512C28ea324EFac154
Block: 10127439
Paid: 0.00157188002200632 ETH (523960 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x9afab16f15b9880b4920dab24fb9b7137d6c728b47ac5d5ce7045f75eabcab93
Contract Address: 0x66EC29971D8Ae58fEbd932013e11867834412E45
Block: 10127439
Paid: 0.014642217204991038 ETH (4880739 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x7573e7e8e93619ba1a5453dfd209124534d9da10580ffb765c024533cfe0de69
Contract Address: 0xfaC74843706170Ad11448De1Fb1EDF753f43d427
Block: 10127439
Paid: 0.005608749078522486 ETH (1869583 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xc355dd75a448e2c71682fd9436827514c544364ef0746af68b73cf7c308ceab4
Block: 10127439
Paid: 0.000063192000884688 ETH (21064 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x21bd3f1e4d8d24dced6612cff036b11b1770913a1df7c8d9c594a5be4e6e0ed8
Contract Address: 0xA1DD624A9E2d654f193028e669fd72bC270e1a20
Block: 10127439
Paid: 0.004088214057234996 ETH (1362738 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xab3692bdd2b8c3ce68d448c48fb94df82be4e0877e24c579a5beb0583d939d75
Block: 10127439
Paid: 0.000063192000884688 ETH (21064 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xc24a08060bd34054f3eb76a1836262507b43c7e6507a0874e421a1c06bf6ca07
Contract Address: 0x6D1faE7e50a76C140F962Be04Dc021759E37cD66
Block: 10127439
Paid: 0.005988834083843676 ETH (1996278 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xac2d5d5937a352825f22e3713fc1d3dd792d63e44a345a352af333dc423091a8
Contract Address: 0xceAF96e04a18eA63c860bAE67F7ae2201C1E8F67
Block: 10127439
Paid: 0.00482286006752004 ETH (1607620 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x99cbb33c552eefc294501d82044475fe83ec08e0a47137c09602ec2847cb27ba
Contract Address: 0x1c5bD7274255637DD7275bb954e4D74A60ec50a9
Block: 10127439
Paid: 0.007287717102028038 ETH (2429239 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x4a25377e0f511a42bc5823a37a6abfa756c9168edfa86b7944a6dce2d18afb9f
Contract Address: 0xF12146C9f4b4749f423aDEe02eFCD928B479Fc10
Block: 10127439
Paid: 0.003347412046863768 ETH (1115804 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xe48df22be3a1d8164a207ee75da8afa0805f6a663136e55313de4df3a88ec05c
Block: 10127439
Paid: 0.000085638001198932 ETH (28546 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xd3e53d3803a2e453abfcd81960cecbf42538b4c4472f6fb7ff7d9f6c8d0a6630
Block: 10127439
Paid: 0.00074718001046052 ETH (249060 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xdfc1e0ac5ca117f1a9218688d1e143ce8a90394ec5e2b62f2d4dd6ce1c9b2932
Block: 10127439
Paid: 0.000139092001947288 ETH (46364 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xd7a6dab850e5a75335a1e8269d12e2d0389d41168cc20ee6e53867d9453957ba
Block: 10127439
Paid: 0.000162198002270772 ETH (54066 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x64e7d5b336085847cbd9587c6ddfcaa398c3a276650fdc17289c4f645aad5be4
Block: 10127439
Paid: 0.000165648002319072 ETH (55216 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x7bdcb47c97d74446c06eeede311b47bb1c31c04e14463f35dcb00884e0541d0e
Block: 10127439
Paid: 0.000165648002319072 ETH (55216 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x496fe4ae4274db55ab5ce9ff00a7bad9812aa81b83779cbae4735c4eeda27dcc
Block: 10127439
Paid: 0.000139092001947288 ETH (46364 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x1313c4428faeb5db789eb9274fc8d6b862d007df1f3e6b2bbeae45d09f87b849
Block: 10127439
Paid: 0.0001429500020013 ETH (47650 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xa738c36c9a6605771aa848d2e9fdd7ba3b3c60005347ec22eddb7c1d4905e210
Block: 10127439
Paid: 0.000314808004407312 ETH (104936 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x35e994e1b64e66e0d0f01a38f07b7b4b228259d79ac5ce3ffe977f403655c5eb
Block: 10127439
Paid: 0.000063192000884688 ETH (21064 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x9e88fd008bc3da7c2c871f327265e0e56637d28c6717efd40f57f391e9764dc7
Block: 10127439
Paid: 0.00032764500458703 ETH (109215 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0xb51097e4bd14b79061e51508143bcccbdb0930ad8b1e75bfac8253018de4823b
Block: 10127439
Paid: 0.000063192000884688 ETH (21064 gas * 3.000000042 gwei)


##### goerli
✅  [Success]Hash: 0x5dc26d5ac9d92d0e2aeee07e15fb988cc0abacc8760d109817c6b3a38f581b2e
Block: 10127439
Paid: 0.000394122005517708 ETH (131374 gas * 3.000000042 gwei)


Transactions saved to: /root/avail-op-stack-adapter/packages/contracts-bedrock/broadcast/Deploy.s.sol/5/run-latest.json

Sensitive values saved to: /root/avail-op-stack-adapter/packages/contracts-bedrock/cache/Deploy.s.sol/5/run-latest.json



==========================

ONCHAIN EXECUTION COMPLETE & SUCCESSFUL.
Total Paid: 0.065309124914327736 ETH (21769708 gas * avg 3.000000042 gwei)

Transactions saved to: /root/avail-op-stack-adapter/packages/contracts-bedrock/broadcast/Deploy.s.sol/5/run-latest.json

Sensitive values saved to: /root/avail-op-stack-adapter/packages/contracts-bedrock/cache/Deploy.s.sol/5/run-latest.json

root@vultr:~/avail-op-stack-adapter/packages/contracts-bedrock# forge script scripts/Deploy.s.sol:Deploy --sig 'sync()' --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL
[⠔] Compiling...
Nothing to compile
Script ran successfully.

== Logs ==
  Connected to network with chainid 5
  Storing temp deployment data in /root/avail-op-stack-adapter/packages/contracts-bedrock/deployments/avail-optimism/.deploy
  DeployConfig: reading file /root/avail-op-stack-adapter/packages/contracts-bedrock/deploy-config/avail-optimism.json
  Deploying from Deploy
  Deployment context: avail-optimism
  Syncing 16 deployments
  Syncing AddressManager
  Syncing L1CrossDomainMessenger
  Syncing L1CrossDomainMessengerProxy
  Syncing L1ERC721Bridge
  Syncing L1ERC721BridgeProxy
  Syncing L1StandardBridge
  Syncing L1StandardBridgeProxy
  Syncing L2OutputOracle
  Syncing L2OutputOracleProxy
  Syncing OptimismMintableERC20Factory
  Syncing OptimismMintableERC20FactoryProxy
  Syncing OptimismPortal
  Syncing OptimismPortalProxy
  Syncing ProxyAdmin
  Syncing SystemConfig
  Syncing SystemConfigProxy
  Synced temp deploy files, deleting /root/avail-op-stack-adapter/packages/contracts-bedrock/deployments/avail-optimism/.deploy

hey, why this is like
"args": "[\"0x4e384a27b145C8E60B2CCc4F83205121B503d200\",\"\\OVM_L1CrossDomainMessenger\\\"]",
it should be like this
"args": [ "0x1f917424bF1517fE70EE3EA42e01f8d1322bFA8b", "OVM_L1CrossDomainMessenger" ]

pls check in file ./packages/contracts-bedrock/deployments/avail-optimism/L1CrossDomainMessengerProxy.json