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 }