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 }