diff --git a/CHANGELOG.md b/CHANGELOG.md index af3b16363766..753cc73acd2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i ### Features +* (types) [#19164](https://github.com/cosmos/cosmos-sdk/pull/19164) Add a ValueCodec for the math.Uint type that can be used in collections maps. * (types) [#19281](https://github.com/cosmos/cosmos-sdk/pull/19281) Added a new method, `IsGT`, for `types.Coin`. This method is used to check if a `types.Coin` is greater than another `types.Coin`. * (client) [#18557](https://github.com/cosmos/cosmos-sdk/pull/18557) Add `--qrcode` flag to `keys show` command to support displaying keys address QR code. * (client) [#18101](https://github.com/cosmos/cosmos-sdk/pull/18101) Add a `keyring-default-keyname` in `client.toml` for specifying a default key name, and skip the need to use the `--from` flag when signing transactions. diff --git a/types/codec_test.go b/types/codec_test.go index b4b01c23ecd9..e0b2114c14ff 100644 --- a/types/codec_test.go +++ b/types/codec_test.go @@ -10,3 +10,9 @@ import ( func TestIntValue(t *testing.T) { colltest.TestValueCodec(t, IntValue, math.NewInt(10005994859)) } + +func TestUintValue(t *testing.T) { + colltest.TestValueCodec(t, UintValue, math.NewUint(1337)) + colltest.TestValueCodec(t, UintValue, math.ZeroUint()) + colltest.TestValueCodec(t, UintValue, math.NewUintFromString("1000000000000000000")) +} diff --git a/types/collections.go b/types/collections.go index eb3146222baf..5474d19af729 100644 --- a/types/collections.go +++ b/types/collections.go @@ -33,6 +33,9 @@ var ( // IntValue represents a collections.ValueCodec to work with Int. IntValue collcodec.ValueCodec[math.Int] = intValueCodec{} + // UintValue represents a collections.ValueCodec to work with Uint. + UintValue collcodec.ValueCodec[math.Uint] = uintValueCodec{} + // TimeKey represents a collections.KeyCodec to work with time.Time // Deprecated: exists only for state compatibility reasons, should not // be used for new storage keys using time. Please use the time KeyCodec @@ -52,6 +55,11 @@ var ( LengthPrefixedBytesKey collcodec.KeyCodec[[]byte] = lengthPrefixedBytesKey{collections.BytesKey} ) +const ( + Int string = "math.Int" + Uint string = "math.Uint" +) + type addressUnion interface { AccAddress | ValAddress | ConsAddress String() string @@ -198,7 +206,43 @@ func (i intValueCodec) Stringify(value math.Int) string { } func (i intValueCodec) ValueType() string { - return "math.Int" + return Int +} + +type uintValueCodec struct{} + +func (i uintValueCodec) Encode(value math.Uint) ([]byte, error) { + return value.Marshal() +} + +func (i uintValueCodec) Decode(b []byte) (math.Uint, error) { + v := new(math.Uint) + err := v.Unmarshal(b) + if err != nil { + return math.Uint{}, err + } + return *v, nil +} + +func (i uintValueCodec) EncodeJSON(value math.Uint) ([]byte, error) { + return value.MarshalJSON() +} + +func (i uintValueCodec) DecodeJSON(b []byte) (math.Uint, error) { + v := new(math.Uint) + err := v.UnmarshalJSON(b) + if err != nil { + return math.Uint{}, err + } + return *v, nil +} + +func (i uintValueCodec) Stringify(value math.Uint) string { + return value.String() +} + +func (i uintValueCodec) ValueType() string { + return Uint } type timeKeyCodec struct{}