@@ -196,6 +196,8 @@ func createChannelCmd(ctx *config.Context) *cobra.Command {
196196func relayMsgsCmd (ctx * config.Context ) * cobra.Command {
197197 const (
198198 flagDoRefresh = "do-refresh"
199+ flagSrcSeqs = "src-seqs"
200+ flagDstSeqs = "dst-seqs"
199201 )
200202 const (
201203 defaultDoRefresh = false
@@ -205,6 +207,7 @@ func relayMsgsCmd(ctx *config.Context) *cobra.Command {
205207 Short : "relay any packets that remain to be relayed on a given path, in both directions" ,
206208 Args : cobra .ExactArgs (1 ),
207209 RunE : func (cmd * cobra.Command , args []string ) error {
210+
208211 c , src , dst , err := ctx .Config .ChainsFromPath (args [0 ])
209212 if err != nil {
210213 return err
@@ -230,6 +233,11 @@ func relayMsgsCmd(ctx *config.Context) *cobra.Command {
230233 if err != nil {
231234 return err
232235 }
236+ srcSeq := getUint64Slice (flagSrcSeqs )
237+ dstSeq := getUint64Slice (flagDstSeqs )
238+ if err = tryFilterRelayPackets (sp , srcSeq , dstSeq ); err != nil {
239+ return err
240+ }
233241
234242 msgs := core .NewRelayMsgs ()
235243
@@ -251,13 +259,17 @@ func relayMsgsCmd(ctx *config.Context) *cobra.Command {
251259 },
252260 }
253261 cmd .Flags ().Bool (flagDoRefresh , defaultDoRefresh , "execute light client refresh (updateClient) if required" )
262+ cmd .Flags ().IntSlice (flagSrcSeqs , nil , "packet filter for src chain" )
263+ cmd .Flags ().IntSlice (flagDstSeqs , nil , "packet filter for dst chain" )
254264 // TODO add option support for strategy
255265 return cmd
256266}
257267
258268func relayAcksCmd (ctx * config.Context ) * cobra.Command {
259269 const (
260270 flagDoRefresh = "do-refresh"
271+ flagSrcSeqs = "src-seqs"
272+ flagDstSeqs = "dst-seqs"
261273 )
262274 const (
263275 defaultDoRefresh = false
@@ -291,6 +303,11 @@ func relayAcksCmd(ctx *config.Context) *cobra.Command {
291303 if err != nil {
292304 return err
293305 }
306+ srcSeq := getUint64Slice (flagSrcSeqs )
307+ dstSeq := getUint64Slice (flagDstSeqs )
308+ if err = tryFilterRelayPackets (sp , srcSeq , dstSeq ); err != nil {
309+ return err
310+ }
294311
295312 msgs := core .NewRelayMsgs ()
296313
@@ -312,5 +329,32 @@ func relayAcksCmd(ctx *config.Context) *cobra.Command {
312329 },
313330 }
314331 cmd .Flags ().Bool (flagDoRefresh , defaultDoRefresh , "execute light client refresh (updateClient) if required" )
332+ cmd .Flags ().IntSlice (flagSrcSeqs , nil , "packet filter for src chain" )
333+ cmd .Flags ().IntSlice (flagDstSeqs , nil , "packet filter for dst chain" )
315334 return cmd
316335}
336+
337+ func tryFilterRelayPackets (sp * core.RelayPackets , srcSeq []uint64 , dstSeq []uint64 ) error {
338+ if len (srcSeq ) > 0 {
339+ sp .Src = sp .Src .Filter (srcSeq )
340+ if len (sp .Src ) != len (srcSeq ) {
341+ return fmt .Errorf ("src packet not found packetLength=%d selectedLength=%d" , len (sp .Src ), len (srcSeq ))
342+ }
343+ }
344+ if len (dstSeq ) > 0 {
345+ sp .Dst = sp .Dst .Filter (dstSeq )
346+ if len (sp .Dst ) != len (dstSeq ) {
347+ return fmt .Errorf ("dst packet not found packetLength=%d selectedLength=%d" , len (sp .Dst ), len (dstSeq ))
348+ }
349+ }
350+ return nil
351+ }
352+
353+ func getUint64Slice (key string ) []uint64 {
354+ org := viper .GetIntSlice (key )
355+ ret := make ([]uint64 , len (org ))
356+ for i , e := range org {
357+ ret [i ] = uint64 (e )
358+ }
359+ return ret
360+ }
0 commit comments