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 }