github.com/ethereum-optimism/optimism/l2geth@v0.0.0-20230612200230-50b04ade19e3/rollup/rcfg/system_address_test.go (about)

     1  package rcfg
     2  
     3  import (
     4  	"crypto/rand"
     5  	"fmt"
     6  	"math/big"
     7  	"os"
     8  	"testing"
     9  
    10  	"github.com/ethereum-optimism/optimism/l2geth/common"
    11  )
    12  
    13  func TestSystemAddressFor(t *testing.T) {
    14  	tests := []struct {
    15  		deployer0 common.Address
    16  		deployer1 common.Address
    17  		chainId   int64
    18  	}{
    19  		{
    20  			common.HexToAddress("0xcDE47C1a5e2d60b9ff262b0a3b6d486048575Ad9"),
    21  			common.HexToAddress("0x53A6eecC2dD4795Fcc68940ddc6B4d53Bd88Bd9E"),
    22  			10,
    23  		},
    24  		{
    25  			common.HexToAddress("0xd23eb5c2dd7035e6eb4a7e129249d9843123079f"),
    26  			common.HexToAddress("0xa81224490b9fa4930a2e920550cd1c9106bb6d9e"),
    27  			69,
    28  		},
    29  		{
    30  			common.HexToAddress("0xc30276833798867c1dbc5c468bf51ca900b44e4c"),
    31  			common.HexToAddress("0x5c679a57e018f5f146838138d3e032ef4913d551"),
    32  			420,
    33  		},
    34  		{
    35  			common.HexToAddress("0xc30276833798867c1dbc5c468bf51ca900b44e4c"),
    36  			common.HexToAddress("0x5c679a57e018f5f146838138d3e032ef4913d551"),
    37  			421,
    38  		},
    39  	}
    40  	for _, tt := range tests {
    41  		chainID := big.NewInt(tt.chainId)
    42  		sad0 := SystemAddressFor(chainID, tt.deployer0)
    43  		if sad0 != SystemAddress0 {
    44  			t.Fatalf("expected %s, got %s", SystemAddress0.String(), sad0.String())
    45  		}
    46  		sad1 := SystemAddressFor(chainID, tt.deployer1)
    47  		if sad1 != SystemAddress1 {
    48  			t.Fatalf("expected %s, got %s", SystemAddress1.String(), sad1.String())
    49  		}
    50  		if SystemAddressFor(chainID, randAddr()) != ZeroSystemAddress {
    51  			t.Fatalf("expected zero address, but got a non-zero one instead")
    52  		}
    53  	}
    54  
    55  	// test env fallback
    56  	addr0 := randAddr()
    57  	addr1 := randAddr()
    58  	chainID := big.NewInt(999)
    59  	if SystemAddressFor(chainID, addr0) != ZeroSystemAddress {
    60  		t.Fatalf("expected zero address, but got a non-zero one instead")
    61  	}
    62  	if SystemAddressFor(chainID, addr1) != ZeroSystemAddress {
    63  		t.Fatalf("expected zero address, but got a non-zero one instead")
    64  	}
    65  	if err := os.Setenv("SYSTEM_ADDRESS_0_DEPLOYER", addr0.String()); err != nil {
    66  		t.Fatalf("error setting env for deployer 0: %v", err)
    67  	}
    68  	if err := os.Setenv("SYSTEM_ADDRESS_1_DEPLOYER", addr1.String()); err != nil {
    69  		t.Fatalf("error setting env for deployer 1: %v", err)
    70  	}
    71  	initEnvSystemAddressDeployer()
    72  	sad0 := SystemAddressFor(chainID, addr0)
    73  	if sad0 != SystemAddress0 {
    74  		t.Fatalf("expected %s, got %s", SystemAddress0.String(), sad0.String())
    75  	}
    76  	sad1 := SystemAddressFor(chainID, addr1)
    77  	if sad1 != SystemAddress1 {
    78  		t.Fatalf("expected %s, got %s", SystemAddress1.String(), sad1.String())
    79  	}
    80  
    81  	// reset
    82  	if err := os.Setenv("SYSTEM_ADDRESS_0_DEPLOYER", ""); err != nil {
    83  		t.Fatalf("error setting env for deployer 0: %v", err)
    84  	}
    85  	if err := os.Setenv("SYSTEM_ADDRESS_1_DEPLOYER", ""); err != nil {
    86  		t.Fatalf("error setting env for deployer 1: %v", err)
    87  	}
    88  	initEnvSystemAddressDeployer()
    89  }
    90  
    91  func TestSystemAddressDeployer(t *testing.T) {
    92  	addr0 := randAddr()
    93  	addr1 := randAddr()
    94  	deployer := SystemAddressDeployer{addr0, addr1}
    95  
    96  	assertAddress(t, deployer, addr0, SystemAddress0)
    97  	assertAddress(t, deployer, addr1, SystemAddress1)
    98  	assertAddress(t, deployer, randAddr(), ZeroSystemAddress)
    99  
   100  	var zeroDeployer SystemAddressDeployer
   101  	assertAddress(t, zeroDeployer, randAddr(), ZeroSystemAddress)
   102  }
   103  
   104  func TestEnvSystemAddressDeployer(t *testing.T) {
   105  	addr0 := randAddr()
   106  	addr1 := randAddr()
   107  
   108  	assertAddress(t, envSystemAddressDeployer, addr0, ZeroSystemAddress)
   109  	assertAddress(t, envSystemAddressDeployer, addr1, ZeroSystemAddress)
   110  	assertAddress(t, envSystemAddressDeployer, randAddr(), ZeroSystemAddress)
   111  
   112  	if err := os.Setenv("SYSTEM_ADDRESS_0_DEPLOYER", addr0.String()); err != nil {
   113  		t.Fatalf("error setting env for deployer 0: %v", err)
   114  	}
   115  	if err := os.Setenv("SYSTEM_ADDRESS_1_DEPLOYER", addr1.String()); err != nil {
   116  		t.Fatalf("error setting env for deployer 1: %v", err)
   117  	}
   118  
   119  	initEnvSystemAddressDeployer()
   120  	assertAddress(t, envSystemAddressDeployer, addr0, SystemAddress0)
   121  	assertAddress(t, envSystemAddressDeployer, addr1, SystemAddress1)
   122  	assertAddress(t, envSystemAddressDeployer, randAddr(), ZeroSystemAddress)
   123  
   124  	tests := []struct {
   125  		deployer0 string
   126  		deployer1 string
   127  		msg       string
   128  	}{
   129  		{
   130  			"not an address",
   131  			addr0.String(),
   132  			"SYSTEM_ADDRESS_0_DEPLOYER specified but invalid",
   133  		},
   134  		{
   135  			"not an address",
   136  			"not an address",
   137  			"SYSTEM_ADDRESS_0_DEPLOYER specified but invalid",
   138  		},
   139  		{
   140  			addr0.String(),
   141  			"not an address",
   142  			"SYSTEM_ADDRESS_1_DEPLOYER specified but invalid",
   143  		},
   144  	}
   145  	for _, tt := range tests {
   146  		if err := os.Setenv("SYSTEM_ADDRESS_0_DEPLOYER", tt.deployer0); err != nil {
   147  			t.Fatalf("error setting env for deployer 0: %v", err)
   148  		}
   149  		if err := os.Setenv("SYSTEM_ADDRESS_1_DEPLOYER", tt.deployer1); err != nil {
   150  			t.Fatalf("error setting env for deployer 1: %v", err)
   151  		}
   152  		assertPanic(t, tt.msg, func() {
   153  			initEnvSystemAddressDeployer()
   154  		})
   155  	}
   156  }
   157  
   158  func randAddr() common.Address {
   159  	buf := make([]byte, 20)
   160  	_, err := rand.Read(buf)
   161  	if err != nil {
   162  		panic(err)
   163  	}
   164  	return common.BytesToAddress(buf)
   165  }
   166  
   167  func assertAddress(t *testing.T, deployer SystemAddressDeployer, in common.Address, expected common.Address) {
   168  	actual := deployer.SystemAddressFor(in)
   169  	if actual != expected {
   170  		t.Fatalf("bad system address. expected %s, got %s", expected.String(), actual.String())
   171  	}
   172  }
   173  
   174  func assertPanic(t *testing.T, msg string, cb func()) {
   175  	defer func() {
   176  		if err := recover(); err != nil {
   177  			errMsg := fmt.Sprintf("%v", err)
   178  			if errMsg != msg {
   179  				t.Fatalf("expected error message %s, got %v", msg, errMsg)
   180  			}
   181  		}
   182  	}()
   183  
   184  	cb()
   185  }