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 }