github.com/Finschia/finschia-sdk@v0.49.1/x/auth/legacy/legacytx/stdtx_builder.go (about)

     1  package legacytx
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/Finschia/finschia-sdk/client"
     7  	"github.com/Finschia/finschia-sdk/codec"
     8  	sdk "github.com/Finschia/finschia-sdk/types"
     9  	sdkerrors "github.com/Finschia/finschia-sdk/types/errors"
    10  	"github.com/Finschia/finschia-sdk/types/tx/signing"
    11  	authsigning "github.com/Finschia/finschia-sdk/x/auth/signing"
    12  )
    13  
    14  // StdTxBuilder wraps StdTx to implement to the context.TxBuilder interface.
    15  // Note that this type just exists for backwards compatibility with amino StdTx
    16  // and will not work for protobuf transactions.
    17  type StdTxBuilder struct {
    18  	StdTx
    19  	cdc *codec.LegacyAmino
    20  }
    21  
    22  // ensure interface implementation
    23  var _ client.TxBuilder = &StdTxBuilder{}
    24  
    25  // GetTx implements TxBuilder.GetTx
    26  func (s *StdTxBuilder) GetTx() authsigning.Tx {
    27  	return s.StdTx
    28  }
    29  
    30  // SetMsgs implements TxBuilder.SetMsgs
    31  func (s *StdTxBuilder) SetMsgs(msgs ...sdk.Msg) error {
    32  	s.Msgs = msgs
    33  	return nil
    34  }
    35  
    36  // SetSignatures implements TxBuilder.SetSignatures.
    37  func (s *StdTxBuilder) SetSignatures(signatures ...signing.SignatureV2) error {
    38  	sigs := make([]StdSignature, len(signatures))
    39  	var err error
    40  	for i, sig := range signatures {
    41  		sigs[i], err = SignatureV2ToStdSignature(s.cdc, sig)
    42  		if err != nil {
    43  			return err
    44  		}
    45  	}
    46  
    47  	s.Signatures = sigs
    48  	return nil
    49  }
    50  
    51  func (s *StdTxBuilder) SetFeeAmount(amount sdk.Coins) {
    52  	s.StdTx.Fee.Amount = amount
    53  }
    54  
    55  func (s *StdTxBuilder) SetGasLimit(limit uint64) {
    56  	s.StdTx.Fee.Gas = limit
    57  }
    58  
    59  // SetMemo implements TxBuilder.SetMemo
    60  func (s *StdTxBuilder) SetMemo(memo string) {
    61  	s.Memo = memo
    62  }
    63  
    64  // SetTimeoutHeight sets the transaction's height timeout.
    65  func (s *StdTxBuilder) SetTimeoutHeight(height uint64) {
    66  	s.TimeoutHeight = height
    67  }
    68  
    69  // SetFeeGranter does nothing for stdtx
    70  func (s *StdTxBuilder) SetFeeGranter(_ sdk.AccAddress) {}
    71  
    72  // StdTxConfig is a context.TxConfig for StdTx
    73  type StdTxConfig struct {
    74  	Cdc *codec.LegacyAmino
    75  }
    76  
    77  var _ client.TxConfig = StdTxConfig{}
    78  
    79  // NewTxBuilder implements TxConfig.NewTxBuilder
    80  func (s StdTxConfig) NewTxBuilder() client.TxBuilder {
    81  	return &StdTxBuilder{
    82  		StdTx: StdTx{},
    83  		cdc:   s.Cdc,
    84  	}
    85  }
    86  
    87  // WrapTxBuilder returns a StdTxBuilder from provided transaction
    88  func (s StdTxConfig) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) {
    89  	stdTx, ok := newTx.(StdTx)
    90  	if !ok {
    91  		return nil, fmt.Errorf("wrong type, expected %T, got %T", stdTx, newTx)
    92  	}
    93  	return &StdTxBuilder{StdTx: stdTx, cdc: s.Cdc}, nil
    94  }
    95  
    96  // MarshalTx implements TxConfig.MarshalTx
    97  func (s StdTxConfig) TxEncoder() sdk.TxEncoder {
    98  	return DefaultTxEncoder(s.Cdc)
    99  }
   100  
   101  func (s StdTxConfig) TxDecoder() sdk.TxDecoder {
   102  	return mkDecoder(s.Cdc.Unmarshal)
   103  }
   104  
   105  func (s StdTxConfig) TxJSONEncoder() sdk.TxEncoder {
   106  	return func(tx sdk.Tx) ([]byte, error) {
   107  		return s.Cdc.MarshalJSON(tx)
   108  	}
   109  }
   110  
   111  func (s StdTxConfig) TxJSONDecoder() sdk.TxDecoder {
   112  	return mkDecoder(s.Cdc.UnmarshalJSON)
   113  }
   114  
   115  func (s StdTxConfig) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, error) {
   116  	stdSigs := make([]StdSignature, len(sigs))
   117  	for i, sig := range sigs {
   118  		stdSig, err := SignatureV2ToStdSignature(s.Cdc, sig)
   119  		if err != nil {
   120  			return nil, err
   121  		}
   122  
   123  		stdSigs[i] = stdSig
   124  	}
   125  	return s.Cdc.MarshalJSON(stdSigs)
   126  }
   127  
   128  func (s StdTxConfig) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, error) {
   129  	var stdSigs []StdSignature
   130  	err := s.Cdc.UnmarshalJSON(bz, &stdSigs)
   131  	if err != nil {
   132  		return nil, err
   133  	}
   134  
   135  	sigs := make([]signing.SignatureV2, len(stdSigs))
   136  	for i, stdSig := range stdSigs {
   137  		sig, err := StdSignatureToSignatureV2(s.Cdc, stdSig)
   138  		if err != nil {
   139  			return nil, err
   140  		}
   141  		sigs[i] = sig
   142  	}
   143  
   144  	return sigs, nil
   145  }
   146  
   147  func (s StdTxConfig) SignModeHandler() authsigning.SignModeHandler {
   148  	return stdTxSignModeHandler{}
   149  }
   150  
   151  // SignatureV2ToStdSignature converts a SignatureV2 to a StdSignature
   152  // [Deprecated]
   153  func SignatureV2ToStdSignature(cdc *codec.LegacyAmino, sig signing.SignatureV2) (StdSignature, error) {
   154  	var (
   155  		sigBz []byte
   156  		err   error
   157  	)
   158  
   159  	if sig.Data != nil {
   160  		sigBz, err = SignatureDataToAminoSignature(cdc, sig.Data)
   161  		if err != nil {
   162  			return StdSignature{}, err
   163  		}
   164  	}
   165  
   166  	return StdSignature{
   167  		PubKey:    sig.PubKey,
   168  		Signature: sigBz,
   169  	}, nil
   170  }
   171  
   172  // Unmarshaler is a generic type for Unmarshal functions
   173  type Unmarshaler func(bytes []byte, ptr interface{}) error
   174  
   175  func mkDecoder(unmarshaler Unmarshaler) sdk.TxDecoder {
   176  	return func(txBytes []byte) (sdk.Tx, error) {
   177  		if len(txBytes) == 0 {
   178  			return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, "tx bytes are empty")
   179  		}
   180  		tx := StdTx{}
   181  		// StdTx.Msg is an interface. The concrete types
   182  		// are registered by MakeTxCodec
   183  		err := unmarshaler(txBytes, &tx)
   184  		if err != nil {
   185  			return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, err.Error())
   186  		}
   187  		return tx, nil
   188  	}
   189  }
   190  
   191  // DefaultTxEncoder logic for standard transaction encoding
   192  func DefaultTxEncoder(cdc *codec.LegacyAmino) sdk.TxEncoder {
   193  	return func(tx sdk.Tx) ([]byte, error) {
   194  		return cdc.Marshal(tx)
   195  	}
   196  }