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 }