Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 32 additions & 3 deletions relayer/tunnel_relayer.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,11 +325,24 @@ func (t *TunnelRelayer) getTunnelPacket(ctx context.Context, seq uint64) (*types
// Check signing status; if it is waiting, wait for the completion of the EVM signature.
// If it is not success (Failed or Undefined), return error.
signing := packet.CurrentGroupSigning
if signing == nil ||
signing.SigningStatus == tsstypes.SIGNING_STATUS_FALLEN {
if (signing == nil ||
signing.SigningStatus == tsstypes.SIGNING_STATUS_FALLEN) && packet.IncomingGroupSigning != nil {
signing = packet.IncomingGroupSigning
}

if signing == nil {
err := fmt.Errorf("no signing info available for packet")
alert.HandleAlert(
t.Alert,
alert.NewTopic(alert.PacketSigningStatusErrorMsg).
WithTunnelID(t.TunnelID).
WithChainName(t.TargetChainProvider.GetChainName()),
err.Error(),
)
t.Log.Error("Failed to relay packet", "sequence", seq, err)
Comment thread
Marca23 marked this conversation as resolved.
Comment thread
Marca23 marked this conversation as resolved.
return nil, err
}

if signing.SigningStatus == tsstypes.SIGNING_STATUS_WAITING {
t.Log.Debug(
"The current packet must wait for the completion of the EVM signature",
Expand All @@ -340,8 +353,20 @@ func (t *TunnelRelayer) getTunnelPacket(ctx context.Context, seq uint64) (*types
continue
} else if signing.SigningStatus != tsstypes.SIGNING_STATUS_SUCCESS {
err := fmt.Errorf("signing status is not success")
alert.HandleAlert(t.Alert, alert.NewTopic(alert.PacketSigningStatusErrorMsg).WithTunnelID(t.TunnelID).WithChainName(t.TargetChainProvider.GetChainName()), err.Error())
alert.HandleAlert(
t.Alert,
alert.NewTopic(alert.PacketSigningStatusErrorMsg).
WithTunnelID(t.TunnelID).
WithChainName(t.TargetChainProvider.GetChainName()),
err.Error(),
)
t.Log.Error("Failed to relay packet", "sequence", seq, err)

// if the signing fails, we set lastRelayedSequence to the failed sequence so that the relayer can skip this sequence in the next rounds.
if t.TargetChainProvider.ChainType() != chaintypes.ChainTypeEVM {
t.lastRelayedSequence = &seq
t.lastRelayedAt = time.Now()
}
Comment thread
Marca23 marked this conversation as resolved.
return nil, err
}
alert.HandleReset(
Expand All @@ -354,3 +379,7 @@ func (t *TunnelRelayer) getTunnelPacket(ctx context.Context, seq uint64) (*types
return packet, nil
}
}

func (t *TunnelRelayer) GetLastRelayedSequence() *uint64 {
return t.lastRelayedSequence
}
49 changes: 49 additions & 0 deletions relayer/tunnel_relayer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ func (s *TunnelRelayerTestSuite) TestCheckAndRelay() {
testcases := []struct {
name string
preprocess func()
postcheck func(t *relayer.TunnelRelayer)
err error
relayStatus relayer.RelayStatus
chainType chaintypes.ChainType
Expand Down Expand Up @@ -366,6 +367,50 @@ func (s *TunnelRelayerTestSuite) TestCheckAndRelay() {
relayStatus: relayer.RelayStatusSkipped,
chainType: chaintypes.ChainTypeXRPL,
},
{
name: "no signing info available",
preprocess: func() {
s.mockGetTunnel(defaultBandLatestSequence, defaultEVMContractAddress)
s.mockQueryTunnelInfo(defaultTargetChainSequence, true, defaultEVMContractAddress)

packet := createMockPacket(
s.tunnelRelayer.TunnelID,
defaultTargetChainSequence+1,
-1, // currentStatus = -1 means nil
-1, // incomingStatus = -1 means nil
)
s.client.EXPECT().
GetTunnelPacket(gomock.Any(), s.tunnelRelayer.TunnelID, defaultTargetChainSequence+1).
Return(packet, nil)
},
err: fmt.Errorf("no signing info available for packet"),
relayStatus: relayer.RelayStatusFailed,
chainType: chaintypes.ChainTypeEVM,
},
{
name: "non-evm chain advances sequence on signing failure",
preprocess: func() {
s.mockGetTunnel(defaultBandLatestSequence, defaultContractAddress)
s.mockQueryTunnelInfo(defaultTargetChainSequence, true, defaultContractAddress)

packet := createMockPacket(
s.tunnelRelayer.TunnelID,
defaultTargetChainSequence+1,
int32(tss.SIGNING_STATUS_FALLEN),
-1,
)
s.client.EXPECT().
GetTunnelPacket(gomock.Any(), s.tunnelRelayer.TunnelID, defaultTargetChainSequence+1).
Return(packet, nil)
},
postcheck: func(t *relayer.TunnelRelayer) {
s.Require().NotNil(t.GetLastRelayedSequence())
s.Require().Equal(defaultTargetChainSequence+1, *t.GetLastRelayedSequence())
},
err: fmt.Errorf("signing status is not success"),
relayStatus: relayer.RelayStatusFailed,
chainType: chaintypes.ChainTypeIcon,
},
}

for _, tc := range testcases {
Expand Down Expand Up @@ -418,6 +463,10 @@ func (s *TunnelRelayerTestSuite) TestCheckAndRelay() {
} else {
s.Require().NoError(err)
}

if tc.postcheck != nil {
tc.postcheck(&tunnelRelayer)
}
})
}
}
Loading