github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/evm/types/msg_test.go (about)

     1  package types
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"math/big"
     7  	"math/rand"
     8  	"strings"
     9  	"testing"
    10  
    11  	ibcfee "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/29-fee"
    12  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
    13  
    14  	"encoding/hex"
    15  
    16  	"github.com/ethereum/go-ethereum/common/hexutil"
    17  	"github.com/ethereum/go-ethereum/common/math"
    18  	fbexchaincodec "github.com/fibonacci-chain/fbc/app/codec"
    19  
    20  	"github.com/stretchr/testify/require"
    21  
    22  	"github.com/fibonacci-chain/fbc/app/crypto/ethsecp256k1"
    23  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    24  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    25  
    26  	ethcmn "github.com/ethereum/go-ethereum/common"
    27  	ethtypes "github.com/ethereum/go-ethereum/core/types"
    28  	"github.com/ethereum/go-ethereum/rlp"
    29  
    30  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/module"
    31  	ibctxdecode "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/ibc-tx"
    32  	authtypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types"
    33  	ibctransfer "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer"
    34  	ibc "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core"
    35  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto/secp256k1"
    36  )
    37  
    38  func newSdkAddress() sdk.AccAddress {
    39  	tmpKey := secp256k1.GenPrivKey().PubKey()
    40  	return sdk.AccAddress(tmpKey.Address().Bytes())
    41  }
    42  
    43  func TestMsgEthereumTx(t *testing.T) {
    44  	addr := GenerateEthAddress()
    45  
    46  	msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test"))
    47  	require.NotNil(t, msg)
    48  	require.Equal(t, *msg.Data.Recipient, addr)
    49  	require.Equal(t, msg.Route(), RouterKey)
    50  	require.Equal(t, msg.Type(), TypeMsgEthereumTx)
    51  	require.NotNil(t, msg.To())
    52  	require.Equal(t, msg.GetMsgs(), []sdk.Msg{msg})
    53  	require.Panics(t, func() { msg.GetSigners() })
    54  	require.Panics(t, func() { msg.GetSignBytes() })
    55  	require.Equal(t, msg.GetNonce(), uint64(0))
    56  
    57  	msg = NewMsgEthereumTxContract(0, nil, 100000, nil, []byte("test"))
    58  	require.NotNil(t, msg)
    59  	require.Nil(t, msg.Data.Recipient)
    60  	require.Nil(t, msg.To())
    61  
    62  }
    63  
    64  func TestTxFnSignatureInfo(t *testing.T) {
    65  	type expected struct {
    66  		sig []byte
    67  		i   int
    68  	}
    69  	testCases := []struct {
    70  		msg      string
    71  		fn       func() *MsgEthereumTx
    72  		expected expected
    73  	}{
    74  		{
    75  			"receipt not nil should equal",
    76  			func() *MsgEthereumTx {
    77  				addr := ethcmn.BytesToAddress([]byte("test_address"))
    78  				msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test"))
    79  				return msg
    80  			},
    81  			expected{
    82  				[]byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x74, 0x65, 0x73, 0x74},
    83  				0,
    84  			},
    85  		},
    86  		{
    87  			"payload below 4 bytes should DefaultSendCoinFnSignature",
    88  			func() *MsgEthereumTx {
    89  				addr := ethcmn.BytesToAddress([]byte("test_address"))
    90  				msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("t"))
    91  				return msg
    92  			},
    93  			expected{
    94  				DefaultSendCoinFnSignature,
    95  				0,
    96  			},
    97  		},
    98  		{
    99  			"receipt nil should be DefaultDeployContractFnSignature",
   100  			func() *MsgEthereumTx {
   101  				msg := NewMsgEthereumTx(0, nil, nil, 100000, nil, []byte("t"))
   102  				return msg
   103  			},
   104  			expected{
   105  				DefaultDeployContractFnSignature,
   106  				1,
   107  			},
   108  		},
   109  	}
   110  	for _, tc := range testCases {
   111  		msg := tc.fn()
   112  		r, i := msg.GetTxFnSignatureInfo()
   113  		require.Equal(t, tc.expected.i, i)
   114  		require.Equal(t, tc.expected.sig, r)
   115  	}
   116  }
   117  
   118  func TestMsgEthereumTxValidation(t *testing.T) {
   119  	testCases := []struct {
   120  		msg        string
   121  		amount     *big.Int
   122  		gasPrice   *big.Int
   123  		expectPass bool
   124  	}{
   125  		{msg: "pass", amount: big.NewInt(100), gasPrice: big.NewInt(100000), expectPass: true},
   126  		{msg: "pass amount is zero", amount: big.NewInt(0), gasPrice: big.NewInt(100000), expectPass: true},
   127  		{msg: "invalid amount", amount: big.NewInt(-1), gasPrice: big.NewInt(100000), expectPass: false},
   128  		{msg: "invalid gas price", amount: big.NewInt(100), gasPrice: big.NewInt(-1), expectPass: false},
   129  		{msg: "invalid gas price", amount: big.NewInt(100), gasPrice: big.NewInt(0), expectPass: false},
   130  	}
   131  
   132  	for i, tc := range testCases {
   133  		msg := NewMsgEthereumTx(0, nil, tc.amount, 0, tc.gasPrice, nil)
   134  
   135  		if tc.expectPass {
   136  			require.Nil(t, msg.ValidateBasic(), "valid test %d failed: %s", i, tc.msg)
   137  		} else {
   138  			require.NotNil(t, msg.ValidateBasic(), "invalid test %d passed: %s", i, tc.msg)
   139  		}
   140  	}
   141  }
   142  
   143  func TestMsgEthereumTxRLPSignBytes(t *testing.T) {
   144  	addr := ethcmn.BytesToAddress([]byte("test_address"))
   145  	chainID := big.NewInt(3)
   146  
   147  	msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test"))
   148  	hash := msg.RLPSignBytes(chainID)
   149  	require.Equal(t, "5BD30E35AD27449390B14C91E6BCFDCAADF8FE44EF33680E3BC200FC0DC083C7", fmt.Sprintf("%X", hash))
   150  }
   151  
   152  func TestMsgEthereumTxRLPEncode(t *testing.T) {
   153  	addr := ethcmn.BytesToAddress([]byte("test_address"))
   154  	msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test"))
   155  
   156  	raw, err := rlp.EncodeToBytes(&msg)
   157  	require.NoError(t, err)
   158  	require.Equal(t, ethcmn.FromHex("E48080830186A0940000000000000000746573745F61646472657373808474657374808080"), raw)
   159  }
   160  
   161  func TestMsgEthereumTxRLPDecode(t *testing.T) {
   162  	var msg MsgEthereumTx
   163  
   164  	raw := ethcmn.FromHex("E48080830186A0940000000000000000746573745F61646472657373808474657374808080")
   165  	addr := ethcmn.BytesToAddress([]byte("test_address"))
   166  	expectedMsg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test"))
   167  
   168  	err := rlp.Decode(bytes.NewReader(raw), &msg)
   169  	require.NoError(t, err)
   170  	require.Equal(t, expectedMsg.Data, msg.Data)
   171  
   172  	// value size exceeds available input length of stream
   173  	mockStream := rlp.NewStream(bytes.NewReader(raw), 1)
   174  	require.Error(t, msg.DecodeRLP(mockStream))
   175  }
   176  
   177  func TestMsgEthereumTxHomestead(t *testing.T) {
   178  	zeroChainID := big.NewInt(0)
   179  
   180  	priv1, _ := ethsecp256k1.GenerateKey()
   181  	addr1 := ethcmn.BytesToAddress(priv1.PubKey().Address().Bytes())
   182  
   183  	// require valid signature passes validation
   184  	msg := NewMsgEthereumTx(0, &addr1, nil, 100000, nil, []byte("test"))
   185  
   186  	// zero chainID
   187  	err := msg.Sign(zeroChainID, priv1.ToECDSA())
   188  	require.Nil(t, err)
   189  	err = msg.VerifySig(zeroChainID, 0)
   190  	require.Nil(t, err)
   191  }
   192  
   193  func TestMsgEthereumTxSig(t *testing.T) {
   194  	chainID, zeroChainID := big.NewInt(3), big.NewInt(0)
   195  
   196  	priv1, _ := ethsecp256k1.GenerateKey()
   197  	priv2, _ := ethsecp256k1.GenerateKey()
   198  	addr1 := ethcmn.BytesToAddress(priv1.PubKey().Address().Bytes())
   199  	trimed := strings.TrimPrefix(addr1.Hex(), "0x")
   200  
   201  	fmt.Printf("%s\n", trimed)
   202  	addrSDKAddr1, err := sdk.AccAddressFromHex(trimed)
   203  	require.NoError(t, err)
   204  	addr2 := ethcmn.BytesToAddress(priv2.PubKey().Address().Bytes())
   205  
   206  	// require valid signature passes validation
   207  	msg := NewMsgEthereumTx(0, &addr1, nil, 100000, nil, []byte("test"))
   208  	err = msg.Sign(chainID, priv1.ToECDSA())
   209  	require.Nil(t, err)
   210  
   211  	err = msg.VerifySig(chainID, 0)
   212  	require.NoError(t, err)
   213  	require.Equal(t, addr1, msg.EthereumAddress())
   214  	require.NotEqual(t, addr2, msg.EthereumAddress())
   215  
   216  	signers := msg.GetSigners()
   217  	require.Equal(t, 1, len(signers))
   218  	require.True(t, addrSDKAddr1.Equals(signers[0]))
   219  
   220  	// zero chainID
   221  	err = msg.Sign(zeroChainID, priv1.ToECDSA())
   222  	require.Nil(t, err)
   223  	err = msg.VerifySig(zeroChainID, 0)
   224  	require.Nil(t, err)
   225  
   226  	// require invalid chain ID fail validation
   227  	msg = NewMsgEthereumTx(0, &addr1, nil, 100000, nil, []byte("test"))
   228  	err = msg.Sign(chainID, priv1.ToECDSA())
   229  	require.Nil(t, err)
   230  }
   231  
   232  func TestMsgEthereumTx_ChainID(t *testing.T) {
   233  	chainID := big.NewInt(3)
   234  	priv, _ := ethsecp256k1.GenerateKey()
   235  	addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes())
   236  	msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test"))
   237  	err := msg.Sign(chainID, priv.ToECDSA())
   238  	require.Nil(t, err)
   239  
   240  	require.True(t, chainID.Cmp(msg.ChainID()) == 0)
   241  
   242  	msg.Data.V = big.NewInt(27)
   243  	require.NotNil(t, msg.ChainID())
   244  
   245  	msg.Data.V = math.MaxBig256
   246  	expectedChainID := new(big.Int).Div(new(big.Int).Sub(math.MaxBig256, big.NewInt(35)), big.NewInt(2))
   247  	require.True(t, expectedChainID.Cmp(msg.ChainID()) == 0)
   248  }
   249  
   250  func TestGetTxFnSignatureInfo(t *testing.T) {
   251  	chainID := big.NewInt(3)
   252  	priv, _ := ethsecp256k1.GenerateKey()
   253  	addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes())
   254  	msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test"))
   255  	err := msg.Sign(chainID, priv.ToECDSA())
   256  	require.Nil(t, err)
   257  }
   258  
   259  func TestMsgEthereumTxGetter(t *testing.T) {
   260  	priv, _ := ethsecp256k1.GenerateKey()
   261  	addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes())
   262  	amount, gasPrice, gasLimit := int64(1024), int64(2048), uint64(100000)
   263  	expectedFee := gasPrice * int64(gasLimit)
   264  	expectCost := expectedFee + amount
   265  	msg := NewMsgEthereumTx(0, &addr, big.NewInt(amount), gasLimit, big.NewInt(gasPrice), []byte("test"))
   266  
   267  	require.Equal(t, gasLimit, msg.GetGas())
   268  	require.True(t, big.NewInt(expectedFee).Cmp(msg.Fee()) == 0)
   269  	require.True(t, big.NewInt(expectCost).Cmp(msg.Cost()) == 0)
   270  
   271  	expectedV, expectedR, expectedS := big.NewInt(1), big.NewInt(2), big.NewInt(3)
   272  	msg.Data.V, msg.Data.R, msg.Data.S = expectedV, expectedR, expectedS
   273  	v, r, s := msg.RawSignatureValues()
   274  	require.True(t, expectedV.Cmp(v) == 0)
   275  	require.True(t, expectedR.Cmp(r) == 0)
   276  	require.True(t, expectedS.Cmp(s) == 0)
   277  }
   278  
   279  func TestMsgEthereumTx_Amino(t *testing.T) {
   280  	priv, _ := ethsecp256k1.GenerateKey()
   281  	addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes())
   282  	amount, gasPrice, gasLimit := int64(1024), int64(2048), uint64(100000)
   283  	msg := NewMsgEthereumTx(0, &addr, big.NewInt(amount), gasLimit, big.NewInt(gasPrice), []byte("test"))
   284  	err := msg.Sign(big.NewInt(3), priv.ToECDSA())
   285  	require.NoError(t, err)
   286  	hash := ethcmn.BigToHash(big.NewInt(2))
   287  
   288  	testCases := []*MsgEthereumTx{
   289  		msg,
   290  		{
   291  			Data: TxData{
   292  				AccountNonce: 2,
   293  				Price:        big.NewInt(3),
   294  				GasLimit:     1,
   295  				Recipient:    &addr,
   296  				Amount:       big.NewInt(4),
   297  				Payload:      []byte("test"),
   298  				V:            big.NewInt(5),
   299  				R:            big.NewInt(6),
   300  				S:            big.NewInt(7),
   301  				Hash:         &hash,
   302  			},
   303  		},
   304  		{
   305  			Data: TxData{
   306  				Price:     big.NewInt(math.MinInt64),
   307  				Recipient: &ethcmn.Address{},
   308  				Amount:    big.NewInt(math.MinInt64),
   309  				Payload:   []byte{},
   310  				V:         big.NewInt(math.MinInt64),
   311  				R:         big.NewInt(math.MinInt64),
   312  				S:         big.NewInt(math.MinInt64),
   313  				Hash:      &ethcmn.Hash{},
   314  			},
   315  		},
   316  		{
   317  			Data: TxData{
   318  				AccountNonce: math.MaxUint64,
   319  				Price:        big.NewInt(math.MaxInt64),
   320  				GasLimit:     math.MaxUint64,
   321  				Amount:       big.NewInt(math.MaxInt64),
   322  				V:            big.NewInt(math.MaxInt64),
   323  				R:            big.NewInt(math.MaxInt64),
   324  				S:            big.NewInt(math.MaxInt64),
   325  			},
   326  		},
   327  	}
   328  
   329  	for _, msg := range testCases {
   330  		raw, err := ModuleCdc.MarshalBinaryBare(msg)
   331  		require.NoError(t, err)
   332  
   333  		var msg2 MsgEthereumTx
   334  		err = ModuleCdc.UnmarshalBinaryBare(raw, &msg2)
   335  		require.NoError(t, err)
   336  
   337  		var msg3 MsgEthereumTx
   338  		v, err := ModuleCdc.UnmarshalBinaryBareWithRegisteredUnmarshaller(raw, &msg3)
   339  		require.NoError(t, err)
   340  		msg3 = *v.(*MsgEthereumTx)
   341  		require.EqualValues(t, msg2, msg3)
   342  	}
   343  }
   344  
   345  func BenchmarkMsgEthereumTxUnmarshal(b *testing.B) {
   346  	cdc := ModuleCdc
   347  	priv, _ := ethsecp256k1.GenerateKey()
   348  	addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes())
   349  	amount, gasPrice, gasLimit := int64(1024), int64(2048), uint64(100000)
   350  	msg := NewMsgEthereumTx(123456, &addr, big.NewInt(amount), gasLimit, big.NewInt(gasPrice), []byte("test"))
   351  	_ = msg.Sign(big.NewInt(66), priv.ToECDSA())
   352  
   353  	raw, _ := cdc.MarshalBinaryBare(msg)
   354  	rlpRaw, err := rlp.EncodeToBytes(&msg)
   355  	require.NoError(b, err)
   356  	b.ResetTimer()
   357  
   358  	b.Run("amino", func(b *testing.B) {
   359  		b.ReportAllocs()
   360  		for i := 0; i < b.N; i++ {
   361  			var msg2 MsgEthereumTx
   362  			err := cdc.UnmarshalBinaryBare(raw, &msg2)
   363  			if err != nil {
   364  				b.Fatal(err)
   365  			}
   366  		}
   367  	})
   368  
   369  	b.Run("unmarshaler", func(b *testing.B) {
   370  		b.ReportAllocs()
   371  		for i := 0; i < b.N; i++ {
   372  			var msg3 MsgEthereumTx
   373  			v, err := cdc.UnmarshalBinaryBareWithRegisteredUnmarshaller(raw, &msg3)
   374  			if err != nil {
   375  				b.Fatal(err)
   376  			}
   377  			msg3 = v.(MsgEthereumTx)
   378  		}
   379  	})
   380  
   381  	b.Run("rlp", func(b *testing.B) {
   382  		b.ReportAllocs()
   383  		for i := 0; i < b.N; i++ {
   384  			var msg MsgEthereumTx
   385  			err = rlp.DecodeBytes(rlpRaw, &msg)
   386  			if err != nil {
   387  				b.Fatal(err)
   388  			}
   389  		}
   390  	})
   391  }
   392  
   393  func TestMarshalAndUnmarshalLogs(t *testing.T) {
   394  	var cdc = codec.New()
   395  
   396  	logs := []*ethtypes.Log{
   397  		{
   398  			Address: ethcmn.BytesToAddress([]byte{0x11}),
   399  			TxHash:  ethcmn.HexToHash("0x01"),
   400  			// May need to find workaround since Topics is required to unmarshal from JSON
   401  			Topics:  []ethcmn.Hash{},
   402  			Removed: true,
   403  		},
   404  		{Address: ethcmn.BytesToAddress([]byte{0x01, 0x11}), Topics: []ethcmn.Hash{}},
   405  	}
   406  
   407  	raw, err := codec.MarshalJSONIndent(cdc, logs)
   408  	require.NoError(t, err)
   409  
   410  	var logs2 []*ethtypes.Log
   411  	err = cdc.UnmarshalJSON(raw, &logs2)
   412  	require.NoError(t, err)
   413  
   414  	require.Len(t, logs2, 2)
   415  	require.Equal(t, logs[0].Address, logs2[0].Address)
   416  	require.Equal(t, logs[0].TxHash, logs2[0].TxHash)
   417  	require.True(t, logs[0].Removed)
   418  
   419  	emptyLogs := []*ethtypes.Log{}
   420  
   421  	raw, err = codec.MarshalJSONIndent(cdc, emptyLogs)
   422  	require.NoError(t, err)
   423  
   424  	err = cdc.UnmarshalJSON(raw, &logs2)
   425  	require.NoError(t, err)
   426  }
   427  
   428  func TestMsgString(t *testing.T) {
   429  	expectedUint64, expectedSDKAddr := uint64(1024), newSdkAddress()
   430  	expectedPayload, err := hexutil.Decode("0x1234567890abcdef")
   431  	require.NoError(t, err)
   432  	expectedOutput := fmt.Sprintf("nonce=1024 gasPrice=1 gasLimit=1024 recipient=%s amount=1 data=0x1234567890abcdef from=%s",
   433  		expectedSDKAddr, expectedSDKAddr)
   434  
   435  	expectedHexAddr := ethcmn.BytesToAddress([]byte{0x01})
   436  	expectedBigInt := big.NewInt(1024)
   437  	expectedOutput = fmt.Sprintf("nonce=1024 price=1024 gasLimit=1024 recipient=%s amount=1024 data=0x1234567890abcdef v=0 r=0 s=0", expectedHexAddr.Hex())
   438  	msgEthereumTx := NewMsgEthereumTx(expectedUint64, &expectedHexAddr, expectedBigInt, expectedUint64, expectedBigInt, expectedPayload)
   439  	require.True(t, strings.EqualFold(msgEthereumTx.String(), expectedOutput))
   440  }
   441  
   442  func newProxyDecoder() *codec.CodecProxy {
   443  	ModuleBasics := module.NewBasicManager(
   444  		ibc.AppModuleBasic{},
   445  		ibctransfer.AppModuleBasic{},
   446  		ibcfee.AppModuleBasic{},
   447  	)
   448  	cdc := fbexchaincodec.MakeCodec(ModuleBasics)
   449  	interfaceReg := fbexchaincodec.MakeIBC(ModuleBasics)
   450  	protoCodec := codec.NewProtoCodec(interfaceReg)
   451  	codecProxy := codec.NewCodecProxy(protoCodec, cdc)
   452  	return codecProxy
   453  }
   454  
   455  // TODO error fix
   456  func TestMsgIBCTxValidate(t *testing.T) {
   457  	tmtypes.UnittestOnlySetMilestoneVenus1Height(1)
   458  
   459  	IBCRouterKey := "ibc"
   460  	cpcdc := newProxyDecoder()
   461  	marshaler := cpcdc.GetProtocMarshal()
   462  	decode := ibctxdecode.IbcTxDecoder(marshaler)
   463  	var err error
   464  	//ex1 encode txBytes1
   465  	txBytes1, err := hex.DecodeString("0a8d030a8a030a232f6962632e636f72652e636c69656e742e76312e4d7367437265617465436c69656e7412e2020aab010a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e745374617465127c0a056962632d311204080110031a040880ac4d22040880df6e2a0308d80432003a05080110940342190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a1075706772616465644942435374617465500158011286010a2e2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436f6e73656e737573537461746512540a0c0892cbde930610a0ff9fe20212220a208acb6977f3cac564f6b015ff1de209e6c167e3454e6a754780e601efe340a5dd1a20cade35b27c5c32afead6cbed10d219c3903b8789b3fee9bf52b893efd6e2b8501a296578316a35657535716775376472686c737277346867326a766a3930707a766132373272347479763812720a4e0a460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a210361469c236406f73459385bfe6d265ad8f293166b4661228d7bf6dd2f305236d912040a02080112200a1a0a0377656912133230343034393530303030303030303030303010e1a6081a40c951cde5885ab43d5e6c1ed88ef8adfd28311bfcba5461baa5bf4c9ad849e50837184dfde85ccb793f9859283553d3ef78113e5960aa353e885a9deb983e802a")
   466  	txBytes2, err := hex.DecodeString("0af8080aeb070a232f6962632e636f72652e636c69656e742e76312e4d7367557064617465436c69656e7412c3070a0f30372d74656e6465726d696e742d301284070a262f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e48656164657212d9060ac9040a8c030a02080b12056962632d3118b907220c08d3dcde930610908ce5b3022a480a206241f13d50332dca5df961e0d1b0ab4c9dd36a8f05af2951ee23a0e1b1ff8913122408011220c2ed8f17294c68e683f31c0deaa1b34fe3966244a7ed52db9a716b9f9c200f703220d3f78b59cbb111d27452a4c0c71c614a6fada163ef175f8954f59007bc5d56df3a20f2473fff8995411fcde70619e3fa3a2e0a865e82edaae3c3ec072c8efaf10c014220c2c257672210f3023ae63cc03ac71b4517479b84ebee227719f06edd7b5aa60a4a20c2c257672210f3023ae63cc03ac71b4517479b84ebee227719f06edd7b5aa60a5220048091bc7ddc283f77bfbf91d73c44da58c3df8a9cbc867405d8b7f3daada22f5a208f988bd1fd57bc996fcba5b40814ee75d4dcc883d2f8eaa873b814ccdaa8acb66220e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8556a20e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85572143ff4a1ab7900d093bddea8d832c34f654207201a12b70108b9071a480a2025909a026179293b314c647573c4ee85b1a820b526e188cc42196e70b7d5622a122408011220ab82b5731b0b954a0fb947b897f522d51557c015632e040682edc607377111672268080212143ff4a1ab7900d093bddea8d832c34f654207201a1a0c08d4dcde93061090d0b8f2022240374206b5b047546cb08abd6994ddf6ec67a736940b286ea11627f20eb4b7668e8bc0ff55f6ab7a29e8fe23a98c672d23cfd926d363204408be729845f72fd1001280010a3e0a143ff4a1ab7900d093bddea8d832c34f654207201a12220a204d72a5c949a4140d889f39074a3302a07801134bb3a2f751ad7200cbb6da5a2e18a08d06123e0a143ff4a1ab7900d093bddea8d832c34f654207201a12220a204d72a5c949a4140d889f39074a3302a07801134bb3a2f751ad7200cbb6da5a2e18a08d061a05080110a4072280010a3e0a143ff4a1ab7900d093bddea8d832c34f654207201a12220a204d72a5c949a4140d889f39074a3302a07801134bb3a2f751ad7200cbb6da5a2e18a08d06123e0a143ff4a1ab7900d093bddea8d832c34f654207201a12220a204d72a5c949a4140d889f39074a3302a07801134bb3a2f751ad7200cbb6da5a2e18a08d061a29657831737061787a64376b37797a716467766b6e7568743671333870673530757530387666716135710a87010a2d2f6962632e636f72652e636f6e6e656374696f6e2e76312e4d7367436f6e6e656374696f6e4f70656e496e697412560a0f30372d74656e6465726d696e742d3012180a0f30372d74656e6465726d696e742d301a050a036962632a29657831737061787a64376b37797a716467766b6e75687436713338706735307575303876667161357112760a500a460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a210311219a285ff5fd852d664a06279ce4cb60eb266be2cc2e24c33525895baade6612040a020801180112220a1c0a03776569121531363632323130303030303030303030303030303010cd920a1a403c793cbaa9d512f7e154511e1656a1cac1fff878d10b9b0a1d49596168bdad04786b9beb78fa1f58c33d580f1a09a345629211116dab2eda98276eb6edf05feb")
   467  	txBytesArray := [][]byte{
   468  		txBytes1, txBytes2,
   469  	}
   470  	expectedMsgType := []string{
   471  		"/ibc.core.client.v1.MsgCreateClient",
   472  		"/ibc.core.client.v1.MsgUpdateClient",
   473  	}
   474  	for i, txbytes := range txBytesArray {
   475  		require.NoError(t, err)
   476  		ibctx, err := decode(txbytes)
   477  		require.NoError(t, err)
   478  		require.NotNil(t, ibctx)
   479  		require.Equal(t, ibctx.StdTx.Msgs[0].Route(), IBCRouterKey)
   480  		require.Equal(t, ibctx.StdTx.Msgs[0].Type(), expectedMsgType[i])
   481  		//tx validator
   482  		require.NoError(t, ibctx.StdTx.Msgs[0].ValidateBasic())
   483  	}
   484  }
   485  
   486  func TestMsgIbcTxMarshalSignBytes(t *testing.T) {
   487  	chainID := "fbc-101"
   488  	accnum := 1
   489  	sequence := 0
   490  	memo := "memo"
   491  	authInfoBytes := []byte("authinfobytes")
   492  	bodyBytes := []byte("bodyBytes")
   493  
   494  	fee := authtypes.StdFee{
   495  		Amount: []sdk.DecCoin{
   496  			sdk.DecCoin{
   497  				Denom:  "test",
   498  				Amount: sdk.NewDecFromBigInt(big.NewInt(10)),
   499  			},
   500  		},
   501  		Gas: 100000,
   502  	}
   503  
   504  	signBytes := authtypes.IbcDirectSignBytes(
   505  		chainID,
   506  		uint64(accnum),
   507  		uint64(sequence),
   508  		fee,
   509  		nil,
   510  		memo,
   511  		authInfoBytes,
   512  		bodyBytes,
   513  	)
   514  
   515  	expectedHexResult := "0A09626F64794279746573120D61757468696E666F62797465731A076662632D3130312001"
   516  
   517  	require.Equal(t, expectedHexResult, fmt.Sprintf("%X", signBytes))
   518  
   519  }
   520  
   521  func BenchmarkEvmTxVerifySig(b *testing.B) {
   522  	chainID := big.NewInt(3)
   523  	priv1, _ := ethsecp256k1.GenerateKey()
   524  	addr1 := ethcmn.BytesToAddress(priv1.PubKey().Address().Bytes())
   525  
   526  	// require valid signature passes validation
   527  	msg := NewMsgEthereumTx(0, &addr1, nil, 100000, nil, []byte("test"))
   528  	_ = msg.Sign(chainID, priv1.ToECDSA())
   529  
   530  	b.ResetTimer()
   531  
   532  	b.Run("firstVerifySig", func(b *testing.B) {
   533  		b.ReportAllocs()
   534  		for i := 0; i < b.N; i++ {
   535  			_, err := msg.firstVerifySig(chainID)
   536  			if err != nil {
   537  				b.Fatal(err)
   538  			}
   539  		}
   540  	})
   541  }
   542  
   543  func TestRlpPointerEncode(t *testing.T) {
   544  	bz := make([]byte, 512)
   545  	rand.Read(bz)
   546  
   547  	h1 := rlpHash([]interface{}{bz})
   548  	h2 := rlpHash([]interface{}{&bz})
   549  
   550  	require.Equal(t, h1, h2)
   551  }