Skip to content

Commit f90ccd5

Browse files
committed
Merge remote-tracking branch 'origin' into technicallyty/object-stores
2 parents a1f2db1 + d081460 commit f90ccd5

File tree

5 files changed

+155
-97
lines changed

5 files changed

+155
-97
lines changed

.github/workflows/build-docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
fetch-depth: 0
2828

2929
- name: Setup Node.js 🔧
30-
uses: actions/setup-node@v5
30+
uses: actions/setup-node@v6
3131
with:
3232
node-version: "24.x"
3333

store/pruning/manager.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,9 @@ func loadPruningSnapshotHeights(db dbm.DB) ([]int64, error) {
224224
}
225225

226226
func int64SliceToBytes(slice ...int64) []byte {
227-
bz := make([]byte, 0, len(slice)*8)
228-
for _, ph := range slice {
229-
buf := make([]byte, 8)
230-
binary.BigEndian.PutUint64(buf, uint64(ph))
231-
bz = append(bz, buf...)
227+
bz := make([]byte, len(slice)*8)
228+
for i, ph := range slice {
229+
binary.BigEndian.PutUint64(bz[i<<3:], uint64(ph))
232230
}
233231
return bz
234232
}

store/pruning/manager_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package pruning
22

33
import (
4+
"encoding/binary"
45
"errors"
56
"fmt"
67
"testing"
@@ -454,3 +455,54 @@ func TestLoadSnapshotHeights_PruneNothing(t *testing.T) {
454455

455456
require.Nil(t, manager.LoadSnapshotHeights(db.NewMemDB()))
456457
}
458+
459+
func TestInt64SliceToBytes(t *testing.T) {
460+
tests := []struct {
461+
name string
462+
input []int64
463+
expect []byte
464+
}{
465+
{
466+
name: "empty slice",
467+
input: []int64{},
468+
expect: []byte{},
469+
},
470+
{
471+
name: "single value",
472+
input: []int64{1},
473+
expect: func() []byte {
474+
b := make([]byte, 8)
475+
binary.BigEndian.PutUint64(b, 1)
476+
return b
477+
}(),
478+
},
479+
{
480+
name: "multiple values",
481+
input: []int64{1, 2},
482+
expect: func() []byte {
483+
b := make([]byte, 16)
484+
binary.BigEndian.PutUint64(b[0:], 1)
485+
binary.BigEndian.PutUint64(b[8:], 2)
486+
return b
487+
}(),
488+
},
489+
}
490+
491+
for _, tt := range tests {
492+
t.Run(tt.name, func(t *testing.T) {
493+
got := int64SliceToBytes(tt.input...)
494+
require.Equal(t, tt.expect, got, "bytes mismatch")
495+
})
496+
}
497+
}
498+
499+
func BenchmarkInt64SliceToBytes(b *testing.B) {
500+
data := make([]int64, 1024)
501+
for i := range data {
502+
data[i] = int64(i)
503+
}
504+
505+
for b.Loop() {
506+
_ = int64SliceToBytes(data...)
507+
}
508+
}

tests/e2e/tx/service_test.go

Lines changed: 94 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -248,64 +248,64 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() {
248248
expLen int
249249
}{
250250
{
251-
"nil request",
252-
nil,
253-
true,
254-
"request cannot be nil",
255-
0,
251+
name: "nil request",
252+
req: nil,
253+
expErr: true,
254+
expErrMsg: "request cannot be nil",
255+
expLen: 0,
256256
},
257257
{
258-
"empty request",
259-
&tx.GetTxsEventRequest{},
260-
true,
261-
"query cannot be empty",
262-
0,
258+
name: "empty request",
259+
req: &tx.GetTxsEventRequest{},
260+
expErr: true,
261+
expErrMsg: "query cannot be empty",
262+
expLen: 0,
263263
},
264264
{
265-
"request with dummy event",
266-
&tx.GetTxsEventRequest{Query: "foobar"},
267-
true,
268-
"failed to search for txs",
269-
0,
265+
name: "request with dummy event",
266+
req: &tx.GetTxsEventRequest{Query: "foobar"},
267+
expErr: true,
268+
expErrMsg: "failed to search for txs",
269+
expLen: 0,
270270
},
271271
{
272-
"request with order-by",
273-
&tx.GetTxsEventRequest{
272+
name: "request with order-by",
273+
req: &tx.GetTxsEventRequest{
274274
Query: bankMsgSendEventAction,
275275
OrderBy: tx.OrderBy_ORDER_BY_ASC,
276276
},
277-
false,
278-
"",
279-
3,
277+
expErr: false,
278+
expErrMsg: "",
279+
expLen: 3,
280280
},
281281
{
282-
"without pagination",
283-
&tx.GetTxsEventRequest{
282+
name: "without pagination",
283+
req: &tx.GetTxsEventRequest{
284284
Query: bankMsgSendEventAction,
285285
},
286-
false,
287-
"",
288-
3,
286+
expErr: false,
287+
expErrMsg: "",
288+
expLen: 3,
289289
},
290290
{
291-
"with pagination",
292-
&tx.GetTxsEventRequest{
291+
name: "with pagination",
292+
req: &tx.GetTxsEventRequest{
293293
Query: bankMsgSendEventAction,
294294
Page: 1,
295295
Limit: 2,
296296
},
297-
false,
298-
"",
299-
2,
297+
expErr: false,
298+
expErrMsg: "",
299+
expLen: 2,
300300
},
301301
{
302-
"with multi events",
303-
&tx.GetTxsEventRequest{
302+
name: "with multi events",
303+
req: &tx.GetTxsEventRequest{
304304
Query: fmt.Sprintf("%s AND message.module='bank'", bankMsgSendEventAction),
305305
},
306-
false,
307-
"",
308-
3,
306+
expErr: false,
307+
expErrMsg: "",
308+
expLen: 3,
309309
},
310310
}
311311
for _, tc := range testCases {
@@ -315,18 +315,18 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() {
315315
if tc.expErr {
316316
s.Require().Error(err)
317317
s.Require().Contains(err.Error(), tc.expErrMsg)
318-
} else {
319-
s.Require().NoError(err)
320-
s.Require().GreaterOrEqual(len(grpcRes.Txs), 1)
321-
s.Require().Equal("foobar", grpcRes.Txs[0].Body.Memo)
322-
s.Require().Equal(tc.expLen, len(grpcRes.Txs))
323-
324-
// Make sure fields are populated.
325-
// ref: https://github.com/cosmos/cosmos-sdk/issues/8680
326-
// ref: https://github.com/cosmos/cosmos-sdk/issues/8681
327-
s.Require().NotEmpty(grpcRes.TxResponses[0].Timestamp)
328-
s.Require().Empty(grpcRes.TxResponses[0].RawLog) // logs are empty if the transactions are successful
318+
return
329319
}
320+
s.Require().NoError(err)
321+
s.Require().GreaterOrEqual(len(grpcRes.Txs), 1)
322+
s.Require().Equal("foobar", grpcRes.Txs[0].Body.Memo)
323+
s.Require().Equal(tc.expLen, len(grpcRes.Txs), fmt.Sprintf("%q", grpcRes.Txs))
324+
325+
// Make sure fields are populated.
326+
// ref: https://github.com/cosmos/cosmos-sdk/issues/8680
327+
// ref: https://github.com/cosmos/cosmos-sdk/issues/8681
328+
s.Require().NotEmpty(grpcRes.TxResponses[0].Timestamp)
329+
s.Require().Empty(grpcRes.TxResponses[0].RawLog) // logs are empty if the transactions are successful
330330
})
331331
}
332332
}
@@ -341,52 +341,60 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPCGateway() {
341341
expLen int
342342
}{
343343
{
344-
"empty params",
345-
fmt.Sprintf("%s/cosmos/tx/v1beta1/txs", val.APIAddress),
346-
true,
347-
"query cannot be empty", 0,
344+
name: "empty params",
345+
url: fmt.Sprintf("%s/cosmos/tx/v1beta1/txs", val.APIAddress),
346+
expErr: true,
347+
expErrMsg: "query cannot be empty",
348+
expLen: 0,
348349
},
349350
{
350-
"without pagination",
351-
fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s", val.APIAddress, bankMsgSendEventAction),
352-
false,
353-
"", 3,
351+
name: "without pagination",
352+
url: fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s", val.APIAddress, bankMsgSendEventAction),
353+
expErr: false,
354+
expErrMsg: "",
355+
expLen: 3,
354356
},
355357
{
356-
"with pagination",
357-
fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&page=%d&limit=%d", val.APIAddress, bankMsgSendEventAction, 1, 2),
358-
false,
359-
"", 2,
358+
name: "with pagination",
359+
url: fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&page=%d&limit=%d", val.APIAddress, bankMsgSendEventAction, 1, 2),
360+
expErr: false,
361+
expErrMsg: "",
362+
expLen: 2,
360363
},
361364
{
362-
"valid request: order by asc",
363-
fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=ORDER_BY_ASC", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"),
364-
false,
365-
"", 3,
365+
name: "valid request: order by asc",
366+
url: fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=ORDER_BY_ASC", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"),
367+
expErr: false,
368+
expErrMsg: "",
369+
expLen: 3,
366370
},
367371
{
368-
"valid request: order by desc",
369-
fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=ORDER_BY_DESC", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"),
370-
false,
371-
"", 3,
372+
name: "valid request: order by desc",
373+
url: fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=ORDER_BY_DESC", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"),
374+
expErr: false,
375+
expErrMsg: "",
376+
expLen: 3,
372377
},
373378
{
374-
"invalid request: invalid order by",
375-
fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=invalid_order", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"),
376-
true,
377-
"is not a valid tx.OrderBy", 0,
379+
name: "invalid request: invalid order by",
380+
url: fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=invalid_order", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"),
381+
expErr: true,
382+
expErrMsg: "is not a valid tx.OrderBy",
383+
expLen: 0,
378384
},
379385
{
380-
"expect pass with multiple-events",
381-
fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"),
382-
false,
383-
"", 3,
386+
name: "expect pass with multiple-events",
387+
url: fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"),
388+
expErr: false,
389+
expErrMsg: "",
390+
expLen: 3,
384391
},
385392
{
386-
"expect pass with escape event",
387-
fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s", val.APIAddress, "message.action%3D'/cosmos.bank.v1beta1.MsgSend'"),
388-
false,
389-
"", 3,
393+
name: "expect pass with escape event",
394+
url: fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s", val.APIAddress, "message.action%3D'/cosmos.bank.v1beta1.MsgSend'"),
395+
expErr: false,
396+
expErrMsg: "",
397+
expLen: 3,
390398
},
391399
}
392400
for _, tc := range testCases {
@@ -395,15 +403,15 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPCGateway() {
395403
s.Require().NoError(err)
396404
if tc.expErr {
397405
s.Require().Contains(string(res), tc.expErrMsg)
398-
} else {
399-
var result tx.GetTxsEventResponse
400-
err = val.ClientCtx.Codec.UnmarshalJSON(res, &result)
401-
s.Require().NoError(err, "failed to unmarshal JSON: %s", res)
402-
s.Require().GreaterOrEqual(len(result.Txs), 1)
403-
s.Require().Equal("foobar", result.Txs[0].Body.Memo)
404-
s.Require().NotZero(result.TxResponses[0].Height)
405-
s.Require().Equal(tc.expLen, len(result.Txs))
406+
return
406407
}
408+
var result tx.GetTxsEventResponse
409+
err = val.ClientCtx.Codec.UnmarshalJSON(res, &result)
410+
s.Require().NoError(err, "failed to unmarshal JSON: %s", res)
411+
s.Require().GreaterOrEqual(len(result.Txs), 1)
412+
s.Require().Equal("foobar", result.Txs[0].Body.Memo)
413+
s.Require().NotZero(result.TxResponses[0].Height)
414+
s.Require().Equal(tc.expLen, len(result.Txs), fmt.Sprintf("%q", result.Txs))
407415
})
408416
}
409417
}

x/auth/tx/service.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func NewTxServer(clientCtx client.Context, simulate baseAppSimulateFn, interface
4343
var _ txtypes.ServiceServer = txServer{}
4444

4545
// GetTxsEvent implements the ServiceServer.TxsByEvents RPC method.
46-
func (s txServer) GetTxsEvent(ctx context.Context, req *txtypes.GetTxsEventRequest) (*txtypes.GetTxsEventResponse, error) {
46+
func (s txServer) GetTxsEvent(_ context.Context, req *txtypes.GetTxsEventRequest) (*txtypes.GetTxsEventResponse, error) {
4747
if req == nil {
4848
return nil, status.Error(codes.InvalidArgument, "request cannot be nil")
4949
}
@@ -73,7 +73,7 @@ func (s txServer) GetTxsEvent(ctx context.Context, req *txtypes.GetTxsEventReque
7373
}
7474

7575
// Simulate implements the ServiceServer.Simulate RPC method.
76-
func (s txServer) Simulate(ctx context.Context, req *txtypes.SimulateRequest) (*txtypes.SimulateResponse, error) {
76+
func (s txServer) Simulate(_ context.Context, req *txtypes.SimulateRequest) (*txtypes.SimulateResponse, error) {
7777
if req == nil {
7878
return nil, status.Error(codes.InvalidArgument, "invalid empty tx")
7979
}
@@ -107,7 +107,7 @@ func (s txServer) Simulate(ctx context.Context, req *txtypes.SimulateRequest) (*
107107
}
108108

109109
// GetTx implements the ServiceServer.GetTx RPC method.
110-
func (s txServer) GetTx(ctx context.Context, req *txtypes.GetTxRequest) (*txtypes.GetTxResponse, error) {
110+
func (s txServer) GetTx(_ context.Context, req *txtypes.GetTxRequest) (*txtypes.GetTxResponse, error) {
111111
if req == nil {
112112
return nil, status.Error(codes.InvalidArgument, "request cannot be nil")
113113
}
@@ -222,7 +222,7 @@ func (s txServer) BroadcastTx(ctx context.Context, req *txtypes.BroadcastTxReque
222222
}
223223

224224
// TxEncode implements the ServiceServer.TxEncode RPC method.
225-
func (s txServer) TxEncode(ctx context.Context, req *txtypes.TxEncodeRequest) (*txtypes.TxEncodeResponse, error) {
225+
func (s txServer) TxEncode(_ context.Context, req *txtypes.TxEncodeRequest) (*txtypes.TxEncodeResponse, error) {
226226
if req.Tx == nil {
227227
return nil, status.Error(codes.InvalidArgument, "invalid empty tx")
228228
}
@@ -262,7 +262,7 @@ func (s txServer) TxEncodeAmino(_ context.Context, req *txtypes.TxEncodeAminoReq
262262
}
263263

264264
// TxDecode implements the ServiceServer.TxDecode RPC method.
265-
func (s txServer) TxDecode(ctx context.Context, req *txtypes.TxDecodeRequest) (*txtypes.TxDecodeResponse, error) {
265+
func (s txServer) TxDecode(_ context.Context, req *txtypes.TxDecodeRequest) (*txtypes.TxDecodeResponse, error) {
266266
if req.TxBytes == nil {
267267
return nil, status.Error(codes.InvalidArgument, "invalid empty tx bytes")
268268
}

0 commit comments

Comments
 (0)