diff --git a/module/x/gravity/keeper/batch.go b/module/x/gravity/keeper/batch.go index dbcb027ac..454e125ce 100644 --- a/module/x/gravity/keeper/batch.go +++ b/module/x/gravity/keeper/batch.go @@ -163,6 +163,17 @@ func (k Keeper) getLastOutgoingBatchByTokenType(ctx sdk.Context, token common.Ad // GetUnsignedBatchTxs returns all batches for which the specified validator has not submitted confirmations in ascending nonce order func (k Keeper) GetUnsignedBatchTxs(ctx sdk.Context, val sdk.ValAddress) []*types.BatchTx { var unconfirmed []*types.BatchTx + k.IterateCompletedOutgoingTxsByType(ctx, types.BatchTxPrefixByte, func(_ []byte, cotx types.OutgoingTx) bool { + sig := k.getEthereumSignature(ctx, cotx.GetStoreIndex(), val) + if len(sig) == 0 { + batch, ok := cotx.(*types.BatchTx) + if !ok { + panic(sdkerrors.Wrapf(types.ErrInvalid, "couldn't cast to batch tx for completed tx %s", cotx)) + } + unconfirmed = append(unconfirmed, batch) + } + return false + }) k.IterateOutgoingTxsByType(ctx, types.BatchTxPrefixByte, func(_ []byte, otx types.OutgoingTx) bool { sig := k.getEthereumSignature(ctx, otx.GetStoreIndex(), val) if len(sig) == 0 { diff --git a/module/x/gravity/keeper/batch_test.go b/module/x/gravity/keeper/batch_test.go index e5f544e48..d4d04335e 100644 --- a/module/x/gravity/keeper/batch_test.go +++ b/module/x/gravity/keeper/batch_test.go @@ -392,8 +392,7 @@ func TestGetUnconfirmedBatchTxs(t *testing.T) { blockheight := uint64(ctx.BlockHeight()) sig := []byte("dummysig") - //gk.SetCompletedOutgoingTx(ctx, &types.BatchTx{ - gk.SetOutgoingTx(ctx, &types.BatchTx{ + gk.SetCompletedOutgoingTx(ctx, &types.BatchTx{ BatchNonce: 1, Height: uint64(ctx.BlockHeight()), }) @@ -438,14 +437,12 @@ func TestGetUnconfirmedBatchTxs(t *testing.T) { addressA := "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" addressB := "0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" - //gk.SetCompletedOutgoingTx(ctx, &types.BatchTx{ - gk.SetOutgoingTx(ctx, &types.BatchTx{ + gk.SetCompletedOutgoingTx(ctx, &types.BatchTx{ TokenContract: addressB, BatchNonce: 3, Height: blockheight, }) - //gk.SetCompletedOutgoingTx(ctx, &types.BatchTx{ - gk.SetOutgoingTx(ctx, &types.BatchTx{ + gk.SetCompletedOutgoingTx(ctx, &types.BatchTx{ TokenContract: addressA, BatchNonce: 4, Height: blockheight, diff --git a/module/x/gravity/keeper/contract_call.go b/module/x/gravity/keeper/contract_call.go index 92fad3033..57618d394 100644 --- a/module/x/gravity/keeper/contract_call.go +++ b/module/x/gravity/keeper/contract_call.go @@ -12,6 +12,18 @@ import ( func (k Keeper) GetUnsignedContractCallTxs(ctx sdk.Context, val sdk.ValAddress) []*types.ContractCallTx { var unconfirmed []*types.ContractCallTx + k.IterateCompletedOutgoingTxsByType(ctx, types.ContractCallTxPrefixByte, func(_ []byte, cotx types.OutgoingTx) bool { + sig := k.getEthereumSignature(ctx, cotx.GetStoreIndex(), val) + if len(sig) == 0 { + call, ok := cotx.(*types.ContractCallTx) + if !ok { + panic(sdkerrors.Wrapf(types.ErrInvalid, "couldn't cast to contract call for completed tx %s", cotx)) + } + unconfirmed = append(unconfirmed, call) + } + return false + }) + k.IterateOutgoingTxsByType(ctx, types.ContractCallTxPrefixByte, func(_ []byte, otx types.OutgoingTx) bool { sig := k.getEthereumSignature(ctx, otx.GetStoreIndex(), val) if len(sig) == 0 { diff --git a/module/x/gravity/keeper/contract_call_test.go b/module/x/gravity/keeper/contract_call_test.go index 15f4c8348..cb7650806 100644 --- a/module/x/gravity/keeper/contract_call_test.go +++ b/module/x/gravity/keeper/contract_call_test.go @@ -96,8 +96,7 @@ func TestGetUnconfirmedContractCallTxs(t *testing.T) { fees := []types.ERC20Token{} sig := []byte("dummysig") gk.CreateContractCallTx(ctx, 1, scope, address, payload, tokens, fees) - //gk.SetCompletedOutgoingTx(ctx, &types.ContractCallTx{ - gk.SetOutgoingTx(ctx, &types.ContractCallTx{ + gk.SetCompletedOutgoingTx(ctx, &types.ContractCallTx{ InvalidationNonce: 2, InvalidationScope: scope, Address: address.Hex(), diff --git a/module/x/gravity/keeper/grpc_query_test.go b/module/x/gravity/keeper/grpc_query_test.go index def75a04e..d00dc5f46 100644 --- a/module/x/gravity/keeper/grpc_query_test.go +++ b/module/x/gravity/keeper/grpc_query_test.go @@ -300,9 +300,7 @@ func TestKeeper_UnsignedBatchTxs(t *testing.T) { res, err := gk.UnsignedBatchTxs(sdk.WrapSDKContext(ctx), req) require.NoError(t, err) require.NotNil(t, res) - //require.Len(t, res.Batches, 3) - // Test broken by completed tx workaround to SubmitEthereumTxComfiration bug - require.Len(t, res.Batches, 1) + require.Len(t, res.Batches, 3) } }) } @@ -346,9 +344,7 @@ func TestKeeper_UnsignedContractCallTxs(t *testing.T) { res, err := gk.UnsignedContractCallTxs(sdk.WrapSDKContext(ctx), req) require.NoError(t, err) require.NotNil(t, res) - //require.Len(t, res.Calls, 3) - // Test broken by completed tx workaround to SubmitEthereumTxComfiration bug - require.Len(t, res.Calls, 2) + require.Len(t, res.Calls, 3) } }) } diff --git a/module/x/gravity/keeper/msg_server.go b/module/x/gravity/keeper/msg_server.go index 597219db1..939e1ac9c 100644 --- a/module/x/gravity/keeper/msg_server.go +++ b/module/x/gravity/keeper/msg_server.go @@ -117,13 +117,16 @@ func (k msgServer) SubmitEthereumTxConfirmation(c context.Context, msg *types.Ms return nil, err } - otx := k.GetOutgoingTx(ctx, confirmation.GetStoreIndex()) - if otx == nil { - k.Logger(ctx).Error( - "no outgoing tx", - "store index", fmt.Sprintf("%x", confirmation.GetStoreIndex()), - ) - return nil, sdkerrors.Wrap(types.ErrInvalid, "couldn't find outgoing tx") + var otx types.OutgoingTx + if otx = k.GetOutgoingTx(ctx, confirmation.GetStoreIndex()); otx == nil { + if otx = k.GetCompletedOutgoingTx(ctx, confirmation.GetStoreIndex()); otx == nil { + k.Logger(ctx).Error( + "no outgoing tx", + "store index", fmt.Sprintf("%x", confirmation.GetStoreIndex()), + ) + + return nil, sdkerrors.Wrap(types.ErrInvalid, "couldn't find outgoing tx") + } } gravityID := k.getGravityID(ctx)