fix(client/v2): *big.Int unmarshal (#21853)

This commit is contained in:
Julien Robert 2024-10-08 17:14:23 +02:00 committed by GitHub
parent 5fea67d59c
commit 43c41be136
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 62 additions and 8 deletions

View File

@ -53,6 +53,10 @@ Ref: https://keepachangelog.com/en/1.0.0/
* [#17709](https://github.com/cosmos/cosmos-sdk/pull/17709) Address codecs have been removed from `autocli.AppOptions` and `flag.Builder`. Instead client/v2 uses the address codecs present in the context (introduced in [#17503](https://github.com/cosmos/cosmos-sdk/pull/17503)).
### Bug Fixes
* [#21853](https://github.com/cosmos/cosmos-sdk/pull/21853) Fix `*big.Int` unmarshalling in txs.
## [v2.0.0-beta.5] - 2024-09-18
### Improvements

View File

@ -26,6 +26,7 @@ const (
ValidatorAddressStringScalarType = "cosmos.ValidatorAddressString"
ConsensusAddressStringScalarType = "cosmos.ConsensusAddressString"
PubkeyScalarType = "cosmos.Pubkey"
DecScalarType = "cosmos.Dec"
)
// Builder manages options for building pflag flags for protobuf messages.
@ -67,6 +68,7 @@ func (b *Builder) init() {
b.scalarFlagTypes[ValidatorAddressStringScalarType] = validatorAddressStringType{}
b.scalarFlagTypes[ConsensusAddressStringScalarType] = consensusAddressStringType{}
b.scalarFlagTypes[PubkeyScalarType] = pubkeyType{}
b.scalarFlagTypes[DecScalarType] = decType{}
}
}

View File

@ -0,0 +1,48 @@
package flag
import (
"context"
"google.golang.org/protobuf/reflect/protoreflect"
"cosmossdk.io/math"
)
type decType struct{}
func (a decType) NewValue(_ *context.Context, _ *Builder) Value {
return &decValue{}
}
func (a decType) DefaultValue() string {
return "0"
}
type decValue struct {
value string
}
func (a decValue) Get(protoreflect.Value) (protoreflect.Value, error) {
return protoreflect.ValueOf(a.value), nil
}
func (a decValue) String() string {
return a.value
}
func (a *decValue) Set(s string) error {
dec, err := math.LegacyNewDecFromStr(s)
if err != nil {
return err
}
// we need to convert from float representation to non-float representation using default precision
// 0.5 -> 500000000000000000
a.value = dec.BigInt().String()
return nil
}
func (a decValue) Type() string {
return "cosmos.Dec"
}

View File

@ -112,7 +112,7 @@ var marshalOption = proto.MarshalOptions{
func (w *builder) getTx() (*gogoTxWrapper, error) {
anyMsgs, err := msgsV1toAnyV2(w.msgs)
if err != nil {
return nil, err
return nil, fmt.Errorf("unable to convert messages: %w", err)
}
body := &txv1beta1.TxBody{
Messages: anyMsgs,
@ -136,12 +136,12 @@ func (w *builder) getTx() (*gogoTxWrapper, error) {
bodyBytes, err := marshalOption.Marshal(body)
if err != nil {
return nil, err
return nil, fmt.Errorf("unable to marshal body: %w", err)
}
authInfoBytes, err := marshalOption.Marshal(authInfo)
if err != nil {
return nil, err
return nil, fmt.Errorf("unable to marshal auth info: %w", err)
}
txRawBytes, err := marshalOption.Marshal(&txv1beta1.TxRaw{
@ -150,12 +150,12 @@ func (w *builder) getTx() (*gogoTxWrapper, error) {
Signatures: w.signatures,
})
if err != nil {
return nil, err
return nil, fmt.Errorf("unable to marshal tx raw: %w", err)
}
decodedTx, err := w.decoder.Decode(txRawBytes)
if err != nil {
return nil, err
return nil, fmt.Errorf("unable to decode tx: %w", err)
}
return newWrapperFromDecodedTx(w.addressCodec, w.codec, decodedTx)

View File

@ -84,7 +84,7 @@ func (d *Decoder) Decode(txBytes []byte) (*DecodedTx, error) {
err = proto.Unmarshal(txBytes, &raw)
if err != nil {
return nil, err
return nil, errorsmod.Wrap(ErrTxDecode, err.Error())
}
var body v1beta1.TxBody
@ -136,7 +136,7 @@ func (d *Decoder) Decode(txBytes []byte) (*DecodedTx, error) {
dynamicMsg := dynamicpb.NewMessageType(msgDesc.(protoreflect.MessageDescriptor)).New().Interface()
err = anyMsg.UnmarshalTo(dynamicMsg)
if err != nil {
return nil, err
return nil, errorsmod.Wrap(ErrTxDecode, fmt.Sprintf("cannot unmarshal Any message: %v", err))
}
dynamicMsgs = append(dynamicMsgs, dynamicMsg)
@ -148,7 +148,7 @@ func (d *Decoder) Decode(txBytes []byte) (*DecodedTx, error) {
msg := reflect.New(gogoType.Elem()).Interface().(gogoproto.Message)
err = d.codec.Unmarshal(anyMsg.Value, msg)
if err != nil {
return nil, err
return nil, errorsmod.Wrap(ErrTxDecode, err.Error())
}
msgs = append(msgs, msg)