github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/token/handler_test.go (about)

     1  package token_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	ethcrypto "github.com/ethereum/go-ethereum/crypto"
     7  	fbchain "github.com/fibonacci-chain/fbc/app"
     8  	app "github.com/fibonacci-chain/fbc/app/types"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    10  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mock"
    13  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    14  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto/secp256k1"
    15  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    16  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    17  	"github.com/fibonacci-chain/fbc/x/common"
    18  	"github.com/fibonacci-chain/fbc/x/common/version"
    19  	"github.com/fibonacci-chain/fbc/x/token"
    20  	"github.com/fibonacci-chain/fbc/x/token/types"
    21  	"github.com/stretchr/testify/require"
    22  )
    23  
    24  func TestHandlerBlockedContractAddrSend(t *testing.T) {
    25  	fbexapp := initApp(true)
    26  	ctx := fbexapp.BaseApp.NewContext(true, abci.Header{Height: 1})
    27  	gAcc := CreateEthAccounts(3, sdk.SysCoins{
    28  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(10000)),
    29  	})
    30  	fbexapp.AccountKeeper.SetAccount(ctx, gAcc[0])
    31  	fbexapp.AccountKeeper.SetAccount(ctx, gAcc[1])
    32  	gAcc[2].CodeHash = []byte("contract code hash")
    33  	fbexapp.AccountKeeper.SetAccount(ctx, gAcc[2])
    34  
    35  	// multi send
    36  	multiSendStr := `[{"to":"` + gAcc[1].Address.String() + `","amount":" 10` + common.NativeToken + `"}]`
    37  	transfers, err := types.StrToTransfers(multiSendStr)
    38  	require.Nil(t, err)
    39  	multiSendStr2 := `[{"to":"` + gAcc[2].Address.String() + `","amount":" 10` + common.NativeToken + `"}]`
    40  	transfers2, err := types.StrToTransfers(multiSendStr2)
    41  	require.Nil(t, err)
    42  
    43  	successfulSendMsg := types.NewMsgTokenSend(gAcc[0].Address, gAcc[1].Address, sdk.SysCoins{sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(1))})
    44  	sendToContractMsg := types.NewMsgTokenSend(gAcc[0].Address, gAcc[2].Address, sdk.SysCoins{sdk.NewDecCoinFromDec(common.NativeToken, sdk.NewDec(1))})
    45  	successfulMultiSendMsg := types.NewMsgMultiSend(gAcc[0].Address, transfers)
    46  	multiSendToContractMsg := types.NewMsgMultiSend(gAcc[0].Address, transfers2)
    47  	handler := token.NewTokenHandler(fbexapp.TokenKeeper, version.CurrentProtocolVersion)
    48  	fbexapp.BankKeeper.SetSendEnabled(ctx, true)
    49  	TestSets := []struct {
    50  		description string
    51  		balance     string
    52  		msg         sdk.Msg
    53  		account     app.EthAccount
    54  	}{
    55  		// 0.01fibo as fixed fee in each stdTx
    56  		{"success to send", "9999.000000000000000000fibo", successfulSendMsg, gAcc[0]},
    57  		{"success to multi-send", "9989.000000000000000000fibo", successfulMultiSendMsg, gAcc[0]},
    58  		{"success to send", "9988.000000000000000000fibo", successfulSendMsg, gAcc[0]},
    59  		{"success to multi-send", "9978.000000000000000000fibo", successfulMultiSendMsg, gAcc[0]},
    60  		//{"fail to send to contract", "9978.000000000000000000fibo", failedSendMsg, gAcc[0]},
    61  		//{"fail to multi-send to contract", "9978.000000000000000000fibo", failedMultiSendMsg, gAcc[0]},
    62  		{"fail to send to contract", "9978.000000000000000000fibo", sendToContractMsg, gAcc[0]},
    63  		{"fail to multi-send to contract", "9978.000000000000000000fibo", multiSendToContractMsg, gAcc[0]},
    64  	}
    65  	for i, tt := range TestSets {
    66  		t.Run(tt.description, func(t *testing.T) {
    67  			handler(ctx, TestSets[i].msg)
    68  			acc := fbexapp.AccountKeeper.GetAccount(ctx, tt.account.Address)
    69  			acc.GetCoins().String()
    70  			require.Equal(t, acc.GetCoins().String(), tt.balance)
    71  		})
    72  	}
    73  }
    74  
    75  // Setup initializes a new FBChainApp. A Nop logger is set in FBChainApp.
    76  func initApp(isCheckTx bool) *fbchain.FBChainApp {
    77  	db := dbm.NewMemDB()
    78  	app := fbchain.NewFBChainApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, 0)
    79  
    80  	if !isCheckTx {
    81  		// init chain must be called to stop deliverState from being nil
    82  		genesisState := fbchain.NewDefaultGenesisState()
    83  		stateBytes, err := codec.MarshalJSONIndent(app.Codec(), genesisState)
    84  		if err != nil {
    85  			panic(err)
    86  		}
    87  
    88  		// Initialize the chain
    89  		app.InitChain(
    90  			abci.RequestInitChain{
    91  				Validators:    []abci.ValidatorUpdate{},
    92  				AppStateBytes: stateBytes,
    93  			},
    94  		)
    95  		app.EndBlock(abci.RequestEndBlock{})
    96  		app.Commit(abci.RequestCommit{})
    97  	}
    98  
    99  	return app
   100  }
   101  
   102  func CreateEthAccounts(numAccs int, genCoins sdk.SysCoins) (genAccs []app.EthAccount) {
   103  	for i := 0; i < numAccs; i++ {
   104  		privKey := secp256k1.GenPrivKey()
   105  		pubKey := privKey.PubKey()
   106  		addr := sdk.AccAddress(pubKey.Address())
   107  
   108  		ak := mock.NewAddrKeys(addr, pubKey, privKey)
   109  		testAccount := app.EthAccount{
   110  			BaseAccount: &auth.BaseAccount{
   111  				Address: ak.Address,
   112  				Coins:   genCoins,
   113  			},
   114  			CodeHash: ethcrypto.Keccak256(nil),
   115  		}
   116  		genAccs = append(genAccs, testAccount)
   117  	}
   118  	return
   119  }