From 9245b2cf7b5ab4b921b98827d3f87ebe22f7c0b7 Mon Sep 17 00:00:00 2001 From: ilija Date: Wed, 8 Oct 2025 12:48:38 +0200 Subject: [PATCH 1/2] Improve address conversion handling in evm relayerset --- pkg/loop/internal/relayerset/evm.go | 28 ++++++- .../internal/relayerset/relayerset_test.go | 74 +++++++++++++++++++ 2 files changed, 98 insertions(+), 4 deletions(-) diff --git a/pkg/loop/internal/relayerset/evm.go b/pkg/loop/internal/relayerset/evm.go index f85ab88b15..03608d60cd 100644 --- a/pkg/loop/internal/relayerset/evm.go +++ b/pkg/loop/internal/relayerset/evm.go @@ -188,8 +188,13 @@ func (s *Server) BalanceAt(ctx context.Context, request *evmpb.BalanceAtRequest) return nil, err } + address, err := evmpb.ConvertOptionalAddressFromProto(request.GetAccount()) + if err != nil { + return nil, err + } + reply, err := evmService.BalanceAt(ctx, evm.BalanceAtRequest{ - Address: evm.Address(request.GetAccount()), + Address: address, BlockNumber: valuespb.NewIntFromBigInt(request.BlockNumber), ConfidenceLevel: conf, }) @@ -405,9 +410,14 @@ func (s *Server) SubmitTransaction(ctx context.Context, request *evmpb.SubmitTra return nil, err } + address, err := evmpb.ConvertOptionalAddressFromProto(request.To) + if err != nil { + return nil, err + } + reply, err := evmService.SubmitTransaction(ctx, evm.SubmitTransactionRequest{ - To: evm.Address(request.To), - Data: evm.ABIPayload(request.Data), + To: address, + Data: request.Data, GasConfig: evmpb.ConvertGasConfigFromProto(request.GetGasConfig()), }) if err != nil { @@ -452,7 +462,17 @@ func (s *Server) GetForwarderForEOA(ctx context.Context, request *evmpb.GetForwa return nil, err } - forwarder, err := evmService.GetForwarderForEOA(ctx, evm.Address(request.GetAddr()), evm.Address(request.GetAggr()), request.PluginType) + eoa, err := evmpb.ConvertAddressFromProto(request.GetAddr()) + if err != nil { + return nil, fmt.Errorf("invalid EOA address: %w", err) + } + + ocr2AggregatorID, err := evmpb.ConvertAddressFromProto(request.GetAggr()) + if err != nil { + return nil, fmt.Errorf("invalid OCR2 Aggregator address: %w", err) + } + + forwarder, err := evmService.GetForwarderForEOA(ctx, eoa, ocr2AggregatorID, request.PluginType) if err != nil { return nil, err } diff --git a/pkg/loop/internal/relayerset/relayerset_test.go b/pkg/loop/internal/relayerset/relayerset_test.go index c544a5bbe8..39ce9c46d9 100644 --- a/pkg/loop/internal/relayerset/relayerset_test.go +++ b/pkg/loop/internal/relayerset/relayerset_test.go @@ -270,6 +270,7 @@ func Test_RelayerSet_EVMService(t *testing.T) { retrievedRelayer, err := rc.Get(ctx, types.RelayID{Network: "N1", ChainID: "C1"}) require.NoError(t, err) + zero := evmtypes.Address{} tests := []struct { name string run func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) @@ -338,6 +339,25 @@ func Test_RelayerSet_EVMService(t *testing.T) { require.Equal(t, big.NewInt(999), reply.Balance) }, }, + { + name: "BalanceAt_ZeroAddress_NoError", + run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { + conf := primitives.Finalized + mockEVM.EXPECT().BalanceAt(mock.Anything, evmtypes.BalanceAtRequest{ + Address: zero, + BlockNumber: big.NewInt(0), + ConfidenceLevel: conf, + }).Return(&evmtypes.BalanceAtReply{Balance: big.NewInt(0)}, nil) + + reply, err := evm.BalanceAt(ctx, evmtypes.BalanceAtRequest{ + Address: zero, + BlockNumber: big.NewInt(0), + ConfidenceLevel: conf, + }) + require.NoError(t, err) + require.Equal(t, big.NewInt(0), reply.Balance) + }, + }, { name: "EstimateGas", run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { @@ -488,6 +508,24 @@ func Test_RelayerSet_EVMService(t *testing.T) { require.Equal(t, &expectedTxResult, txResult) }, }, + { + name: "SubmitTransaction_ZeroTo_NoError", + run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { + txRequest := evmtypes.SubmitTransactionRequest{ + To: zero, + Data: []byte("data"), + } + expectedTxResult := evmtypes.TransactionResult{ + TxStatus: evmtypes.TxSuccess, + TxHash: evmtypes.Hash{9, 9, 9}, + } + // Should not error even when To is zero address. + mockEVM.EXPECT().SubmitTransaction(mock.Anything, txRequest).Return(&expectedTxResult, nil) + txResult, err := evm.SubmitTransaction(ctx, txRequest) + require.NoError(t, err) + require.Equal(t, &expectedTxResult, txResult) + }, + }, { name: "CalculateTransactionFee", run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { @@ -504,6 +542,42 @@ func Test_RelayerSet_EVMService(t *testing.T) { require.Equal(t, expectedFee, fee) }, }, + { + name: "SubmitTransaction_ZeroTo_NoError", + run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { + txRequest := evmtypes.SubmitTransactionRequest{ + To: zero, // 0x00..00 + Data: []byte("data"), // arbitrary payload + } + expectedTxResult := evmtypes.TransactionResult{ + TxStatus: evmtypes.TxSuccess, + TxHash: evmtypes.Hash{9, 9, 9}, + } + // Should not error even when To is zero address. + mockEVM.EXPECT().SubmitTransaction(mock.Anything, txRequest).Return(&expectedTxResult, nil) + txResult, err := evm.SubmitTransaction(ctx, txRequest) + require.NoError(t, err) + require.Equal(t, &expectedTxResult, txResult) + }, + }, + { + name: "GetForwarderForEOA_ErrorsOnZeroEoa", + run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { + mockEVM.EXPECT().GetForwarderForEOA(mock.Anything, zero, address, "str").Return(address1, nil) + res, err := evm.GetForwarderForEOA(ctx, zero, address, "str") + require.NoError(t, err) + require.Equal(t, address1, res) + }, + }, + { + name: "GetForwarderForEOA_ErrorsOnZeroOCRID", + run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { + mockEVM.EXPECT().GetForwarderForEOA(mock.Anything, address, zero, "str").Return(address1, nil) + res, err := evm.GetForwarderForEOA(ctx, address, zero, "str") + require.NoError(t, err) + require.Equal(t, address1, res) + }, + }, } for _, tc := range tests { From b8bd6d401823141d980474bc699dfa4f2aa58f60 Mon Sep 17 00:00:00 2001 From: ilija Date: Wed, 8 Oct 2025 13:01:21 +0200 Subject: [PATCH 2/2] lint --- .../internal/relayerset/relayerset_test.go | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/pkg/loop/internal/relayerset/relayerset_test.go b/pkg/loop/internal/relayerset/relayerset_test.go index 39ce9c46d9..db3db9ec42 100644 --- a/pkg/loop/internal/relayerset/relayerset_test.go +++ b/pkg/loop/internal/relayerset/relayerset_test.go @@ -542,24 +542,6 @@ func Test_RelayerSet_EVMService(t *testing.T) { require.Equal(t, expectedFee, fee) }, }, - { - name: "SubmitTransaction_ZeroTo_NoError", - run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) { - txRequest := evmtypes.SubmitTransactionRequest{ - To: zero, // 0x00..00 - Data: []byte("data"), // arbitrary payload - } - expectedTxResult := evmtypes.TransactionResult{ - TxStatus: evmtypes.TxSuccess, - TxHash: evmtypes.Hash{9, 9, 9}, - } - // Should not error even when To is zero address. - mockEVM.EXPECT().SubmitTransaction(mock.Anything, txRequest).Return(&expectedTxResult, nil) - txResult, err := evm.SubmitTransaction(ctx, txRequest) - require.NoError(t, err) - require.Equal(t, &expectedTxResult, txResult) - }, - }, { name: "GetForwarderForEOA_ErrorsOnZeroEoa", run: func(t *testing.T, evm types.EVMService, mockEVM *mocks2.EVMService) {