@@ -4,10 +4,12 @@ package tx_test
44
55import (
66 "context"
7+ "encoding/base64"
78 "fmt"
89 "strings"
910 "testing"
1011
12+ "github.com/stretchr/testify/require"
1113 "github.com/stretchr/testify/suite"
1214
1315 "github.com/cosmos/cosmos-sdk/client"
@@ -28,6 +30,7 @@ import (
2830 "github.com/cosmos/cosmos-sdk/types/tx/signing"
2931 authclient "github.com/cosmos/cosmos-sdk/x/auth/client"
3032 authtest "github.com/cosmos/cosmos-sdk/x/auth/client/testutil"
33+ authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"
3134 bankcli "github.com/cosmos/cosmos-sdk/x/bank/client/testutil"
3235 banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
3336)
@@ -111,6 +114,81 @@ func (s *IntegrationTestSuite) TearDownSuite() {
111114 s .network .Cleanup ()
112115}
113116
117+ func (s * IntegrationTestSuite ) TestQueryBySig () {
118+ // broadcast tx
119+ txb := s .mkTxBuilder ()
120+ txbz , err := s .cfg .TxConfig .TxEncoder ()(txb .GetTx ())
121+ s .Require ().NoError (err )
122+ resp , err := s .queryClient .BroadcastTx (context .Background (), & tx.BroadcastTxRequest {TxBytes : txbz , Mode : tx .BroadcastMode_BROADCAST_MODE_SYNC })
123+ s .Require ().NoError (err )
124+ s .Require ().NotEmpty (resp .TxResponse .TxHash )
125+
126+ s .Require ().NoError (s .network .WaitForNextBlock ())
127+
128+ // get the signature out of the builder
129+ sigs , err := txb .GetTx ().GetSignaturesV2 ()
130+ s .Require ().NoError (err )
131+ s .Require ().Len (sigs , 1 )
132+ sig , ok := sigs [0 ].Data .(* signing.SingleSignatureData )
133+ s .Require ().True (ok )
134+
135+ // encode, format, query
136+ b64Sig := base64 .StdEncoding .EncodeToString (sig .Signature )
137+ sigFormatted := fmt .Sprintf ("%s.%s='%s'" , sdk .EventTypeTx , sdk .AttributeKeySignature , b64Sig )
138+ res , err := s .queryClient .GetTxsEvent (context .Background (), & tx.GetTxsEventRequest {
139+ Events : []string {sigFormatted },
140+ OrderBy : 0 ,
141+ Page : 0 ,
142+ Limit : 10 ,
143+ })
144+ s .Require ().NoError (err )
145+ s .Require ().Len (res .Txs , 1 )
146+ s .Require ().Len (res .Txs [0 ].Signatures , 1 )
147+ s .Require ().Equal (res .Txs [0 ].Signatures [0 ], sig .Signature )
148+
149+ // bad format should error
150+ _ , err = s .queryClient .GetTxsEvent (context .Background (), & tx.GetTxsEventRequest {Events : []string {"tx.foo.bar='baz'" }})
151+ s .Require ().ErrorContains (err , "invalid event;" )
152+ }
153+
154+ func TestEventRegex (t * testing.T ) {
155+ t .Parallel ()
156+
157+ testCases := []struct {
158+ name string
159+ event string
160+ match bool
161+ }{
162+ {
163+ name : "valid: with quotes" ,
164+ event : "tx.message='something'" ,
165+ match : true ,
166+ },
167+ {
168+ name : "valid: no quotes" ,
169+ event : "tx.message=something" ,
170+ match : true ,
171+ },
172+ {
173+ name : "invalid: too many separators" ,
174+ event : "tx.message.foo='bar'" ,
175+ match : false ,
176+ },
177+ {
178+ name : "valid: symbols ok" ,
179+ event : "tx.signature='foobar/baz123=='" ,
180+ match : true ,
181+ },
182+ }
183+
184+ for _ , tc := range testCases {
185+ t .Run (tc .name , func (t * testing.T ) {
186+ match := authtx .EventRegex .Match ([]byte (tc .event ))
187+ require .Equal (t , tc .match , match )
188+ })
189+ }
190+ }
191+
114192func (s IntegrationTestSuite ) TestSimulateTx_GRPC () {
115193 val := s .network .Validators [0 ]
116194 txBuilder := s .mkTxBuilder ()
0 commit comments