github.com/Finschia/finschia-sdk@v0.49.1/x/fbridge/keeper/transfer_test.go (about)

     1  package keeper
     2  
     3  import (
     4  	"encoding/binary"
     5  	"errors"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	sdk "github.com/Finschia/finschia-sdk/types"
    11  	"github.com/Finschia/finschia-sdk/x/fbridge/testutil"
    12  	"github.com/Finschia/finschia-sdk/x/fbridge/types"
    13  )
    14  
    15  func TestHandleBridgeTransfer(t *testing.T) {
    16  	key, memKey, ctx, encCfg, authKeeper, bankKeeper, _ := testutil.PrepareFbridgeTest(t, 0)
    17  
    18  	sender := sdk.AccAddress("test")
    19  	amt := sdk.NewInt(1000000)
    20  	denom := "stake"
    21  	token := sdk.Coins{sdk.Coin{Denom: denom, Amount: amt}}
    22  	bankKeeper.EXPECT().IsSendEnabledCoins(ctx, token).Return(nil).Times(1)
    23  	bankKeeper.EXPECT().SendCoinsFromAccountToModule(ctx, sender, types.ModuleName, token).Return(nil).Times(1)
    24  	bankKeeper.EXPECT().BurnCoins(ctx, types.ModuleName, token).Return(nil).Times(1)
    25  
    26  	k := NewKeeper(encCfg.Codec, key, memKey, authKeeper, bankKeeper, types.DefaultAuthority().String())
    27  	params := types.DefaultParams()
    28  	params.TargetDenom = denom
    29  	err := k.SetParams(ctx, params)
    30  	require.NoError(t, err)
    31  	targetSeq := uint64(2)
    32  	bz := make([]byte, 8)
    33  	binary.BigEndian.PutUint64(bz, targetSeq)
    34  	ctx.KVStore(key).Set(types.KeyNextSeqSend, bz)
    35  
    36  	handledSeq, err := k.handleBridgeTransfer(ctx, sender, amt)
    37  	require.NoError(t, err)
    38  	require.Equal(t, targetSeq, handledSeq)
    39  	afterSeq := k.GetNextSequence(ctx)
    40  	require.Equal(t, targetSeq+1, afterSeq)
    41  	h, err := k.GetSeqToBlocknum(ctx, handledSeq)
    42  	require.NoError(t, err)
    43  	require.Equal(t, uint64(ctx.BlockHeight()), h)
    44  
    45  	// test error cases
    46  	bankKeeper.EXPECT().IsSendEnabledCoins(ctx, token).Return(nil).Times(1)
    47  	bankKeeper.EXPECT().SendCoinsFromAccountToModule(ctx, sender, types.ModuleName, token).Return(errors.New("insufficient funds")).Times(1)
    48  	_, err = k.handleBridgeTransfer(ctx, sender, amt)
    49  	require.Error(t, err)
    50  
    51  	bankKeeper.EXPECT().IsSendEnabledCoins(ctx, token).Return(nil).Times(1)
    52  	bankKeeper.EXPECT().SendCoinsFromAccountToModule(ctx, sender, types.ModuleName, token).Return(nil).Times(1)
    53  	bankKeeper.EXPECT().BurnCoins(ctx, types.ModuleName, token).Return(errors.New("failed to burn coins")).Times(1)
    54  	require.Panics(t, func() { _, _ = k.handleBridgeTransfer(ctx, sender, amt) }, "cannot burn coins after a successful send to a module account: failed to burn coins")
    55  }
    56  
    57  func TestIsValidEthereumAddress(t *testing.T) {
    58  	tcs := map[string]struct {
    59  		isErr   bool
    60  		address string
    61  	}{
    62  		"valid": {
    63  			isErr:   true,
    64  			address: "0xf7bAc63fc7CEaCf0589F25454Ecf5C2ce904997c",
    65  		},
    66  		"invalid": {
    67  			isErr:   false,
    68  			address: "0xf7bAc63fc7CEaCf0589F25454Ecf5C2ce905997c",
    69  		},
    70  	}
    71  
    72  	for name, tc := range tcs {
    73  		t.Run(name, func(t *testing.T) {
    74  			require.Equal(t, tc.isErr, IsValidEthereumAddress(tc.address) == nil)
    75  		})
    76  	}
    77  }