2020-07-30 07:45:18 -07:00
package tx_test
import (
"testing"
"github.com/stretchr/testify/require"
2020-09-10 11:26:47 -07:00
"github.com/stretchr/testify/suite"
2020-07-30 07:45:18 -07:00
2020-09-10 11:26:47 -07:00
"github.com/cosmos/cosmos-sdk/client"
2020-07-30 07:45:18 -07:00
tx2 "github.com/cosmos/cosmos-sdk/client/tx"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/simapp"
2020-09-10 11:26:47 -07:00
"github.com/cosmos/cosmos-sdk/simapp/params"
2020-07-30 07:45:18 -07:00
"github.com/cosmos/cosmos-sdk/testutil/testdata"
"github.com/cosmos/cosmos-sdk/types"
2021-02-18 10:00:19 -08:00
sdk "github.com/cosmos/cosmos-sdk/types"
2020-09-10 11:26:47 -07:00
signing2 "github.com/cosmos/cosmos-sdk/types/tx/signing"
2020-09-22 07:35:18 -07:00
"github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx"
2020-09-10 11:26:47 -07:00
"github.com/cosmos/cosmos-sdk/x/auth/signing"
"github.com/cosmos/cosmos-sdk/x/auth/tx"
2020-09-22 07:35:18 -07:00
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
2020-07-30 07:45:18 -07:00
)
const (
2020-11-24 09:09:30 -08:00
memo = "waboom"
gas = uint64 ( 10000 )
2021-02-18 10:00:19 -08:00
timeoutHeight = uint64 ( 5 )
2020-07-30 07:45:18 -07:00
)
var (
fee = types . NewCoins ( types . NewInt64Coin ( "bam" , 100 ) )
_ , pub1 , addr1 = testdata . KeyTestPubAddr ( )
_ , _ , addr2 = testdata . KeyTestPubAddr ( )
sig = signing2 . SignatureV2 {
PubKey : pub1 ,
Data : & signing2 . SingleSignatureData {
SignMode : signing2 . SignMode_SIGN_MODE_LEGACY_AMINO_JSON ,
Signature : [ ] byte ( "dummy" ) ,
} ,
}
2021-02-18 10:00:19 -08:00
msg0 = banktypes . NewMsgSend ( addr1 , addr2 , types . NewCoins ( types . NewInt64Coin ( "wack" , 1 ) ) )
msg1 = sdk . ServiceMsg {
MethodName : "/cosmos.bank.v1beta1.Msg/Send" ,
Request : banktypes . NewMsgSend ( addr1 , addr2 , types . NewCoins ( types . NewInt64Coin ( "wack" , 2 ) ) ) ,
}
2020-07-30 07:45:18 -07:00
)
func buildTestTx ( t * testing . T , builder client . TxBuilder ) {
builder . SetMemo ( memo )
builder . SetGasLimit ( gas )
builder . SetFeeAmount ( fee )
2021-02-18 10:00:19 -08:00
err := builder . SetMsgs ( msg0 , msg1 )
2020-07-30 07:45:18 -07:00
require . NoError ( t , err )
err = builder . SetSignatures ( sig )
require . NoError ( t , err )
2020-11-24 09:09:30 -08:00
builder . SetTimeoutHeight ( timeoutHeight )
2020-07-30 07:45:18 -07:00
}
type TestSuite struct {
suite . Suite
encCfg params . EncodingConfig
protoCfg client . TxConfig
aminoCfg client . TxConfig
}
func ( s * TestSuite ) SetupSuite ( ) {
2020-10-27 04:33:48 -07:00
encCfg := simapp . MakeTestEncodingConfig ( )
2020-07-30 07:45:18 -07:00
s . encCfg = encCfg
2020-09-21 09:48:28 -07:00
s . protoCfg = tx . NewTxConfig ( codec . NewProtoCodec ( encCfg . InterfaceRegistry ) , tx . DefaultSignModes )
2020-09-22 07:35:18 -07:00
s . aminoCfg = legacytx . StdTxConfig { Cdc : encCfg . Amino }
2020-07-30 07:45:18 -07:00
}
func ( s * TestSuite ) TestCopyTx ( ) {
// proto -> amino -> proto
protoBuilder := s . protoCfg . NewTxBuilder ( )
buildTestTx ( s . T ( ) , protoBuilder )
aminoBuilder := s . aminoCfg . NewTxBuilder ( )
2020-10-23 12:20:02 -07:00
err := tx2 . CopyTx ( protoBuilder . GetTx ( ) , aminoBuilder , false )
2020-07-30 07:45:18 -07:00
s . Require ( ) . NoError ( err )
protoBuilder2 := s . protoCfg . NewTxBuilder ( )
2020-10-23 12:20:02 -07:00
err = tx2 . CopyTx ( aminoBuilder . GetTx ( ) , protoBuilder2 , false )
2020-07-30 07:45:18 -07:00
s . Require ( ) . NoError ( err )
2021-02-18 10:00:19 -08:00
// Check sigs, signers and msgs.
sigsV2_1 , err := protoBuilder . GetTx ( ) . GetSignaturesV2 ( )
2020-07-30 07:45:18 -07:00
s . Require ( ) . NoError ( err )
2021-02-18 10:00:19 -08:00
sigsV2_2 , err := protoBuilder2 . GetTx ( ) . GetSignaturesV2 ( )
2020-07-30 07:45:18 -07:00
s . Require ( ) . NoError ( err )
2021-02-18 10:00:19 -08:00
s . Require ( ) . Equal ( sigsV2_1 , sigsV2_2 )
s . Require ( ) . Equal ( protoBuilder . GetTx ( ) . GetSigners ( ) , protoBuilder2 . GetTx ( ) . GetSigners ( ) )
s . Require ( ) . Equal ( protoBuilder . GetTx ( ) . GetMsgs ( ) [ 0 ] , protoBuilder2 . GetTx ( ) . GetMsgs ( ) [ 0 ] )
s . Require ( ) . Equal ( protoBuilder . GetTx ( ) . GetMsgs ( ) [ 1 ] . ( sdk . ServiceMsg ) . Request , protoBuilder2 . GetTx ( ) . GetMsgs ( ) [ 1 ] ) // We lose the "ServiceMsg" information
2020-07-30 07:45:18 -07:00
// amino -> proto -> amino
aminoBuilder = s . aminoCfg . NewTxBuilder ( )
buildTestTx ( s . T ( ) , aminoBuilder )
protoBuilder = s . protoCfg . NewTxBuilder ( )
2020-10-23 12:20:02 -07:00
err = tx2 . CopyTx ( aminoBuilder . GetTx ( ) , protoBuilder , false )
2020-07-30 07:45:18 -07:00
s . Require ( ) . NoError ( err )
aminoBuilder2 := s . aminoCfg . NewTxBuilder ( )
2020-10-23 12:20:02 -07:00
err = tx2 . CopyTx ( protoBuilder . GetTx ( ) , aminoBuilder2 , false )
2020-07-30 07:45:18 -07:00
s . Require ( ) . NoError ( err )
2021-02-18 10:00:19 -08:00
// Check sigs, signers, and msgs
sigsV2_1 , err = aminoBuilder . GetTx ( ) . GetSignaturesV2 ( )
2020-07-30 07:45:18 -07:00
s . Require ( ) . NoError ( err )
2021-02-18 10:00:19 -08:00
sigsV2_2 , err = aminoBuilder2 . GetTx ( ) . GetSignaturesV2 ( )
2020-07-30 07:45:18 -07:00
s . Require ( ) . NoError ( err )
2021-02-18 10:00:19 -08:00
s . Require ( ) . Equal ( sigsV2_1 , sigsV2_2 )
s . Require ( ) . Equal ( aminoBuilder . GetTx ( ) . GetSigners ( ) , aminoBuilder2 . GetTx ( ) . GetSigners ( ) )
s . Require ( ) . Equal ( aminoBuilder . GetTx ( ) . GetMsgs ( ) [ 0 ] , aminoBuilder2 . GetTx ( ) . GetMsgs ( ) [ 0 ] )
s . Require ( ) . Equal ( aminoBuilder . GetTx ( ) . GetMsgs ( ) [ 1 ] , aminoBuilder2 . GetTx ( ) . GetMsgs ( ) [ 1 ] ) // We lose the "ServiceMsg" information
2020-07-30 07:45:18 -07:00
}
func ( s * TestSuite ) TestConvertTxToStdTx ( ) {
// proto tx
protoBuilder := s . protoCfg . NewTxBuilder ( )
buildTestTx ( s . T ( ) , protoBuilder )
stdTx , err := tx2 . ConvertTxToStdTx ( s . encCfg . Amino , protoBuilder . GetTx ( ) )
s . Require ( ) . NoError ( err )
s . Require ( ) . Equal ( memo , stdTx . Memo )
s . Require ( ) . Equal ( gas , stdTx . Fee . Gas )
s . Require ( ) . Equal ( fee , stdTx . Fee . Amount )
2021-02-18 10:00:19 -08:00
s . Require ( ) . Equal ( msg0 , stdTx . Msgs [ 0 ] )
s . Require ( ) . Equal ( msg1 . Request , stdTx . Msgs [ 1 ] )
2020-11-24 09:09:30 -08:00
s . Require ( ) . Equal ( timeoutHeight , stdTx . TimeoutHeight )
2020-07-30 07:45:18 -07:00
s . Require ( ) . Equal ( sig . PubKey , stdTx . Signatures [ 0 ] . PubKey )
s . Require ( ) . Equal ( sig . Data . ( * signing2 . SingleSignatureData ) . Signature , stdTx . Signatures [ 0 ] . Signature )
2020-10-23 12:20:02 -07:00
// SIGN_MODE_DIRECT should fall back to an unsigned tx
err = protoBuilder . SetSignatures ( signing2 . SignatureV2 {
PubKey : pub1 ,
Data : & signing2 . SingleSignatureData {
SignMode : signing2 . SignMode_SIGN_MODE_DIRECT ,
Signature : [ ] byte ( "dummy" ) ,
} ,
} )
s . Require ( ) . NoError ( err )
stdTx , err = tx2 . ConvertTxToStdTx ( s . encCfg . Amino , protoBuilder . GetTx ( ) )
s . Require ( ) . NoError ( err )
s . Require ( ) . Equal ( memo , stdTx . Memo )
s . Require ( ) . Equal ( gas , stdTx . Fee . Gas )
s . Require ( ) . Equal ( fee , stdTx . Fee . Amount )
2021-02-18 10:00:19 -08:00
s . Require ( ) . Equal ( msg0 , stdTx . Msgs [ 0 ] )
s . Require ( ) . Equal ( msg1 . Request , stdTx . Msgs [ 1 ] )
2020-11-24 09:09:30 -08:00
s . Require ( ) . Equal ( timeoutHeight , stdTx . TimeoutHeight )
2020-10-23 12:20:02 -07:00
s . Require ( ) . Empty ( stdTx . Signatures )
2020-07-30 07:45:18 -07:00
// std tx
aminoBuilder := s . aminoCfg . NewTxBuilder ( )
buildTestTx ( s . T ( ) , aminoBuilder )
2020-09-22 07:35:18 -07:00
stdTx = aminoBuilder . GetTx ( ) . ( legacytx . StdTx )
2020-07-30 07:45:18 -07:00
stdTx2 , err := tx2 . ConvertTxToStdTx ( s . encCfg . Amino , stdTx )
s . Require ( ) . NoError ( err )
s . Require ( ) . Equal ( stdTx , stdTx2 )
}
func ( s * TestSuite ) TestConvertAndEncodeStdTx ( ) {
// convert amino -> proto -> amino
aminoBuilder := s . aminoCfg . NewTxBuilder ( )
buildTestTx ( s . T ( ) , aminoBuilder )
2020-09-22 07:35:18 -07:00
stdTx := aminoBuilder . GetTx ( ) . ( legacytx . StdTx )
2020-07-30 07:45:18 -07:00
txBz , err := tx2 . ConvertAndEncodeStdTx ( s . protoCfg , stdTx )
s . Require ( ) . NoError ( err )
decodedTx , err := s . protoCfg . TxDecoder ( ) ( txBz )
s . Require ( ) . NoError ( err )
aminoBuilder2 := s . aminoCfg . NewTxBuilder ( )
2020-10-23 12:20:02 -07:00
s . Require ( ) . NoError ( tx2 . CopyTx ( decodedTx . ( signing . Tx ) , aminoBuilder2 , false ) )
2020-07-30 07:45:18 -07:00
s . Require ( ) . Equal ( stdTx , aminoBuilder2 . GetTx ( ) )
// just use amino everywhere
txBz , err = tx2 . ConvertAndEncodeStdTx ( s . aminoCfg , stdTx )
s . Require ( ) . NoError ( err )
decodedTx , err = s . aminoCfg . TxDecoder ( ) ( txBz )
s . Require ( ) . NoError ( err )
s . Require ( ) . Equal ( stdTx , decodedTx )
}
2021-02-18 10:00:19 -08:00
func TestTestSuite ( t * testing . T ) {
suite . Run ( t , new ( TestSuite ) )
}