diff --git a/Justfile b/Justfile
index 6137f8752..13a1a0e30 100644
--- a/Justfile
+++ b/Justfile
@@ -53,7 +53,7 @@ calculate-artifact-url:
     echo "https://storage.googleapis.com/oplabs-contract-artifacts/artifacts-v1-$checksum.tar.gz"
 
 generate-monorepo-bindings: install-abigen
-    ./scripts/generate-bindings.sh -u $(just calculate-artifact-url) -n CrossL2Inbox,L2ToL2CrossDomainMessenger,L1BlockInterop,OptimismSuperchainERC20,SuperchainWETH,SuperchainTokenBridge -o ./bindings
+    ./scripts/generate-bindings.sh -u $(just calculate-artifact-url) -n CrossL2Inbox,L2ToL2CrossDomainMessenger,L1BlockInterop,SuperchainERC20,SuperchainWETH,SuperchainTokenBridge -o ./bindings
 
 generate-genesis: build-contracts
     go run ./genesis/cmd/main.go --monorepo-artifacts $(just calculate-artifact-url) --periphery-artifacts ./contracts/out --outdir ./genesis/generated
diff --git a/bindings/OptimismSuperchainERC20.go b/bindings/OptimismSuperchainERC20.go
deleted file mode 100644
index 6eb22c43f..000000000
--- a/bindings/OptimismSuperchainERC20.go
+++ /dev/null
@@ -1,1755 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"errors"
-	"math/big"
-	"strings"
-
-	ethereum "github.com/ethereum/go-ethereum"
-	"github.com/ethereum/go-ethereum/accounts/abi"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/event"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var (
-	_ = errors.New
-	_ = big.NewInt
-	_ = strings.NewReader
-	_ = ethereum.NotFound
-	_ = bind.Bind
-	_ = common.Big1
-	_ = types.BloomLookup
-	_ = event.NewSubscription
-	_ = abi.ConvertType
-)
-
-// OptimismSuperchainERC20MetaData contains all meta data concerning the OptimismSuperchainERC20 contract.
-var OptimismSuperchainERC20MetaData = &bind.MetaData{
-	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"result\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"crosschainBurn\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"crosschainMint\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"_symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"_decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"remoteToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burn\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CrosschainBurn\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CrosschainMint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AllowanceOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AllowanceUnderflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientAllowance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Permit2AllowanceIsFixedAtInfinity\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PermitExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSupplyOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]",
-}
-
-// OptimismSuperchainERC20ABI is the input ABI used to generate the binding from.
-// Deprecated: Use OptimismSuperchainERC20MetaData.ABI instead.
-var OptimismSuperchainERC20ABI = OptimismSuperchainERC20MetaData.ABI
-
-// OptimismSuperchainERC20 is an auto generated Go binding around an Ethereum contract.
-type OptimismSuperchainERC20 struct {
-	OptimismSuperchainERC20Caller     // Read-only binding to the contract
-	OptimismSuperchainERC20Transactor // Write-only binding to the contract
-	OptimismSuperchainERC20Filterer   // Log filterer for contract events
-}
-
-// OptimismSuperchainERC20Caller is an auto generated read-only Go binding around an Ethereum contract.
-type OptimismSuperchainERC20Caller struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// OptimismSuperchainERC20Transactor is an auto generated write-only Go binding around an Ethereum contract.
-type OptimismSuperchainERC20Transactor struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// OptimismSuperchainERC20Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
-type OptimismSuperchainERC20Filterer struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// OptimismSuperchainERC20Session is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type OptimismSuperchainERC20Session struct {
-	Contract     *OptimismSuperchainERC20 // Generic contract binding to set the session for
-	CallOpts     bind.CallOpts            // Call options to use throughout this session
-	TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
-}
-
-// OptimismSuperchainERC20CallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type OptimismSuperchainERC20CallerSession struct {
-	Contract *OptimismSuperchainERC20Caller // Generic contract caller binding to set the session for
-	CallOpts bind.CallOpts                  // Call options to use throughout this session
-}
-
-// OptimismSuperchainERC20TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type OptimismSuperchainERC20TransactorSession struct {
-	Contract     *OptimismSuperchainERC20Transactor // Generic contract transactor binding to set the session for
-	TransactOpts bind.TransactOpts                  // Transaction auth options to use throughout this session
-}
-
-// OptimismSuperchainERC20Raw is an auto generated low-level Go binding around an Ethereum contract.
-type OptimismSuperchainERC20Raw struct {
-	Contract *OptimismSuperchainERC20 // Generic contract binding to access the raw methods on
-}
-
-// OptimismSuperchainERC20CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type OptimismSuperchainERC20CallerRaw struct {
-	Contract *OptimismSuperchainERC20Caller // Generic read-only contract binding to access the raw methods on
-}
-
-// OptimismSuperchainERC20TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type OptimismSuperchainERC20TransactorRaw struct {
-	Contract *OptimismSuperchainERC20Transactor // Generic write-only contract binding to access the raw methods on
-}
-
-// NewOptimismSuperchainERC20 creates a new instance of OptimismSuperchainERC20, bound to a specific deployed contract.
-func NewOptimismSuperchainERC20(address common.Address, backend bind.ContractBackend) (*OptimismSuperchainERC20, error) {
-	contract, err := bindOptimismSuperchainERC20(address, backend, backend, backend)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20{OptimismSuperchainERC20Caller: OptimismSuperchainERC20Caller{contract: contract}, OptimismSuperchainERC20Transactor: OptimismSuperchainERC20Transactor{contract: contract}, OptimismSuperchainERC20Filterer: OptimismSuperchainERC20Filterer{contract: contract}}, nil
-}
-
-// NewOptimismSuperchainERC20Caller creates a new read-only instance of OptimismSuperchainERC20, bound to a specific deployed contract.
-func NewOptimismSuperchainERC20Caller(address common.Address, caller bind.ContractCaller) (*OptimismSuperchainERC20Caller, error) {
-	contract, err := bindOptimismSuperchainERC20(address, caller, nil, nil)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20Caller{contract: contract}, nil
-}
-
-// NewOptimismSuperchainERC20Transactor creates a new write-only instance of OptimismSuperchainERC20, bound to a specific deployed contract.
-func NewOptimismSuperchainERC20Transactor(address common.Address, transactor bind.ContractTransactor) (*OptimismSuperchainERC20Transactor, error) {
-	contract, err := bindOptimismSuperchainERC20(address, nil, transactor, nil)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20Transactor{contract: contract}, nil
-}
-
-// NewOptimismSuperchainERC20Filterer creates a new log filterer instance of OptimismSuperchainERC20, bound to a specific deployed contract.
-func NewOptimismSuperchainERC20Filterer(address common.Address, filterer bind.ContractFilterer) (*OptimismSuperchainERC20Filterer, error) {
-	contract, err := bindOptimismSuperchainERC20(address, nil, nil, filterer)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20Filterer{contract: contract}, nil
-}
-
-// bindOptimismSuperchainERC20 binds a generic wrapper to an already deployed contract.
-func bindOptimismSuperchainERC20(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
-	parsed, err := OptimismSuperchainERC20MetaData.GetAbi()
-	if err != nil {
-		return nil, err
-	}
-	return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
-	return _OptimismSuperchainERC20.Contract.OptimismSuperchainERC20Caller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.OptimismSuperchainERC20Transactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.OptimismSuperchainERC20Transactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
-	return _OptimismSuperchainERC20.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.contract.Transact(opts, method, params...)
-}
-
-// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
-//
-// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "DOMAIN_SEPARATOR")
-
-	if err != nil {
-		return *new([32]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
-	return out0, err
-
-}
-
-// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
-//
-// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) DOMAINSEPARATOR() ([32]byte, error) {
-	return _OptimismSuperchainERC20.Contract.DOMAINSEPARATOR(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
-//
-// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) DOMAINSEPARATOR() ([32]byte, error) {
-	return _OptimismSuperchainERC20.Contract.DOMAINSEPARATOR(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
-//
-// Solidity: function allowance(address owner, address spender) view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "allowance", owner, spender)
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
-//
-// Solidity: function allowance(address owner, address spender) view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
-	return _OptimismSuperchainERC20.Contract.Allowance(&_OptimismSuperchainERC20.CallOpts, owner, spender)
-}
-
-// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
-//
-// Solidity: function allowance(address owner, address spender) view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
-	return _OptimismSuperchainERC20.Contract.Allowance(&_OptimismSuperchainERC20.CallOpts, owner, spender)
-}
-
-// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
-//
-// Solidity: function balanceOf(address owner) view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "balanceOf", owner)
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
-//
-// Solidity: function balanceOf(address owner) view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) BalanceOf(owner common.Address) (*big.Int, error) {
-	return _OptimismSuperchainERC20.Contract.BalanceOf(&_OptimismSuperchainERC20.CallOpts, owner)
-}
-
-// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
-//
-// Solidity: function balanceOf(address owner) view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) BalanceOf(owner common.Address) (*big.Int, error) {
-	return _OptimismSuperchainERC20.Contract.BalanceOf(&_OptimismSuperchainERC20.CallOpts, owner)
-}
-
-// Decimals is a free data retrieval call binding the contract method 0x313ce567.
-//
-// Solidity: function decimals() view returns(uint8)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) Decimals(opts *bind.CallOpts) (uint8, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "decimals")
-
-	if err != nil {
-		return *new(uint8), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
-
-	return out0, err
-
-}
-
-// Decimals is a free data retrieval call binding the contract method 0x313ce567.
-//
-// Solidity: function decimals() view returns(uint8)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Decimals() (uint8, error) {
-	return _OptimismSuperchainERC20.Contract.Decimals(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// Decimals is a free data retrieval call binding the contract method 0x313ce567.
-//
-// Solidity: function decimals() view returns(uint8)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) Decimals() (uint8, error) {
-	return _OptimismSuperchainERC20.Contract.Decimals(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// Name is a free data retrieval call binding the contract method 0x06fdde03.
-//
-// Solidity: function name() view returns(string)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) Name(opts *bind.CallOpts) (string, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "name")
-
-	if err != nil {
-		return *new(string), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
-	return out0, err
-
-}
-
-// Name is a free data retrieval call binding the contract method 0x06fdde03.
-//
-// Solidity: function name() view returns(string)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Name() (string, error) {
-	return _OptimismSuperchainERC20.Contract.Name(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// Name is a free data retrieval call binding the contract method 0x06fdde03.
-//
-// Solidity: function name() view returns(string)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) Name() (string, error) {
-	return _OptimismSuperchainERC20.Contract.Name(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
-//
-// Solidity: function nonces(address owner) view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) Nonces(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "nonces", owner)
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
-//
-// Solidity: function nonces(address owner) view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Nonces(owner common.Address) (*big.Int, error) {
-	return _OptimismSuperchainERC20.Contract.Nonces(&_OptimismSuperchainERC20.CallOpts, owner)
-}
-
-// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
-//
-// Solidity: function nonces(address owner) view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) Nonces(owner common.Address) (*big.Int, error) {
-	return _OptimismSuperchainERC20.Contract.Nonces(&_OptimismSuperchainERC20.CallOpts, owner)
-}
-
-// RemoteToken is a free data retrieval call binding the contract method 0xd6c0b2c4.
-//
-// Solidity: function remoteToken() view returns(address)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) RemoteToken(opts *bind.CallOpts) (common.Address, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "remoteToken")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// RemoteToken is a free data retrieval call binding the contract method 0xd6c0b2c4.
-//
-// Solidity: function remoteToken() view returns(address)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) RemoteToken() (common.Address, error) {
-	return _OptimismSuperchainERC20.Contract.RemoteToken(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// RemoteToken is a free data retrieval call binding the contract method 0xd6c0b2c4.
-//
-// Solidity: function remoteToken() view returns(address)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) RemoteToken() (common.Address, error) {
-	return _OptimismSuperchainERC20.Contract.RemoteToken(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
-//
-// Solidity: function supportsInterface(bytes4 _interfaceId) view returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) SupportsInterface(opts *bind.CallOpts, _interfaceId [4]byte) (bool, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "supportsInterface", _interfaceId)
-
-	if err != nil {
-		return *new(bool), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
-
-	return out0, err
-
-}
-
-// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
-//
-// Solidity: function supportsInterface(bytes4 _interfaceId) view returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) SupportsInterface(_interfaceId [4]byte) (bool, error) {
-	return _OptimismSuperchainERC20.Contract.SupportsInterface(&_OptimismSuperchainERC20.CallOpts, _interfaceId)
-}
-
-// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
-//
-// Solidity: function supportsInterface(bytes4 _interfaceId) view returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) SupportsInterface(_interfaceId [4]byte) (bool, error) {
-	return _OptimismSuperchainERC20.Contract.SupportsInterface(&_OptimismSuperchainERC20.CallOpts, _interfaceId)
-}
-
-// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
-//
-// Solidity: function symbol() view returns(string)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) Symbol(opts *bind.CallOpts) (string, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "symbol")
-
-	if err != nil {
-		return *new(string), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
-	return out0, err
-
-}
-
-// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
-//
-// Solidity: function symbol() view returns(string)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Symbol() (string, error) {
-	return _OptimismSuperchainERC20.Contract.Symbol(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
-//
-// Solidity: function symbol() view returns(string)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) Symbol() (string, error) {
-	return _OptimismSuperchainERC20.Contract.Symbol(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
-//
-// Solidity: function totalSupply() view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "totalSupply")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
-//
-// Solidity: function totalSupply() view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) TotalSupply() (*big.Int, error) {
-	return _OptimismSuperchainERC20.Contract.TotalSupply(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
-//
-// Solidity: function totalSupply() view returns(uint256 result)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) TotalSupply() (*big.Int, error) {
-	return _OptimismSuperchainERC20.Contract.TotalSupply(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// Version is a free data retrieval call binding the contract method 0x54fd4d50.
-//
-// Solidity: function version() view returns(string)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Caller) Version(opts *bind.CallOpts) (string, error) {
-	var out []interface{}
-	err := _OptimismSuperchainERC20.contract.Call(opts, &out, "version")
-
-	if err != nil {
-		return *new(string), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
-	return out0, err
-
-}
-
-// Version is a free data retrieval call binding the contract method 0x54fd4d50.
-//
-// Solidity: function version() view returns(string)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Version() (string, error) {
-	return _OptimismSuperchainERC20.Contract.Version(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// Version is a free data retrieval call binding the contract method 0x54fd4d50.
-//
-// Solidity: function version() view returns(string)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20CallerSession) Version() (string, error) {
-	return _OptimismSuperchainERC20.Contract.Version(&_OptimismSuperchainERC20.CallOpts)
-}
-
-// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
-//
-// Solidity: function approve(address spender, uint256 amount) returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Transactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.contract.Transact(opts, "approve", spender, amount)
-}
-
-// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
-//
-// Solidity: function approve(address spender, uint256 amount) returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Approve(&_OptimismSuperchainERC20.TransactOpts, spender, amount)
-}
-
-// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
-//
-// Solidity: function approve(address spender, uint256 amount) returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorSession) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Approve(&_OptimismSuperchainERC20.TransactOpts, spender, amount)
-}
-
-// Burn is a paid mutator transaction binding the contract method 0x9dc29fac.
-//
-// Solidity: function burn(address _from, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Transactor) Burn(opts *bind.TransactOpts, _from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.contract.Transact(opts, "burn", _from, _amount)
-}
-
-// Burn is a paid mutator transaction binding the contract method 0x9dc29fac.
-//
-// Solidity: function burn(address _from, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Burn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Burn(&_OptimismSuperchainERC20.TransactOpts, _from, _amount)
-}
-
-// Burn is a paid mutator transaction binding the contract method 0x9dc29fac.
-//
-// Solidity: function burn(address _from, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorSession) Burn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Burn(&_OptimismSuperchainERC20.TransactOpts, _from, _amount)
-}
-
-// CrosschainBurn is a paid mutator transaction binding the contract method 0x2b8c49e3.
-//
-// Solidity: function crosschainBurn(address _from, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Transactor) CrosschainBurn(opts *bind.TransactOpts, _from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.contract.Transact(opts, "crosschainBurn", _from, _amount)
-}
-
-// CrosschainBurn is a paid mutator transaction binding the contract method 0x2b8c49e3.
-//
-// Solidity: function crosschainBurn(address _from, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) CrosschainBurn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.CrosschainBurn(&_OptimismSuperchainERC20.TransactOpts, _from, _amount)
-}
-
-// CrosschainBurn is a paid mutator transaction binding the contract method 0x2b8c49e3.
-//
-// Solidity: function crosschainBurn(address _from, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorSession) CrosschainBurn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.CrosschainBurn(&_OptimismSuperchainERC20.TransactOpts, _from, _amount)
-}
-
-// CrosschainMint is a paid mutator transaction binding the contract method 0x18bf5077.
-//
-// Solidity: function crosschainMint(address _to, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Transactor) CrosschainMint(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.contract.Transact(opts, "crosschainMint", _to, _amount)
-}
-
-// CrosschainMint is a paid mutator transaction binding the contract method 0x18bf5077.
-//
-// Solidity: function crosschainMint(address _to, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) CrosschainMint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.CrosschainMint(&_OptimismSuperchainERC20.TransactOpts, _to, _amount)
-}
-
-// CrosschainMint is a paid mutator transaction binding the contract method 0x18bf5077.
-//
-// Solidity: function crosschainMint(address _to, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorSession) CrosschainMint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.CrosschainMint(&_OptimismSuperchainERC20.TransactOpts, _to, _amount)
-}
-
-// Initialize is a paid mutator transaction binding the contract method 0xf6d2ee86.
-//
-// Solidity: function initialize(address _remoteToken, string _name, string _symbol, uint8 _decimals) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Transactor) Initialize(opts *bind.TransactOpts, _remoteToken common.Address, _name string, _symbol string, _decimals uint8) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.contract.Transact(opts, "initialize", _remoteToken, _name, _symbol, _decimals)
-}
-
-// Initialize is a paid mutator transaction binding the contract method 0xf6d2ee86.
-//
-// Solidity: function initialize(address _remoteToken, string _name, string _symbol, uint8 _decimals) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Initialize(_remoteToken common.Address, _name string, _symbol string, _decimals uint8) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Initialize(&_OptimismSuperchainERC20.TransactOpts, _remoteToken, _name, _symbol, _decimals)
-}
-
-// Initialize is a paid mutator transaction binding the contract method 0xf6d2ee86.
-//
-// Solidity: function initialize(address _remoteToken, string _name, string _symbol, uint8 _decimals) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorSession) Initialize(_remoteToken common.Address, _name string, _symbol string, _decimals uint8) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Initialize(&_OptimismSuperchainERC20.TransactOpts, _remoteToken, _name, _symbol, _decimals)
-}
-
-// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
-//
-// Solidity: function mint(address _to, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Transactor) Mint(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.contract.Transact(opts, "mint", _to, _amount)
-}
-
-// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
-//
-// Solidity: function mint(address _to, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Mint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Mint(&_OptimismSuperchainERC20.TransactOpts, _to, _amount)
-}
-
-// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
-//
-// Solidity: function mint(address _to, uint256 _amount) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorSession) Mint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Mint(&_OptimismSuperchainERC20.TransactOpts, _to, _amount)
-}
-
-// Permit is a paid mutator transaction binding the contract method 0xd505accf.
-//
-// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Transactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.contract.Transact(opts, "permit", owner, spender, value, deadline, v, r, s)
-}
-
-// Permit is a paid mutator transaction binding the contract method 0xd505accf.
-//
-// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Permit(&_OptimismSuperchainERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
-}
-
-// Permit is a paid mutator transaction binding the contract method 0xd505accf.
-//
-// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorSession) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Permit(&_OptimismSuperchainERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
-}
-
-// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
-//
-// Solidity: function transfer(address to, uint256 amount) returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Transactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.contract.Transact(opts, "transfer", to, amount)
-}
-
-// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
-//
-// Solidity: function transfer(address to, uint256 amount) returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Transfer(&_OptimismSuperchainERC20.TransactOpts, to, amount)
-}
-
-// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
-//
-// Solidity: function transfer(address to, uint256 amount) returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorSession) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.Transfer(&_OptimismSuperchainERC20.TransactOpts, to, amount)
-}
-
-// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
-//
-// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.contract.Transact(opts, "transferFrom", from, to, amount)
-}
-
-// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
-//
-// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Session) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.TransferFrom(&_OptimismSuperchainERC20.TransactOpts, from, to, amount)
-}
-
-// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
-//
-// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20TransactorSession) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _OptimismSuperchainERC20.Contract.TransferFrom(&_OptimismSuperchainERC20.TransactOpts, from, to, amount)
-}
-
-// OptimismSuperchainERC20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20ApprovalIterator struct {
-	Event *OptimismSuperchainERC20Approval // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *OptimismSuperchainERC20ApprovalIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(OptimismSuperchainERC20Approval)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(OptimismSuperchainERC20Approval)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *OptimismSuperchainERC20ApprovalIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *OptimismSuperchainERC20ApprovalIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// OptimismSuperchainERC20Approval represents a Approval event raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20Approval struct {
-	Owner   common.Address
-	Spender common.Address
-	Amount  *big.Int
-	Raw     types.Log // Blockchain specific contextual infos
-}
-
-// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
-//
-// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*OptimismSuperchainERC20ApprovalIterator, error) {
-
-	var ownerRule []interface{}
-	for _, ownerItem := range owner {
-		ownerRule = append(ownerRule, ownerItem)
-	}
-	var spenderRule []interface{}
-	for _, spenderItem := range spender {
-		spenderRule = append(spenderRule, spenderItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20ApprovalIterator{contract: _OptimismSuperchainERC20.contract, event: "Approval", logs: logs, sub: sub}, nil
-}
-
-// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
-//
-// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *OptimismSuperchainERC20Approval, owner []common.Address, spender []common.Address) (event.Subscription, error) {
-
-	var ownerRule []interface{}
-	for _, ownerItem := range owner {
-		ownerRule = append(ownerRule, ownerItem)
-	}
-	var spenderRule []interface{}
-	for _, spenderItem := range spender {
-		spenderRule = append(spenderRule, spenderItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(OptimismSuperchainERC20Approval)
-				if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Approval", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
-//
-// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) ParseApproval(log types.Log) (*OptimismSuperchainERC20Approval, error) {
-	event := new(OptimismSuperchainERC20Approval)
-	if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Approval", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// OptimismSuperchainERC20BurnIterator is returned from FilterBurn and is used to iterate over the raw logs and unpacked data for Burn events raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20BurnIterator struct {
-	Event *OptimismSuperchainERC20Burn // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *OptimismSuperchainERC20BurnIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(OptimismSuperchainERC20Burn)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(OptimismSuperchainERC20Burn)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *OptimismSuperchainERC20BurnIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *OptimismSuperchainERC20BurnIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// OptimismSuperchainERC20Burn represents a Burn event raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20Burn struct {
-	From   common.Address
-	Amount *big.Int
-	Raw    types.Log // Blockchain specific contextual infos
-}
-
-// FilterBurn is a free log retrieval operation binding the contract event 0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5.
-//
-// Solidity: event Burn(address indexed from, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) FilterBurn(opts *bind.FilterOpts, from []common.Address) (*OptimismSuperchainERC20BurnIterator, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.FilterLogs(opts, "Burn", fromRule)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20BurnIterator{contract: _OptimismSuperchainERC20.contract, event: "Burn", logs: logs, sub: sub}, nil
-}
-
-// WatchBurn is a free log subscription operation binding the contract event 0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5.
-//
-// Solidity: event Burn(address indexed from, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) WatchBurn(opts *bind.WatchOpts, sink chan<- *OptimismSuperchainERC20Burn, from []common.Address) (event.Subscription, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.WatchLogs(opts, "Burn", fromRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(OptimismSuperchainERC20Burn)
-				if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Burn", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseBurn is a log parse operation binding the contract event 0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5.
-//
-// Solidity: event Burn(address indexed from, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) ParseBurn(log types.Log) (*OptimismSuperchainERC20Burn, error) {
-	event := new(OptimismSuperchainERC20Burn)
-	if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Burn", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// OptimismSuperchainERC20CrosschainBurnIterator is returned from FilterCrosschainBurn and is used to iterate over the raw logs and unpacked data for CrosschainBurn events raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20CrosschainBurnIterator struct {
-	Event *OptimismSuperchainERC20CrosschainBurn // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *OptimismSuperchainERC20CrosschainBurnIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(OptimismSuperchainERC20CrosschainBurn)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(OptimismSuperchainERC20CrosschainBurn)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *OptimismSuperchainERC20CrosschainBurnIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *OptimismSuperchainERC20CrosschainBurnIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// OptimismSuperchainERC20CrosschainBurn represents a CrosschainBurn event raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20CrosschainBurn struct {
-	From   common.Address
-	Amount *big.Int
-	Sender common.Address
-	Raw    types.Log // Blockchain specific contextual infos
-}
-
-// FilterCrosschainBurn is a free log retrieval operation binding the contract event 0xb90795a66650155983e242cac3e1ac1a4dc26f8ed2987f3ce416a34e00111fd4.
-//
-// Solidity: event CrosschainBurn(address indexed from, uint256 amount, address indexed sender)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) FilterCrosschainBurn(opts *bind.FilterOpts, from []common.Address, sender []common.Address) (*OptimismSuperchainERC20CrosschainBurnIterator, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-
-	var senderRule []interface{}
-	for _, senderItem := range sender {
-		senderRule = append(senderRule, senderItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.FilterLogs(opts, "CrosschainBurn", fromRule, senderRule)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20CrosschainBurnIterator{contract: _OptimismSuperchainERC20.contract, event: "CrosschainBurn", logs: logs, sub: sub}, nil
-}
-
-// WatchCrosschainBurn is a free log subscription operation binding the contract event 0xb90795a66650155983e242cac3e1ac1a4dc26f8ed2987f3ce416a34e00111fd4.
-//
-// Solidity: event CrosschainBurn(address indexed from, uint256 amount, address indexed sender)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) WatchCrosschainBurn(opts *bind.WatchOpts, sink chan<- *OptimismSuperchainERC20CrosschainBurn, from []common.Address, sender []common.Address) (event.Subscription, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-
-	var senderRule []interface{}
-	for _, senderItem := range sender {
-		senderRule = append(senderRule, senderItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.WatchLogs(opts, "CrosschainBurn", fromRule, senderRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(OptimismSuperchainERC20CrosschainBurn)
-				if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "CrosschainBurn", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseCrosschainBurn is a log parse operation binding the contract event 0xb90795a66650155983e242cac3e1ac1a4dc26f8ed2987f3ce416a34e00111fd4.
-//
-// Solidity: event CrosschainBurn(address indexed from, uint256 amount, address indexed sender)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) ParseCrosschainBurn(log types.Log) (*OptimismSuperchainERC20CrosschainBurn, error) {
-	event := new(OptimismSuperchainERC20CrosschainBurn)
-	if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "CrosschainBurn", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// OptimismSuperchainERC20CrosschainMintIterator is returned from FilterCrosschainMint and is used to iterate over the raw logs and unpacked data for CrosschainMint events raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20CrosschainMintIterator struct {
-	Event *OptimismSuperchainERC20CrosschainMint // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *OptimismSuperchainERC20CrosschainMintIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(OptimismSuperchainERC20CrosschainMint)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(OptimismSuperchainERC20CrosschainMint)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *OptimismSuperchainERC20CrosschainMintIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *OptimismSuperchainERC20CrosschainMintIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// OptimismSuperchainERC20CrosschainMint represents a CrosschainMint event raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20CrosschainMint struct {
-	To     common.Address
-	Amount *big.Int
-	Sender common.Address
-	Raw    types.Log // Blockchain specific contextual infos
-}
-
-// FilterCrosschainMint is a free log retrieval operation binding the contract event 0xde22baff038e3a3e08407cbdf617deed74e869a7ba517df611e33131c6e6ea04.
-//
-// Solidity: event CrosschainMint(address indexed to, uint256 amount, address indexed sender)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) FilterCrosschainMint(opts *bind.FilterOpts, to []common.Address, sender []common.Address) (*OptimismSuperchainERC20CrosschainMintIterator, error) {
-
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	var senderRule []interface{}
-	for _, senderItem := range sender {
-		senderRule = append(senderRule, senderItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.FilterLogs(opts, "CrosschainMint", toRule, senderRule)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20CrosschainMintIterator{contract: _OptimismSuperchainERC20.contract, event: "CrosschainMint", logs: logs, sub: sub}, nil
-}
-
-// WatchCrosschainMint is a free log subscription operation binding the contract event 0xde22baff038e3a3e08407cbdf617deed74e869a7ba517df611e33131c6e6ea04.
-//
-// Solidity: event CrosschainMint(address indexed to, uint256 amount, address indexed sender)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) WatchCrosschainMint(opts *bind.WatchOpts, sink chan<- *OptimismSuperchainERC20CrosschainMint, to []common.Address, sender []common.Address) (event.Subscription, error) {
-
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	var senderRule []interface{}
-	for _, senderItem := range sender {
-		senderRule = append(senderRule, senderItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.WatchLogs(opts, "CrosschainMint", toRule, senderRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(OptimismSuperchainERC20CrosschainMint)
-				if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "CrosschainMint", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseCrosschainMint is a log parse operation binding the contract event 0xde22baff038e3a3e08407cbdf617deed74e869a7ba517df611e33131c6e6ea04.
-//
-// Solidity: event CrosschainMint(address indexed to, uint256 amount, address indexed sender)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) ParseCrosschainMint(log types.Log) (*OptimismSuperchainERC20CrosschainMint, error) {
-	event := new(OptimismSuperchainERC20CrosschainMint)
-	if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "CrosschainMint", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// OptimismSuperchainERC20InitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20InitializedIterator struct {
-	Event *OptimismSuperchainERC20Initialized // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *OptimismSuperchainERC20InitializedIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(OptimismSuperchainERC20Initialized)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(OptimismSuperchainERC20Initialized)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *OptimismSuperchainERC20InitializedIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *OptimismSuperchainERC20InitializedIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// OptimismSuperchainERC20Initialized represents a Initialized event raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20Initialized struct {
-	Version uint64
-	Raw     types.Log // Blockchain specific contextual infos
-}
-
-// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2.
-//
-// Solidity: event Initialized(uint64 version)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) FilterInitialized(opts *bind.FilterOpts) (*OptimismSuperchainERC20InitializedIterator, error) {
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.FilterLogs(opts, "Initialized")
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20InitializedIterator{contract: _OptimismSuperchainERC20.contract, event: "Initialized", logs: logs, sub: sub}, nil
-}
-
-// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2.
-//
-// Solidity: event Initialized(uint64 version)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OptimismSuperchainERC20Initialized) (event.Subscription, error) {
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.WatchLogs(opts, "Initialized")
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(OptimismSuperchainERC20Initialized)
-				if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Initialized", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2.
-//
-// Solidity: event Initialized(uint64 version)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) ParseInitialized(log types.Log) (*OptimismSuperchainERC20Initialized, error) {
-	event := new(OptimismSuperchainERC20Initialized)
-	if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Initialized", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// OptimismSuperchainERC20MintIterator is returned from FilterMint and is used to iterate over the raw logs and unpacked data for Mint events raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20MintIterator struct {
-	Event *OptimismSuperchainERC20Mint // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *OptimismSuperchainERC20MintIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(OptimismSuperchainERC20Mint)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(OptimismSuperchainERC20Mint)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *OptimismSuperchainERC20MintIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *OptimismSuperchainERC20MintIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// OptimismSuperchainERC20Mint represents a Mint event raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20Mint struct {
-	To     common.Address
-	Amount *big.Int
-	Raw    types.Log // Blockchain specific contextual infos
-}
-
-// FilterMint is a free log retrieval operation binding the contract event 0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885.
-//
-// Solidity: event Mint(address indexed to, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) FilterMint(opts *bind.FilterOpts, to []common.Address) (*OptimismSuperchainERC20MintIterator, error) {
-
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.FilterLogs(opts, "Mint", toRule)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20MintIterator{contract: _OptimismSuperchainERC20.contract, event: "Mint", logs: logs, sub: sub}, nil
-}
-
-// WatchMint is a free log subscription operation binding the contract event 0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885.
-//
-// Solidity: event Mint(address indexed to, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) WatchMint(opts *bind.WatchOpts, sink chan<- *OptimismSuperchainERC20Mint, to []common.Address) (event.Subscription, error) {
-
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.WatchLogs(opts, "Mint", toRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(OptimismSuperchainERC20Mint)
-				if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Mint", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseMint is a log parse operation binding the contract event 0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885.
-//
-// Solidity: event Mint(address indexed to, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) ParseMint(log types.Log) (*OptimismSuperchainERC20Mint, error) {
-	event := new(OptimismSuperchainERC20Mint)
-	if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Mint", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// OptimismSuperchainERC20TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20TransferIterator struct {
-	Event *OptimismSuperchainERC20Transfer // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *OptimismSuperchainERC20TransferIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(OptimismSuperchainERC20Transfer)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(OptimismSuperchainERC20Transfer)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *OptimismSuperchainERC20TransferIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *OptimismSuperchainERC20TransferIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// OptimismSuperchainERC20Transfer represents a Transfer event raised by the OptimismSuperchainERC20 contract.
-type OptimismSuperchainERC20Transfer struct {
-	From   common.Address
-	To     common.Address
-	Amount *big.Int
-	Raw    types.Log // Blockchain specific contextual infos
-}
-
-// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
-//
-// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OptimismSuperchainERC20TransferIterator, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
-	if err != nil {
-		return nil, err
-	}
-	return &OptimismSuperchainERC20TransferIterator{contract: _OptimismSuperchainERC20.contract, event: "Transfer", logs: logs, sub: sub}, nil
-}
-
-// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
-//
-// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *OptimismSuperchainERC20Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	logs, sub, err := _OptimismSuperchainERC20.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(OptimismSuperchainERC20Transfer)
-				if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Transfer", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
-//
-// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
-func (_OptimismSuperchainERC20 *OptimismSuperchainERC20Filterer) ParseTransfer(log types.Log) (*OptimismSuperchainERC20Transfer, error) {
-	event := new(OptimismSuperchainERC20Transfer)
-	if err := _OptimismSuperchainERC20.contract.UnpackLog(event, "Transfer", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
diff --git a/bindings/SuperchainERC20.go b/bindings/SuperchainERC20.go
new file mode 100644
index 000000000..2061fc3c4
--- /dev/null
+++ b/bindings/SuperchainERC20.go
@@ -0,0 +1,1237 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+	_ = abi.ConvertType
+)
+
+// SuperchainERC20MetaData contains all meta data concerning the SuperchainERC20 contract.
+var SuperchainERC20MetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"result\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"crosschainBurn\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"crosschainMint\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CrosschainBurn\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CrosschainMint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AllowanceOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AllowanceUnderflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientAllowance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Permit2AllowanceIsFixedAtInfinity\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PermitExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSupplyOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[]}]",
+}
+
+// SuperchainERC20ABI is the input ABI used to generate the binding from.
+// Deprecated: Use SuperchainERC20MetaData.ABI instead.
+var SuperchainERC20ABI = SuperchainERC20MetaData.ABI
+
+// SuperchainERC20 is an auto generated Go binding around an Ethereum contract.
+type SuperchainERC20 struct {
+	SuperchainERC20Caller     // Read-only binding to the contract
+	SuperchainERC20Transactor // Write-only binding to the contract
+	SuperchainERC20Filterer   // Log filterer for contract events
+}
+
+// SuperchainERC20Caller is an auto generated read-only Go binding around an Ethereum contract.
+type SuperchainERC20Caller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SuperchainERC20Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type SuperchainERC20Transactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SuperchainERC20Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type SuperchainERC20Filterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SuperchainERC20Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type SuperchainERC20Session struct {
+	Contract     *SuperchainERC20  // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// SuperchainERC20CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type SuperchainERC20CallerSession struct {
+	Contract *SuperchainERC20Caller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts          // Call options to use throughout this session
+}
+
+// SuperchainERC20TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type SuperchainERC20TransactorSession struct {
+	Contract     *SuperchainERC20Transactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
+}
+
+// SuperchainERC20Raw is an auto generated low-level Go binding around an Ethereum contract.
+type SuperchainERC20Raw struct {
+	Contract *SuperchainERC20 // Generic contract binding to access the raw methods on
+}
+
+// SuperchainERC20CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type SuperchainERC20CallerRaw struct {
+	Contract *SuperchainERC20Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// SuperchainERC20TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type SuperchainERC20TransactorRaw struct {
+	Contract *SuperchainERC20Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewSuperchainERC20 creates a new instance of SuperchainERC20, bound to a specific deployed contract.
+func NewSuperchainERC20(address common.Address, backend bind.ContractBackend) (*SuperchainERC20, error) {
+	contract, err := bindSuperchainERC20(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &SuperchainERC20{SuperchainERC20Caller: SuperchainERC20Caller{contract: contract}, SuperchainERC20Transactor: SuperchainERC20Transactor{contract: contract}, SuperchainERC20Filterer: SuperchainERC20Filterer{contract: contract}}, nil
+}
+
+// NewSuperchainERC20Caller creates a new read-only instance of SuperchainERC20, bound to a specific deployed contract.
+func NewSuperchainERC20Caller(address common.Address, caller bind.ContractCaller) (*SuperchainERC20Caller, error) {
+	contract, err := bindSuperchainERC20(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &SuperchainERC20Caller{contract: contract}, nil
+}
+
+// NewSuperchainERC20Transactor creates a new write-only instance of SuperchainERC20, bound to a specific deployed contract.
+func NewSuperchainERC20Transactor(address common.Address, transactor bind.ContractTransactor) (*SuperchainERC20Transactor, error) {
+	contract, err := bindSuperchainERC20(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &SuperchainERC20Transactor{contract: contract}, nil
+}
+
+// NewSuperchainERC20Filterer creates a new log filterer instance of SuperchainERC20, bound to a specific deployed contract.
+func NewSuperchainERC20Filterer(address common.Address, filterer bind.ContractFilterer) (*SuperchainERC20Filterer, error) {
+	contract, err := bindSuperchainERC20(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &SuperchainERC20Filterer{contract: contract}, nil
+}
+
+// bindSuperchainERC20 binds a generic wrapper to an already deployed contract.
+func bindSuperchainERC20(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := SuperchainERC20MetaData.GetAbi()
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_SuperchainERC20 *SuperchainERC20Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _SuperchainERC20.Contract.SuperchainERC20Caller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_SuperchainERC20 *SuperchainERC20Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.SuperchainERC20Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SuperchainERC20 *SuperchainERC20Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.SuperchainERC20Transactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_SuperchainERC20 *SuperchainERC20CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _SuperchainERC20.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_SuperchainERC20 *SuperchainERC20TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SuperchainERC20 *SuperchainERC20TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.contract.Transact(opts, method, params...)
+}
+
+// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
+//
+// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result)
+func (_SuperchainERC20 *SuperchainERC20Caller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "DOMAIN_SEPARATOR")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
+//
+// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result)
+func (_SuperchainERC20 *SuperchainERC20Session) DOMAINSEPARATOR() ([32]byte, error) {
+	return _SuperchainERC20.Contract.DOMAINSEPARATOR(&_SuperchainERC20.CallOpts)
+}
+
+// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
+//
+// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) DOMAINSEPARATOR() ([32]byte, error) {
+	return _SuperchainERC20.Contract.DOMAINSEPARATOR(&_SuperchainERC20.CallOpts)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(address owner, address spender) view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "allowance", owner, spender)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(address owner, address spender) view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+	return _SuperchainERC20.Contract.Allowance(&_SuperchainERC20.CallOpts, owner, spender)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(address owner, address spender) view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+	return _SuperchainERC20.Contract.Allowance(&_SuperchainERC20.CallOpts, owner, spender)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(address owner) view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20Caller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "balanceOf", owner)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(address owner) view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20Session) BalanceOf(owner common.Address) (*big.Int, error) {
+	return _SuperchainERC20.Contract.BalanceOf(&_SuperchainERC20.CallOpts, owner)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(address owner) view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) BalanceOf(owner common.Address) (*big.Int, error) {
+	return _SuperchainERC20.Contract.BalanceOf(&_SuperchainERC20.CallOpts, owner)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() view returns(uint8)
+func (_SuperchainERC20 *SuperchainERC20Caller) Decimals(opts *bind.CallOpts) (uint8, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "decimals")
+
+	if err != nil {
+		return *new(uint8), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+	return out0, err
+
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() view returns(uint8)
+func (_SuperchainERC20 *SuperchainERC20Session) Decimals() (uint8, error) {
+	return _SuperchainERC20.Contract.Decimals(&_SuperchainERC20.CallOpts)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() view returns(uint8)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) Decimals() (uint8, error) {
+	return _SuperchainERC20.Contract.Decimals(&_SuperchainERC20.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() view returns(string)
+func (_SuperchainERC20 *SuperchainERC20Caller) Name(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "name")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() view returns(string)
+func (_SuperchainERC20 *SuperchainERC20Session) Name() (string, error) {
+	return _SuperchainERC20.Contract.Name(&_SuperchainERC20.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() view returns(string)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) Name() (string, error) {
+	return _SuperchainERC20.Contract.Name(&_SuperchainERC20.CallOpts)
+}
+
+// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
+//
+// Solidity: function nonces(address owner) view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20Caller) Nonces(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "nonces", owner)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
+//
+// Solidity: function nonces(address owner) view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20Session) Nonces(owner common.Address) (*big.Int, error) {
+	return _SuperchainERC20.Contract.Nonces(&_SuperchainERC20.CallOpts, owner)
+}
+
+// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
+//
+// Solidity: function nonces(address owner) view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) Nonces(owner common.Address) (*big.Int, error) {
+	return _SuperchainERC20.Contract.Nonces(&_SuperchainERC20.CallOpts, owner)
+}
+
+// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
+//
+// Solidity: function supportsInterface(bytes4 _interfaceId) view returns(bool)
+func (_SuperchainERC20 *SuperchainERC20Caller) SupportsInterface(opts *bind.CallOpts, _interfaceId [4]byte) (bool, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "supportsInterface", _interfaceId)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
+//
+// Solidity: function supportsInterface(bytes4 _interfaceId) view returns(bool)
+func (_SuperchainERC20 *SuperchainERC20Session) SupportsInterface(_interfaceId [4]byte) (bool, error) {
+	return _SuperchainERC20.Contract.SupportsInterface(&_SuperchainERC20.CallOpts, _interfaceId)
+}
+
+// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
+//
+// Solidity: function supportsInterface(bytes4 _interfaceId) view returns(bool)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) SupportsInterface(_interfaceId [4]byte) (bool, error) {
+	return _SuperchainERC20.Contract.SupportsInterface(&_SuperchainERC20.CallOpts, _interfaceId)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() view returns(string)
+func (_SuperchainERC20 *SuperchainERC20Caller) Symbol(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "symbol")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() view returns(string)
+func (_SuperchainERC20 *SuperchainERC20Session) Symbol() (string, error) {
+	return _SuperchainERC20.Contract.Symbol(&_SuperchainERC20.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() view returns(string)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) Symbol() (string, error) {
+	return _SuperchainERC20.Contract.Symbol(&_SuperchainERC20.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "totalSupply")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20Session) TotalSupply() (*big.Int, error) {
+	return _SuperchainERC20.Contract.TotalSupply(&_SuperchainERC20.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() view returns(uint256 result)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) TotalSupply() (*big.Int, error) {
+	return _SuperchainERC20.Contract.TotalSupply(&_SuperchainERC20.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SuperchainERC20 *SuperchainERC20Caller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _SuperchainERC20.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SuperchainERC20 *SuperchainERC20Session) Version() (string, error) {
+	return _SuperchainERC20.Contract.Version(&_SuperchainERC20.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SuperchainERC20 *SuperchainERC20CallerSession) Version() (string, error) {
+	return _SuperchainERC20.Contract.Version(&_SuperchainERC20.CallOpts)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(address spender, uint256 amount) returns(bool)
+func (_SuperchainERC20 *SuperchainERC20Transactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.contract.Transact(opts, "approve", spender, amount)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(address spender, uint256 amount) returns(bool)
+func (_SuperchainERC20 *SuperchainERC20Session) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.Approve(&_SuperchainERC20.TransactOpts, spender, amount)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(address spender, uint256 amount) returns(bool)
+func (_SuperchainERC20 *SuperchainERC20TransactorSession) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.Approve(&_SuperchainERC20.TransactOpts, spender, amount)
+}
+
+// CrosschainBurn is a paid mutator transaction binding the contract method 0x2b8c49e3.
+//
+// Solidity: function crosschainBurn(address _from, uint256 _amount) returns()
+func (_SuperchainERC20 *SuperchainERC20Transactor) CrosschainBurn(opts *bind.TransactOpts, _from common.Address, _amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.contract.Transact(opts, "crosschainBurn", _from, _amount)
+}
+
+// CrosschainBurn is a paid mutator transaction binding the contract method 0x2b8c49e3.
+//
+// Solidity: function crosschainBurn(address _from, uint256 _amount) returns()
+func (_SuperchainERC20 *SuperchainERC20Session) CrosschainBurn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.CrosschainBurn(&_SuperchainERC20.TransactOpts, _from, _amount)
+}
+
+// CrosschainBurn is a paid mutator transaction binding the contract method 0x2b8c49e3.
+//
+// Solidity: function crosschainBurn(address _from, uint256 _amount) returns()
+func (_SuperchainERC20 *SuperchainERC20TransactorSession) CrosschainBurn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.CrosschainBurn(&_SuperchainERC20.TransactOpts, _from, _amount)
+}
+
+// CrosschainMint is a paid mutator transaction binding the contract method 0x18bf5077.
+//
+// Solidity: function crosschainMint(address _to, uint256 _amount) returns()
+func (_SuperchainERC20 *SuperchainERC20Transactor) CrosschainMint(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.contract.Transact(opts, "crosschainMint", _to, _amount)
+}
+
+// CrosschainMint is a paid mutator transaction binding the contract method 0x18bf5077.
+//
+// Solidity: function crosschainMint(address _to, uint256 _amount) returns()
+func (_SuperchainERC20 *SuperchainERC20Session) CrosschainMint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.CrosschainMint(&_SuperchainERC20.TransactOpts, _to, _amount)
+}
+
+// CrosschainMint is a paid mutator transaction binding the contract method 0x18bf5077.
+//
+// Solidity: function crosschainMint(address _to, uint256 _amount) returns()
+func (_SuperchainERC20 *SuperchainERC20TransactorSession) CrosschainMint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.CrosschainMint(&_SuperchainERC20.TransactOpts, _to, _amount)
+}
+
+// Permit is a paid mutator transaction binding the contract method 0xd505accf.
+//
+// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
+func (_SuperchainERC20 *SuperchainERC20Transactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
+	return _SuperchainERC20.contract.Transact(opts, "permit", owner, spender, value, deadline, v, r, s)
+}
+
+// Permit is a paid mutator transaction binding the contract method 0xd505accf.
+//
+// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
+func (_SuperchainERC20 *SuperchainERC20Session) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.Permit(&_SuperchainERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
+}
+
+// Permit is a paid mutator transaction binding the contract method 0xd505accf.
+//
+// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
+func (_SuperchainERC20 *SuperchainERC20TransactorSession) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.Permit(&_SuperchainERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(address to, uint256 amount) returns(bool)
+func (_SuperchainERC20 *SuperchainERC20Transactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.contract.Transact(opts, "transfer", to, amount)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(address to, uint256 amount) returns(bool)
+func (_SuperchainERC20 *SuperchainERC20Session) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.Transfer(&_SuperchainERC20.TransactOpts, to, amount)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(address to, uint256 amount) returns(bool)
+func (_SuperchainERC20 *SuperchainERC20TransactorSession) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.Transfer(&_SuperchainERC20.TransactOpts, to, amount)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
+func (_SuperchainERC20 *SuperchainERC20Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.contract.Transact(opts, "transferFrom", from, to, amount)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
+func (_SuperchainERC20 *SuperchainERC20Session) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.TransferFrom(&_SuperchainERC20.TransactOpts, from, to, amount)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
+func (_SuperchainERC20 *SuperchainERC20TransactorSession) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _SuperchainERC20.Contract.TransferFrom(&_SuperchainERC20.TransactOpts, from, to, amount)
+}
+
+// SuperchainERC20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the SuperchainERC20 contract.
+type SuperchainERC20ApprovalIterator struct {
+	Event *SuperchainERC20Approval // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *SuperchainERC20ApprovalIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(SuperchainERC20Approval)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(SuperchainERC20Approval)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *SuperchainERC20ApprovalIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *SuperchainERC20ApprovalIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// SuperchainERC20Approval represents a Approval event raised by the SuperchainERC20 contract.
+type SuperchainERC20Approval struct {
+	Owner   common.Address
+	Spender common.Address
+	Amount  *big.Int
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
+func (_SuperchainERC20 *SuperchainERC20Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*SuperchainERC20ApprovalIterator, error) {
+
+	var ownerRule []interface{}
+	for _, ownerItem := range owner {
+		ownerRule = append(ownerRule, ownerItem)
+	}
+	var spenderRule []interface{}
+	for _, spenderItem := range spender {
+		spenderRule = append(spenderRule, spenderItem)
+	}
+
+	logs, sub, err := _SuperchainERC20.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &SuperchainERC20ApprovalIterator{contract: _SuperchainERC20.contract, event: "Approval", logs: logs, sub: sub}, nil
+}
+
+// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
+func (_SuperchainERC20 *SuperchainERC20Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *SuperchainERC20Approval, owner []common.Address, spender []common.Address) (event.Subscription, error) {
+
+	var ownerRule []interface{}
+	for _, ownerItem := range owner {
+		ownerRule = append(ownerRule, ownerItem)
+	}
+	var spenderRule []interface{}
+	for _, spenderItem := range spender {
+		spenderRule = append(spenderRule, spenderItem)
+	}
+
+	logs, sub, err := _SuperchainERC20.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(SuperchainERC20Approval)
+				if err := _SuperchainERC20.contract.UnpackLog(event, "Approval", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
+func (_SuperchainERC20 *SuperchainERC20Filterer) ParseApproval(log types.Log) (*SuperchainERC20Approval, error) {
+	event := new(SuperchainERC20Approval)
+	if err := _SuperchainERC20.contract.UnpackLog(event, "Approval", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// SuperchainERC20CrosschainBurnIterator is returned from FilterCrosschainBurn and is used to iterate over the raw logs and unpacked data for CrosschainBurn events raised by the SuperchainERC20 contract.
+type SuperchainERC20CrosschainBurnIterator struct {
+	Event *SuperchainERC20CrosschainBurn // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *SuperchainERC20CrosschainBurnIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(SuperchainERC20CrosschainBurn)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(SuperchainERC20CrosschainBurn)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *SuperchainERC20CrosschainBurnIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *SuperchainERC20CrosschainBurnIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// SuperchainERC20CrosschainBurn represents a CrosschainBurn event raised by the SuperchainERC20 contract.
+type SuperchainERC20CrosschainBurn struct {
+	From   common.Address
+	Amount *big.Int
+	Sender common.Address
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterCrosschainBurn is a free log retrieval operation binding the contract event 0xb90795a66650155983e242cac3e1ac1a4dc26f8ed2987f3ce416a34e00111fd4.
+//
+// Solidity: event CrosschainBurn(address indexed from, uint256 amount, address indexed sender)
+func (_SuperchainERC20 *SuperchainERC20Filterer) FilterCrosschainBurn(opts *bind.FilterOpts, from []common.Address, sender []common.Address) (*SuperchainERC20CrosschainBurnIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _SuperchainERC20.contract.FilterLogs(opts, "CrosschainBurn", fromRule, senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &SuperchainERC20CrosschainBurnIterator{contract: _SuperchainERC20.contract, event: "CrosschainBurn", logs: logs, sub: sub}, nil
+}
+
+// WatchCrosschainBurn is a free log subscription operation binding the contract event 0xb90795a66650155983e242cac3e1ac1a4dc26f8ed2987f3ce416a34e00111fd4.
+//
+// Solidity: event CrosschainBurn(address indexed from, uint256 amount, address indexed sender)
+func (_SuperchainERC20 *SuperchainERC20Filterer) WatchCrosschainBurn(opts *bind.WatchOpts, sink chan<- *SuperchainERC20CrosschainBurn, from []common.Address, sender []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _SuperchainERC20.contract.WatchLogs(opts, "CrosschainBurn", fromRule, senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(SuperchainERC20CrosschainBurn)
+				if err := _SuperchainERC20.contract.UnpackLog(event, "CrosschainBurn", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseCrosschainBurn is a log parse operation binding the contract event 0xb90795a66650155983e242cac3e1ac1a4dc26f8ed2987f3ce416a34e00111fd4.
+//
+// Solidity: event CrosschainBurn(address indexed from, uint256 amount, address indexed sender)
+func (_SuperchainERC20 *SuperchainERC20Filterer) ParseCrosschainBurn(log types.Log) (*SuperchainERC20CrosschainBurn, error) {
+	event := new(SuperchainERC20CrosschainBurn)
+	if err := _SuperchainERC20.contract.UnpackLog(event, "CrosschainBurn", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// SuperchainERC20CrosschainMintIterator is returned from FilterCrosschainMint and is used to iterate over the raw logs and unpacked data for CrosschainMint events raised by the SuperchainERC20 contract.
+type SuperchainERC20CrosschainMintIterator struct {
+	Event *SuperchainERC20CrosschainMint // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *SuperchainERC20CrosschainMintIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(SuperchainERC20CrosschainMint)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(SuperchainERC20CrosschainMint)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *SuperchainERC20CrosschainMintIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *SuperchainERC20CrosschainMintIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// SuperchainERC20CrosschainMint represents a CrosschainMint event raised by the SuperchainERC20 contract.
+type SuperchainERC20CrosschainMint struct {
+	To     common.Address
+	Amount *big.Int
+	Sender common.Address
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterCrosschainMint is a free log retrieval operation binding the contract event 0xde22baff038e3a3e08407cbdf617deed74e869a7ba517df611e33131c6e6ea04.
+//
+// Solidity: event CrosschainMint(address indexed to, uint256 amount, address indexed sender)
+func (_SuperchainERC20 *SuperchainERC20Filterer) FilterCrosschainMint(opts *bind.FilterOpts, to []common.Address, sender []common.Address) (*SuperchainERC20CrosschainMintIterator, error) {
+
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _SuperchainERC20.contract.FilterLogs(opts, "CrosschainMint", toRule, senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &SuperchainERC20CrosschainMintIterator{contract: _SuperchainERC20.contract, event: "CrosschainMint", logs: logs, sub: sub}, nil
+}
+
+// WatchCrosschainMint is a free log subscription operation binding the contract event 0xde22baff038e3a3e08407cbdf617deed74e869a7ba517df611e33131c6e6ea04.
+//
+// Solidity: event CrosschainMint(address indexed to, uint256 amount, address indexed sender)
+func (_SuperchainERC20 *SuperchainERC20Filterer) WatchCrosschainMint(opts *bind.WatchOpts, sink chan<- *SuperchainERC20CrosschainMint, to []common.Address, sender []common.Address) (event.Subscription, error) {
+
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _SuperchainERC20.contract.WatchLogs(opts, "CrosschainMint", toRule, senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(SuperchainERC20CrosschainMint)
+				if err := _SuperchainERC20.contract.UnpackLog(event, "CrosschainMint", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseCrosschainMint is a log parse operation binding the contract event 0xde22baff038e3a3e08407cbdf617deed74e869a7ba517df611e33131c6e6ea04.
+//
+// Solidity: event CrosschainMint(address indexed to, uint256 amount, address indexed sender)
+func (_SuperchainERC20 *SuperchainERC20Filterer) ParseCrosschainMint(log types.Log) (*SuperchainERC20CrosschainMint, error) {
+	event := new(SuperchainERC20CrosschainMint)
+	if err := _SuperchainERC20.contract.UnpackLog(event, "CrosschainMint", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// SuperchainERC20TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the SuperchainERC20 contract.
+type SuperchainERC20TransferIterator struct {
+	Event *SuperchainERC20Transfer // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *SuperchainERC20TransferIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(SuperchainERC20Transfer)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(SuperchainERC20Transfer)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *SuperchainERC20TransferIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *SuperchainERC20TransferIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// SuperchainERC20Transfer represents a Transfer event raised by the SuperchainERC20 contract.
+type SuperchainERC20Transfer struct {
+	From   common.Address
+	To     common.Address
+	Amount *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
+func (_SuperchainERC20 *SuperchainERC20Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SuperchainERC20TransferIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _SuperchainERC20.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &SuperchainERC20TransferIterator{contract: _SuperchainERC20.contract, event: "Transfer", logs: logs, sub: sub}, nil
+}
+
+// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
+func (_SuperchainERC20 *SuperchainERC20Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *SuperchainERC20Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _SuperchainERC20.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(SuperchainERC20Transfer)
+				if err := _SuperchainERC20.contract.UnpackLog(event, "Transfer", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
+func (_SuperchainERC20 *SuperchainERC20Filterer) ParseTransfer(log types.Log) (*SuperchainERC20Transfer, error) {
+	event := new(SuperchainERC20Transfer)
+	if err := _SuperchainERC20.contract.UnpackLog(event, "Transfer", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/bindings/l2nativesuperchainerc20.go b/bindings/l2nativesuperchainerc20.go
deleted file mode 100644
index 38b5e7194..000000000
--- a/bindings/l2nativesuperchainerc20.go
+++ /dev/null
@@ -1,1516 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"errors"
-	"math/big"
-	"strings"
-
-	ethereum "github.com/ethereum/go-ethereum"
-	"github.com/ethereum/go-ethereum/accounts/abi"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/event"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var (
-	_ = errors.New
-	_ = big.NewInt
-	_ = strings.NewReader
-	_ = ethereum.NotFound
-	_ = bind.Bind
-	_ = common.Big1
-	_ = types.BloomLookup
-	_ = event.NewSubscription
-	_ = abi.ConvertType
-)
-
-// L2NativeSuperchainERC20MetaData contains all meta data concerning the L2NativeSuperchainERC20 contract.
-var L2NativeSuperchainERC20MetaData = &bind.MetaData{
-	ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"result\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"crosschainBurn\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"crosschainMint\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burn\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CrosschainBurn\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CrosschainMint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AllowanceOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AllowanceUnderflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientAllowance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Permit2AllowanceIsFixedAtInfinity\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PermitExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSupplyOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]",
-}
-
-// L2NativeSuperchainERC20ABI is the input ABI used to generate the binding from.
-// Deprecated: Use L2NativeSuperchainERC20MetaData.ABI instead.
-var L2NativeSuperchainERC20ABI = L2NativeSuperchainERC20MetaData.ABI
-
-// L2NativeSuperchainERC20 is an auto generated Go binding around an Ethereum contract.
-type L2NativeSuperchainERC20 struct {
-	L2NativeSuperchainERC20Caller     // Read-only binding to the contract
-	L2NativeSuperchainERC20Transactor // Write-only binding to the contract
-	L2NativeSuperchainERC20Filterer   // Log filterer for contract events
-}
-
-// L2NativeSuperchainERC20Caller is an auto generated read-only Go binding around an Ethereum contract.
-type L2NativeSuperchainERC20Caller struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// L2NativeSuperchainERC20Transactor is an auto generated write-only Go binding around an Ethereum contract.
-type L2NativeSuperchainERC20Transactor struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// L2NativeSuperchainERC20Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
-type L2NativeSuperchainERC20Filterer struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// L2NativeSuperchainERC20Session is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type L2NativeSuperchainERC20Session struct {
-	Contract     *L2NativeSuperchainERC20 // Generic contract binding to set the session for
-	CallOpts     bind.CallOpts            // Call options to use throughout this session
-	TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
-}
-
-// L2NativeSuperchainERC20CallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type L2NativeSuperchainERC20CallerSession struct {
-	Contract *L2NativeSuperchainERC20Caller // Generic contract caller binding to set the session for
-	CallOpts bind.CallOpts                  // Call options to use throughout this session
-}
-
-// L2NativeSuperchainERC20TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type L2NativeSuperchainERC20TransactorSession struct {
-	Contract     *L2NativeSuperchainERC20Transactor // Generic contract transactor binding to set the session for
-	TransactOpts bind.TransactOpts                  // Transaction auth options to use throughout this session
-}
-
-// L2NativeSuperchainERC20Raw is an auto generated low-level Go binding around an Ethereum contract.
-type L2NativeSuperchainERC20Raw struct {
-	Contract *L2NativeSuperchainERC20 // Generic contract binding to access the raw methods on
-}
-
-// L2NativeSuperchainERC20CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type L2NativeSuperchainERC20CallerRaw struct {
-	Contract *L2NativeSuperchainERC20Caller // Generic read-only contract binding to access the raw methods on
-}
-
-// L2NativeSuperchainERC20TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type L2NativeSuperchainERC20TransactorRaw struct {
-	Contract *L2NativeSuperchainERC20Transactor // Generic write-only contract binding to access the raw methods on
-}
-
-// NewL2NativeSuperchainERC20 creates a new instance of L2NativeSuperchainERC20, bound to a specific deployed contract.
-func NewL2NativeSuperchainERC20(address common.Address, backend bind.ContractBackend) (*L2NativeSuperchainERC20, error) {
-	contract, err := bindL2NativeSuperchainERC20(address, backend, backend, backend)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20{L2NativeSuperchainERC20Caller: L2NativeSuperchainERC20Caller{contract: contract}, L2NativeSuperchainERC20Transactor: L2NativeSuperchainERC20Transactor{contract: contract}, L2NativeSuperchainERC20Filterer: L2NativeSuperchainERC20Filterer{contract: contract}}, nil
-}
-
-// NewL2NativeSuperchainERC20Caller creates a new read-only instance of L2NativeSuperchainERC20, bound to a specific deployed contract.
-func NewL2NativeSuperchainERC20Caller(address common.Address, caller bind.ContractCaller) (*L2NativeSuperchainERC20Caller, error) {
-	contract, err := bindL2NativeSuperchainERC20(address, caller, nil, nil)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20Caller{contract: contract}, nil
-}
-
-// NewL2NativeSuperchainERC20Transactor creates a new write-only instance of L2NativeSuperchainERC20, bound to a specific deployed contract.
-func NewL2NativeSuperchainERC20Transactor(address common.Address, transactor bind.ContractTransactor) (*L2NativeSuperchainERC20Transactor, error) {
-	contract, err := bindL2NativeSuperchainERC20(address, nil, transactor, nil)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20Transactor{contract: contract}, nil
-}
-
-// NewL2NativeSuperchainERC20Filterer creates a new log filterer instance of L2NativeSuperchainERC20, bound to a specific deployed contract.
-func NewL2NativeSuperchainERC20Filterer(address common.Address, filterer bind.ContractFilterer) (*L2NativeSuperchainERC20Filterer, error) {
-	contract, err := bindL2NativeSuperchainERC20(address, nil, nil, filterer)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20Filterer{contract: contract}, nil
-}
-
-// bindL2NativeSuperchainERC20 binds a generic wrapper to an already deployed contract.
-func bindL2NativeSuperchainERC20(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
-	parsed, err := L2NativeSuperchainERC20MetaData.GetAbi()
-	if err != nil {
-		return nil, err
-	}
-	return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
-	return _L2NativeSuperchainERC20.Contract.L2NativeSuperchainERC20Caller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.L2NativeSuperchainERC20Transactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.L2NativeSuperchainERC20Transactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
-	return _L2NativeSuperchainERC20.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.contract.Transact(opts, method, params...)
-}
-
-// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
-//
-// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Caller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error) {
-	var out []interface{}
-	err := _L2NativeSuperchainERC20.contract.Call(opts, &out, "DOMAIN_SEPARATOR")
-
-	if err != nil {
-		return *new([32]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
-	return out0, err
-
-}
-
-// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
-//
-// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) DOMAINSEPARATOR() ([32]byte, error) {
-	return _L2NativeSuperchainERC20.Contract.DOMAINSEPARATOR(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
-//
-// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerSession) DOMAINSEPARATOR() ([32]byte, error) {
-	return _L2NativeSuperchainERC20.Contract.DOMAINSEPARATOR(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
-//
-// Solidity: function allowance(address owner, address spender) view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
-	var out []interface{}
-	err := _L2NativeSuperchainERC20.contract.Call(opts, &out, "allowance", owner, spender)
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
-//
-// Solidity: function allowance(address owner, address spender) view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
-	return _L2NativeSuperchainERC20.Contract.Allowance(&_L2NativeSuperchainERC20.CallOpts, owner, spender)
-}
-
-// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
-//
-// Solidity: function allowance(address owner, address spender) view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
-	return _L2NativeSuperchainERC20.Contract.Allowance(&_L2NativeSuperchainERC20.CallOpts, owner, spender)
-}
-
-// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
-//
-// Solidity: function balanceOf(address owner) view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Caller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
-	var out []interface{}
-	err := _L2NativeSuperchainERC20.contract.Call(opts, &out, "balanceOf", owner)
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
-//
-// Solidity: function balanceOf(address owner) view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) BalanceOf(owner common.Address) (*big.Int, error) {
-	return _L2NativeSuperchainERC20.Contract.BalanceOf(&_L2NativeSuperchainERC20.CallOpts, owner)
-}
-
-// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
-//
-// Solidity: function balanceOf(address owner) view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerSession) BalanceOf(owner common.Address) (*big.Int, error) {
-	return _L2NativeSuperchainERC20.Contract.BalanceOf(&_L2NativeSuperchainERC20.CallOpts, owner)
-}
-
-// Decimals is a free data retrieval call binding the contract method 0x313ce567.
-//
-// Solidity: function decimals() pure returns(uint8)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Caller) Decimals(opts *bind.CallOpts) (uint8, error) {
-	var out []interface{}
-	err := _L2NativeSuperchainERC20.contract.Call(opts, &out, "decimals")
-
-	if err != nil {
-		return *new(uint8), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
-
-	return out0, err
-
-}
-
-// Decimals is a free data retrieval call binding the contract method 0x313ce567.
-//
-// Solidity: function decimals() pure returns(uint8)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Decimals() (uint8, error) {
-	return _L2NativeSuperchainERC20.Contract.Decimals(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// Decimals is a free data retrieval call binding the contract method 0x313ce567.
-//
-// Solidity: function decimals() pure returns(uint8)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerSession) Decimals() (uint8, error) {
-	return _L2NativeSuperchainERC20.Contract.Decimals(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// Name is a free data retrieval call binding the contract method 0x06fdde03.
-//
-// Solidity: function name() pure returns(string)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Caller) Name(opts *bind.CallOpts) (string, error) {
-	var out []interface{}
-	err := _L2NativeSuperchainERC20.contract.Call(opts, &out, "name")
-
-	if err != nil {
-		return *new(string), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
-	return out0, err
-
-}
-
-// Name is a free data retrieval call binding the contract method 0x06fdde03.
-//
-// Solidity: function name() pure returns(string)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Name() (string, error) {
-	return _L2NativeSuperchainERC20.Contract.Name(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// Name is a free data retrieval call binding the contract method 0x06fdde03.
-//
-// Solidity: function name() pure returns(string)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerSession) Name() (string, error) {
-	return _L2NativeSuperchainERC20.Contract.Name(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
-//
-// Solidity: function nonces(address owner) view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Caller) Nonces(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
-	var out []interface{}
-	err := _L2NativeSuperchainERC20.contract.Call(opts, &out, "nonces", owner)
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
-//
-// Solidity: function nonces(address owner) view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Nonces(owner common.Address) (*big.Int, error) {
-	return _L2NativeSuperchainERC20.Contract.Nonces(&_L2NativeSuperchainERC20.CallOpts, owner)
-}
-
-// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
-//
-// Solidity: function nonces(address owner) view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerSession) Nonces(owner common.Address) (*big.Int, error) {
-	return _L2NativeSuperchainERC20.Contract.Nonces(&_L2NativeSuperchainERC20.CallOpts, owner)
-}
-
-// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
-//
-// Solidity: function symbol() pure returns(string)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Caller) Symbol(opts *bind.CallOpts) (string, error) {
-	var out []interface{}
-	err := _L2NativeSuperchainERC20.contract.Call(opts, &out, "symbol")
-
-	if err != nil {
-		return *new(string), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
-	return out0, err
-
-}
-
-// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
-//
-// Solidity: function symbol() pure returns(string)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Symbol() (string, error) {
-	return _L2NativeSuperchainERC20.Contract.Symbol(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
-//
-// Solidity: function symbol() pure returns(string)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerSession) Symbol() (string, error) {
-	return _L2NativeSuperchainERC20.Contract.Symbol(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
-//
-// Solidity: function totalSupply() view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _L2NativeSuperchainERC20.contract.Call(opts, &out, "totalSupply")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
-//
-// Solidity: function totalSupply() view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) TotalSupply() (*big.Int, error) {
-	return _L2NativeSuperchainERC20.Contract.TotalSupply(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
-//
-// Solidity: function totalSupply() view returns(uint256 result)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerSession) TotalSupply() (*big.Int, error) {
-	return _L2NativeSuperchainERC20.Contract.TotalSupply(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// Version is a free data retrieval call binding the contract method 0x54fd4d50.
-//
-// Solidity: function version() view returns(string)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Caller) Version(opts *bind.CallOpts) (string, error) {
-	var out []interface{}
-	err := _L2NativeSuperchainERC20.contract.Call(opts, &out, "version")
-
-	if err != nil {
-		return *new(string), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
-	return out0, err
-
-}
-
-// Version is a free data retrieval call binding the contract method 0x54fd4d50.
-//
-// Solidity: function version() view returns(string)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Version() (string, error) {
-	return _L2NativeSuperchainERC20.Contract.Version(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// Version is a free data retrieval call binding the contract method 0x54fd4d50.
-//
-// Solidity: function version() view returns(string)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20CallerSession) Version() (string, error) {
-	return _L2NativeSuperchainERC20.Contract.Version(&_L2NativeSuperchainERC20.CallOpts)
-}
-
-// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
-//
-// Solidity: function approve(address spender, uint256 amount) returns(bool)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Transactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.contract.Transact(opts, "approve", spender, amount)
-}
-
-// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
-//
-// Solidity: function approve(address spender, uint256 amount) returns(bool)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Approve(&_L2NativeSuperchainERC20.TransactOpts, spender, amount)
-}
-
-// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
-//
-// Solidity: function approve(address spender, uint256 amount) returns(bool)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorSession) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Approve(&_L2NativeSuperchainERC20.TransactOpts, spender, amount)
-}
-
-// Burn is a paid mutator transaction binding the contract method 0x9dc29fac.
-//
-// Solidity: function burn(address _from, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Transactor) Burn(opts *bind.TransactOpts, _from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.contract.Transact(opts, "burn", _from, _amount)
-}
-
-// Burn is a paid mutator transaction binding the contract method 0x9dc29fac.
-//
-// Solidity: function burn(address _from, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Burn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Burn(&_L2NativeSuperchainERC20.TransactOpts, _from, _amount)
-}
-
-// Burn is a paid mutator transaction binding the contract method 0x9dc29fac.
-//
-// Solidity: function burn(address _from, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorSession) Burn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Burn(&_L2NativeSuperchainERC20.TransactOpts, _from, _amount)
-}
-
-// CrosschainBurn is a paid mutator transaction binding the contract method 0x2b8c49e3.
-//
-// Solidity: function crosschainBurn(address _from, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Transactor) CrosschainBurn(opts *bind.TransactOpts, _from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.contract.Transact(opts, "crosschainBurn", _from, _amount)
-}
-
-// CrosschainBurn is a paid mutator transaction binding the contract method 0x2b8c49e3.
-//
-// Solidity: function crosschainBurn(address _from, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) CrosschainBurn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.CrosschainBurn(&_L2NativeSuperchainERC20.TransactOpts, _from, _amount)
-}
-
-// CrosschainBurn is a paid mutator transaction binding the contract method 0x2b8c49e3.
-//
-// Solidity: function crosschainBurn(address _from, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorSession) CrosschainBurn(_from common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.CrosschainBurn(&_L2NativeSuperchainERC20.TransactOpts, _from, _amount)
-}
-
-// CrosschainMint is a paid mutator transaction binding the contract method 0x18bf5077.
-//
-// Solidity: function crosschainMint(address _to, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Transactor) CrosschainMint(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.contract.Transact(opts, "crosschainMint", _to, _amount)
-}
-
-// CrosschainMint is a paid mutator transaction binding the contract method 0x18bf5077.
-//
-// Solidity: function crosschainMint(address _to, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) CrosschainMint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.CrosschainMint(&_L2NativeSuperchainERC20.TransactOpts, _to, _amount)
-}
-
-// CrosschainMint is a paid mutator transaction binding the contract method 0x18bf5077.
-//
-// Solidity: function crosschainMint(address _to, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorSession) CrosschainMint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.CrosschainMint(&_L2NativeSuperchainERC20.TransactOpts, _to, _amount)
-}
-
-// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
-//
-// Solidity: function mint(address _to, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Transactor) Mint(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.contract.Transact(opts, "mint", _to, _amount)
-}
-
-// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
-//
-// Solidity: function mint(address _to, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Mint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Mint(&_L2NativeSuperchainERC20.TransactOpts, _to, _amount)
-}
-
-// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
-//
-// Solidity: function mint(address _to, uint256 _amount) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorSession) Mint(_to common.Address, _amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Mint(&_L2NativeSuperchainERC20.TransactOpts, _to, _amount)
-}
-
-// Permit is a paid mutator transaction binding the contract method 0xd505accf.
-//
-// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Transactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.contract.Transact(opts, "permit", owner, spender, value, deadline, v, r, s)
-}
-
-// Permit is a paid mutator transaction binding the contract method 0xd505accf.
-//
-// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Permit(&_L2NativeSuperchainERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
-}
-
-// Permit is a paid mutator transaction binding the contract method 0xd505accf.
-//
-// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorSession) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Permit(&_L2NativeSuperchainERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
-}
-
-// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
-//
-// Solidity: function transfer(address to, uint256 amount) returns(bool)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Transactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.contract.Transact(opts, "transfer", to, amount)
-}
-
-// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
-//
-// Solidity: function transfer(address to, uint256 amount) returns(bool)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Transfer(&_L2NativeSuperchainERC20.TransactOpts, to, amount)
-}
-
-// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
-//
-// Solidity: function transfer(address to, uint256 amount) returns(bool)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorSession) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.Transfer(&_L2NativeSuperchainERC20.TransactOpts, to, amount)
-}
-
-// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
-//
-// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.contract.Transact(opts, "transferFrom", from, to, amount)
-}
-
-// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
-//
-// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Session) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.TransferFrom(&_L2NativeSuperchainERC20.TransactOpts, from, to, amount)
-}
-
-// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
-//
-// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20TransactorSession) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
-	return _L2NativeSuperchainERC20.Contract.TransferFrom(&_L2NativeSuperchainERC20.TransactOpts, from, to, amount)
-}
-
-// L2NativeSuperchainERC20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20ApprovalIterator struct {
-	Event *L2NativeSuperchainERC20Approval // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *L2NativeSuperchainERC20ApprovalIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(L2NativeSuperchainERC20Approval)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(L2NativeSuperchainERC20Approval)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *L2NativeSuperchainERC20ApprovalIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *L2NativeSuperchainERC20ApprovalIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// L2NativeSuperchainERC20Approval represents a Approval event raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20Approval struct {
-	Owner   common.Address
-	Spender common.Address
-	Amount  *big.Int
-	Raw     types.Log // Blockchain specific contextual infos
-}
-
-// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
-//
-// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*L2NativeSuperchainERC20ApprovalIterator, error) {
-
-	var ownerRule []interface{}
-	for _, ownerItem := range owner {
-		ownerRule = append(ownerRule, ownerItem)
-	}
-	var spenderRule []interface{}
-	for _, spenderItem := range spender {
-		spenderRule = append(spenderRule, spenderItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20ApprovalIterator{contract: _L2NativeSuperchainERC20.contract, event: "Approval", logs: logs, sub: sub}, nil
-}
-
-// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
-//
-// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *L2NativeSuperchainERC20Approval, owner []common.Address, spender []common.Address) (event.Subscription, error) {
-
-	var ownerRule []interface{}
-	for _, ownerItem := range owner {
-		ownerRule = append(ownerRule, ownerItem)
-	}
-	var spenderRule []interface{}
-	for _, spenderItem := range spender {
-		spenderRule = append(spenderRule, spenderItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(L2NativeSuperchainERC20Approval)
-				if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "Approval", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
-//
-// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) ParseApproval(log types.Log) (*L2NativeSuperchainERC20Approval, error) {
-	event := new(L2NativeSuperchainERC20Approval)
-	if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "Approval", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// L2NativeSuperchainERC20BurnIterator is returned from FilterBurn and is used to iterate over the raw logs and unpacked data for Burn events raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20BurnIterator struct {
-	Event *L2NativeSuperchainERC20Burn // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *L2NativeSuperchainERC20BurnIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(L2NativeSuperchainERC20Burn)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(L2NativeSuperchainERC20Burn)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *L2NativeSuperchainERC20BurnIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *L2NativeSuperchainERC20BurnIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// L2NativeSuperchainERC20Burn represents a Burn event raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20Burn struct {
-	Account common.Address
-	Amount  *big.Int
-	Raw     types.Log // Blockchain specific contextual infos
-}
-
-// FilterBurn is a free log retrieval operation binding the contract event 0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5.
-//
-// Solidity: event Burn(address indexed account, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) FilterBurn(opts *bind.FilterOpts, account []common.Address) (*L2NativeSuperchainERC20BurnIterator, error) {
-
-	var accountRule []interface{}
-	for _, accountItem := range account {
-		accountRule = append(accountRule, accountItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.FilterLogs(opts, "Burn", accountRule)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20BurnIterator{contract: _L2NativeSuperchainERC20.contract, event: "Burn", logs: logs, sub: sub}, nil
-}
-
-// WatchBurn is a free log subscription operation binding the contract event 0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5.
-//
-// Solidity: event Burn(address indexed account, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) WatchBurn(opts *bind.WatchOpts, sink chan<- *L2NativeSuperchainERC20Burn, account []common.Address) (event.Subscription, error) {
-
-	var accountRule []interface{}
-	for _, accountItem := range account {
-		accountRule = append(accountRule, accountItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.WatchLogs(opts, "Burn", accountRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(L2NativeSuperchainERC20Burn)
-				if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "Burn", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseBurn is a log parse operation binding the contract event 0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5.
-//
-// Solidity: event Burn(address indexed account, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) ParseBurn(log types.Log) (*L2NativeSuperchainERC20Burn, error) {
-	event := new(L2NativeSuperchainERC20Burn)
-	if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "Burn", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// L2NativeSuperchainERC20CrosschainBurnIterator is returned from FilterCrosschainBurn and is used to iterate over the raw logs and unpacked data for CrosschainBurn events raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20CrosschainBurnIterator struct {
-	Event *L2NativeSuperchainERC20CrosschainBurn // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *L2NativeSuperchainERC20CrosschainBurnIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(L2NativeSuperchainERC20CrosschainBurn)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(L2NativeSuperchainERC20CrosschainBurn)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *L2NativeSuperchainERC20CrosschainBurnIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *L2NativeSuperchainERC20CrosschainBurnIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// L2NativeSuperchainERC20CrosschainBurn represents a CrosschainBurn event raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20CrosschainBurn struct {
-	From   common.Address
-	Amount *big.Int
-	Raw    types.Log // Blockchain specific contextual infos
-}
-
-// FilterCrosschainBurn is a free log retrieval operation binding the contract event 0x017c33ab728c93e2be949ec7e4a35b76d607957c5fac4253f5d623b4a3b13036.
-//
-// Solidity: event CrosschainBurn(address indexed from, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) FilterCrosschainBurn(opts *bind.FilterOpts, from []common.Address) (*L2NativeSuperchainERC20CrosschainBurnIterator, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.FilterLogs(opts, "CrosschainBurn", fromRule)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20CrosschainBurnIterator{contract: _L2NativeSuperchainERC20.contract, event: "CrosschainBurn", logs: logs, sub: sub}, nil
-}
-
-// WatchCrosschainBurn is a free log subscription operation binding the contract event 0x017c33ab728c93e2be949ec7e4a35b76d607957c5fac4253f5d623b4a3b13036.
-//
-// Solidity: event CrosschainBurn(address indexed from, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) WatchCrosschainBurn(opts *bind.WatchOpts, sink chan<- *L2NativeSuperchainERC20CrosschainBurn, from []common.Address) (event.Subscription, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.WatchLogs(opts, "CrosschainBurn", fromRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(L2NativeSuperchainERC20CrosschainBurn)
-				if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "CrosschainBurn", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseCrosschainBurn is a log parse operation binding the contract event 0x017c33ab728c93e2be949ec7e4a35b76d607957c5fac4253f5d623b4a3b13036.
-//
-// Solidity: event CrosschainBurn(address indexed from, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) ParseCrosschainBurn(log types.Log) (*L2NativeSuperchainERC20CrosschainBurn, error) {
-	event := new(L2NativeSuperchainERC20CrosschainBurn)
-	if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "CrosschainBurn", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// L2NativeSuperchainERC20CrosschainMintIterator is returned from FilterCrosschainMint and is used to iterate over the raw logs and unpacked data for CrosschainMint events raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20CrosschainMintIterator struct {
-	Event *L2NativeSuperchainERC20CrosschainMint // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *L2NativeSuperchainERC20CrosschainMintIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(L2NativeSuperchainERC20CrosschainMint)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(L2NativeSuperchainERC20CrosschainMint)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *L2NativeSuperchainERC20CrosschainMintIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *L2NativeSuperchainERC20CrosschainMintIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// L2NativeSuperchainERC20CrosschainMint represents a CrosschainMint event raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20CrosschainMint struct {
-	To     common.Address
-	Amount *big.Int
-	Raw    types.Log // Blockchain specific contextual infos
-}
-
-// FilterCrosschainMint is a free log retrieval operation binding the contract event 0x7ca16db12dad0e1c536f8062fd9e2e4fbb3d1a503b59df12a0cfa9f96abf1c59.
-//
-// Solidity: event CrosschainMint(address indexed to, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) FilterCrosschainMint(opts *bind.FilterOpts, to []common.Address) (*L2NativeSuperchainERC20CrosschainMintIterator, error) {
-
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.FilterLogs(opts, "CrosschainMint", toRule)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20CrosschainMintIterator{contract: _L2NativeSuperchainERC20.contract, event: "CrosschainMint", logs: logs, sub: sub}, nil
-}
-
-// WatchCrosschainMint is a free log subscription operation binding the contract event 0x7ca16db12dad0e1c536f8062fd9e2e4fbb3d1a503b59df12a0cfa9f96abf1c59.
-//
-// Solidity: event CrosschainMint(address indexed to, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) WatchCrosschainMint(opts *bind.WatchOpts, sink chan<- *L2NativeSuperchainERC20CrosschainMint, to []common.Address) (event.Subscription, error) {
-
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.WatchLogs(opts, "CrosschainMint", toRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(L2NativeSuperchainERC20CrosschainMint)
-				if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "CrosschainMint", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseCrosschainMint is a log parse operation binding the contract event 0x7ca16db12dad0e1c536f8062fd9e2e4fbb3d1a503b59df12a0cfa9f96abf1c59.
-//
-// Solidity: event CrosschainMint(address indexed to, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) ParseCrosschainMint(log types.Log) (*L2NativeSuperchainERC20CrosschainMint, error) {
-	event := new(L2NativeSuperchainERC20CrosschainMint)
-	if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "CrosschainMint", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// L2NativeSuperchainERC20MintIterator is returned from FilterMint and is used to iterate over the raw logs and unpacked data for Mint events raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20MintIterator struct {
-	Event *L2NativeSuperchainERC20Mint // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *L2NativeSuperchainERC20MintIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(L2NativeSuperchainERC20Mint)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(L2NativeSuperchainERC20Mint)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *L2NativeSuperchainERC20MintIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *L2NativeSuperchainERC20MintIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// L2NativeSuperchainERC20Mint represents a Mint event raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20Mint struct {
-	Account common.Address
-	Amount  *big.Int
-	Raw     types.Log // Blockchain specific contextual infos
-}
-
-// FilterMint is a free log retrieval operation binding the contract event 0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885.
-//
-// Solidity: event Mint(address indexed account, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) FilterMint(opts *bind.FilterOpts, account []common.Address) (*L2NativeSuperchainERC20MintIterator, error) {
-
-	var accountRule []interface{}
-	for _, accountItem := range account {
-		accountRule = append(accountRule, accountItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.FilterLogs(opts, "Mint", accountRule)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20MintIterator{contract: _L2NativeSuperchainERC20.contract, event: "Mint", logs: logs, sub: sub}, nil
-}
-
-// WatchMint is a free log subscription operation binding the contract event 0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885.
-//
-// Solidity: event Mint(address indexed account, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) WatchMint(opts *bind.WatchOpts, sink chan<- *L2NativeSuperchainERC20Mint, account []common.Address) (event.Subscription, error) {
-
-	var accountRule []interface{}
-	for _, accountItem := range account {
-		accountRule = append(accountRule, accountItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.WatchLogs(opts, "Mint", accountRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(L2NativeSuperchainERC20Mint)
-				if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "Mint", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseMint is a log parse operation binding the contract event 0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885.
-//
-// Solidity: event Mint(address indexed account, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) ParseMint(log types.Log) (*L2NativeSuperchainERC20Mint, error) {
-	event := new(L2NativeSuperchainERC20Mint)
-	if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "Mint", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// L2NativeSuperchainERC20TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20TransferIterator struct {
-	Event *L2NativeSuperchainERC20Transfer // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *L2NativeSuperchainERC20TransferIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(L2NativeSuperchainERC20Transfer)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(L2NativeSuperchainERC20Transfer)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *L2NativeSuperchainERC20TransferIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *L2NativeSuperchainERC20TransferIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// L2NativeSuperchainERC20Transfer represents a Transfer event raised by the L2NativeSuperchainERC20 contract.
-type L2NativeSuperchainERC20Transfer struct {
-	From   common.Address
-	To     common.Address
-	Amount *big.Int
-	Raw    types.Log // Blockchain specific contextual infos
-}
-
-// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
-//
-// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L2NativeSuperchainERC20TransferIterator, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
-	if err != nil {
-		return nil, err
-	}
-	return &L2NativeSuperchainERC20TransferIterator{contract: _L2NativeSuperchainERC20.contract, event: "Transfer", logs: logs, sub: sub}, nil
-}
-
-// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
-//
-// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *L2NativeSuperchainERC20Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
-
-	var fromRule []interface{}
-	for _, fromItem := range from {
-		fromRule = append(fromRule, fromItem)
-	}
-	var toRule []interface{}
-	for _, toItem := range to {
-		toRule = append(toRule, toItem)
-	}
-
-	logs, sub, err := _L2NativeSuperchainERC20.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(L2NativeSuperchainERC20Transfer)
-				if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "Transfer", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
-//
-// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
-func (_L2NativeSuperchainERC20 *L2NativeSuperchainERC20Filterer) ParseTransfer(log types.Log) (*L2NativeSuperchainERC20Transfer, error) {
-	event := new(L2NativeSuperchainERC20Transfer)
-	if err := _L2NativeSuperchainERC20.contract.UnpackLog(event, "Transfer", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
diff --git a/bindings/l2tol2crossdomainmessenger.go b/bindings/l2tol2crossdomainmessenger.go
index 846a340d1..8dcf45e1f 100644
--- a/bindings/l2tol2crossdomainmessenger.go
+++ b/bindings/l2tol2crossdomainmessenger.go
@@ -29,15 +29,6 @@ var (
 	_ = abi.ConvertType
 )
 
-// Identifier is an auto generated low-level Go binding around an user-defined struct.
-type Identifier struct {
-	Origin      common.Address
-	BlockNumber *big.Int
-	LogIndex    *big.Int
-	Timestamp   *big.Int
-	ChainId     *big.Int
-}
-
 // L2ToL2CrossDomainMessengerMetaData contains all meta data concerning the L2ToL2CrossDomainMessenger contract.
 var L2ToL2CrossDomainMessengerMetaData = &bind.MetaData{
 	ABI: "[{\"type\":\"function\",\"name\":\"crossDomainMessageContext\",\"inputs\":[],\"outputs\":[{\"name\":\"sender_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"source_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"crossDomainMessageSender\",\"inputs\":[],\"outputs\":[{\"name\":\"sender_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"crossDomainMessageSource\",\"inputs\":[],\"outputs\":[{\"name\":\"source_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"relayMessage\",\"inputs\":[{\"name\":\"_id\",\"type\":\"tuple\",\"internalType\":\"structIdentifier\",\"components\":[{\"name\":\"origin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"logIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"_sentMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"returnData_\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_destination\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"successfulMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"RelayedMessage\",\"inputs\":[{\"name\":\"source\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"messageNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessage\",\"inputs\":[{\"name\":\"destination\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"messageNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EventPayloadNotSentMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IdOriginNotL2ToL2CrossDomainMessenger\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidChainId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageAlreadyRelayed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageDestinationNotRelayChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageDestinationSameChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageTargetCrossL2Inbox\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageTargetL2ToL2CrossDomainMessenger\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEntered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TargetCallFailed\",\"inputs\":[]}]",
diff --git a/bindings/parsedabi.go b/bindings/parsedabi.go
index 938177547..9b86c04b2 100644
--- a/bindings/parsedabi.go
+++ b/bindings/parsedabi.go
@@ -15,7 +15,6 @@ func MustParseABI(abiStr string) *abi.ABI {
 }
 
 var SimpleStorageParsedABI = MustParseABI(SimpleStorageMetaData.ABI)
-var L2NativeSuperchainERC20ParseABI = MustParseABI(L2NativeSuperchainERC20MetaData.ABI)
 
 var CrossL2InboxParsedABI = MustParseABI(CrossL2InboxMetaData.ABI)
 var L1BlockInteropParsedABI = MustParseABI(L1BlockInteropMetaData.ABI)
diff --git a/interop/indexer_test.go b/interop/indexer_test.go
index 4f5c25e91..381cdc2c6 100644
--- a/interop/indexer_test.go
+++ b/interop/indexer_test.go
@@ -24,7 +24,8 @@ var header = types.Header{
 	Number: big.NewInt(int64(blockNumber)),
 	Time:   timestamp,
 }
-var block = types.NewBlock(&header, nil, nil, types.TrieHasher((*trie.StackTrie)(nil)))
+
+var block = types.NewBlock(&header, nil, nil, types.TrieHasher((*trie.StackTrie)(nil)), types.DefaultBlockConfig)
 
 var sentMessage = &L2ToL2Message{
 	Destination: destinationChainID,
diff --git a/supersim_test.go b/supersim_test.go
index be5a4aca9..6cd1c54f8 100644
--- a/supersim_test.go
+++ b/supersim_test.go
@@ -2,6 +2,7 @@ package supersim
 
 import (
 	"context"
+	"math"
 	"math/big"
 	"strings"
 	"sync"
@@ -23,7 +24,7 @@ import (
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
-	"github.com/ethereum/go-ethereum/common/math"
+	gethmath "github.com/ethereum/go-ethereum/common/math"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/ethclient"
@@ -213,7 +214,7 @@ func TestStartup(t *testing.T) {
 		l2Client, err := rpc.Dial(chain.Endpoint())
 		require.NoError(t, err)
 
-		var chainId math.HexOrDecimal64
+		var chainId gethmath.HexOrDecimal64
 		require.NoError(t, l2Client.CallContext(context.Background(), &chainId, "eth_chainId"))
 		require.Equal(t, chain.Config().ChainID, uint64(chainId))
 
@@ -224,7 +225,7 @@ func TestStartup(t *testing.T) {
 	l1Client, err := rpc.Dial(testSuite.Supersim.Orchestrator.L1Chain().Endpoint())
 	require.NoError(t, err)
 
-	var chainId math.HexOrDecimal64
+	var chainId gethmath.HexOrDecimal64
 	require.NoError(t, l1Client.CallContext(context.Background(), &chainId, "eth_chainId"))
 	require.Equal(t, testSuite.Supersim.Orchestrator.L1Chain().Config().ChainID, uint64(chainId))
 
@@ -489,7 +490,7 @@ func TestBatchJsonRpcRequestErrorHandling(t *testing.T) {
 	require.NoError(t, err)
 
 	// Create a bad executing message that will throw an error using CrossL2Inbox
-	executeMessageNonce, err := testSuite.DestEthClient.PendingNonceAt(context.Background(), fromAddress)
+	nonce, err := testSuite.DestEthClient.PendingNonceAt(context.Background(), fromAddress)
 	require.NoError(t, err)
 	initiatingMessageBlockHeader, err := testSuite.SourceEthClient.HeaderByNumber(context.Background(), initiatingMessageTxReceipt.BlockNumber)
 	require.NoError(t, err)
@@ -501,17 +502,17 @@ func TestBatchJsonRpcRequestErrorHandling(t *testing.T) {
 		Timestamp:   new(big.Int).Sub(new(big.Int).SetUint64(initiatingMessageBlockHeader.Time), big.NewInt(1)),
 		ChainId:     testSuite.SourceChainID,
 	}
-	executeMessageCallData, err := bindings.CrossL2InboxParsedABI.Pack("executeMessage", identifier, fromAddress, initiatingMessageLog.Data)
+	validateMessageCallData, err := bindings.CrossL2InboxParsedABI.Pack("validateMessage", identifier, initiatingMessageLog.Data)
 	require.NoError(t, err)
-	executeMessageTx := types.NewTransaction(executeMessageNonce, predeploys.CrossL2InboxAddr, big.NewInt(0), gasLimit, gasPrice, executeMessageCallData)
+	validateMessageTx := types.NewTransaction(nonce, predeploys.CrossL2InboxAddr, big.NewInt(0), gasLimit, gasPrice, validateMessageCallData)
 	require.NoError(t, err)
-	executeMessageSignedTx, err := types.SignTx(executeMessageTx, types.NewEIP155Signer(testSuite.DestChainID), privateKey)
+	validateMessageSignedTx, err := types.SignTx(validateMessageTx, types.NewEIP155Signer(testSuite.DestChainID), privateKey)
 	require.NoError(t, err)
-	executeMessageTxData, err := executeMessageSignedTx.MarshalBinary()
+	validateMessageTxData, err := validateMessageSignedTx.MarshalBinary()
 	require.NoError(t, err)
 	var chainIdError error
 	var sendRawTxError error
-	elems := []rpc.BatchElem{{Method: "eth_chainId", Result: new(hexutil.Uint64), Error: chainIdError}, {Method: "eth_sendRawTransaction", Args: []interface{}{hexutil.Encode(executeMessageTxData)}, Result: new(string), Error: sendRawTxError}}
+	elems := []rpc.BatchElem{{Method: "eth_chainId", Result: new(hexutil.Uint64), Error: chainIdError}, {Method: "eth_sendRawTransaction", Args: []interface{}{hexutil.Encode(validateMessageTxData)}, Result: new(string), Error: sendRawTxError}}
 
 	require.NoError(t, testSuite.DestEthClient.Client().BatchCallContext(context.Background(), elems))
 	require.Nil(t, elems[0].Error)
@@ -581,7 +582,6 @@ func TestInteropInvariantCheckFailsBadLogIndex(t *testing.T) {
 
 	privateKey, err := testSuite.DevKeys.Secret(devkeys.UserKey(0))
 	require.NoError(t, err)
-	fromAddress := crypto.PubkeyToAddress(privateKey.PublicKey)
 
 	l2ToL2CrossDomainMessenger, err := bindings.NewL2ToL2CrossDomainMessenger(predeploys.L2toL2CrossDomainMessengerAddr, testSuite.SourceEthClient)
 	require.NoError(t, err)
@@ -624,7 +624,7 @@ func TestInteropInvariantCheckFailsBadLogIndex(t *testing.T) {
 	require.NoError(t, err)
 
 	// Should fail because the block number is incorrect
-	_, err = crossL2Inbox.ExecuteMessage(transactor, identifier, fromAddress, initiatingMessageLog.Data)
+	_, err = crossL2Inbox.ValidateMessage(transactor, identifier, crypto.Keccak256Hash(initiatingMessageLog.Data))
 	require.Error(t, err)
 }
 
@@ -634,7 +634,6 @@ func TestInteropInvariantCheckBadBlockNumber(t *testing.T) {
 
 	privateKey, err := testSuite.DevKeys.Secret(devkeys.UserKey(0))
 	require.NoError(t, err)
-	fromAddress := crypto.PubkeyToAddress(privateKey.PublicKey)
 
 	l2ToL2CrossDomainMessenger, err := bindings.NewL2ToL2CrossDomainMessenger(predeploys.L2toL2CrossDomainMessengerAddr, testSuite.SourceEthClient)
 	require.NoError(t, err)
@@ -677,7 +676,7 @@ func TestInteropInvariantCheckBadBlockNumber(t *testing.T) {
 	require.NoError(t, err)
 
 	// Should fail because the block number is incorrect
-	_, err = crossL2Inbox.ExecuteMessage(transactor, identifier, fromAddress, initiatingMessageLog.Data)
+	_, err = crossL2Inbox.ValidateMessage(transactor, identifier, crypto.Keccak256Hash(initiatingMessageLog.Data))
 	require.Error(t, err)
 }
 
@@ -687,7 +686,6 @@ func TestInteropInvariantCheckBadBlockTimestamp(t *testing.T) {
 
 	privateKey, err := testSuite.DevKeys.Secret(devkeys.UserKey(0))
 	require.NoError(t, err)
-	fromAddress := crypto.PubkeyToAddress(privateKey.PublicKey)
 
 	l2ToL2CrossDomainMessenger, err := bindings.NewL2ToL2CrossDomainMessenger(predeploys.L2toL2CrossDomainMessengerAddr, testSuite.SourceEthClient)
 	require.NoError(t, err)
@@ -729,7 +727,7 @@ func TestInteropInvariantCheckBadBlockTimestamp(t *testing.T) {
 	require.NoError(t, err)
 
 	// Should fail because the block timestamp is incorrect
-	_, err = crossL2Inbox.ExecuteMessage(transactor, identifier, fromAddress, initiatingMessageLog.Data)
+	_, err = crossL2Inbox.ValidateMessage(transactor, identifier, crypto.Keccak256Hash(initiatingMessageLog.Data))
 	require.Error(t, err)
 }