From 107ad0ebd13315591dbcad22f11a6e6ca2914c52 Mon Sep 17 00:00:00 2001 From: Ganesh Vanahalli Date: Wed, 24 Sep 2025 16:03:01 -0500 Subject: [PATCH 1/4] Fix SCW initialization bug in staker --- arbnode/node.go | 6 +++--- nitro-testnode | 2 +- staker/legacy/staker.go | 2 +- staker/validatorwallet/contract.go | 4 ++-- staker/validatorwallet/eoa.go | 2 +- staker/validatorwallet/noop.go | 2 +- system_tests/fast_confirm_test.go | 8 ++++---- system_tests/staker_test.go | 8 ++++---- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/arbnode/node.go b/arbnode/node.go index 78e1c46adaa..eff8bb6439a 100644 --- a/arbnode/node.go +++ b/arbnode/node.go @@ -47,8 +47,8 @@ import ( "github.com/offchainlabs/nitro/solgen/go/precompilesgen" "github.com/offchainlabs/nitro/staker" "github.com/offchainlabs/nitro/staker/bold" - "github.com/offchainlabs/nitro/staker/legacy" - "github.com/offchainlabs/nitro/staker/multi_protocol" + legacystaker "github.com/offchainlabs/nitro/staker/legacy" + multiprotocolstaker "github.com/offchainlabs/nitro/staker/multi_protocol" "github.com/offchainlabs/nitro/staker/validatorwallet" "github.com/offchainlabs/nitro/util/containers" "github.com/offchainlabs/nitro/util/contracts" @@ -788,7 +788,7 @@ func getStaker( if err != nil { return nil, nil, common.Address{}, err } - if err := wallet.Initialize(ctx); err != nil { + if err := wallet.Initialize(ctx, config.Staker.UseSmartContractWallet); err != nil { return nil, nil, common.Address{}, err } if dp != nil { diff --git a/nitro-testnode b/nitro-testnode index 81a225be6c8..33d0ed7ab2e 160000 --- a/nitro-testnode +++ b/nitro-testnode @@ -1 +1 @@ -Subproject commit 81a225be6c8afedcb35904eae436f8a0ae7498aa +Subproject commit 33d0ed7ab2e5e42f9168eaf205c3ca482bafe0cb diff --git a/staker/legacy/staker.go b/staker/legacy/staker.go index 57eb0b5007a..6d1cf341c7b 100644 --- a/staker/legacy/staker.go +++ b/staker/legacy/staker.go @@ -298,7 +298,7 @@ type Staker struct { } type ValidatorWalletInterface interface { - Initialize(context.Context) error + Initialize(context.Context, bool) error // Address must be able to be called concurrently with other functions Address() *common.Address // Address must be able to be called concurrently with other functions diff --git a/staker/validatorwallet/contract.go b/staker/validatorwallet/contract.go index fed87caca28..2a66e3db9ba 100644 --- a/staker/validatorwallet/contract.go +++ b/staker/validatorwallet/contract.go @@ -105,8 +105,8 @@ func (v *Contract) validateWallet(ctx context.Context) error { return nil } -func (v *Contract) Initialize(ctx context.Context) error { - err := v.populateWallet(ctx, false) +func (v *Contract) Initialize(ctx context.Context, createIfMissing bool) error { + err := v.populateWallet(ctx, createIfMissing) if err != nil { return err } diff --git a/staker/validatorwallet/eoa.go b/staker/validatorwallet/eoa.go index 695299279a9..8f5fb196247 100644 --- a/staker/validatorwallet/eoa.go +++ b/staker/validatorwallet/eoa.go @@ -35,7 +35,7 @@ func NewEOA(dataPoster *dataposter.DataPoster, l1Client *ethclient.Client, getEx }, nil } -func (w *EOA) Initialize(ctx context.Context) error { +func (w *EOA) Initialize(ctx context.Context, _ bool) error { return nil } diff --git a/staker/validatorwallet/noop.go b/staker/validatorwallet/noop.go index 8e0b0cd9115..3885557fbec 100644 --- a/staker/validatorwallet/noop.go +++ b/staker/validatorwallet/noop.go @@ -26,7 +26,7 @@ func NewNoOp(l1Client *ethclient.Client) *NoOp { } } -func (*NoOp) Initialize(context.Context) error { return nil } +func (*NoOp) Initialize(context.Context, bool) error { return nil } func (*NoOp) Address() *common.Address { return nil } diff --git a/system_tests/fast_confirm_test.go b/system_tests/fast_confirm_test.go index d0ed5df0936..2138cfa9068 100644 --- a/system_tests/fast_confirm_test.go +++ b/system_tests/fast_confirm_test.go @@ -37,7 +37,7 @@ import ( "github.com/offchainlabs/nitro/solgen/go/rollup_legacy_gen" "github.com/offchainlabs/nitro/solgen/go/upgrade_executorgen" "github.com/offchainlabs/nitro/staker" - "github.com/offchainlabs/nitro/staker/legacy" + legacystaker "github.com/offchainlabs/nitro/staker/legacy" "github.com/offchainlabs/nitro/staker/validatorwallet" "github.com/offchainlabs/nitro/util" "github.com/offchainlabs/nitro/validator/server_common" @@ -280,7 +280,7 @@ func setupFastConfirmation(ctx context.Context, t *testing.T) (*NodeBuilder, *le Require(t, err) err = stateless.Start(ctx) Require(t, err) - err = valWallet.Initialize(ctx) + err = valWallet.Initialize(ctx, false) Require(t, err) stakerA, err := legacystaker.NewStaker( l2node.L1Reader, @@ -475,7 +475,7 @@ func TestFastConfirmationWithSafe(t *testing.T) { Require(t, err) err = statelessA.Start(ctx) Require(t, err) - err = valWalletA.Initialize(ctx) + err = valWalletA.Initialize(ctx, false) Require(t, err) stakerA, err := legacystaker.NewStaker( l2nodeA.L1Reader, @@ -532,7 +532,7 @@ func TestFastConfirmationWithSafe(t *testing.T) { Require(t, err) err = statelessB.Start(ctx) Require(t, err) - err = valWalletB.Initialize(ctx) + err = valWalletB.Initialize(ctx, false) Require(t, err) stakerB, err := legacystaker.NewStaker( l2nodeB.L1Reader, diff --git a/system_tests/staker_test.go b/system_tests/staker_test.go index c78aad8f711..73b64379fda 100644 --- a/system_tests/staker_test.go +++ b/system_tests/staker_test.go @@ -34,7 +34,7 @@ import ( "github.com/offchainlabs/nitro/solgen/go/rollup_legacy_gen" "github.com/offchainlabs/nitro/solgen/go/upgrade_executorgen" "github.com/offchainlabs/nitro/staker" - "github.com/offchainlabs/nitro/staker/legacy" + legacystaker "github.com/offchainlabs/nitro/staker/legacy" "github.com/offchainlabs/nitro/staker/validatorwallet" "github.com/offchainlabs/nitro/util" "github.com/offchainlabs/nitro/util/arbmath" @@ -234,7 +234,7 @@ func stakerTestImpl(t *testing.T, faultyStaker bool, honestStakerInactive bool) Require(t, err) err = stakerA.Initialize(ctx) if stakerA.Strategy() != legacystaker.WatchtowerStrategy { - err = valWalletA.Initialize(ctx) + err = valWalletA.Initialize(ctx, false) Require(t, err) } Require(t, err) @@ -293,7 +293,7 @@ func stakerTestImpl(t *testing.T, faultyStaker bool, honestStakerInactive bool) err = stakerB.Initialize(ctx) Require(t, err) if stakerB.Strategy() != legacystaker.WatchtowerStrategy { - err = valWalletB.Initialize(ctx) + err = valWalletB.Initialize(ctx, false) Require(t, err) } valWalletC := validatorwallet.NewNoOp(builder.L1.Client) @@ -317,7 +317,7 @@ func stakerTestImpl(t *testing.T, faultyStaker bool, honestStakerInactive bool) ) Require(t, err) if stakerC.Strategy() != legacystaker.WatchtowerStrategy { - err = valWalletC.Initialize(ctx) + err = valWalletC.Initialize(ctx, false) Require(t, err) } err = stakerC.Initialize(ctx) From 0ff4ae43c417a622d7a5931676b69d7cb530e3a6 Mon Sep 17 00:00:00 2001 From: Ganesh Vanahalli Date: Mon, 29 Sep 2025 11:27:28 -0500 Subject: [PATCH 2/4] address PR comments --- arbnode/node.go | 7 ++++++- staker/legacy/staker.go | 3 ++- staker/validatorwallet/contract.go | 10 +++++++++- staker/validatorwallet/eoa.go | 6 +++++- staker/validatorwallet/noop.go | 4 +++- system_tests/fast_confirm_test.go | 6 +++--- system_tests/staker_test.go | 6 +++--- 7 files changed, 31 insertions(+), 11 deletions(-) diff --git a/arbnode/node.go b/arbnode/node.go index eff8bb6439a..0c69e6a54a0 100644 --- a/arbnode/node.go +++ b/arbnode/node.go @@ -788,7 +788,12 @@ func getStaker( if err != nil { return nil, nil, common.Address{}, err } - if err := wallet.Initialize(ctx, config.Staker.UseSmartContractWallet); err != nil { + if config.Staker.UseSmartContractWallet { + err = wallet.InitializeAndCreateSCW(ctx) + } else { + err = wallet.Initialize(ctx) + } + if err != nil { return nil, nil, common.Address{}, err } if dp != nil { diff --git a/staker/legacy/staker.go b/staker/legacy/staker.go index 6d1cf341c7b..658f7157a62 100644 --- a/staker/legacy/staker.go +++ b/staker/legacy/staker.go @@ -298,7 +298,8 @@ type Staker struct { } type ValidatorWalletInterface interface { - Initialize(context.Context, bool) error + Initialize(context.Context) error + InitializeAndCreateSCW(context.Context) error // Address must be able to be called concurrently with other functions Address() *common.Address // Address must be able to be called concurrently with other functions diff --git a/staker/validatorwallet/contract.go b/staker/validatorwallet/contract.go index 2a66e3db9ba..74e01096d97 100644 --- a/staker/validatorwallet/contract.go +++ b/staker/validatorwallet/contract.go @@ -105,7 +105,15 @@ func (v *Contract) validateWallet(ctx context.Context) error { return nil } -func (v *Contract) Initialize(ctx context.Context, createIfMissing bool) error { +func (v *Contract) Initialize(ctx context.Context) error { + return v.initialize(ctx, false) +} + +func (v *Contract) InitializeAndCreateSCW(ctx context.Context) error { + return v.initialize(ctx, true) +} + +func (v *Contract) initialize(ctx context.Context, createIfMissing bool) error { err := v.populateWallet(ctx, createIfMissing) if err != nil { return err diff --git a/staker/validatorwallet/eoa.go b/staker/validatorwallet/eoa.go index 8f5fb196247..7adaa3bde63 100644 --- a/staker/validatorwallet/eoa.go +++ b/staker/validatorwallet/eoa.go @@ -35,7 +35,11 @@ func NewEOA(dataPoster *dataposter.DataPoster, l1Client *ethclient.Client, getEx }, nil } -func (w *EOA) Initialize(ctx context.Context, _ bool) error { +func (w *EOA) Initialize(ctx context.Context) error { + return nil +} + +func (w *EOA) InitializeAndCreateSCW(ctx context.Context) error { return nil } diff --git a/staker/validatorwallet/noop.go b/staker/validatorwallet/noop.go index 3885557fbec..37c48d8afce 100644 --- a/staker/validatorwallet/noop.go +++ b/staker/validatorwallet/noop.go @@ -26,7 +26,9 @@ func NewNoOp(l1Client *ethclient.Client) *NoOp { } } -func (*NoOp) Initialize(context.Context, bool) error { return nil } +func (*NoOp) Initialize(context.Context) error { return nil } + +func (*NoOp) InitializeAndCreateSCW(context.Context) error { return nil } func (*NoOp) Address() *common.Address { return nil } diff --git a/system_tests/fast_confirm_test.go b/system_tests/fast_confirm_test.go index 2138cfa9068..f084fee28f5 100644 --- a/system_tests/fast_confirm_test.go +++ b/system_tests/fast_confirm_test.go @@ -280,7 +280,7 @@ func setupFastConfirmation(ctx context.Context, t *testing.T) (*NodeBuilder, *le Require(t, err) err = stateless.Start(ctx) Require(t, err) - err = valWallet.Initialize(ctx, false) + err = valWallet.Initialize(ctx) Require(t, err) stakerA, err := legacystaker.NewStaker( l2node.L1Reader, @@ -475,7 +475,7 @@ func TestFastConfirmationWithSafe(t *testing.T) { Require(t, err) err = statelessA.Start(ctx) Require(t, err) - err = valWalletA.Initialize(ctx, false) + err = valWalletA.Initialize(ctx) Require(t, err) stakerA, err := legacystaker.NewStaker( l2nodeA.L1Reader, @@ -532,7 +532,7 @@ func TestFastConfirmationWithSafe(t *testing.T) { Require(t, err) err = statelessB.Start(ctx) Require(t, err) - err = valWalletB.Initialize(ctx, false) + err = valWalletB.Initialize(ctx) Require(t, err) stakerB, err := legacystaker.NewStaker( l2nodeB.L1Reader, diff --git a/system_tests/staker_test.go b/system_tests/staker_test.go index 73b64379fda..138d7c8dcdf 100644 --- a/system_tests/staker_test.go +++ b/system_tests/staker_test.go @@ -234,7 +234,7 @@ func stakerTestImpl(t *testing.T, faultyStaker bool, honestStakerInactive bool) Require(t, err) err = stakerA.Initialize(ctx) if stakerA.Strategy() != legacystaker.WatchtowerStrategy { - err = valWalletA.Initialize(ctx, false) + err = valWalletA.Initialize(ctx) Require(t, err) } Require(t, err) @@ -293,7 +293,7 @@ func stakerTestImpl(t *testing.T, faultyStaker bool, honestStakerInactive bool) err = stakerB.Initialize(ctx) Require(t, err) if stakerB.Strategy() != legacystaker.WatchtowerStrategy { - err = valWalletB.Initialize(ctx, false) + err = valWalletB.Initialize(ctx) Require(t, err) } valWalletC := validatorwallet.NewNoOp(builder.L1.Client) @@ -317,7 +317,7 @@ func stakerTestImpl(t *testing.T, faultyStaker bool, honestStakerInactive bool) ) Require(t, err) if stakerC.Strategy() != legacystaker.WatchtowerStrategy { - err = valWalletC.Initialize(ctx, false) + err = valWalletC.Initialize(ctx) Require(t, err) } err = stakerC.Initialize(ctx) From bdc268cc0a80cff3d11e06eee1f7ceaabf1dc477 Mon Sep 17 00:00:00 2001 From: Ganesh Vanahalli Date: Fri, 10 Oct 2025 10:49:38 -0500 Subject: [PATCH 3/4] revert updating testnode pin --- nitro-testnode | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nitro-testnode b/nitro-testnode index 33d0ed7ab2e..81a225be6c8 160000 --- a/nitro-testnode +++ b/nitro-testnode @@ -1 +1 @@ -Subproject commit 33d0ed7ab2e5e42f9168eaf205c3ca482bafe0cb +Subproject commit 81a225be6c8afedcb35904eae436f8a0ae7498aa From 3a4d91fa7ae15d76c9a85d09ba338db24533bac2 Mon Sep 17 00:00:00 2001 From: Ganesh Vanahalli Date: Wed, 22 Oct 2025 10:21:10 -0500 Subject: [PATCH 4/4] remove unnecessary import aliases --- arbnode/node.go | 6 +++--- system_tests/fast_confirm_test.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arbnode/node.go b/arbnode/node.go index aed66b5adf0..d1d6d80815d 100644 --- a/arbnode/node.go +++ b/arbnode/node.go @@ -41,15 +41,15 @@ import ( "github.com/offchainlabs/nitro/daprovider/daclient" "github.com/offchainlabs/nitro/daprovider/das" "github.com/offchainlabs/nitro/daprovider/data_streaming" - dapserver "github.com/offchainlabs/nitro/daprovider/server" + "github.com/offchainlabs/nitro/daprovider/server" "github.com/offchainlabs/nitro/execution" "github.com/offchainlabs/nitro/execution/gethexec" "github.com/offchainlabs/nitro/solgen/go/bridgegen" "github.com/offchainlabs/nitro/solgen/go/precompilesgen" "github.com/offchainlabs/nitro/staker" "github.com/offchainlabs/nitro/staker/bold" - legacystaker "github.com/offchainlabs/nitro/staker/legacy" - multiprotocolstaker "github.com/offchainlabs/nitro/staker/multi_protocol" + "github.com/offchainlabs/nitro/staker/legacy" + "github.com/offchainlabs/nitro/staker/multi_protocol" "github.com/offchainlabs/nitro/staker/validatorwallet" "github.com/offchainlabs/nitro/util/containers" "github.com/offchainlabs/nitro/util/contracts" diff --git a/system_tests/fast_confirm_test.go b/system_tests/fast_confirm_test.go index b247438a6ec..db3fc442ab3 100644 --- a/system_tests/fast_confirm_test.go +++ b/system_tests/fast_confirm_test.go @@ -37,7 +37,7 @@ import ( "github.com/offchainlabs/nitro/solgen/go/rollup_legacy_gen" "github.com/offchainlabs/nitro/solgen/go/upgrade_executorgen" "github.com/offchainlabs/nitro/staker" - legacystaker "github.com/offchainlabs/nitro/staker/legacy" + "github.com/offchainlabs/nitro/staker/legacy" "github.com/offchainlabs/nitro/staker/validatorwallet" "github.com/offchainlabs/nitro/util" "github.com/offchainlabs/nitro/validator/server_common"