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

     1  package legacytx
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/Finschia/finschia-sdk/codec"
     7  	"github.com/Finschia/finschia-sdk/crypto/types/multisig"
     8  	sdk "github.com/Finschia/finschia-sdk/types"
     9  	sdkerrors "github.com/Finschia/finschia-sdk/types/errors"
    10  	signingtypes "github.com/Finschia/finschia-sdk/types/tx/signing"
    11  	"github.com/Finschia/finschia-sdk/x/auth/signing"
    12  )
    13  
    14  // stdTxSignModeHandler is a SignModeHandler that handles SIGN_MODE_LEGACY_AMINO_JSON
    15  type stdTxSignModeHandler struct{}
    16  
    17  func NewStdTxSignModeHandler() signing.SignModeHandler {
    18  	return &stdTxSignModeHandler{}
    19  }
    20  
    21  // assert interface implementation
    22  var _ signing.SignModeHandler = stdTxSignModeHandler{}
    23  
    24  // DefaultMode implements SignModeHandler.DefaultMode
    25  func (h stdTxSignModeHandler) DefaultMode() signingtypes.SignMode {
    26  	return signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON
    27  }
    28  
    29  // Modes implements SignModeHandler.Modes
    30  func (stdTxSignModeHandler) Modes() []signingtypes.SignMode {
    31  	return []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON}
    32  }
    33  
    34  // DefaultMode implements SignModeHandler.GetSignBytes
    35  func (stdTxSignModeHandler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) {
    36  	if mode != signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON {
    37  		return nil, fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, mode)
    38  	}
    39  
    40  	stdTx, ok := tx.(StdTx)
    41  	if !ok {
    42  		return nil, fmt.Errorf("expected %T, got %T", StdTx{}, tx)
    43  	}
    44  
    45  	return StdSignBytes(
    46  		data.ChainID, data.AccountNumber, data.Sequence, stdTx.GetTimeoutHeight(), StdFee{Amount: stdTx.GetFee(), Gas: stdTx.GetGas()}, tx.GetMsgs(), stdTx.GetMemo(),
    47  	), nil
    48  }
    49  
    50  // SignatureDataToAminoSignature converts a SignatureData to amino-encoded signature bytes.
    51  // Only SIGN_MODE_LEGACY_AMINO_JSON is supported.
    52  func SignatureDataToAminoSignature(cdc *codec.LegacyAmino, data signingtypes.SignatureData) ([]byte, error) {
    53  	switch data := data.(type) {
    54  	case *signingtypes.SingleSignatureData:
    55  		if data.SignMode != signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON {
    56  			return nil, fmt.Errorf("wrong SignMode. Expected %s, got %s",
    57  				signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, data.SignMode)
    58  		}
    59  
    60  		return data.Signature, nil
    61  	case *signingtypes.MultiSignatureData:
    62  		aminoMSig, err := MultiSignatureDataToAminoMultisignature(cdc, data)
    63  		if err != nil {
    64  			return nil, err
    65  		}
    66  
    67  		return cdc.Marshal(aminoMSig)
    68  	default:
    69  		return nil, fmt.Errorf("unexpected signature data %T", data)
    70  	}
    71  }
    72  
    73  // MultiSignatureDataToAminoMultisignature converts a MultiSignatureData to an AminoMultisignature.
    74  // Only SIGN_MODE_LEGACY_AMINO_JSON is supported.
    75  func MultiSignatureDataToAminoMultisignature(cdc *codec.LegacyAmino, mSig *signingtypes.MultiSignatureData) (multisig.AminoMultisignature, error) {
    76  	n := len(mSig.Signatures)
    77  	sigs := make([][]byte, n)
    78  
    79  	for i := 0; i < n; i++ {
    80  		var err error
    81  		sigs[i], err = SignatureDataToAminoSignature(cdc, mSig.Signatures[i])
    82  		if err != nil {
    83  			return multisig.AminoMultisignature{}, sdkerrors.Wrapf(err, "Unable to convert Signature Data to signature %d", i)
    84  		}
    85  	}
    86  
    87  	return multisig.AminoMultisignature{
    88  		BitArray: mSig.BitArray,
    89  		Sigs:     sigs,
    90  	}, nil
    91  }