Skip to content

Commit a7da981

Browse files
committed
updates
1 parent c7fa8a0 commit a7da981

11 files changed

Lines changed: 69 additions & 75 deletions

File tree

apps/evm/single/cmd/run.go

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package cmd
22

33
import (
44
"context"
5-
"encoding/hex"
65
"fmt"
76
"path/filepath"
87

@@ -30,27 +29,27 @@ var RunCmd = &cobra.Command{
3029
Aliases: []string{"node", "run"},
3130
Short: "Run the evolve node with EVM execution client",
3231
RunE: func(cmd *cobra.Command, args []string) error {
33-
executor, err := createExecutionClient(cmd)
34-
if err != nil {
35-
return err
36-
}
32+
executor, err := createExecutionClient(cmd)
33+
if err != nil {
34+
return err
35+
}
3736

38-
nodeConfig, err := rollcmd.ParseConfig(cmd)
39-
if err != nil {
40-
return err
41-
}
37+
nodeConfig, err := rollcmd.ParseConfig(cmd)
38+
if err != nil {
39+
return err
40+
}
4241

43-
logger := rollcmd.SetupLogger(nodeConfig.Log)
42+
logger := rollcmd.SetupLogger(nodeConfig.Log)
4443

45-
// Attach logger to the EVM engine client if available
46-
if ec, ok := executor.(*evm.EngineClient); ok {
47-
ec.SetLogger(logger.With().Str("module", "engine_client").Logger())
48-
}
44+
// Attach logger to the EVM engine client if available
45+
if ec, ok := executor.(*evm.EngineClient); ok {
46+
ec.SetLogger(logger.With().Str("module", "engine_client").Logger())
47+
}
4948

50-
headerNamespace := da.PrepareNamespace([]byte(nodeConfig.DA.GetNamespace()))
51-
dataNamespace := da.PrepareNamespace([]byte(nodeConfig.DA.GetDataNamespace()))
49+
headerNamespace := da.NamespaceFromString(nodeConfig.DA.GetNamespace())
50+
dataNamespace := da.NamespaceFromString(nodeConfig.DA.GetDataNamespace())
5251

53-
logger.Info().Str("headerNamespace", hex.EncodeToString(headerNamespace)).Str("dataNamespace", hex.EncodeToString(dataNamespace)).Msg("namespaces")
52+
logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces")
5453

5554
daJrpc, err := jsonrpc.NewClient(context.Background(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, nodeConfig.DA.GasPrice, nodeConfig.DA.GasMultiplier)
5655
if err != nil {

apps/grpc/single/cmd/run.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package cmd
22

33
import (
4-
"encoding/hex"
54
"fmt"
65
"path/filepath"
76

87
"github.com/spf13/cobra"
98

10-
coreda "github.com/evstack/ev-node/core/da"
9+
"github.com/evstack/ev-node/core/da"
1110
"github.com/evstack/ev-node/core/execution"
1211
"github.com/evstack/ev-node/da/jsonrpc"
1312
executiongrpc "github.com/evstack/ev-node/execution/grpc"
@@ -47,10 +46,10 @@ The execution client must implement the Evolve execution gRPC interface.`,
4746

4847
logger := rollcmd.SetupLogger(nodeConfig.Log)
4948

50-
headerNamespace := coreda.PrepareNamespace([]byte(nodeConfig.DA.GetNamespace()))
51-
dataNamespace := coreda.PrepareNamespace([]byte(nodeConfig.DA.GetDataNamespace()))
49+
headerNamespace := da.NamespaceFromString(nodeConfig.DA.GetNamespace())
50+
dataNamespace := da.NamespaceFromString(nodeConfig.DA.GetDataNamespace())
5251

53-
logger.Info().Str("headerNamespace", hex.EncodeToString(headerNamespace)).Str("dataNamespace", hex.EncodeToString(dataNamespace)).Msg("namespaces")
52+
logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces")
5453

5554
// Create DA client
5655
daJrpc, err := jsonrpc.NewClient(cmd.Context(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, nodeConfig.DA.GasPrice, nodeConfig.DA.GasMultiplier)

apps/testapp/cmd/run.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package cmd
22

33
import (
44
"context"
5-
"encoding/hex"
65
"fmt"
76
"path/filepath"
87

@@ -47,10 +46,10 @@ var RunCmd = &cobra.Command{
4746
ctx, cancel := context.WithCancel(context.Background())
4847
defer cancel()
4948

50-
headerNamespace := da.PrepareNamespace([]byte(nodeConfig.DA.GetNamespace()))
51-
dataNamespace := da.PrepareNamespace([]byte(nodeConfig.DA.GetDataNamespace()))
49+
headerNamespace := da.NamespaceFromString(nodeConfig.DA.GetNamespace())
50+
dataNamespace := da.NamespaceFromString(nodeConfig.DA.GetDataNamespace())
5251

53-
logger.Info().Str("headerNamespace", hex.EncodeToString(headerNamespace)).Str("dataNamespace", hex.EncodeToString(dataNamespace)).Msg("namespaces")
52+
logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces")
5453

5554
daJrpc, err := jsonrpc.NewClient(ctx, logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, nodeConfig.DA.GasPrice, nodeConfig.DA.GasMultiplier)
5655
if err != nil {

block/internal/submitting/da_submitter.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ func (s *DASubmitter) SubmitHeaders(ctx context.Context, cache cache.Manager) er
199199
}
200200
},
201201
"header",
202-
[]byte(s.config.DA.GetNamespace()),
202+
s.config.DA.GetNamespace(),
203203
[]byte(s.config.DA.SubmitOptions),
204204
cache,
205205
)
@@ -242,7 +242,7 @@ func (s *DASubmitter) SubmitData(ctx context.Context, cache cache.Manager, signe
242242
}
243243
},
244244
"data",
245-
[]byte(s.config.DA.GetDataNamespace()),
245+
s.config.DA.GetDataNamespace(),
246246
[]byte(s.config.DA.SubmitOptions),
247247
cache,
248248
)
@@ -312,7 +312,7 @@ func submitToDA[T any](
312312
marshalFn func(T) ([]byte, error),
313313
postSubmit func([]T, *coreda.ResultSubmit, float64),
314314
itemType string,
315-
namespace []byte,
315+
namespace string,
316316
options []byte,
317317
cache cache.Manager,
318318
) error {

block/internal/submitting/da_submitter_mocks_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func TestSubmitToDA_MempoolRetry_IncreasesGasAndSucceeds(t *testing.T) {
4545

4646
// First attempt returns a mempool-related error (mapped to StatusNotIncludedInBlock)
4747
// Expect gasPrice=1.0
48-
ns := []byte("ns")
48+
ns := "ns"
4949
opts := []byte("opts")
5050
// capture gas prices used
5151
var usedGas []float64
@@ -99,7 +99,7 @@ func TestSubmitToDA_UnknownError_RetriesSameGasThenSucceeds(t *testing.T) {
9999
// Initial gas price comes from config (set below), so DA.GasPrice is not called
100100
mockDA.On("GasMultiplier", mock.Anything).Return(3.0, nil).Once()
101101

102-
ns := []byte("ns")
102+
ns := "ns"
103103
opts := []byte("opts")
104104
var usedGas []float64
105105

@@ -147,7 +147,7 @@ func TestSubmitToDA_TooBig_HalvesBatch(t *testing.T) {
147147
// Use fixed gas from config to simplify
148148
mockDA.On("GasMultiplier", mock.Anything).Return(2.0, nil).Once()
149149

150-
ns := []byte("ns")
150+
ns := "ns"
151151
opts := []byte("opts")
152152
// record sizes of batches sent to DA
153153
var batchSizes []int
@@ -202,7 +202,7 @@ func TestSubmitToDA_SentinelNoGas_PreservesGasAcrossRetries(t *testing.T) {
202202
// GasMultiplier is still called once, but should not affect gas when sentinel is used
203203
mockDA.On("GasMultiplier", mock.Anything).Return(10.0, nil).Once()
204204

205-
ns := []byte("ns")
205+
ns := "ns"
206206
opts := []byte("opts")
207207
var usedGas []float64
208208

@@ -249,7 +249,7 @@ func TestSubmitToDA_PartialSuccess_AdvancesWindow(t *testing.T) {
249249
mockDA := mocks.NewMockDA(t)
250250
mockDA.On("GasMultiplier", mock.Anything).Return(2.0, nil).Once()
251251

252-
ns := []byte("ns")
252+
ns := "ns"
253253
opts := []byte("opts")
254254
// track how many items postSubmit sees across attempts
255255
var totalSubmitted int

da/jsonrpc/client.go

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@ type API struct {
4040

4141
// Get returns Blob for each given ID, or an error.
4242
func (api *API) Get(ctx context.Context, ids []da.ID, ns []byte) ([]da.Blob, error) {
43-
preparedNs := da.PrepareNamespace(ns)
44-
api.Logger.Debug().Str("method", "Get").Int("num_ids", len(ids)).Str("namespace", hex.EncodeToString(preparedNs)).Msg("Making RPC call")
45-
res, err := api.Internal.Get(ctx, ids, preparedNs)
43+
api.Logger.Debug().Str("method", "Get").Int("num_ids", len(ids)).Str("namespace", hex.EncodeToString(ns)).Msg("Making RPC call")
44+
res, err := api.Internal.Get(ctx, ids, ns)
4645
if err != nil {
4746
if strings.Contains(err.Error(), context.Canceled.Error()) {
4847
api.Logger.Debug().Str("method", "Get").Msg("RPC call canceled due to context cancellation")
@@ -58,9 +57,8 @@ func (api *API) Get(ctx context.Context, ids []da.ID, ns []byte) ([]da.Blob, err
5857

5958
// GetIDs returns IDs of all Blobs located in DA at given height.
6059
func (api *API) GetIDs(ctx context.Context, height uint64, ns []byte) (*da.GetIDsResult, error) {
61-
preparedNs := da.PrepareNamespace(ns)
62-
api.Logger.Debug().Str("method", "GetIDs").Uint64("height", height).Str("namespace", hex.EncodeToString(preparedNs)).Msg("Making RPC call")
63-
res, err := api.Internal.GetIDs(ctx, height, preparedNs)
60+
api.Logger.Debug().Str("method", "GetIDs").Uint64("height", height).Str("namespace", hex.EncodeToString(ns)).Msg("Making RPC call")
61+
res, err := api.Internal.GetIDs(ctx, height, ns)
6462
if err != nil {
6563
// Using strings.contains since JSON RPC serialization doesn't preserve error wrapping
6664
// Check if the error is specifically BlobNotFound, otherwise log and return
@@ -92,9 +90,8 @@ func (api *API) GetIDs(ctx context.Context, height uint64, ns []byte) (*da.GetID
9290

9391
// GetProofs returns inclusion Proofs for Blobs specified by their IDs.
9492
func (api *API) GetProofs(ctx context.Context, ids []da.ID, ns []byte) ([]da.Proof, error) {
95-
preparedNs := da.PrepareNamespace(ns)
96-
api.Logger.Debug().Str("method", "GetProofs").Int("num_ids", len(ids)).Str("namespace", hex.EncodeToString(preparedNs)).Msg("Making RPC call")
97-
res, err := api.Internal.GetProofs(ctx, ids, preparedNs)
93+
api.Logger.Debug().Str("method", "GetProofs").Int("num_ids", len(ids)).Str("namespace", hex.EncodeToString(ns)).Msg("Making RPC call")
94+
res, err := api.Internal.GetProofs(ctx, ids, ns)
9895
if err != nil {
9996
api.Logger.Error().Err(err).Str("method", "GetProofs").Msg("RPC call failed")
10097
} else {
@@ -105,9 +102,8 @@ func (api *API) GetProofs(ctx context.Context, ids []da.ID, ns []byte) ([]da.Pro
105102

106103
// Commit creates a Commitment for each given Blob.
107104
func (api *API) Commit(ctx context.Context, blobs []da.Blob, ns []byte) ([]da.Commitment, error) {
108-
preparedNs := da.PrepareNamespace(ns)
109-
api.Logger.Debug().Str("method", "Commit").Int("num_blobs", len(blobs)).Str("namespace", hex.EncodeToString(preparedNs)).Msg("Making RPC call")
110-
res, err := api.Internal.Commit(ctx, blobs, preparedNs)
105+
api.Logger.Debug().Str("method", "Commit").Int("num_blobs", len(blobs)).Str("namespace", hex.EncodeToString(ns)).Msg("Making RPC call")
106+
res, err := api.Internal.Commit(ctx, blobs, ns)
111107
if err != nil {
112108
api.Logger.Error().Err(err).Str("method", "Commit").Msg("RPC call failed")
113109
} else {
@@ -118,9 +114,8 @@ func (api *API) Commit(ctx context.Context, blobs []da.Blob, ns []byte) ([]da.Co
118114

119115
// Validate validates Commitments against the corresponding Proofs. This should be possible without retrieving the Blobs.
120116
func (api *API) Validate(ctx context.Context, ids []da.ID, proofs []da.Proof, ns []byte) ([]bool, error) {
121-
preparedNs := da.PrepareNamespace(ns)
122-
api.Logger.Debug().Str("method", "Validate").Int("num_ids", len(ids)).Int("num_proofs", len(proofs)).Str("namespace", hex.EncodeToString(preparedNs)).Msg("Making RPC call")
123-
res, err := api.Internal.Validate(ctx, ids, proofs, preparedNs)
117+
api.Logger.Debug().Str("method", "Validate").Int("num_ids", len(ids)).Int("num_proofs", len(proofs)).Str("namespace", hex.EncodeToString(ns)).Msg("Making RPC call")
118+
res, err := api.Internal.Validate(ctx, ids, proofs, ns)
124119
if err != nil {
125120
api.Logger.Error().Err(err).Str("method", "Validate").Msg("RPC call failed")
126121
} else {
@@ -131,15 +126,14 @@ func (api *API) Validate(ctx context.Context, ids []da.ID, proofs []da.Proof, ns
131126

132127
// Submit submits the Blobs to Data Availability layer.
133128
func (api *API) Submit(ctx context.Context, blobs []da.Blob, gasPrice float64, ns []byte) ([]da.ID, error) {
134-
preparedNs := da.PrepareNamespace(ns)
135-
api.Logger.Debug().Str("method", "Submit").Int("num_blobs", len(blobs)).Float64("gas_price", gasPrice).Str("namespace", hex.EncodeToString(preparedNs)).Msg("Making RPC call")
136-
res, err := api.Internal.Submit(ctx, blobs, gasPrice, preparedNs)
129+
api.Logger.Debug().Str("method", "Submit").Int("num_blobs", len(blobs)).Float64("gas_price", gasPrice).Str("namespace", hex.EncodeToString(ns)).Msg("Making RPC call")
130+
res, err := api.Internal.Submit(ctx, blobs, gasPrice, ns)
137131
if err != nil {
138132
if strings.Contains(err.Error(), context.Canceled.Error()) {
139133
api.Logger.Debug().Str("method", "Submit").Msg("RPC call canceled due to context cancellation")
140134
return res, context.Canceled
141135
}
142-
api.Logger.Error().Err(err).Str("method", "Submit").Bytes("namespace", preparedNs).Msg("RPC call failed")
136+
api.Logger.Error().Err(err).Str("method", "Submit").Bytes("namespace", ns).Msg("RPC call failed")
143137
} else {
144138
api.Logger.Debug().Str("method", "Submit").Int("num_ids_returned", len(res)).Msg("RPC call successful")
145139
}
@@ -172,9 +166,8 @@ func (api *API) SubmitWithOptions(ctx context.Context, inputBlobs []da.Blob, gas
172166
return nil, da.ErrBlobSizeOverLimit
173167
}
174168

175-
preparedNs := da.PrepareNamespace(ns)
176-
api.Logger.Debug().Str("method", "SubmitWithOptions").Int("num_blobs", len(inputBlobs)).Uint64("total_size", totalSize).Float64("gas_price", gasPrice).Str("namespace", hex.EncodeToString(preparedNs)).Msg("Making RPC call")
177-
res, err := api.Internal.SubmitWithOptions(ctx, inputBlobs, gasPrice, preparedNs, options)
169+
api.Logger.Debug().Str("method", "SubmitWithOptions").Int("num_blobs", len(inputBlobs)).Uint64("total_size", totalSize).Float64("gas_price", gasPrice).Str("namespace", hex.EncodeToString(ns)).Msg("Making RPC call")
170+
res, err := api.Internal.SubmitWithOptions(ctx, inputBlobs, gasPrice, ns, options)
178171
if err != nil {
179172
if strings.Contains(err.Error(), context.Canceled.Error()) {
180173
api.Logger.Debug().Str("method", "SubmitWithOptions").Msg("RPC call canceled due to context cancellation")

da/jsonrpc/proxy_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -231,10 +231,11 @@ func HeightFromFutureTest(t *testing.T, d coreda.DA) {
231231
// TestSubmitWithOptions tests the SubmitWithOptions method with various scenarios
232232
func TestSubmitWithOptions(t *testing.T) {
233233
ctx := context.Background()
234-
testNamespace := []byte("options_test")
234+
testNamespace := "options_test"
235235
// The client will convert the namespace string to a proper Celestia namespace
236236
// using SHA256 hashing and version 0 format (1 version byte + 28 ID bytes)
237-
encodedNamespace := coreda.PrepareNamespace(testNamespace)
237+
namespace := coreda.NamespaceFromString(testNamespace)
238+
encodedNamespace := namespace.Bytes()
238239
testOptions := []byte("test_options")
239240
gasPrice := 0.0
240241

@@ -257,7 +258,7 @@ func TestSubmitWithOptions(t *testing.T) {
257258

258259
mockAPI.On("SubmitWithOptions", ctx, blobs, gasPrice, encodedNamespace, testOptions).Return(expectedIDs, nil).Once()
259260

260-
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, testNamespace, testOptions)
261+
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, encodedNamespace, testOptions)
261262

262263
require.NoError(t, err)
263264
assert.Equal(t, expectedIDs, ids)
@@ -271,7 +272,7 @@ func TestSubmitWithOptions(t *testing.T) {
271272
largerBlob := make([]byte, testMaxBlobSize+1)
272273
blobs := []coreda.Blob{largerBlob, []byte("this blob is definitely too large")}
273274

274-
_, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, testNamespace, testOptions)
275+
_, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, encodedNamespace, testOptions)
275276

276277
require.Error(t, err)
277278
mockAPI.AssertExpectations(t)
@@ -286,7 +287,7 @@ func TestSubmitWithOptions(t *testing.T) {
286287

287288
blobs := []coreda.Blob{blobsizes, blobsizes, blobsizesOver}
288289

289-
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, testNamespace, testOptions)
290+
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, encodedNamespace, testOptions)
290291

291292
require.Error(t, err)
292293
assert.ErrorIs(t, err, coreda.ErrBlobSizeOverLimit)
@@ -304,7 +305,7 @@ func TestSubmitWithOptions(t *testing.T) {
304305
largerBlob := make([]byte, testMaxBlobSize+1)
305306
blobs := []coreda.Blob{largerBlob, []byte("small")}
306307

307-
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, testNamespace, testOptions)
308+
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, encodedNamespace, testOptions)
308309

309310
require.Error(t, err)
310311
assert.ErrorIs(t, err, coreda.ErrBlobSizeOverLimit)
@@ -320,7 +321,7 @@ func TestSubmitWithOptions(t *testing.T) {
320321

321322
var blobs []coreda.Blob
322323

323-
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, testNamespace, testOptions)
324+
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, encodedNamespace, testOptions)
324325

325326
require.NoError(t, err)
326327
assert.Empty(t, ids)
@@ -338,7 +339,7 @@ func TestSubmitWithOptions(t *testing.T) {
338339

339340
mockAPI.On("SubmitWithOptions", ctx, blobs, gasPrice, encodedNamespace, testOptions).Return(nil, expectedError).Once()
340341

341-
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, testNamespace, testOptions)
342+
ids, err := client.DA.SubmitWithOptions(ctx, blobs, gasPrice, encodedNamespace, testOptions)
342343

343344
require.Error(t, err)
344345
assert.ErrorIs(t, err, expectedError)

pkg/config/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,8 @@ func validateNamespace(namespace string) error {
259259
return fmt.Errorf("namespace cannot be empty")
260260
}
261261

262-
namespaceBz := da.PrepareNamespace([]byte(namespace))
263-
if _, err := share.NewNamespaceFromBytes(namespaceBz); err != nil {
262+
ns := da.NamespaceFromString(namespace)
263+
if _, err := share.NewNamespaceFromBytes(ns.Bytes()); err != nil {
264264
return fmt.Errorf("could not validate namespace (%s): %w", namespace, err)
265265
}
266266
return nil

pkg/rpc/server/server.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"time"
99

1010
"encoding/binary"
11-
"encoding/hex"
1211
"errors"
1312

1413
"connectrpc.com/connect"
@@ -208,12 +207,12 @@ func (cs *ConfigServer) GetNamespace(
208207
req *connect.Request[emptypb.Empty],
209208
) (*connect.Response[pb.GetNamespaceResponse], error) {
210209

211-
hns := coreda.PrepareNamespace([]byte(cs.config.DA.GetNamespace()))
212-
dns := coreda.PrepareNamespace([]byte(cs.config.DA.GetDataNamespace()))
210+
hns := coreda.NamespaceFromString(cs.config.DA.GetNamespace())
211+
dns := coreda.NamespaceFromString(cs.config.DA.GetDataNamespace())
213212

214213
return connect.NewResponse(&pb.GetNamespaceResponse{
215-
HeaderNamespace: hex.EncodeToString(hns),
216-
DataNamespace: hex.EncodeToString(dns),
214+
HeaderNamespace: hns.HexString(),
215+
DataNamespace: dns.HexString(),
217216
}), nil
218217
}
219218

types/da.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ func SubmitWithHelpers(
2222
logger zerolog.Logger,
2323
data [][]byte,
2424
gasPrice float64,
25-
namespace []byte, // New namespace parameter
25+
namespace string,
2626
options []byte,
2727
) coreda.ResultSubmit { // Return core ResultSubmit type
28-
ids, err := da.SubmitWithOptions(ctx, data, gasPrice, namespace, options)
28+
ns := coreda.NamespaceFromString(namespace)
29+
ids, err := da.SubmitWithOptions(ctx, data, gasPrice, ns.Bytes(), options)
2930

3031
// Handle errors returned by Submit
3132
if err != nil {

0 commit comments

Comments
 (0)