diff --git a/client/testutil/suite.go b/client/testutil/suite.go index 5aa8a5e3e..542a40dc6 100644 --- a/client/testutil/suite.go +++ b/client/testutil/suite.go @@ -6,12 +6,11 @@ import ( "github.com/stretchr/testify/suite" "github.com/tendermint/tendermint/crypto" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil/testdata" "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/cosmos/cosmos-sdk/client" - signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -286,3 +285,22 @@ func (s *TxConfigTestSuite) TestTxEncodeDecode() { s.Require().Equal([][]byte{dummySig}, tx3.GetSignatures()) s.Require().Equal([]crypto.PubKey{pubkey}, tx3.GetPubKeys()) } + +func (s *TxConfigTestSuite) TestWrapTxBuilder() { + _, _, addr := testdata.KeyTestPubAddr() + feeAmount := sdk.Coins{sdk.NewInt64Coin("atom", 150)} + gasLimit := uint64(50000) + memo := "foomemo" + msg := testdata.NewTestMsg(addr) + + txBuilder := s.TxConfig.NewTxBuilder() + txBuilder.SetFeeAmount(feeAmount) + txBuilder.SetGasLimit(gasLimit) + txBuilder.SetMemo(memo) + err := txBuilder.SetMsgs(msg) + s.Require().NoError(err) + + newTxBldr, err := s.TxConfig.WrapTxBuilder(txBuilder.GetTx()) + s.Require().NoError(err) + s.Require().Equal(txBuilder, newTxBldr) +} diff --git a/client/tx_generator.go b/client/tx_generator.go index c5aecb1f4..76a5eb98a 100644 --- a/client/tx_generator.go +++ b/client/tx_generator.go @@ -12,6 +12,7 @@ type ( // implement TxBuilder. TxConfig interface { NewTxBuilder() TxBuilder + WrapTxBuilder(sdk.Tx) (TxBuilder, error) SignModeHandler() signing.SignModeHandler TxEncoder() sdk.TxEncoder diff --git a/x/auth/tx/generator.go b/x/auth/tx/generator.go index 3d6bb529e..c61d4377e 100644 --- a/x/auth/tx/generator.go +++ b/x/auth/tx/generator.go @@ -1,6 +1,8 @@ package tx import ( + "fmt" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/types" @@ -35,6 +37,16 @@ func (g generator) NewTxBuilder() client.TxBuilder { return newBuilder(g.marshaler, g.pubkeyCodec) } +// WrapTxBuilder returns a builder from provided transaction +func (g generator) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { + newBuilder, ok := newTx.(*builder) + if !ok { + return nil, fmt.Errorf("expected %T, got %T", &builder{}, newTx) + } + + return newBuilder, nil +} + func (g generator) SignModeHandler() signing.SignModeHandler { return g.handler } diff --git a/x/auth/types/client_tx.go b/x/auth/types/client_tx.go index 5df499aa0..b0f8fc613 100644 --- a/x/auth/types/client_tx.go +++ b/x/auth/types/client_tx.go @@ -1,6 +1,8 @@ package types import ( + "fmt" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/legacy" @@ -92,6 +94,15 @@ func (s StdTxConfig) NewTxBuilder() client.TxBuilder { } } +// WrapTxBuilder returns a StdTxBuilder from provided transaction +func (s StdTxConfig) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { + stdTx, ok := newTx.(StdTx) + if !ok { + return nil, fmt.Errorf("expected %T, got %T", StdTx{}, newTx) + } + return &StdTxBuilder{StdTx: stdTx, cdc: s.Cdc}, nil +} + // MarshalTx implements TxConfig.MarshalTx func (s StdTxConfig) TxEncoder() sdk.TxEncoder { return DefaultTxEncoder(s.Cdc)