81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package tx
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client"
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/x/auth/signing"
|
|
"github.com/cosmos/cosmos-sdk/x/auth/types"
|
|
)
|
|
|
|
// ConvertTxToStdTx converts a transaction to the legacy StdTx format
|
|
func ConvertTxToStdTx(codec *codec.LegacyAmino, tx signing.Tx) (types.StdTx, error) {
|
|
|
|
if stdTx, ok := tx.(types.StdTx); ok {
|
|
return stdTx, nil
|
|
}
|
|
|
|
aminoTxConfig := types.StdTxConfig{Cdc: codec}
|
|
builder := aminoTxConfig.NewTxBuilder()
|
|
|
|
err := CopyTx(tx, builder)
|
|
if err != nil {
|
|
|
|
return types.StdTx{}, err
|
|
}
|
|
|
|
stdTx, ok := builder.GetTx().(types.StdTx)
|
|
if !ok {
|
|
return types.StdTx{}, fmt.Errorf("expected %T, got %+v", types.StdTx{}, builder.GetTx())
|
|
}
|
|
|
|
return stdTx, nil
|
|
}
|
|
|
|
// CopyTx copies a Tx to a new TxBuilder, allowing conversion between
|
|
// different transaction formats.
|
|
func CopyTx(tx signing.Tx, builder client.TxBuilder) error {
|
|
err := builder.SetMsgs(tx.GetMsgs()...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
sigs, err := tx.GetSignaturesV2()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = builder.SetSignatures(sigs...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
builder.SetMemo(tx.GetMemo())
|
|
builder.SetFeeAmount(tx.GetFee())
|
|
builder.SetGasLimit(tx.GetGas())
|
|
|
|
return nil
|
|
}
|
|
|
|
func ConvertAndEncodeStdTx(txConfig client.TxConfig, stdTx types.StdTx) ([]byte, error) {
|
|
builder := txConfig.NewTxBuilder()
|
|
|
|
var theTx sdk.Tx
|
|
|
|
// check if we need a StdTx anyway, in that case don't copy
|
|
if _, ok := builder.GetTx().(types.StdTx); ok {
|
|
theTx = stdTx
|
|
} else {
|
|
err := CopyTx(stdTx, builder)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
theTx = builder.GetTx()
|
|
}
|
|
|
|
return txConfig.TxEncoder()(theTx)
|
|
}
|